进程
进程是具有独立功能的程序关于某个数据集上的一次运行活动,是系统进行资源分配和调度的独立单位。进程可以看作:
- 某个程序的一次执行过程;
- 正在运行的某个程序的抽象;
进程控制块
PCB:Process Control Block,又称为进程描述符、进程属性,和进程是一一对应的。
PCB 是操作系统用于管理控制进程的一个专门数据结构,是系统感知进程存在的唯一标志。
PCB 中包含了:
- 进程描述信息
- 进程标识符:唯一,通常是一个整数;
- 进程名:不唯一,通常基于可执行文件名;
- 用户标识符;
- 进程组关系;
- 进程控制信息
- 所拥有的资源和使用情况
- 虚拟地址空间的状况;
- 打开的文件列表;
- CPU 现场信息
- 寄存器值(通用寄存器、程序计数器 PC 等);
- 指向该进程页表的指针;
进程表
进程表是所有进程的 PCB 的集合,反映了系统的最大并发度。
进程状态及状态转换
进程的三种基本状态
- 运行态(Running):占有 CPU,并在 CPU 上运行
- 就绪态(Ready):已经具备了运行条件,但是由于没有空闲的 CPU,而暂时不能运行
- 等待态(waiting/Blocked):因等待某一个时间而暂时不能运行
三状态模型及状态转换
- 就绪 -> 运行:调整程序选择一个新的进程运行;
- 运行 -> 就绪:运行进程用完了时间片;或者一个高优先级进程进入了就绪状态,抢占正在运行的进程;
- 运行 -> 等待:当一个进程等待某个事件发生时;
- 等待 -> 就绪:锁等待的事件发生了;
只有就绪态和运行态可以相互转换,其他都是单向转换。
进程的其它状态
- 创建:已完成创建一进程所必要的工作,但因为资源有限尚未同意执行该进程;
- 终止:终止执行后,进程进入该状态,最后回收资源;
- 挂起:用于调节负载,进程不占用内存空间,将其进程映像交换到磁盘上;
五状态进程模型
新增了新建、结束和阻塞三个状态
七状态进程模型
增加了“阻塞挂起”和“挂起就绪”
进程队列
操作系统为每一类进程建立一个或多个队列,队列中的元素为 PCB,伴随着进程状态的改变,其 PCB 从一个队列进入了另外一个队列。
进程控制
进程控制操作完成了进程各种状态之间的转换,由具有特定功能的原语完成:
- 进程创建原语;
- 进程撤销原语;
- 阻塞原语;
- 唤醒原语;
- 挂起原语;
- 激活原语;
- …..
原语:完成某种特定功能的一段程序,具有不可分割性或者不可中断性。即原语的执行必须是连续的,在执行的过程中不允许被中断。
进程的创建
- 给新进程分配一个唯一标识以及进程控制块
- 为进程分配地址空间
- 初始化进程控制块
- 设置相应的队列指针(如: 把新进程加到就绪队列链表中)
进程的撤销
- 收回进程所占有的资源(如:关闭打开的文件、断开网络连接、回收分配的内存)
- 撤消该进程的 PCB
进程阻塞
处于运行状态的进程,在其运行过程中期待某一事件发生,如等待键盘输入、等待磁盘数据传输完成、等待其它进程发送消息,当被等待的事件未发生时,由进程自己执行阻塞原语,使自己由运行态变为阻塞态。
进程的地址空间
进程中的地址空间一般指的是相对地址空间。如果两个完全相同的程序运行,那么它们当中的栈、堆、数据段等的相对地址空间是一样的。
上下文切换(CONTEXT)
将 CPU 硬件状态从一个进程换到另一个进程的过程称为上下文切换。
进程运行时,其硬件状态保存在 CPU 上的寄存器中;进程不运行时,这些寄存器的值保存在进程控制块 PCB 中;当操作系统要运行一个新的进程时,将 PCB 中的相关值送到对应的寄存器中。
线程的基本概念
进程中的一个运行实体,是 CPU 的调度单位。进程中的线程继承了这个属性,所以有时将线程称为轻量级进程。程序的开始是以一个单线程进程方式运行的。
线程包含:标识符 ID,状态及状态转换,不运行时需要保存的上下文,自己的栈和栈指针。
进程仍然是资源的拥有者,但是线程共享所在进程的地址空间和其他资源。
线程机制的实现
用户级线程
在用户空间建立线程库:提供一组管理线程的过程。运行时系统完成线程的管理工作,内核管理的还是进程,不知道线程的存在,线程切换不需要内核态特权。
优点:
- 线程切换速度快(因为不需要内核处理);
- 调度算法是应用程序特定的;
- 用户级线程可运行在任何操作系统上,只需要实现线程库;
缺点:
- 大多数系统调用是阻塞的,因为内核阻塞进程,故进程中所有线程也被阻塞;
- 多核处理器上,同一个进程中的两个线程不能同时运行于两个处理器;
核心级线程
内核管理所有线程管理,并向应用程序提供 API 接口。内核维护进程和线程的上下文,且线程的切换需要内核支持。
混合模型
线程创建在用户空间完成,线程调度等在核心态完成。
线程和进程的区别
主要从四个方面比较线程和进程:
- 拥有资源:进程是资源分配的最小单位,但是线程不拥有资源,线程可以访问隶属进程的资源。
- 调度:线程是 CPU 调度的最小单位,在同一进程中,线程的切换不会引起进程切换。但是从一个进程中的线程切换到另一个进程中的线程时,会引起进程切换。
- 系统开销:由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。
- 通信方面:线程间可以通过直接读写同一进程中的数据进行通信,但是进程通信需要借助 IPC。