跳转至

第 2 章 进程管理

依据:《操作系统概论(2017年版)》第二章、自学考试大纲及附录答案。编号沿用大纲“考核内容与考核要求”。代码为伪代码,P=wait,V=signal。教材说明本章 Linux 内核代码不作为考试内容。

复习导航

大纲条目 层次 笔记位置与要求
1.1 顺序执行;1.2 并发执行 识记;领会 第 1 节:对比特点,解释结果为何可能不同
2.1 进程定义与结构;2.2 PCB 识记 第 2 节:定义、组成、PCB 的作用与信息
2.3 三态及转换;2.4 组织 识记 第 3 节:状态、转换条件、链接与索引
3.1—3.4 进程控制 识记 第 4 节:创建、撤销、阻塞、唤醒的条件与步骤
4.1 内核;4.2 中断定义 识记 第 5 节:内核功能、中断含义
4.3 中断处理 领会 第 5 节:断点、现场、中断入口与返回
4.4 两种执行态、系统调用;4.5 调用过程 识记;领会 第 6 节:态转换及系统调用与函数调用的区别
4.6 时钟体系;4.7 时钟机制 识记;领会 第 7 节:RTC、PIT、时钟驱动程序
5.1 线程概念与比较;5.2 线程控制 领会 第 8 节:进程与线程、两种线程实现、控制过程
6.1 同步基本概念与四条准则 领会 第 9 节:临界资源、临界区与协调
6.2 整型信号量;6.3 记录型信号量 综合应用 第 10 节:会设初值、写 P/V、跟踪数值和阻塞
6.4 生产者—消费者、读者—写者 综合应用 第 11 节:能独立建立同步程序
6.5 管程及两类应用 领会 第 12 节:条件变量、缓冲池、哲学家进餐
6.6 进程通信 识记 第 13 节:共享存储器、管道、消息缓冲队列

程序并发执行后,系统需要保存各次执行的状态,进程及其控制块便承担这一任务。内核通过调度、中断和系统调用管理执行过程,同步与通信机制则处理进程之间的协作关系。线程是在此基础上进一步划分的执行单位。

1 顺序执行与并发执行(1.1、1.2)

执行方式 特点 理解
顺序执行 顺序性 前一操作结束,才能进行后一操作
顺序执行 封闭性 在教材的独占资源模型中,运行环境的资源状态仅由本程序改变
顺序执行 可再现性 初始条件和环境相同,重复执行得到相同结果
并发执行 间断性 因共享有限资源,执行过程可能暂停再继续
并发执行 失去封闭性 共享数据和系统状态可由其他进程改变
并发执行 不可再现性 缺乏适当控制时,指令交错顺序不同可能产生不同结果

并发指多个程序在同一时间间隔内推进;单核上是交替执行,不是同一时刻都在 CPU 上执行。

例如,共享变量 counter 的初值为 0,两个进程各执行一次 counter++。这条语句可能分成“读入寄存器、加 1、写回”三步。两个进程都先读到 0 时,最终值可能是 1;一个进程完成后另一个再读,最终值为 2。高级语言语句不一定是原子操作,并发也不等于必然出错。

2 进程与进程控制块(2.1、2.2)

进程定义:进程是允许并发执行的程序在某个数据集合上的运行过程。从结构上看,它由正文段、用户数据段和进程控制块组成,三者共同构成执行环境。

  • 正文段:被执行的机器指令。
  • 用户数据段:执行时直接操作的数据。
  • PCB:描述运行环境,供操作系统管理和控制进程。

某一时刻进程内容的集合称为进程映像。进程的特征是并发性、动态性、独立性、异步性和结构特征。传统未引入线程的模型中,进程既是独立运行的基本单位,也是资源调度分配的基本单位。引入线程后,资源分配单位与调度单位需要分开讨论。

