操作系统(2):处理机管理

Last updated on July 6, 2025 pm

这是《操作系统》课程的课程笔记系列。本文整理部分为“第2章:处理机管理”。

2.1 进程与线程

2.1.1 进程的概念和特征

  • 进程的概念:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
    • 程序:是静态的,是存储的可执行文件,即一系列的指令集合
    • 进程:是动态的,是程序的一次执行过程
    • 进程实体(进程映像):是静态的,由 PCB、程序段、数据段组成,反映了进程在某一时刻的状态
  • 进程的特征
    • 动态性:是最基本的特征,进程是程序的一次执行过程,是动态地产生、变化和消亡的
    • 并发性:内存中有多个进程实体,各进程可并发执行
    • 独立性:进程是能独立运行、独立获得资源、独立接受调度的基本单位
    • 异步性:各进程按各自独立的、不可预知的速度向前推进,可能导致运行结果的不确定性
    • 结构性:每个进程都会配置一个 PCB

2.1.2 进程的组成

  • 进程控制块(PCB):是进程存在的唯一标志,包含操作系统对进程管理所需的信息
    • 进程描述信息
      • 进程标识符(PID)
      • 用户标识符(UID)
    • 进程控制和管理信息
      • CPU、磁盘、网络流量使用情况统计等
      • 进程当前状态:就绪态 / 阻塞态 / 运行态等
    • 资源分配清单
      • 正在使用哪些文件
      • 正在使用哪些内存区域
      • 正在使用哪些 I/O 设备
    • 处理机相关信息:如 PSW、PC 等寄存器的值(用于实现进程切换)
  • 程序段:程序的代码(指令序列)
  • 数据段:运行过程中产生的各种数据(如程序中定义的变量)

2.1.3 进程的状态与转换

  • 进程的五种状态
    • 运行态:占有 CPU,并在 CPU 上运行
      • 有 CPU 资源,有其他所需资源
    • 就绪态:已具备运行条件,但由于没有空闲 CPU,暂时不能运行
      • 无 CPU 资源,有其他所需资源
    • 阻塞态:因等待某一事件而暂时不能运行
      • 无 CPU 资源,无其他所需资源
    • 创建态:进程正在被创建,操作系统为进程分配资源、初始化 PCB
    • 终止态:进程正在从系统中撤销,操作系统回收进程拥有的资源、撤销 PCB
  • 进程状态的转换
    • 就绪态 --> 运行态:进程被调度
    • 运行态 --> 就绪态:时间片到,或 CPU 被其他高优先级的进程抢占
    • 运行态 --> 阻塞态:等待系统资源分配,或等待某事件发生(主动行为)
    • 阻塞态 --> 就绪态:资源分配到位,等待的事件发生(被动行为)
    • 创建态 --> 就绪态:系统完成创建进程相关的工作
    • 运行态 --> 终止态:进程运行结束,或运行过程中遇到不可修复的错误
    graph LR;
    A(创建态) -- 创建 --> B(就绪态);
    B -- 调度 --> C(运行态);
    C -- 时间到 --> B;
    C -- 退出 --> D(终止态);
    C -- 事件等待 --> E(阻塞态);
    E -- 事件发生 --> B;
    
  • 进程的组织方式
    • 链接方式
      • 按照进程状态将 PCB 分为多个队列
      • 操作系统持有指向各个队列的指针
    • 索引方式
      • 根据进程状态的不同,建立几张索引表
      • 操作系统持有指向各个索引表的指针

2.1.4 进程控制

  • 进程控制:实现进程状态的转换
  • 实现方式:用原语实现
    • 原语是一种特殊的程序
    • 原语的执行必须一气呵成,不可中断
    • 原语用关中断和开中断来实现
  • 相关原语
    • 进程的创建
      • 创建原语:无 --> 创建态 --> 就绪态
        • 申请空白 PCB
        • 为新进程分配所需资源
        • 初始化 PCB
        • 将 PCB 插入就绪队列
      • 引起进程创建的事件:用户登录、作业调度、提供服务、应用请求
    • 进程的终止
      • 撤销原语:就绪态 / 阻塞态 / 运行态 --> 终止态 --> 无
        • 从 PCB 集合中找到终止进程的 PCB
        • 若进程正在运行,立即剥夺 CPU,将 CPU 分配给其他进程
        • 终止其所有子进程
        • 将该进程拥有的所有资源归还给父进程或操作系统
        • 删除 PCB
      • 引起进程终止的事件:正常结束、异常结束、外界干预
    • 进程的阻塞
      • 阻塞原语:运行态 --> 阻塞态
        • 找到要阻塞的进程对应的 PCB
        • 保护进程运行现场,将 PCB 状态信息设置为阻塞态,暂停进程运行
        • 将 PCB 插入相应事件的等待队列
      • 引起进程阻塞的事件
        • 需要系统分配某种资源
        • 需要等待相互合作的其他进程完成工作
    • 进程的唤醒
      • 唤醒原语:阻塞态 --> 就绪态
        • 在事件等待队列中找到 PCB
        • 将 PCB 从等待队列移除,设置进程为就绪态
        • 将 PCB 插入就绪队列,等待被调度
      • 引起进程唤醒的事件:等待的事件发生
    • 进程的切换
      • 切换原语:运行态 --> 阻塞态 / 就绪态,就绪态 --> 运行态
        • 将运行环境信息存入 PCB
        • PCB 移入相应队列
        • 选择另一个进程执行,并更新其 PCB
        • 根据 PCB 恢复新进程所需的运行环境
      • 引起进程切换的事件
        • 当前进程时间片到
        • 有更高优先级的进程到达
        • 当前进程主动阻塞
        • 当前进程终止

