第二章 进程的描述与控制
5 分钟阅读2,214 字30 个小节
第二章 进程的描述与控制
2.1 前趋图和程序执行
前趋图(DAG)
- 有向无循环图(DAG),用于描述进程间的前后关系
- 节点表示语句/程序段/进程,有向边表示前趋关系
程序顺序执行的特征
- 顺序性:严格按顺序执行
- 封闭性:程序独占全部资源,结果不受外界影响
- 可再现性:输入相同→结果相同
程序并发执行的特征
- 间断性:执行—暂停—执行
- 失去封闭性:共享资源,执行环境被外界影响
- 不可再现性:结果可能因调度顺序不同而不同
2.2 进程的描述
进程的定义
- 进程是程序的一次执行过程
- 进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位(引入线程后,线程成为调度的基本单位)
进程的特征
| 特征 | 说明 |
|---|---|
| 动态性(最基本) | 进程有创建、运行、消亡的生命周期 |
| 并发性 | 多个进程可同时存在于内存中并发执行 |
| 独立性 | 进程是独立运行和获得资源的基本单位 |
| 异步性 | 各进程按各自独立、不可预知的速度推进 |
进程的状态
三态模型:
就绪 ——调度——→ 运行
↑ ↓
← —事件完成—— 阻塞
↑ ↓
←←←←←←←←←←←←←
时间片完/被抢占
五态模型:就绪、运行、阻塞 + 创建、终止
七态模型(含挂起):
- 活动就绪 ↔ 静止就绪(挂起)
- 活动阻塞 ↔ 静止阻塞(挂起)
挂起(Suspend):进程从内存调至外存;激活(Active):进程从外存调回内存
进程控制块 PCB
PCB是进程存在的唯一标志,包含4类信息:
| 类别 | 内容 |
|---|---|
| 进程标识符 | 内部标识符(PID数字标识)、外部标识符(用户使用的名称) |
| 处理机状态 | 通用寄存器、PC、PSW、用户栈指针 |
| 进程调度信息 | 进程状态、优先级、事件(阻塞原因)、调度其他信息 |
| 进程控制信息 | 程序和数据地址、同步和通信机制、资源清单、链接指针 |
PCB的组织方式:
- 线性方式:所有PCB放在一个线性表中
- 链接方式:按状态链成多个队列(就绪队列、阻塞队列等)
- 索引方式:建立索引表,表项指向PCB
2.3 进程控制
进程控制通过原语实现(原语在内核态执行,不可中断)。
| 原语 | 功能 |
|---|---|
| 创建原语 | 分配PID→分配资源→初始化PCB→插入就绪队列 |
| 终止原语 | 查找PCB→若进程正在运行则终止→终止其子孙进程→归还资源→删除PCB |
| 阻塞原语 | 将进程从运行态→阻塞态,保存现场,插入等待队列 |
| 唤醒原语 | 从等待队列移出→将进程从阻塞态→就绪态,插入就绪队列 |
| 挂起原语 | 活动就绪→静止就绪,或活动阻塞→静止阻塞 |
| 激活原语 | 静止就绪→活动就绪,或静止阻塞→活动阻塞 |
⚠️ 阻塞和唤醒必须成对出现!阻塞由进程自己调用(主动),唤醒由其他相关进程调用(被动)。
2.4 进程通信
| 方式 | 说明 |
|---|---|
| 共享存储器 | 多个进程通过读/写共享内存区域通信;需同步互斥机制保护 |
| 管道(pipe) | 半双工,固定大小缓冲区(通常4KB),FIFO字节流;写满时写进程阻塞,读空时读进程阻塞;连接读写进程的共享文件 |
| 消息传递 | 直接通信:点对点,send(P,msg)/receive(Q,msg);间接通信:通过邮箱,send(A,msg)/receive(A,msg) |
| 客户机-服务器 | socket(套接字,可跨网络)/ RPC(远程过程调用) |
2.5 线程
线程的概念
- 线程是CPU调度的基本单位
- 进程是资源分配的基本单位
- 一个进程可包含多个线程,共享进程资源
- 线程比进程更轻量,切换开销更小
进程 vs 线程
| 比较项 | 进程 | 线程 |
|---|---|---|
| 资源分配 | 资源分配的基本单位 | 不拥有系统资源(共享进程资源) |
| 调度 | (无线程时)调度的基本单位 | 调度的基本单位 |
| 并发性 | 进程间可并发 | 进程内的多线程也可并发 |
| 系统开销 | 进程创建/撤销/切换开销大(需切换页表导致TLB失效/Cache冷) | 线程切换开销小(不切换地址空间,TLB/Cache仍有效) |
| 独立性 | 进程间独立 | 同一进程内的线程共享地址空间 |
线程控制块 TCB
包含:线程标识符、寄存器状态(PC、PSW、通用寄存器)、线程运行状态、优先级、栈指针等。
线程的实现方式
| 方式 | 优点 | 缺点 |
|---|---|---|
| 用户级线程ULT | 不需内核支持,切换快,进程可专用调度算法,平台无关 | 一个线程阻塞→整个进程阻塞;不能利用多处理机 |
| 内核级线程KST | 多处理机上可并行,一线程阻塞不影响其他,内核本身也可多线程 | 模式切换开销大(用户态→内核态) |
| 组合方式 | 结合两者优点 | 实现复杂 |
多线程模型
| 模型 | 说明 | 缺点 |
|---|---|---|
| 多对一 | 多个ULT映射到一个KST | 一阻塞全阻塞,不能多处理机并行 |
| 一对一 | 每个ULT对应一个KST | 创建开销大(如Windows NT) |
| 多对多 | 多个ULT映射到≤ULT数的KST | 结合优点,最灵活 |
轻量级进程(LWP)
- 作为ULT与KST之间的中间层
- 每个LWP连接一个KST
- ULT通过LWP间接使用内核服务
2.6 程序运行环境与进程内存映像(2026趋势)
进程内存映像(Memory Image)
典型用户进程地址空间自低地址到高地址可概括为:
text(代码段) → data(已初始化全局/静态区) → bss(未初始化全局/静态区) → heap(堆,向高地址增长) ... stack(栈,向低地址增长)
- text段:机器指令与只读常量,通常只读且可共享
- data段:已初始化的全局变量和静态变量
- bss段:未初始化全局变量和静态变量(装入时清零)
- heap堆:由
malloc/new等动态扩展和回收 - stack栈:函数调用现场、局部变量、返回地址
⚠️ 易考辨析:进程共享“代码和只读数据”通常发生在同一程序多进程场景;线程共享进程地址空间,但各线程栈独立。
fork 与 COW(写时复制)
fork()后父子进程最初共享物理页框(只读映射)- 任一方尝试写入时触发保护异常,OS复制该页(Copy-On-Write)
- COW的目标:减少无效复制开销,提高创建子进程效率
2.7 信号(Signal)机制(2025新增)
信号的本质
- 信号是软件层面的异步事件通知机制,用于告知进程“发生了某事件”
- 信号不是数据传输通道,主要表达“发生了什么”而非“传了什么”
信号处理方式
- 默认处理(终止/忽略/停止/继续/核心转储)
- 显式忽略(部分信号可忽略)
- 自定义处理函数(signal handler)
常见高频信号
SIGKILL(9):立即终止,不可捕获、不可忽略SIGTERM(15):请求终止,可被捕获处理SIGCHLD:子进程状态变化通知父进程SIGSEGV:非法内存访问
生命周期与检查时机
- 流程:产生(generate)→ 未决(pending)→ 递送(deliver)→ 处理(handle)
- 内核通常在从核心态返回用户态前检查并递送可处理信号
信号 vs 信号量(常考)
| 对比项 | 信号(Signal) | 信号量(Semaphore) |
|---|---|---|
| 作用 | 异步事件通知 | 同步与互斥 |
| 是否计数资源 | 否 | 是(value体现资源数/等待数) |
| 典型场景 | 进程终止、异常通知、子进程回收 | 生产者-消费者、互斥临界区 |
⚠️ 一句话区分:Signal解决“事件到了吗”,Semaphore解决“资源够不够/次序对不对”。
🎯 本章真题锚点与最短模板
- 高频题号(2009-2025):2011Q25、2014Q26、2017Q27、2019Q23/Q24、2024Q24/Q25/Q28、2025Q22/Q46
- 优质例题:判断“创建子进程、I/O完成、时间片用完、请求I/O”引起的进程状态转换。
- 最短解题模板:
- 建立五态图:就绪、执行、阻塞及方向箭头。
- 逐事件映射:时间片到期→执行→就绪;I/O请求→执行→阻塞;I/O完成→阻塞→就绪。
- 涉及线程时先判“共享什么”:地址空间共享,栈/寄存器私有。
⚡ 秒杀版口令卡(10秒回忆)
- 口令:时间片到=就绪;等I/O=阻塞;I/O完=就绪。
- 口令:进程管资源,线程管调度。
- 口令:共享地址空间,私有栈与寄存器。