比较 程序 进程
性质 静态指令集合 程序的一次动态执行过程
存在时间 可长期保存在外存 创建后存在,结束时撤销
实体 程序代码 正文段、用户数据段、PCB
对应关系 同一程序可供多个进程执行 一个进程也可先后执行不同程序

PCB(Process Control Block)包含描述进程情况及控制运行所需的信息。每个进程有唯一 PCB。PCB 是系统感知进程存在的唯一标志。

信息类别 主要内容 用途
标识符信息 本进程、父进程、子进程标识 识别进程及关系
处理机状态信息 通用寄存器、PC、PSW、栈指针等 保存与恢复执行现场
调度信息 状态、优先级、调度所需数据 决定何时运行、运行多久
控制信息 程序和数据地址、同步通信、资源清单、链接指针 管理资源、通信及队列

多个进程轮流使用同一组 CPU 寄存器。切换进程时,必须保存原进程的寄存器值,再恢复新进程的执行现场。PCB 中的处理机状态信息使进程能够从先前暂停的位置继续运行。

3 三种基本状态与进程组织(2.3、2.4)

PCB 保存的进程状态反映了进程当前能否执行。三态模型根据进程是否获得 CPU、是否还需等待其他条件,将其分为就绪、执行和阻塞。

状态 已满足的条件 还在等待什么
就绪态 具备运行条件 CPU
执行态 已获得 CPU 正在执行
阻塞态 因资源或事件暂不能运行 I/O 完成、数据到达、资源可用等

图2-1 进程状态转换图

转换 原因
就绪 → 执行 被调度并获得 CPU
执行 → 就绪 时间片用完或被抢占
执行 → 阻塞 等待资源或事件
阻塞 → 就绪 等待条件满足,被唤醒

唤醒只会使进程进入就绪态,不会立即运行。三态模型中没有“阻塞→执行”或“就绪→阻塞”的基本转换。单 CPU 同时只能有一个进程执行,N 个 CPU 最多有 N 个;就绪队列可以为空,也可以包含全部进程。

操作系统通过组织 PCB 来组织进程。链接方式利用 PCB 的链接字段,把同状态进程串成队列;索引方式按状态建立索引表,各表项指向 PCB。就绪队列可按优先级分成多个,阻塞队列可按等待原因分成多个。

4 进程控制(3.1—3.4)

进程状态由内核的控制操作维护。创建和撤销改变进程的存在状态,阻塞和唤醒则在等待条件变化时调整状态及所属队列。

操作 触发条件 教材的一般步骤
创建 用户登录、作业调度、提供服务、应用请求 申请空白 PCB → 分配资源 → 初始化 PCB → 插入就绪队列
阻塞 请求服务未满足、等待操作完成、数据未到达、等待消息等 状态改阻塞 → 插入相应阻塞队列 → 转进程调度
唤醒 所等待的事件发生或资源可用 移出阻塞队列 → 改就绪态 → 插入就绪队列
撤销 正常结束、其他进程请求终止等;异常也可能导致结束 读取状态 → 若在执行则停止 → 按系统策略处理子孙进程 → 释放资源 → 移出 PCB

创建者为父进程,被创建者为子进程;同一父进程的子进程互为兄弟。父子可以并发执行,也可以父进程等待子进程。子进程地址空间可共享,也可独立,不能一概而论。

父进程终止时,系统可能级联终止子孙进程;UNIX 也可能把子进程交给其他进程接管,因此不能简单地说“父进程结束,子进程必结束”。fork 用于创建进程,execve 使现有进程执行新的程序代码。

5 操作系统内核与中断(4.1—4.3)

内核是计算机硬件的第一次扩充,由与硬件密切相关、执行频率高的模块组成,常驻内存。其功能包括:

  • 支撑功能:中断处理、时钟管理、原语操作。
  • 资源管理功能:进程管理、存储器管理、设备管理。

原语是一组在执行过程中不能被中断的操作,强调原子性。应用程序的一般代码不自动具有这种性质。