总结:控制原语要做的三类操作:

  1. 更新 PCB 中的信息(修改进程状态、保存 / 恢复运行环境)
  2. 将 PCB 插入合适的队列
  3. 分配 / 回收资源

2.1.5 进程的通信

  • 共享存储
    • 设置一个共享内存区域,并映射到进程的虚拟地址空间
    • 要互斥地访问共享空间(通信进程负责实现,使用内核提供的同步互斥工具)
    • 两种方式:基于数据结构的共享(低级)、基于存储区的共享(高级)
  • 消息传递
    • 传递结构化的消息(包含消息头和消息体)
    • 系统提供发送 / 接收原语
    • 两种方式
      • 直接通信方式:发送进程指明接收进程的 ID,消息直接挂到接接收进程的消息队列中
      • 间接通信方式:以“信箱”作为中间体进行消息传递
  • 管道通信
    • 设置一个特殊的共享文件(管道,本质上是一片内存缓冲区)
    • 一个管道只能实现半双工通信,实现双向同时通信要建立两个管道
    • 各进程要互斥访问管道(由操作系统负责实现互斥)
    • 管道写满时,写进程阻塞;管道读空时,读进程阻塞
  • 信号
    • 作用:用于通知进程某个特性事件发生(实现简单的进程间通信)
      • 也常作为异常处理的一种配套机制
    • 信号的发送
      • 可以由一个进程给另一个进程发送信号
      • 可以由操作系统内核给进程发送信号
      • 一个进程也可以给自己发送信号
    • 信号的保存:在每个进程的 PCB 中,用两个 n bit 位向量表示待处理信号、被阻塞信号
    • 信号的处理
      • 处理时机:当进程从内核态转为用户态时,例行检查是否有待处理信号,如果有,即处理信号
      • 如何处理
        • 执行默认的信号处理程序:操作系统内核对每一种信号都有默认的处理程序
        • 执行用户定义的信号处理程序:允许进程通过系统调用,自定义某些信号的处理程序,覆盖操作系统的默认处理
    • 特点
      • 不同的操作系统,对信号类型的定义各不相同
      • 重复收到的同类信号,将被简单地丢弃
      • 有些信号既不能被用户自定义处理函数,也不能被阻塞

