文章目录
- 进程与线程
- 进程
- 什么是进程
- 进程的组成
- 程序段
- 数据段
- 程序控制块
- 例子
- 线程
- 什么是线程
- 线程的组成
- 线程描述信息
- 程序计数器
- 栈内存
- 例子
- 进程与线程的区别
进程与线程
进程
什么是进程
什么是进程呢?简单来说,进程是程序的一次启动执行。什么是 程序呢?程序是存放在硬盘中的可执行文件,主要包括代码指令和数 据。一个进程是一个程序的一次启动和执行,是操作系统将程序装入 内存,给程序分配必要的系统资源,并且开始运行程序的指令。
进程与程序是什么关系呢?同一个程序可以多次启动,对应多个 进程。比如,多次打开Chrome浏览器程序,对应的就是多个Chrome进程。
进程的组成
进程是程序执行和系统进行并发调度的最小单位。一般来说一个进程是由程序段、数据段和程序控制块三部分组成。进程结构图如下:
程序段
程序段一般也被称为代码段。代码段是进程的程序指令在内存中的位置,包含需要执行指令的集合。
数据段
数据段是进程的操作数据在内存中的位置,包含需要操作的数据集合。
程序控制块
程序控制块(Program ControlBlock,PCB)包含进程的描述信息和控制信息,是进程存在的唯一标志。
描述信息:主要包括进程ID和进程名称,进程ID是唯一的,代表进程的身份;进程状态,比如运行、就绪、阻塞;进程优先级,是进程调度的重要依据。
调度信息:主要包括程序起始地址,程序的第一行指令的内存地址,从这里开始程序的执行;通信信息,进程间通信时的消息队列。
资源信息:主要包括内存信息,内存占用情况和内存管理所用的数据结构;I/O设备信息,所用到的I/O设备编号及相应的数据结构;文件句柄,所打开文件的信息。
进程上下文:主要包括执行时各种CPU寄存器的值、当前程序计数器(PC)的值以及各种栈的值等,即进程的环境。在操作系统切换进程时,当前进程被迫让出CPU,当前进程的上下文就保存在PCB结构中,供下次恢复运行时使用。
例子
Java编写的程序都运行在Java虚拟机(JVM)中,每当使用Java命 令启动一个Java应用程序时,就会启动一个JVM进程。在这个JVM进程 内部,所有Java程序代码都是以线程来运行的。JVM找到程序的入口点 main()方法,然后运行main()方法,这样就产生了一个线程,这个线 程被称为主线程。当main()方法结束后,主线程运行完成,JVM进程也 随即退出。
线程
什么是线程
早期的操作系统只有进程而没有线程,随着科技的发展,CPU的性能越来越高,而且从单核CPU发展为多核CPU,为了充分发挥CPU的计算性能,提升CPU硬件 资源的利用率,同时弥补进程调度过于笨重产生的问题,进程内部演 进出了并发调度的诉求,于是就发明了线程。
线程是指“进程代码段”的一次顺序执行流程。一个进程可以有一个或多个线程,各个线程之间共享进程 的内存空间、系统资源,进程仍然是操作系统资源分配的最小单位。
线程的组成
线程是CPU调度的 最小单位。一个标准的线程主要由三部分组成,即线程描述信息、程序计数 器(Program Counter,PC)和栈内存。线程结构图如下:
线程描述信息
线程的描述信息即线程的基本信息。
线程ID:线程的唯一标识,同一个进程内不同线程的ID不会重叠。
线程名称:主要是方便用户识别,用户可以指定线程的名字,如果没有指定,系统就会自动分配一个名称。
线程优先级:表示线程调度的优先级,优先级越高,获得CPU的执行机会越大。
线程状态:标识当前线程的执行状态,为新建、就绪、运行、阻塞、结束等状态中的一种。
其他的一些信息,如是否为守护线程等。
程序计数器
在线程的结构中,程序计数器很重要,它记录着线程下一条指令的代码段内存地址。
栈内存
在线程的结构中,占内存是代码段中局部变量的存储空间,为线程所独立拥有,在线程之间不共享。在JDK1.8中,每个线程在创建是默认被分配1MB大小的栈内存。栈内存和堆内存不同,栈内存不受垃圾回收器管理。
例子
Java程序的进程执行过程就是标准的多线程的执行过程。每当使 用Java命令执行一个class类时,实际上就是启动了一个JVM进程。理 论上,在该进程的内部至少会启动两个线程,一个是main线程,另一 个是GC(垃圾回收)线程。实际上,执行一个Java程序后,线程数量远远不止两个,达到了18个之 多。
进程与线程的区别
- 线程是“进程代码段”的一次顺序执行流程。一个进程由一个或多个线程组成,一个进程至少有一个线程。
- 线程是CPU调度的最小单位,进程是操作系统分配资源的最小单位。线程的划分尺度小于进程,使得多线程程序得并发性高。
- 线程是出于高并发得调度诉求从进程内部演进而来的。线程的出现既充分发挥了CPU的计算性能,又弥补了进程调度过于笨重的问题。
- 进程之间是相互独立的,但进程内部的各个线程之间并不完全独立。各个线程之间共享进程的方法区内存、堆内存、系统资源(文件句柄、系统信号等)。
- 切换速度不同,线程上下文切换比进程上下文切换要快得多。所以有的时候线程也称为轻量级进程。