中断是改变处理器执行指令顺序的一种事件。CPU 暂停当前程序,转去处理事件,之后按相应机制返回。中断支持 CPU 与设备并行工作,提高利用率,也支持系统异步性。

类型 来源 例子
同步中断/内部中断/异常 与当前指令执行有关 除零、溢出、调试等
异步中断/外部中断 外部硬件产生 I/O 完成、时钟等
外部可屏蔽中断 可受中断屏蔽控制 常见 I/O 中断
外部不可屏蔽中断 紧急硬件事件 某些硬件故障

“关中断”不等于所有异常和不可屏蔽中断都不再响应。教材模型中,外部中断在一条指令执行完后检查;异常不一定发生在指令执行完毕之后。

单重中断处理过程:本次处理期间不响应新的中断,教材假定处理后返回原断点。

  1. 关中断,保护断点,保存下一条待执行指令地址。
  2. 转入中断处理程序,保存相关寄存器等硬件上下文,即保护现场。
  3. 根据中断向量查找入口信息,执行对应中断服务子例程。
  4. 恢复现场、开中断,返回断点继续执行。

图2-8 单重中断处理流程

断点记录程序恢复执行的位置,现场则包含恢复执行所需的寄存器等状态信息。中断向量标识中断源,中断描述符表 IDT 保存入口相关信息。教材 32 位 x86 实例中,表项地址为 IDT 基址+8×中断向量;8 字节是该实例的表项大小。

6 用户态、系统态与系统调用(4.4、4.5)

内核需要控制资源访问权限,用户程序因而不能任意执行特权操作。系统调用提供了受控入口,使用户程序能够在权限检查下请求内核服务。

用户态是执行用户空间代码时的状态;系统态又称核心态,执行内核代码并具有相应特权。系统调用是操作系统提供给应用程序、用于取得内核服务的程序接口。

比较 用户程序的一般函数调用 系统调用
执行状态 通常保持用户态 进入系统态执行内核服务
入口方式 转移到函数入口 通过受控的陷入/系统调用入口
查找依据 函数地址 系统调用号等
开销 常规调用开销 另有执行态转换、现场处理等开销

执行过程:用户程序调用库函数接口 → 准备系统调用号和参数 → 执行陷入指令进入内核 → 保存上下文并检查、分派请求 → 执行服务例程 → 返回结果、恢复用户态。

教材以 getpid() 间接调用 sys_getpid()、传统 x86 的 int 0x80 为例。不同平台的入口指令可能不同,但都需要通过调用号定位服务并从用户态进入系统态。库函数不等于系统调用;系统调用也不等于进程切换。

教材列举系统调用类型:进程控制、文件操作、设备管理、信息维护和通信。其作用是封装内核服务,使程序通过统一、受控的入口使用系统资源。

7 时钟体系与时钟机制(4.6、4.7)

时钟用于维护日期时间、记录文件和网络数据的时间戳、定时与报警、CPU 使用记账以及时间片控制。其中时间片控制的目的是防止进程长期独占 CPU。

部分 作用
RTC/CMOS 时钟 电池供电,为开机获取初始日期时间提供依据
OS 时钟 开机后由操作系统控制,教材通过 PIT 周期中断说明
PIT 可编程间隔定时器 晶振、计数器、保持寄存器构成,周期性产生中断
时钟驱动程序 响应时钟中断,维护时间及定时相关数据

PIT 工作过程:晶振产生固定频率脉冲 → 每个脉冲使计数器减 1 → 计数器减到 0 产生中断;中断之后,保持寄存器重新装入计数器 → 重复计数。

图2-12 PIT 的逻辑结构

时钟驱动程序四项功能:维护日期和时间;递减时间片剩余量并检查是否耗尽;CPU 使用记账;递减报警计数器。时间片减到零时需要重新调度,进程不因此被撤销。