2.1.6 线程和多线程模型

  • 线程:是基本的 CPU 执行单元,也是程序执行流的最小单位
  • 线程机制的作用
    • 资源分配、调度
      • 传统进程机制中,进程是资源分配、调度的基本单位
      • 引入线程后,进程是资源分配的基本单位,线程是调度的基本单位
    • 并发性
      • 传统进程机制中,只能进程间并发
      • 引入线程后,各线程间也能并发,提升了并发度
    • 系统开销
      • 传统的进程间并发,需要切换进程的运行环境,系统开销很大
      • 线程间并发,如果是同一进程内的线程切换,则不需要切换进程环境,系统开销小
      • 引入线程后,并发所带来的系统开销减小
  • 线程的属性
    • 线程是处理机调度的单位
    • 多 CPU 计算机中,各个线程可占用不同的 CPU
    • 每个线程都有一个线程 ID、线程控制块(TCB)
    • 线程也有就绪、阻塞、运行三种基本状态
    • 线程几乎不拥有系统资源,同一进程的不同线程间共享进程的资源
    • 由于共享内存地址空间,同一进程中的线程间通信无需系统干预
    • 同一进程中的线程切换,不会引起进程切换;不同进程中的线程切换,会引起进程切换
    • 切换同进程内的线程,系统开销很小;切换进程,系统开销较大
  • 线程的实现方式
    • 用户级线程:从用户视角能看到的线程,由线程库实现
    • 内核级线程:从操作系统视角看到的线程,由操作系统实现
      • 内核级线程是处理机分配的单位
    • 组合方式:上述两种方式的组合
  • 多线程模型
    • 一对一模型:一个用户级线程映射到一个内核级线程
      • 优点:各个线程可分配到多核处理机并行执行,并发度高
      • 缺点:线程管理都需要操作系统支持,开销大
    • 多对一模型:多个用户级线程映射到一个内核级线程
      • 优点:线程管理开销小,效率高
      • 缺点:一个线程阻塞会导致整个进程都被阻塞,并发度低
    • 多对多模型nn 个用户级线程映射到 mm 个内核级线程(nmn \ge m
      • 融合了两者的优点
  • 线程的状态与转换:与进程的就绪态、运行态、阻塞态的转换一致
  • 线程的组织与控制
    • 线程控制块(TCB):每个线程对应一个 TCB
      • 线程标识符:TID,与 PID 类似
      • 运行环境:程序计数器 PC、其他寄存器、堆栈指针
      • 线程运行状态:运行态 / 就绪态 / 阻塞态
      • 优先级:线程调度、资源分配的参考
    • 线程表:多个 TCB 可组织成一张线程表

2.2 CPU 调度

2.2.1 调度的概念

  • 调度的概念:按某种算法选择一个进程将处理机分配给它
  • 调度的层次
    • 高级调度(作业调度):按照某种规则,从后备队列中选择合适的作业将其调入内存,并为其创建进程
    • 中级调度(内存调度):按照某种规则,从挂起队列中选择合适的进程将其数据调回内存
      • 挂起状态:暂时调到外存等待的进程状态,分为就绪挂起和阻塞挂起
    • 低级调度(进程调度):按照某种规则,从就绪队列中选择一个进程为其分配处理机
graph LR;
A --> F(就绪挂起);
A(创建态) -- 创建 --> B(就绪态);
B -- 调度 --> C(运行态);
C -- 时间到 --> B;
C -- 退出 --> D(终止态);
C -- 事件等待 --> E(阻塞态);
E -- 事件发生 --> B;
B -- 挂起 --> F;
E -- 挂起 --> G;
G -- 激活 --> E;
G(阻塞挂起) -- 事件出现 --> F;
F -- 激活 --> B;
C --> F;
调度发生的位置 发生频率 对进程状态的影响
高级调度 外存 --> 内存
(面向作业)
最低 无 --> 创建态 --> 就绪态
中级调度 外存 --> 内存
(面向进程)
中等 挂起态 --> 就绪态
低级调度 内存 --> CPU 最高 就绪态 --> 运行态

2.2.2 调度的实现

  • 调度的时机
    • 需要进程调度的情况
      • 主动放弃
        • 进程正常终止
        • 运行过程中发生异常而终止
        • 主动阻塞(如等待 I/O)
      • 被动放弃
        • 分给进程的时间片用完
        • 有更紧急的事情需要处理(如 I/O 中断)
        • 有更高优先级的进程进入就绪队列
    • 不能进行进程调度的情况
      • 在处理中断的过程中
      • 进程在操作系统内核程序临界区中
      • 原子操作过程中(原语)

补充

  • 临界资源:一个时间段内只允许一个进程使用的资源,各进程需要互斥地访问临界资源
  • 临界区:访问临界资源的代码段
  • 内核程序临界区:一般用来访问某种内核数据结构,如进程的就绪队列
  • 进程在操作系统内核程序临界区中不能进行调度和切换,因为其访问的临界资源可能影响到操作系统内核的其他管理工作,但在普通临界区中可以进行调度和切换
  • 进程调度的方式
    • 非剥夺调度方式(非抢占式):只能由当前运行的进程主动放弃 CPU
    • 剥夺调度方式(抢占式):可由操作系统剥夺当前进程的 CPU 使用权

2.2.3 调度的目标

2.2.4 进程切换

  • 切换和调度
    • 狭义的进程调度:指从就绪队列中选中一个要运行的进程(刚刚被暂停的进程或另一个进程)
    • 进程切换:指一个进程让出处理机,由另一个进程占用处理机的过程
    • 广义的进程调度:包含了选择一个进程和进程切换两个步骤
  • 进程切换的过程
    1. 对原来运行进程各种数据的保存
    2. 对新的进程各种数据的恢复
    • 结论:进程调度和切换是有代价的,并不是调度越频繁,并发度就越高

2.2.5 CPU 调度算法

2.2.6 多处理机调度

2.3 同步与互斥

2.3.1 同步与互斥的基本概念

2.3.2 实现临界区互斥的基本方法

2.3.3 互斥锁

2.3.4 信号量

2.3.5 经典同步问题

2.3.6 管程

2.4 死锁

2.4.1 死锁的概念

2.4.2 死锁预防

2.4.3 死锁避免

2.4.4 死锁检测和解除


操作系统(2):处理机管理
https://cny123222.github.io/2025/06/18/操作系统-2-:处理机管理/
Author
Nuoyan Chen
Posted on
June 18, 2025
Licensed under