1、什么是进程
- 什么是进程呢?进程是程序的一次启动执行。
- 什么是程序呢?程序是存放在硬盘中的可执行文件,主要包括代码指令和数据。
- 一个进程是一个程序的一次启动和执行,是操作系统将程序装入内存,给程序分配必要的系统资源,并且开始运行程序的指令。
- 进程与程序是什么关系呢?同一个程序可以多次启动,对应多个进程。比如,多次打开Chrome浏览器程序,在Process Explorer中可以看到多个Chrome浏览器进程。
2.进程基本原理
-
在计算机中,CPU是核心的硬件资源,承担了所有的计算任务
-
内存资源承担了运行时数据的保存任务
-
外存资源(硬盘等)承担了数据外部永久存储的任务。
-
计算任务的调度、资源的分配由操作系统来统领。
-
应用程序以进程的形式运行于操作系统之上,享受操作系统提供的服务。
-
一个进程由程序段、数据段和进程控制块三部分组成。
-
程序段一般也被称为代码段。代码段是进程的程序指令在内存中的位置,包含需要执行的指令集合
-
数据段是进程的操作数据在内存中的位置,包含需要操作的数据集合
-
程序控制块(ProgramControl Block,PCB)包含进程的描述信息和控制信息,是进程存在的唯一标志。PCB主要由4大部分组成:
- 1)进程的描述信息。主要包括:进程ID和进程名称,进程ID是唯一的,代表进程的身份;进程的状态,比如运行、就绪、阻塞;进程优先级,是进程调度的重要依据。
2)进程的调度信息。主要包括:程序起始地址,程序的第一行指令的内存地址,从这里开始程序的执行;通信信息,进程间通信时的消息队列。 - 3)进程的资源信息。主要包括:内存信息,内存占用情况和内存管理所用的数据结构;IO
设备信息,所用的I/O设备编号及相应数据结构;文件句柄,所打开文件的信息。 - 4)进程上下文。主要包括执行时各种CPU寄存器的值、当前的程序计数器(PC)的值以及名种栈的值等,即进程的环境。在操作系统切换进程时,当前进程被迫让出CPU,当前进程的上下文就保存在PCB结构中,供下次恢复运行时使用。
- 1)进程的描述信息。主要包括:进程ID和进程名称,进程ID是唯一的,代表进程的身份;进程的状态,比如运行、就绪、阻塞;进程优先级,是进程调度的重要依据。
-
3.线程的基本原理
- 线程是指
进程代码段
的一次的顺序执行流程。线程是CPU调度的最小单位。一个进程可以有一个或多个线程,各个线程之间共享进程的内存空间、系统资源,进程仍然是操作系统资源分配的最小单位。 - 一个标准的线程主要由三部分组成,即线程描述信息、程序计数器(Program Counter,PC)和栈内存。
-
在线程的结构中,线程描述信息即线程的基本信息,主要包括:
- 1)线程ID(ThreadID,线程标识符)。线程的唯一标识,同一个进程内不同线程的ID不会重叠。
- 2)线程名称。主要是方便用户识别,用户可以指定线程的名字,如果没有指定,系统就会自动分配一个名称。
- 3)线程优先级。表示线程调度的优先级,优先级越高,获得CPU的执行机会就越大。
- 4)线程状态。表示当前线程的执行状态,为新建、就绪、运行、阻塞、结束等状态中的一种。
- 5)其他。例如是否为守护线程等。
在线程的结构中,程序计数器很重要,它记录着线程下一条指令的代码段内存地址。
在线程的结构中,栈内存是代码段中局部变量的存储空间,为线程所独立拥有,
在线程之间不共享。在JDK1.8中,每个线程在创建时默认被分配
1MB
大小的栈内存。栈内存和堆内存不同,栈内存不受垃圾回收器管理。
4. java 中的线程执行原理
- 在Java中,执行程序流程的重要单位是
方法
- 栈内存的分配的单位是
栈帧
(或者叫方法帧
)。方法的每一次执行都需要为其分配一个栈帧(方法帧),栈帧主要保存该方法中的局部变量
、方法的返回地址
以及其他方法
的相关信息。- 当线程的执行流程进入方法时,JVM就会为方法分配一个对应的栈帧压入栈内存;
- 当线程的执行流程跳出方法时,JVM就从栈内存弹出该方法的栈帧,此时方法栈帧的内存空间就会被回收,栈帧中的变量就会被销毁。
- 栈帧(方法帧)的操作是后进先出的模式,这也是标准的栈操作模式,所以存放方法帧的内存也被叫作
栈内存
。
5.进程与线程的区别
- 线程是进程代码段的一次的顺序执行流程。一个进程由一个或多个线程组成;一个进程至少有一个线程。
- 线程是CPU调度的最小单位,进程是操作系统分配资源的最小单位。线程的划分尺度小于进程,使得多线程程序的并发性高。
- 线程是出于高并发的调度诉求从进程内部演进而来的。线程的出现既充分发挥CPU的计算性能,又弥补了进程调度过于笨重的问题。
- 进程之间是相互独立的,但进程内部各个线程之间并不完全独立。各个线程之间共享进程的方法区内存、堆内存、系统资源(文件句柄、系统信号等)。
- 切换速度不同,线程上下文切换比进程上下文切换要快得多。所以,有时线程也称为轻量级进程。