例如每秒产生 100 次时钟中断时,一次滴答为 10 ms,50 ms 时间片对应 5 次滴答。这个数值只用于说明计算方法。Linux 2.4 的 jiffies 表示系统启动后的滴答数,不是日期时间。

8 线程(5.1、5.2)

进程模型将资源拥有和执行过程联系在一起。线程进一步将执行单位从资源容器中分离,使同一进程内的多个执行流能够共享资源并分别调度。

线程是进程中的实体,是独立调度和分派的基本单位。引入线程的目的在于提高并发性,减少创建、撤销和切换的时空开销。线程有自己的 PC、寄存器和栈等少量运行资源,同一进程的线程共享进程地址空间及其他资源。

比较角度 进程 同一进程中的线程
基本角色 资源拥有的基本单位 执行、调度与分派的基本单位
地址空间 进程间通常相互独立 共享所属进程地址空间
通信 使用进程通信机制 可直接访问共享变量,仍需同步
并发 不同进程间可以并发 同一进程内不同线程也可以并发
开销 创建、撤销、切换开销较大 通常较小,尤其同进程线程切换

线程控制块 TCB 包含线程标识、处理机状态、调度及记账信息,可按状态链接成队列。线程也有就绪、运行、阻塞三态,其转换逻辑与进程三态相同。

比较 用户级线程(教材的纯用户线程模型) 内核级线程
谁管理 用户空间线程库,内核不知道具体线程 内核建立 TCB 并管理
谁调度 内核调度进程,线程库在进程内调度 内核按线程调度
切换 通常不需进入内核,较快 需要内核参与,开销较大
阻塞式系统调用 可能阻塞整个所属进程 通常只阻塞调用线程
CPU 时间分配 同进程线程分享进程的份额 以线程为调度对象
多处理器利用 教材模型中同进程用户线程不能同时用多个 CPU 同进程多个线程可分配到不同 CPU 并行

上表采用教材的两种线程模型;用户级线程的结论以“内核只看到所属进程”为前提。

线程控制:创建时申请并初始化 TCB,加入就绪线程队列。终止原因有正常结束、异常结束、外界干预;过程为定位 TCB、停止运行并设置调度标志、移出队列并保留待收集的信息。阻塞时保存现场、改阻塞态并入相应队列,再调度其他线程。唤醒时移出阻塞队列、改就绪态并入就绪队列。用户级由线程库负责,内核级由内核负责。

9 同步与互斥的基本概念(6.1)

无论采用进程还是线程,并发执行都可能访问同一数据或等待彼此的结果。因此,系统需要约束共享资源的访问次序,并协调合作任务的执行条件。

同步机制有两个任务:使共享临界资源的进程互斥访问;使相互合作的进程按需要的先后关系协调执行。

概念 含义
临界资源 必须互斥访问的共享资源,如共享计数器
临界区 进程中访问临界资源的代码段
进入区 检查并取得进入许可的代码
退出区 释放访问权、允许其他进程进入的代码
互斥 同一临界资源一次只允许一个进程访问
协调/狭义同步 合作进程满足执行先后条件,如先产生数据再消费

基本原理是在临界区前检查和取得许可,退出时归还许可,保证相关临界区互斥执行。

四条准则:空闲让进,临界资源空闲时允许进入;忙则等待,已有进程使用时其他进程等待;有限等待,请求者在有限时间内能进入;让权等待,不能进入时释放 CPU,避免忙等。忙则等待不等于让权等待,忙等也属于等待,却持续消耗 CPU。

10 信号量与 P/V 操作(6.2、6.3,综合应用)

信号量表示资源数量、使用状况或事件关系。除初始化外,通过原子的 P/V 操作修改;以下操作均针对共享的同一个信号量对象。

10.1 整型信号量

P(S):
    while S <= 0:
        忙等
    S = S - 1

V(S):
    S = S + 1

