进程

进程是具有独立功能的程序关于某个数据集上的一次运行活动,是系统进行资源分配和调度的独立单位。进程可以看作:

  • 某个程序的一次执行过程;
  • 正在运行的某个程序的抽象;

进程控制块

PCB:Process Control Block,又称为进程描述符、进程属性,和进程是一一对应的。

PCB 是操作系统用于管理控制进程的一个专门数据结构,是系统感知进程存在的唯一标志。

PCB 中包含了:

  • 进程描述信息
    • 进程标识符:唯一,通常是一个整数;
    • 进程名:不唯一,通常基于可执行文件名;
    • 用户标识符;
    • 进程组关系;
  • 进程控制信息
  • 所拥有的资源和使用情况
    • 虚拟地址空间的状况;
    • 打开的文件列表;
  • CPU 现场信息
    • 寄存器值(通用寄存器、程序计数器 PC 等);
    • 指向该进程页表的指针;

进程表

进程表是所有进程的 PCB 的集合,反映了系统的最大并发度。

进程状态及状态转换

进程的三种基本状态

  • 运行态(Running):占有 CPU,并在 CPU 上运行
  • 就绪态(Ready):已经具备了运行条件,但是由于没有空闲的 CPU,而暂时不能运行
  • 等待态(waiting/Blocked):因等待某一个时间而暂时不能运行

三状态模型及状态转换

  • 就绪 -> 运行:调整程序选择一个新的进程运行;
  • 运行 -> 就绪:运行进程用完了时间片;或者一个高优先级进程进入了就绪状态,抢占正在运行的进程;
  • 运行 -> 等待:当一个进程等待某个事件发生时;
  • 等待 -> 就绪:锁等待的事件发生了;

    只有就绪态和运行态可以相互转换,其他都是单向转换。

image.png

进程的其它状态

  • 创建:已完成创建一进程所必要的工作,但因为资源有限尚未同意执行该进程;
  • 终止:终止执行后,进程进入该状态,最后回收资源;
  • 挂起:用于调节负载,进程不占用内存空间,将其进程映像交换到磁盘上;

五状态进程模型

新增了新建、结束和阻塞三个状态
image.png

七状态进程模型

增加了“阻塞挂起”和“挂起就绪”
image.png

进程队列

操作系统为每一类进程建立一个或多个队列,队列中的元素为 PCB,伴随着进程状态的改变,其 PCB 从一个队列进入了另外一个队列。
image.png

进程控制

进程控制操作完成了进程各种状态之间的转换,由具有特定功能的原语完成:

  • 进程创建原语;
  • 进程撤销原语;
  • 阻塞原语;
  • 唤醒原语;
  • 挂起原语;
  • 激活原语;
  • …..

原语:完成某种特定功能的一段程序,具有不可分割性或者不可中断性。即原语的执行必须是连续的,在执行的过程中不允许被中断。

进程的创建

  • 给新进程分配一个唯一标识以及进程控制块
  • 为进程分配地址空间
  • 初始化进程控制块
  • 设置相应的队列指针(如: 把新进程加到就绪队列链表中)

进程的撤销

  • 收回进程所占有的资源(如:关闭打开的文件、断开网络连接、回收分配的内存)
  • 撤消该进程的 PCB

进程阻塞

处于运行状态的进程,在其运行过程中期待某一事件发生,如等待键盘输入、等待磁盘数据传输完成、等待其它进程发送消息,当被等待的事件未发生时,由进程自己执行阻塞原语,使自己由运行态变为阻塞态。

进程的地址空间

进程中的地址空间一般指的是相对地址空间。如果两个完全相同的程序运行,那么它们当中的栈、堆、数据段等的相对地址空间是一样的。

上下文切换(CONTEXT)

将 CPU 硬件状态从一个进程换到另一个进程的过程称为上下文切换。

进程运行时,其硬件状态保存在 CPU 上的寄存器中;进程不运行时,这些寄存器的值保存在进程控制块 PCB 中;当操作系统要运行一个新的进程时,将 PCB 中的相关值送到对应的寄存器中。

线程的基本概念

进程中的一个运行实体,是 CPU 的调度单位。进程中的线程继承了这个属性,所以有时将线程称为轻量级进程。程序的开始是以一个单线程进程方式运行的。

线程包含:标识符 ID,状态及状态转换,不运行时需要保存的上下文,自己的栈和栈指针。

进程仍然是资源的拥有者,但是线程共享所在进程的地址空间和其他资源。

线程机制的实现

用户级线程

在用户空间建立线程库:提供一组管理线程的过程。运行时系统完成线程的管理工作,内核管理的还是进程,不知道线程的存在,线程切换不需要内核态特权。
image.png
优点:

  • 线程切换速度快(因为不需要内核处理);
  • 调度算法是应用程序特定的;
  • 用户级线程可运行在任何操作系统上,只需要实现线程库;

缺点:

  • 大多数系统调用是阻塞的,因为内核阻塞进程,故进程中所有线程也被阻塞;
  • 多核处理器上,同一个进程中的两个线程不能同时运行于两个处理器;

核心级线程

内核管理所有线程管理,并向应用程序提供 API 接口。内核维护进程和线程的上下文,且线程的切换需要内核支持。
image.png

混合模型

线程创建在用户空间完成,线程调度等在核心态完成。
image.png

线程和进程的区别

主要从四个方面比较线程和进程:

  • 拥有资源:进程是资源分配的最小单位,但是线程不拥有资源,线程可以访问隶属进程的资源。
  • 调度:线程是 CPU 调度的最小单位,在同一进程中,线程的切换不会引起进程切换。但是从一个进程中的线程切换到另一个进程中的线程时,会引起进程切换。
  • 系统开销:由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。
  • 通信方面:线程间可以通过直接读写同一进程中的数据进行通信,但是进程通信需要借助 IPC。

参考

  1. 北京大学操作系统原理(Operating Systems)
  2. Tanenbaum A S, Bos H. Modern operating systems[M]. Prentice Hall Press, 2014.
  3. CS-Note进程管理