P 操作中的条件检查和资源取得需要由底层机制保证原子性。上述代码仅表示操作语义;若直接用普通循环和赋值实现,多核环境中仍可能出现竞争。互斥信号量初值为 1,N 个同类资源初值为 N。整型机制的问题是忙等,不满足让权等待。

10.2 记录型信号量

S = { value: 整数, L: 阻塞队列 }

P(S):
    S.value = S.value - 1
    if S.value < 0:
        把当前进程加入 S.L 并阻塞,放弃 CPU

V(S):
    S.value = S.value + 1
    if S.value <= 0:
        从 S.L 唤醒一个进程

记录型 P 操作先将 value 减 1,再根据结果是否小于 0 决定阻塞。V 操作则先加 1,结果小于等于 0 时唤醒等待者。阻塞的是调用 P 的当前进程;被唤醒的进程转为就绪,不等于立即取得 CPU,也不应重新执行一次已经完成扣减的 P。

  • value ≥ 0:表示当前可用资源数量。
  • value < 0:其绝对值表示该信号量队列中的等待进程数。教材相关句子省略绝对值,理解时需补全。
操作示例,初值 1 操作后 value 结果
A 执行 P 0 A 取得许可
B 执行 P −1 B 阻塞
C 执行 P −2 C 阻塞
A 执行 V −1 唤醒一个等待者
获许可者完成并 V 0 唤醒另一个等待者
最后一个完成并 V 1 无等待者,许可归还

10.3 两种基本建模

互斥:mutex = 1,每个访问同一资源的进程都执行 P(mutex) → 临界区 → V(mutex)。

先后关系:要求 A 的 S1 完成后,B 才能执行 S2,设 done = 0;A 执行 S1 → V(done),B 执行 P(done) → S2。V 位于产生事件的进程,P 位于等待事件的进程,两者配合表达这段先后约束。

写同步题时,先确定资源和先后关系,再定义信号量、写初值、标出临界区并安排 P/V。记录型信号量消除了忙等,但错误的 P/V 顺序仍可能造成死锁,也不保证公平。

教材另介绍 AND 型信号量,用一次操作同时申请多个资源;大纲 6.2、6.3 明确列出的应用重点是整型和记录型机制。

11 两个经典同步模型(6.4,综合应用)

11.1 生产者—消费者

生产者把数据放入含 N 个槽位的缓冲池,消费者从中取出数据。双方共享缓冲区和读写指针,访问这些状态时需要互斥。缓冲池满时生产者等待,缓冲池空时消费者等待,这又构成资源数量上的同步约束。

信号量 含义 初值
mutex 缓冲池访问许可 1
empty 可申请的空缓冲区 N
full 可申请的消息 0

生产者循环:

在私有变量中生产 item
P(empty)
P(mutex)
buffer[in] = item
in = (in + 1) mod N
V(mutex)
V(full)

消费者循环:

P(full)
P(mutex)
从 buffer[out] 取到私有变量 item
out = (out + 1) mod N
V(mutex)
V(empty)
在临界区外消费 item

图2-18 生产者—消费者共享缓冲池

必须先申请资源,再申请互斥权。缓冲池已满时,若生产者先 P(mutex) 再 P(empty),它会持有 mutex 并等待空位。消费者此时取不到 mutex,也就取不走数据、无法释放空位。双方因此死锁。缓冲池为空时,消费者反过来也会遇到同样的问题。

生产和消费放在临界区外,临界区只保护缓冲区及共享指针。P/V 执行过程中,资源可能已被预留但尚未发布,因此不能在任意时刻用 empty.value + full.value = N 判断状态;稳定状态下,实际空位数和消息数之和才是 N。

11.2 读者—写者

多个读者可以同时读取数据;只要有写者访问数据区,就需要排除其他读者和写者。设 readcount = 0,rmutex = 1 保护计数器,wmutex = 1 控制共享数据区。

读者:

P(rmutex)
if readcount == 0: P(wmutex)
readcount++
V(rmutex)

读共享数据

P(rmutex)
readcount--
if readcount == 0: V(wmutex)
V(rmutex)

写者:

P(wmutex)
写共享数据
V(wmutex)

第一个读者为读者群申请数据区,最后一个读者归还;其他读者不必逐个申请 wmutex。readcount 的增减受 rmutex 保护,实际读操作不应放在 rmutex 临界区内,否则读者会被串行化。

这是读者优先模型:已有读者时,新读者可以继续加入,写者可能饥饿。若题目要求写者优先,需要另设同步方案。

11.3 教材综合题:单缓冲区读文件并打印

pA 每次从磁盘读一条记录到公共缓冲区,pB 每次取出并打印一条;缓冲区只容一条。它是 N=1 的生产者—消费者问题,设 empty=1, full=0, mutex=1。

pA 循环:

从文件读记录到私有变量
P(empty)
P(mutex)
写入公共缓冲区
V(mutex)
V(full)

pB 循环:

P(full)
P(mutex)
从公共缓冲区复制到私有变量
V(mutex)
V(empty)
打印私有变量中的记录

与附录一致,取出到私有变量后就可以归还 empty,不必等待打印完成;如果直接从公共缓冲区打印,则必须保证打印结束前不会被覆盖。终止协议由题目另外约定,以上表达逐条交替的同步关系。

12 管程(6.5,领会)

信号量要求程序在各个访问位置正确安排 P/V 操作。管程把共享数据及其操作集中封装,通过统一入口保证互斥,并用条件变量表达等待关系。

管程由两部分组成:描述共享资源的数据结构,以及在这一结构上的管理过程。具体包括变量定义、初始化代码和操作共享资源的过程。其特点:资源封装在管程内部,外部不能直接访问;进程通过入口过程使用资源;任意时刻只有一个进程在管程内活跃执行,互斥由语言及相应机制保证。

条件变量支持等待条件:x.wait() 将进程加入该条件的等待队列,阻塞并释放管程的执行权;x.signal() 唤醒等待者,若无人等待则没有效果。条件变量不积累“资源许可”,与信号量的 V 不同。

12.1 管程实现生产者—消费者

把缓冲区、count、放入和取出过程集中在一个管程。教材把“缓冲池满”的条件变量命名为 full,把“缓冲池空”的条件变量命名为 empty。这两个名称与上节资源信号量的含义不同。

  • 放入:满则在 full 条件上等待;允许放入后写缓冲区、count 加 1,通知在 empty 条件上等待的消费者。
  • 取出:空则在 empty 条件上等待;允许取出后读缓冲区、count 减 1,通知在 full 条件上等待的生产者。

教材用 if 展示条件等待。若采用唤醒者继续、等待者稍后重新进入的语义,应以 while 重查条件;不能把教材伪代码不加说明地视为任何语言都可直接运行的代码。

12.2 哲学家进餐

5 人围坐,每人进餐需要左右两支筷子。若所有人各拿一支再等另一支,可能死锁。教材管程为每人设置 thinking、hungry、eating 状态和条件变量 self[i],左右邻居下标是 (i+4) mod 5、(i+1) mod 5。

test(i):
    if state[i] == hungry and 左右邻居都不是 eating:
        state[i] = eating
        self[i].signal()

pickup(i):
    state[i] = hungry
    test(i)
    if state[i] != eating:
        self[i].wait()

putdown(i):
    state[i] = thinking
    test(左邻居)
    test(右邻居)

哲学家在管程外思考和进餐,进入管程只是检查、改变状态。该方法不让相邻两人同时进餐,并避免“各占一支筷子再等待”的死锁模式;若没有额外公平策略,不能据此宣称每个人都必定有限等待。

13 进程通信(6.6,识记)

通信用于进程间交换信息,教材先介绍共享存储器、消息传递和管道,再介绍消息缓冲队列机制。

方式 主要思想 注意
共享存储器 共享数据结构或一块存储区,通过读写交换数据 共享不自动保证互斥与同步
消息传递 经操作系统提供的发送、接收功能交换格式化消息 可直接发给目标,也可经信箱间接传递
管道 连接读写进程的特殊文件,以字符流传递数据 以流式接口读写;“特殊文件”不表示数据必然保存到磁盘
消息缓冲队列 发送方申请缓冲区并入接收方消息队列,接收方取出复制 消息队列本身也需互斥及资源同步

消息缓冲区通常含发送进程标识、消息长度、正文和下一缓冲区指针;PCB 相应增加队列指针、互斥信号量、资源信号量等信息。大纲明确列出的识记内容包括共享存储器、管道和消息缓冲队列。

14 教材本章习题

题目取自教材第二章习题,答案依据教材附录。

14.1 单项选择题

1. 下列选项中,操作系统提供给应用程序的接口是( )。

  • A. 系统调用

  • B. 中断

  • C. 库函数

  • D. 原语

答案与解析

参考答案:A。

系统调用是应用程序取得内核服务的程序接口;库函数可能只是对系统调用的封装。

2. wait(s) 操作中的 block(s, L) 阻塞的进程是( )。

  • A. 申请资源的进程

  • B. 申请临界资源的进程

  • C. 调用 wait(s) 的进程

  • D. 提供 wait(s) 操作的系统进程

答案与解析

参考答案:C。

执行 P 操作后发现资源不可用时,当前调用 P 的进程进入阻塞队列。

3. 在一个单处理机系统中存在 5 个进程,处于就绪队列中的就绪进程数最多为( )。

  • A. 0 个

  • B. 4 个

  • C. 5 个

  • D. 6 个

答案与解析

参考答案:C。

题目只问就绪队列,5 个进程可以全部处于就绪态;单处理机最多同时执行其中 1 个,并不意味着必须有 1 个执行态进程。

4. 若记录型信号量 s 初值为 2,当前值为 −1,则 s 的阻塞队列中有( )个进程。

  • A. 0 个

  • B. 1 个

  • C. 2 个

  • D. 3 个

答案与解析

参考答案:B。

记录型信号量值为负时,负值的绝对值表示阻塞队列中的进程数。

14.2 填空题

1. 进程是由正文段、和构成的实体。

答案与解析

用户数据段;进程控制块。

2. 进程的 3 种基本状态是执行态、态和态。

答案与解析

就绪;阻塞。

3. 整型信号量的值只能被和改变。

答案与解析

wait 操作;signal 操作。

4. 临界区是指访问___的代码。

答案与解析

临界资源。

14.3 简答题

1. 什么是进程?说明进程与程序的区别和联系。

答案与解析

进程是允许并发执行的程序在某个数据集合上的运行过程,由正文段、用户数据段和 PCB 组成。程序是静态的指令集合,进程是动态的执行过程;程序可长期保存在外存,进程有创建和撤销;一个程序可以对应多个进程,一个进程通常对应一次程序执行。

2. 操作系统在什么时候创建进程?如何创建?

答案与解析

用户登录、作业调度、提供服务、应用请求时可创建。步骤为:申请空白 PCB → 分配资源 → 初始化 PCB → 插入就绪队列。

3. 时钟中断信号如何产生?时钟驱动程序有什么功能?

答案与解析

PIT 的晶振产生固定频率脉冲,计数器随脉冲递减,减到 0 后产生时钟中断,并从保持寄存器重新装载计数值。时钟驱动程序维护日期时间,递减并检查当前进程时间片,记录 CPU 使用情况,递减报警计数器。

4. 请说明单重中断的处理过程。

答案与解析

关中断并保护断点 → 保存寄存器等现场 → 根据中断向量找到服务程序 → 执行中断服务 → 恢复现场、开中断并返回断点。

5. 进程具有哪些特征?

答案与解析

并发性、动态性、独立性、异步性、结构特征。

6. 什么是线程?为什么要引入线程?

答案与解析

线程是进程中的实体,是独立调度和分派的基本单位,拥有 PC、寄存器、栈等少量资源并共享所属进程资源。引入线程可以减少进程创建、撤销和切换的开销,提高并发程度。

7. 实现进程互斥的基本原理是什么?

答案与解析

把访问临界资源的代码置于临界区;进入前申请访问许可,临界区内一次只允许一个进程,退出时释放许可并唤醒等待者,同时满足空闲让进、忙则等待、有限等待、让权等待。

14.4 综合应用题

题目: 有两个进程 pA、pB 合作解决文件打印问题:pA 将文件记录从磁盘读入主存缓冲区,每次读一个记录;pB 将缓冲区内容打印出来,每次打印一个记录。缓冲区大小等于一个记录大小。请用记录型信号量的 wait(s) 和 signal(s) 保证正确打印,并写出同步代码。

答案与解析

设置 mutex 保护缓冲区,empty 表示空缓冲区,full 表示已有记录。初值为:

mutex.value = 1
empty.value = 1
full.value = 0

pA:

while 还有记录:
    从磁盘读一条记录到私有变量
    wait(empty)
    wait(mutex)
    将私有变量中的记录写入公共缓冲区
    signal(mutex)
    signal(full)

pB:

while 还有记录:
    wait(full)
    wait(mutex)
    从公共缓冲区复制一条记录到私有变量
    signal(mutex)
    signal(empty)
    打印私有变量中的记录

要点:三个信号量的含义和初值正确;生产者先申请 empty,消费者先申请 full;访问公共缓冲区时使用 mutex;取出记录后释放 empty。

15 闭卷复习与 PV 建模检查(补充)

自测题(自编) 参考答案与辨析
阻塞进程得到事件通知后,是否直接进入执行态? 通常先进入就绪态,等待 CPU 调度。
PCB 为什么重要? 保存身份、处理机现场、调度和资源控制信息,是系统管理和识别进程的重要依据。
一次系统调用是否一定引起进程切换? 不一定。用户态进入内核态是特权级转换,只有需要阻塞或重新调度等情况才可能换进程。
整型信号量与记录型信号量等待方式有何不同? 整型机制典型实现忙等,记录型机制在资源不足时把进程挂入等待队列并阻塞。
记录型信号量值为 -3,按本书定义说明什么? 有 3 个进程因等待该信号量而阻塞;非负时表示可用资源数。
同一进程的线程是否所有状态都共享? 共享进程的地址空间和资源,但各有自己的执行现场、寄存器及栈等。

PV 建模需要明确各进程执行的动作、共享资源以及动作之间的先后约束。对需要独占访问的资源设置互斥信号量;对等待数据或事件的条件设置同步信号量。初值根据初始资源数量确定,P/V 操作则放在相应动作之前或之后。P/V 操作本身具有原子性。

对有 n 个槽的有界缓冲,empty=n、full=0、mutex=1。生产者应先 P(empty) 再 P(mutex),消费者先 P(full) 再 P(mutex)。若把等待资源放在取得 mutex 之后,可能锁住缓冲区而无法等到另一方生产或释放。两个进程中使用的同一互斥信号量必须指向同一对象。

同步方案的正确性取决于各种可能的交错次序。除双方正常交替外,还需检查空缓冲时消费者先执行、满缓冲时生产者先执行等情况。这些情形下要确认,等待中的进程不会阻碍另一方改变等待条件。记录型 P 阻塞后被唤醒,是继续完成原来的等待,不是把 P 的减 1 再重复做一次。读者优先方案允许读者并行,但持续到来的读者可能让写者饥饿,应按题目要求说明公平性。

与后续章节的联系:第三章调度选择就绪进程;第四章缺页会使进程等待 I/O;第六章公共缓冲池直接复用本章的资源信号量和队列互斥方法。