操作系统期末复习全景指南

基于全部课程资料整理

📚 知识点清单 + 手写笔记 + 问答50题 📝 填空判断 + 选择练习 + 样卷真题
第一部分:第1-4章 核心理论
1

操作系统概述

1.1 操作系统的定义

操作系统(Operating System, OS)是管理和控制计算机系统中的所有软件、硬件资源,合理地组织计算机的工作流程,并为用户提供一个良好的工作环境和友好接口的系统软件

OS 是配置在计算机硬件上的第一层软件,是硬件之上的第一层扩充,其他所有软件都在 OS 的支持下运行。

⚠ 易错点 操作系统是系统软件,不是应用软件。应用软件在操作系统之上运行,依赖于操作系统的支持。

1.2 操作系统的层次结构

计算机系统由上而下的层次:

层次结构(由上到下) 应用系统与应用软件 → 操作系统(OS) → 其他系统软件(编译程序等) → 裸机

操作系统位于其他系统软件之下,直接管理硬件资源,是最基本的系统软件。

⚠ 易错点 操作系统位于其他系统软件之下,不是之上。题目中若将顺序写为"应用软件→OS→其他系统软件→裸机"是错误的。正确顺序应为"应用软件→其他系统软件→OS→裸机"。

1.3 操作系统的四大特征

特征一:并发(Concurrency)

宏观上同一时间区段内多个事件同时发生,微观上多个程序交替执行。在单处理机系统中,多个程序并发执行时,它们在时间上重叠,但任一时刻只有一个程序在处理机上执行。

特征二:共享(Sharing)

系统中的资源可供多个并发执行的进程共同使用。资源共享以并发执行为条件,没有并发就没有共享。

  • 互斥共享:一段时间内只允许一个进程访问(如打印机)
  • 同时访问:一段时间内允许多个进程同时访问(如磁盘文件)

特征三:虚拟(Virtual)

通过某种技术把物理上的一个实体变为逻辑上的多个对应物。

  • 虚拟处理机:多道程序并发执行,每个用户感觉独占一台处理机
  • 虚拟存储器:通过请求调页/调段,将外存当内存使用
  • 虚拟设备:SPOOLing 技术将独占设备变为共享设备

特征四:异步(Asynchronism)

多道程序环境下,进程以不可预知的速度推进(走走停停)。但只要运行环境相同,OS 必须保证多次执行结果一致。

💡 关键区分
  • 并发 vs 并行:并发是宏观同时、微观交替;并行是微观同一时刻同时执行(需多处理机)
  • 并发是最重要的特征:其他三个特征均以并发为前提
  • 单处理机系统中只能并发不能并行,但程序执行与 I/O 操作可以并行

1.4 操作系统的功能

  • 处理器管理(进程管理)核心功能:进程的创建与撤销、调度、同步与互斥、通信、死锁处理
  • 存储器管理:内存分配与回收、地址重定位(逻辑地址→物理地址)、存储保护、存储扩充(虚拟存储)
  • 设备管理:缓冲管理、设备分配与调度、设备驱动、虚拟设备(SPOOLing)
  • 文件管理:文件存储空间管理、目录管理、文件的读写管理、存取控制
  • 用户接口:命令接口(联机/脱机)、程序接口(系统调用)、图形接口(GUI)

1.5 操作系统的接口类型

  • 命令接口
    • 联机命令接口(交互式):用户输入一条命令,系统立即执行并返回结果
    • 脱机命令接口(批处理):用户将作业说明书提交系统,系统批量处理
  • 程序接口(系统调用):用户程序请求 OS 服务的接口,是用户态向核心态请求服务的途径
  • 图形接口(GUI):用户通过图形窗口、图标、菜单与系统交互
💡 区分 系统调用是程序接口(程序使用),命令接口是用户直接使用的接口。两者的本质区别在于使用方式不同。

1.6 操作系统类型

类型特点关键指标交互方式
批处理系统 用户将作业提交给系统后,系统自动调度执行,不允许用户随时干涉程序运行 吞吐量、资源利用率 脱机(非交互)
分时系统 将处理机时间划分为时间片,轮流分配给各终端用户;允许多个用户以交互方式使用计算机 响应时间 联机(交互式)
实时系统 及时响应外部事件,有严格时间约束;分为硬实时和软实时 可靠性、及时性 事件驱动
记忆要点:批处理看吞吐量,分时看响应时间,实时看可靠性和及时性

1.7 核心态与用户态

区分原因

  • 保护操作系统内核和关键数据结构,防止用户程序随意修改
  • 限制用户程序只能访问自己的地址空间,保证系统安全
  • 核心态可执行所有指令(含特权指令),用户态只能执行非特权指令

切换时机

  • 用户态 → 核心态("自陷"):
    • 系统调用(用户程序主动请求 OS 服务)
    • 中断(I/O 中断、时钟中断等外部事件)
    • 异常(缺页中断、除零错误、地址越界等)
  • 核心态 → 用户态:OS 完成服务后,通过中断返回指令(iret)交还控制权
💡 核心区分 模式切换(用户态 ↔ 核心态)是同一进程内的 CPU 状态切换,不改变进程的运行状态。
进程切换则是不同进程之间的切换,涉及保存/恢复上下文。
两者是不同的概念,不要混淆。

1.8 多道程序设计

多道程序设计技术是指允许多个程序同时存在于内存中,并交替使用处理机的技术。

引入意义

  • 使并发和共享成为可能(OS 四大特征的前提)
  • 提高了系统资源利用率吞吐量
  • 延长了每道程序的单次执行时间(因需与其他程序共享 CPU)
💡 易错点
  • 多道程序设计 并行。单处理机下只能并发不能并行
  • 程序执行与 I/O 操作可以并行(CPU 在执行程序 A 时,程序 B 可以同时进行 I/O)
  • 引入多道程序设计的目的是提高资源利用率和吞吐量,不是缩短每道程序执行时间

1.9 原语与系统调用

原语(Primitive)

OS 中完成特定功能且不可中断(原子性)的基本操作过程。原语在执行期间不允许被中断,通常通过关中断来实现。如进程创建、撤销、阻塞、唤醒等进程控制操作。

系统调用(System Call)

OS 为用户程序提供的接口,是用户态程序向核心态请求 OS 服务的途径。用户程序需要使用 I/O、文件操作等功能时,必须通过系统调用进入核心态。

记忆要点:原语 = 不可中断的基本操作;系统调用 = 用户态→核心态的桥梁。两者都运行在核心态。

1.10 其他重要概念

  • 计算机系统资源:包括硬件资源(CPU、内存、I/O 设备)和软件资源(程序、数据),不仅仅是程序和数据
  • 指令寄存器(IR):存放当前正在执行的指令
  • Linux是自由软件(free software),可自由修改和发布;采用宏内核架构
  • 内核架构:宏内核(Linux)vs 微内核,宏内核性能更好但可靠性较低
  • 没有用户执行时 CPU 不完全空闲:系统进程仍在运行
⚠ 第1章易错点汇总
  • OS 是系统软件,不是应用软件
  • OS 层次结构中,OS 在其他系统软件之下
  • 系统资源包括硬件软件资源,不只是程序和数据
  • 并发 ≠ 并行;单处理机只能并发不能并行
  • 多道程序设计提高吞吐量,但延长单道程序执行时间
  • 模式切换 ≠ 进程切换
2

进程管理

2.1 进程的定义

进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位。

进程是一个动态的概念,具有生命周期:由创建而产生,由调度而执行,由撤销而消亡。

关键定位:进程是资源分配的基本单位(拥有独立的地址空间),线程是CPU 调度的基本单位。

2.2 进程的组成

进程由三部分组成:

进程组成 进程 = 程序段 + 数据段 + PCB(进程控制块)
  • 程序段:进程要执行的代码
  • 数据段:进程处理的数据
  • PCB:进程控制块,进程存在的唯一标志
⚠ 易错点 进程由程序 + 数据 + PCB 三部分组成,不能遗漏 PCB。若题目说"进程由程序和数据组成"是错误的。

2.3 进程控制块(PCB)详解

PCB 的核心地位

  • PCB 是进程存在的唯一标志 — 系统通过 PCB 感知进程的存在
  • 每个进程有且仅有唯一的 PCB
  • PCB 由操作系统创建和管理,用户不能创建或删除 PCB
  • 撤销进程时,除了释放 PCB,还需释放进程占用的所有资源(内存、打开的文件等)

PCB 包含的信息

信息类别具体内容
进程标识信息进程标识符 PID、父进程标识符、用户标识符 UID
处理机状态通用寄存器、指令计数器 PC、程序状态字 PSW、栈指针
进程调度信息进程状态、优先级、调度所需信息、等待事件
进程控制信息程序和数据地址、资源清单、链接指针(队列指针)
⚠ 高频易错
  • 撤销进程不只释放 PCB,还需释放所有占用的资源
  • PCB 由OS管理,不是用户创建和管理的

2.4 进程与程序的区别

对比维度程序进程
性质静态的(指令集合)动态的(执行过程)
生命周期永久的(可长期保存)暂时的(有创建和撤销)
对应关系一个程序可对应多个进程;一个进程也可包含多个程序
资源不占用系统资源占用 CPU、内存等资源
存在标志存储在磁盘上PCB 是其唯一标志

进程与程序的四种关系

  • 一对一:一个独立程序运行,只产生一个进程
  • 一对多:浏览器打开多个窗口,每个窗口一个进程
  • 多对一:多个程序链接到一个可执行文件中,运行形成一个进程
  • 多对多:分布式系统中多个程序在多台机器上运行

2.5 进程状态与转换

三态模型(基本状态)

  • 就绪态(Ready):已具备运行条件(已获得除 CPU 外的所有资源),等待被调度执行
  • 运行态(Running):正在 CPU 上执行
  • 阻塞态(Blocked / Waiting):因等待某事件(如 I/O 完成)而暂停执行
三态转换关系 就绪 ⇄ 运行 → 阻塞 → 就绪 (注意:阻塞不能直接变为运行态)
转换方向触发条件由谁决定
就绪 → 运行调度程序选中该进程调度程序
运行 → 就绪时间片用完 / 更高优先级进程到来(抢占式)调度/中断
运行 → 阻塞请求 I/O / 等待某事件(主动行为)进程自身
阻塞 → 就绪I/O 完成 / 等待的事件发生系统/外部事件
💡 重点理解
  • 进程自身只能决定"运行 → 阻塞"(主动请求 I/O)
  • 阻塞条件解除后变为就绪态(非运行态)— 必须再经过调度才能运行
  • 进程状态转换由操作系统完成,对用户是透明的
⚠ 高频易错
  • 阻塞 → 运行错误的!阻塞只能先变就绪,再被调度为运行
  • "有新进程进入就绪状态"不是引起进程切换的直接原因,只有 CPU 空闲或当前进程让出 CPU 时才调度新进程

2.6 五态模型

在三态模型基础上增加两个状态:

  • 新建态(New):进程刚被创建,OS 正在为其分配资源、初始化 PCB
  • 终止态(Terminated):进程执行完毕或异常终止,OS 正在回收资源
五态转换 新建 → 就绪 ⇄ 运行 → 终止 ↑ ↓ ↓ ←── 阻塞 ←───┘

2.7 进程控制原语

进程控制通过原语实现,保证操作的原子性(不可中断)。

原语操作内容状态变化
创建原语分配 PCB、分配资源、初始化、挂入就绪队列→ 就绪态
撤销原语收回资源、撤销 PCB、从队列移除终止态 → 消亡
阻塞原语保存 CPU 现场到 PCB、修改状态、移入等待队列运行 → 阻塞
唤醒原语从等待队列移出、修改状态、挂入就绪队列阻塞 → 就绪

2.8 引起进程切换的五种情况

  1. 时间片用完:当前运行进程的时间片耗尽
  2. 进程阻塞:请求 I/O 或等待某事件
  3. 进程终止:执行完毕或出错退出
  4. 更高优先级进程到来:抢占式调度中,高优先级进程抢占 CPU
  5. 中断发生:如 I/O 中断完成,唤醒了更高优先级的进程

2.9 线程

基本概念

  • 线程是进程内的一个相对独立的执行单位
  • 线程是CPU 调度的基本单位,进程是资源分配的基本单位
  • 同一进程内的线程共享进程的资源(地址空间、文件描述符等)
  • 同一进程或不同进程内的线程都可以并发执行
  • 线程切换的开销远小于进程切换(无需切换地址空间)
对比维度进程线程
基本单位资源分配的基本单位调度的基本单位
地址空间独立的地址空间共享进程的地址空间
资源拥有独立的资源共享进程资源
切换开销大(需切换地址空间)小(同一地址空间内)
通信需 IPC 机制,开销大可直接读写共享变量
并发性可以并发可以并发(粒度更细)
用户级线程

不依赖内核,由用户空间线程库管理。切换不需要模式切换,开销小。但内核不知道其存在,一个线程阻塞会导致整个进程阻塞。

内核级线程

依赖内核支持。切换需要模式切换,开销大。但能利用多处理机并行,一个线程阻塞不影响其他线程。

⚠ 第2章易错点汇总
  • 进程 = 程序 + 数据 + PCB(不能遗漏 PCB)
  • PCB 是进程存在的唯一标志,由OS创建管理
  • 撤销进程需释放所有资源,不只是 PCB
  • 阻塞 → 就绪(不是运行)
  • 进程自身只能决定"运行 → 阻塞"
  • "新进程进入就绪"不是进程切换的直接原因
  • 线程是调度单位,进程是资源分配单位

2.10 进程间的制约关系

  • 间接制约(互斥):源于进程间共享资源的竞争关系 — 如多个进程竞争打印机
  • 直接制约(同步):源于进程间合作的协同关系 — 如生产者-消费者的协作
  • 进程通信:进程间交换数据的方式(共享存储、消息传递、管道通信等)
3

进程同步与互斥

3.1 同步与互斥的概念

  • 同步(Synchronization):进程间的直接制约关系(合作关系)。多个进程为完成同一任务而相互合作,需要按一定顺序协调执行。例如接力赛中选手之间的配合。
  • 互斥(Mutual Exclusion):进程间的间接制约关系(竞争关系)。多个进程因共享临界资源而必须排他地访问。例如多人借同一本书、多人同时选课。

3.2 临界区与临界资源

  • 临界资源:一次仅允许一个进程访问的共享资源(如打印机、共享变量)
  • 临界区:访问临界资源的代码段(是一段程序,不是缓冲区或数据区)

临界区访问的四个准则

  1. 空闲让进:临界区空闲时,应允许一个进程进入
  2. 忙则等待:已有进程在临界区时,其他进程必须等待
  3. 有限等待:等待进入的进程不能无限期等待(避免饥饿)
  4. 让权等待:不能进入临界区的进程应释放 CPU,避免"忙等"
⚠ 高频易错 互斥只保证同一时间只有一个进程在临界区内,但进程在临界区内仍可被中断(如时间片用完)。只是另一个进程不能进入临界区。

3.3 信号量机制(P/V 操作)

信号量的组成

信号量结构 semaphore S = { value: 整数值, queue: 等待队列 PCB 指针 }

S.value 表示可用资源数量,S.queue 是等待该信号量的进程队列。

P 操作(wait / 申请资源)

P 操作伪代码 P(S) { S.value = S.value - 1; // 申请资源,资源数减1 if (S.value < 0) { // 资源不够 将当前进程加入 S.queue; // 阻塞当前进程 block(S.queue); } }

V 操作(signal / 释放资源)

V 操作伪代码 V(S) { S.value = S.value + 1; // 释放资源,资源数加1 if (S.value <= 0) { // 有等待进程 从 S.queue 取出一个进程; // 唤醒一个等待进程 wakeup(P); } }
P/V 操作核心判断条件 P 操作后:S.value < 0 → 阻塞(资源不足)
V 操作后:S.value ≤ 0 → 唤醒(有进程在等)
⚠ 最高频易错点 V 操作后判断条件是 S.value ≤ 0含等于),不是 S.value < 0
理解:S.value 加 1 后如果仍 ≤ 0,说明加 1 之前是负数(有进程在等),需要唤醒。
💡 信号量初值与含义
  • 初值不能为负数,表示可用资源数量
  • 初值为正数时:有多个资源实例可用
  • 运行中值为负数时:绝对值 = 等待队列中的进程数
  • S.queue 为空时,S.value ≥ 0
  • 互斥信号量初值通常为 1,同步信号量初值根据资源数确定

3.4 信号量值的含义

信号量值含义可用资源数等待进程数
初值=3,当前值=1已分配2个,剩余1个10
初值=3,当前值=-1已分配4个,1个在等待01
mutex=1,当前值=-31个在临界区,3个在等待03
当前值=2有2个资源实例可分配20

3.5 经典问题一:生产者-消费者问题

问题描述

一组生产者向缓冲区放入产品,一组消费者从缓冲区取出产品。缓冲区大小为 N。

同步关系:缓冲区不满时生产者才能放(empty),缓冲区不空时消费者才能取(full)。

互斥关系:对缓冲区的访问互斥(mutex)。

信号量定义

信号量定义 semaphore mutex = 1; // 互斥信号量,保护缓冲区 semaphore empty = N; // 同步信号量,空缓冲区数 semaphore full = 0; // 同步信号量,满缓冲区数 item buffer[N]; // 缓冲区 int in = 0, out = 0; // 放入/取出位置

生产者进程

生产者代码 Producer() { while (true) { 生产一个产品 item; P(empty); // ① 申请空缓冲区(同步) P(mutex); // ② 申请互斥访问缓冲区 buffer[in] = item; in = (in + 1) % N; V(mutex); // ③ 释放互斥 V(full); // ④ 增加满缓冲区(同步) } }

消费者进程

消费者代码 Consumer() { while (true) { P(full); // ① 申请满缓冲区(同步) P(mutex); // ② 申请互斥访问缓冲区 item = buffer[out]; out = (out + 1) % N; V(mutex); // ③ 释放互斥 V(empty); // ④ 增加空缓冲区(同步) 消费产品 item; } }
⚠ 必考要点:P 操作顺序不能颠倒
  • P(empty) 必须在 P(mutex) 之前!若先 P(mutex) 再 P(empty),当缓冲区满时生产者持有 mutex 却被 empty 阻塞,消费者也无法获取 mutex 取出产品 → 死锁
  • V 操作顺序无关紧要:V 操作不会阻塞,交换 V(mutex) 和 V(full) 的顺序不影响正确性
💡 解题套路 先同步后互斥:P 操作时先 P 同步信号量,再 P 互斥信号量。V 操作时顺序随意,但通常先 V 互斥再 V 同步。

3.6 经典问题二:读者-写者问题

问题描述

多个读者可以同时读,写者必须互斥(与读者和其他写者都互斥)。

互斥关系:写-写互斥、读-写互斥;读-读不互斥(可共享)。

信号量定义

信号量定义 semaphore rw = 1; // 互斥访问共享数据 semaphore mutex = 1; // 互斥访问 readcount int readcount = 0; // 当前读者数

写者进程

写者代码 Writer() { while (true) { P(rw); // 申请写权限 写数据; V(rw); // 释放写权限 } }

读者进程(读优先)

读者代码(读优先) Reader() { while (true) { P(mutex); // 互斥访问 readcount readcount++; if (readcount == 1) // 第一个读者加锁 P(rw); // 阻止写者 V(mutex); // 释放 readcount 互斥 读数据; // 多个读者可同时读 P(mutex); readcount--; if (readcount == 0) // 最后一个读者解锁 V(rw); // 允许写者 V(mutex); } }
💡 读优先的问题 读优先策略可能导致写者饥饿(只要有读者不断到来,写者永远等不到)。解决方法是采用写优先(公平策略):增加一个信号量 w=1,读者在读之前先 P(w),写者在写之前先 P(w),保证写者有机会获得执行权。
解题关键:第一个读者负责加锁 P(rw),最后一个读者负责解锁 V(rw),中间读者不需要操作 rw。readcount 用 mutex 保护。

3.7 经典问题三:哲学家进餐问题

问题描述

5 个哲学家围圆桌而坐,桌上每两人之间放一根筷子。哲学家交替进行思考和进餐。进餐需要同时拿起左右两根筷子。

互斥关系:每根筷子是临界资源(相邻哲学家共享一根筷子)。

死锁风险:若所有哲学家同时拿起左筷子,再拿右筷子时全部阻塞 → 死锁

信号量定义

信号量定义 semaphore chopstick[5] = {1,1,1,1,1}; // 5根筷子,各为互斥信号量 semaphore room = 4; // 限制最多4人同时进餐(防死锁)

哲学家进程(防死锁方案一:限制人数)

哲学家 i 的代码(限制最多4人进餐) Philosopher(int i) { while (true) { 思考; P(room); // 申请进餐(最多4人) P(chopstick[i]); // 拿左筷子 P(chopstick[(i+1)%5]); // 拿右筷子 进餐; V(chopstick[i]); // 放左筷子 V(chopstick[(i+1)%5]); // 放右筷子 V(room); // 释放进餐位 } }

防死锁方案二:奇偶号不同拿法

哲学家 i 的代码(奇偶策略) Philosopher(int i) { while (true) { 思考; if (i % 2 == 0) { // 偶数号:先左后右 P(chopstick[i]); P(chopstick[(i+1)%5]); } else { // 奇数号:先右后左 P(chopstick[(i+1)%5]); P(chopstick[i]); } 进餐; V(chopstick[i]); V(chopstick[(i+1)%5]); } }

防死锁方案三:两根都可用才拿

哲学家 i 的代码(原子拿两根) Philosopher(int i) { while (true) { 思考; P(mutex); // 互斥检查两根筷子是否都可用 P(chopstick[i]); P(chopstick[(i+1)%5]); V(mutex); 进餐; V(chopstick[i]); V(chopstick[(i+1)%5]); } }
💡 三种防死锁方案对比
  • 限制人数:最多 4 人同时拿筷子 → 至少有1人能拿到两根(破坏循环等待)
  • 奇偶策略:奇数号和偶数号拿筷子顺序不同 → 不会形成环路(破坏循环等待)
  • 原子拿两根:两根筷子都可用时才拿 → 不会出现只拿一根的情况(破坏请求与保持)

3.8 管程(Monitor)

管程是一种高级同步机制,将共享变量及对共享变量的操作封装在一个模块中。

管程的特点

  • 管程内的共享变量只能被管程内的过程访问
  • 每次仅允许一个进程进入管程执行(互斥由编译器/语言自身保证)
  • 程序员无需手动编写 P/V 操作,降低了出错风险
  • 管程中使用 condition 变量实现同步(类似信号量但有区别)
管程 vs 信号量:信号量需要程序员分散地写 P/V 操作,容易遗漏或顺序错误;管程将同步机制集中封装,互斥由系统自动保证,更安全可靠。

3.9 前驱关系同步问题

当多个进程中的语句有前驱依赖关系时,每条边对应一个信号量,初值为 0

  • 前驱语句执行完后 V(对应信号量)
  • 后继语句执行前 P(对应信号量)

例如 S1 → S2 表示 S1 必须先于 S2 执行,则设信号量 s=0,S1 后 V(s),S2 前 P(s)。

3.10 经典同步问题分类

问题类型说明
生产者-消费者同步 + 互斥同步(空/满缓冲),互斥(缓冲区访问)
读者-写者互斥写者互斥,读者可共享
哲学家就餐互斥筷子是临界资源,可能死锁
司机-售票员同步(无互斥)前驱后继合作关系
飞机订票互斥共享票务资源
吸烟者问题同步供应者与吸烟者的合作关系
桥梁交通管理互斥 + 同步不同方向互斥,同方向计数同步
⚠ 第3章易错点汇总
  • P 操作后 S < 0 才阻塞;V 操作后 S ≤ 0 才唤醒(注意等号!)
  • 生产者-消费者中 P(empty) 必须在 P(mutex) 之前,否则死锁
  • V 操作顺序无关紧要(不会阻塞)
  • 临界区内进程可被中断(但其他进程不能进入临界区)
  • 信号量初值不能为负,运行中可为负(绝对值=等待进程数)
  • 使用多个互斥信号量时应按相同顺序加锁,避免死锁
4

死锁

4.1 死锁的定义

多个进程因竞争资源而形成一种互相等待的僵局,若无外力作用,这些进程都将无法继续执行。

死锁与进程并发执行的进度资源分配策略有关,是一种和时间有关的错误。

⚠ 易错点 死锁 ≠ 计算机死机 ≠ 用户操作不当。死锁是进程间因竞争资源形成的互相等待状态,不是系统崩溃。

4.2 死锁的四个必要条件

注意:这四个条件必须同时满足才会发生死锁。只要破坏其中任何一个,就能预防死锁。

条件一:互斥条件(Mutual Exclusion)

资源一次只能被一个进程使用。即资源具有独占性,不能被多个进程同时访问。例如打印机、磁带机。

条件二:请求与保持条件(Hold and Wait)

进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放

条件三:不可抢占条件(No Preemption)

进程已获得的资源在未使用完之前,不能被强行夺走,只能由进程自己主动释放。

条件四:循环等待条件(Circular Wait)

存在一个进程的循环等待链 P0→P1→...→Pn→P0,链中每个进程都在等待下一个进程所占有的资源。

死锁四条件记忆口诀 互斥 → 请求保持 → 不可抢占 → 循环等待
(互、请、不、环)

4.3 可抢占资源 vs 不可抢占资源

  • 可抢占(可剥夺)资源:CPU — 可以被高优先级进程抢占,竞争 CPU 不会产生死锁
  • 不可抢占资源:打印机、磁带机、磁盘等 — 必须由占有者主动释放,可能导致死锁
关键结论:竞争可剥夺资源(如 CPU)不会产生死锁。死锁只可能发生在不可剥夺资源的竞争上。

4.4 死锁处理策略对比

策略核心思想并发性实现方式优缺点
死锁预防 破坏四个必要条件之一,从根源上防止 最低 静态分配、有序分配 简单可靠,但资源利用率低
死锁避免 分配前检查是否安全,动态决策 中等 银行家算法 资源利用率较高,但开销大
死锁检测与解除 允许死锁发生,检测到后再解除 最高 资源分配图、终止进程 并发性最高,但恢复代价大
并发性排序 死锁检测与解除 > 银行家算法(避免) > 死锁预防(资源预分配)

4.5 死锁预防

通过破坏四个必要条件之一来预防死锁。

破坏条件方法说明
破坏互斥 将互斥资源改为共享 如 SPOOLing 将打印机改为共享设备。但不是所有资源都能共享,实际难以实现
破坏请求与保持 静态分配(一次性申请全部资源) 进程运行前一次性申请所需全部资源。简单但资源利用率低
破坏不可抢占 允许抢占资源 新资源得不到时释放已占有资源。实现复杂,可能造成前功尽弃
破坏循环等待 有序分配(资源编号按序申请) 所有资源编号,进程按序号递增申请。实际可行但限制多
实际中最常用的预防方法:破坏"请求与保持"(静态分配)和破坏"循环等待"(有序资源分配)。

4.6 死锁避免

安全状态

系统能按某种顺序为每个进程分配资源,使所有进程都能顺利完成,则称系统处于安全状态,该顺序称为安全序列

安全序列

一个进程序列 <P1, P2, ..., Pn>,对于每个 Pi,它还需要的资源数 ≤ 当前可用资源数 + 前面所有进程释放的资源数,则该序列为安全序列。

⚠ 高频易错
  • 安全状态 → 一定无死锁
  • 不安全状态 → 可能产生死锁(非必然
  • 不安全状态 已进入死锁!不安全只是"有死锁的可能"

4.7 银行家算法(核心重点)

算法思想

在每次资源分配前,先模拟分配,检查分配后系统是否仍处于安全状态。若安全则真正分配,否则拒绝分配让进程等待。

数据结构

银行家算法核心公式 Need[i][j] = Max[i][j] - Allocation[i][j]
其中: Max[i][j] — 进程 i 对资源 j 的最大需求 Allocation[i][j] — 进程 i 已分配的资源 j Need[i][j] — 进程 i 还需要的资源 j Available[j] — 系统当前可用的资源 j Request[i][j] — 进程 i 本次请求的资源 j
矩阵/向量含义
Available可用资源向量(各类资源的当前可用数)
Max最大需求矩阵(每个进程对每类资源的最大需求)
Allocation已分配矩阵(每个进程已获得的各类资源数)
Need需求矩阵(每个进程还需要各类资源数)= Max - Allocation

资源请求算法(步骤一:判断是否允许分配)

  1. Request[i] ≤ Need[i],转步骤 2;否则出错(请求超过最大需求)
  2. Request[i] ≤ Available,转步骤 3;否则进程等待(资源不足)
  3. 系统试探性分配
    Available = Available - Request[i]
    Allocation[i] = Allocation[i] + Request[i]
    Need[i] = Need[i] - Request[i]
  4. 执行安全性算法检查分配后状态是否安全。若安全则正式分配,否则回滚(恢复原值),进程等待

安全性检查算法(步骤二:判断是否安全)

安全性算法流程 1. 初始化: Work = Available; // 工作向量,当前可用资源 Finish[i] = false; // 所有进程初始未完成 2. 寻找一个满足条件的进程 i: Finish[i] == false 且 Need[i] ≤ Work 3. 若找到这样的进程 i: Work = Work + Allocation[i]; // 假设该进程完成,释放资源 Finish[i] = true; // 标记为已完成 回到步骤 2 继续寻找 4. 若所有 Finish[i] == true: 系统处于安全状态,存在安全序列 否则:系统处于不安全状态

安全性检查要点

  • 每次找到一个可满足的进程后,将其已分配资源加回 Work(因为该进程完成后会释放所有资源)
  • 检查顺序就是安全序列的顺序
  • 如果最终所有进程都能完成 → 安全
  • 如果有进程无法完成 → 不安全
💡 银行家算法解题技巧
  • 先算 Need = Max - Allocation
  • 试探分配后,用安全性算法逐个检查哪个进程的 Need ≤ Work
  • 找到的进程"释放"其 Allocation 加入 Work,继续找下一个
  • 能找完全部进程 → 安全,输出安全序列
  • 找不完 → 不安全,拒绝分配

4.8 死锁检测与解除

死锁检测

  • 利用资源分配图检测死锁
  • 如果资源分配图中存在环路,且资源数为 1,则发生死锁
  • 定期运行检测算法,检查系统是否已进入死锁状态

死锁解除方法

方法说明
终止一个死锁进程选择代价最小的进程终止,释放其资源
终止所有死锁进程简单粗暴,但代价大
从死锁进程处抢夺资源挂起某些死锁进程,抢占其资源给其他进程
⚠ 易错点 死锁解除时从死锁进程处抢夺资源,不从非死锁进程处抢夺(没有意义,可能引发新问题)。

4.9 死锁 vs 饥饿 vs 活锁

对比维度死锁饥饿
进程数至少 2 个(循环等待)可以只有 1 个
本质循环等待,互相持有对方所需资源长期得不到所需资源
是否阻塞所有死锁进程都被阻塞可能处于就绪态但得不到调度
解决方法预防/避免/检测解除公平调度(如强信号量 FIFO)

4.10 死锁资源数计算公式

死锁资源数公式 n 个进程,每个需要 m 个同类资源:
死锁最大资源数 = n × (m - 1)
不会死锁的最小资源数 = n × (m - 1) + 1

理解:最坏情况下每个进程都获得了 m-1 个资源(差一个就能满足),此时共占 n×(m-1) 个资源,全部阻塞 → 死锁。只要再多 1 个资源,就有一个进程能完成。

计算示例

4 个进程,每个需 3 个资源:

  • 死锁最大资源数 = 4 × (3 - 1) = 8
  • 不会死锁的最小资源数 = 8 + 1 = 9
  • 即资源数 ≥ 9 则不会死锁,资源数 3~8 时可能死锁

4.11 哲学家就餐问题的死锁处理(综合)

死锁预防(破坏必要条件)

  • 破坏循环等待:最多允许 4 个哲学家同时坐下;或奇偶号不同拿法
  • 破坏请求与保持:两根筷子都可用时才允许拿

死锁避免

  • 银行家算法:拿筷子前检查是否导致不安全状态

死锁检测与解除

  • 检测:定期检查分配图是否存在环路
  • 解除:剥夺某个哲学家的筷子或终止进程
⚠ 第4章易错点汇总
  • 死锁四条件必须同时满足,破坏任何一个即可预防
  • 安全状态 ≠ 无死锁(安全一定无死锁,但反过来不一定)
  • 不安全状态 ≠ 死锁(不安全只是有死锁可能)
  • 竞争 CPU 不会死锁(CPU 是可剥夺资源)
  • 并发性排序:检测解除 > 银行家 > 预分配
  • 银行家算法核心公式:Need = Max - Allocation
  • 安全性算法中:进程完成后将其 Allocation 加回 Work
  • 死锁解除从死锁进程抢夺资源,不从非死锁进程
  • 死锁至少 2 个进程,饥饿可只有 1 个

五、处理机调度

5.1 调度的三个层次

处理机调度是指在多个进程竞争 CPU 时,由调度程序决定把处理机分配给哪个进程。按调度发生的层次分为三级:

三级调度对比

调度层次别名调度对象发生频率主要功能适用系统
高级调度 作业调度 作业(外存 → 内存) 几分钟 ~ 几小时 从后备队列选作业调入内存,创建 PCB,变为就绪态 批处理系统
中级调度 内存调度 进程(内存 ↔ 外存) 几秒 ~ 几分钟 将暂时不能运行的进程换出到外存(挂起),内存空闲时再换入 所有系统
低级调度 进程调度 进程(就绪 → 运行) 毫秒级(最频繁) 从就绪队列选进程分配 CPU,是最基本的调度 所有系统(必不可少)

提示:高级调度决定“谁调入内存”,中级调度决定“谁在内/外存间对换”,低级调度决定“谁上 CPU 运行”。

调度的两种基本方式

  • 非抢占式(非剥夺式):一旦进程获得 CPU 就一直运行到结束或主动放弃,不允许被抢占。实现简单,适合批处理。
  • 抢占式(剥夺式):可根据时间片或优先级强制剥夺当前进程的 CPU。有利于提高响应速度,适合分时/实时系统,但开销大。

5.2 调度算法

① FCFS 先来先服务

原理:按作业/进程到达的先后顺序进行调度,先到先服务。属于非抢占式算法。

优点:实现简单、公平;对长作业有利。

缺点:平均等待时间往往较长;存在护航效应(convoy effect)——一个长作业会使其后到达的短作业长时间等待;对 I/O 繁忙型作业不利。

适用:批处理系统;也常用于打印机等设备分配。

② SJF 短作业(进程)优先

原理:选择要求服务时间(运行时间)最短的作业/进程投入运行。可分非抢占式 SJF抢占式 SJF(SRTF,最短剩余时间优先):抢占式下,每当新进程到达时比较剩余时间,若新进程剩余时间更短则抢占。

优点:可获得最短的平均等待/周转时间(理论最优)。

缺点:必须预知运行时间(实际难以做到);对长作业不利,可能产生饥饿;未考虑紧迫程度。

示例(非抢占式 SJF):5 个作业 A~E,到达时间与运行时间如下,求周转时间。

作业到达时间运行时间开始时间完成时间周转时间带权周转时间
A040441.00
D324631.50
B136982.67
E4491392.25
C251318163.20
调度顺序:A → D → B → E → C
平均周转时间 = (4+3+8+9+16) / 5 = 40 / 5 = 8
平均带权周转时间 = (1+1.5+2.67+2.25+3.2) / 5 ≈ 2.1

说明:时刻 0 只有 A 到达,先执行 A;A 完成(时刻4)时,就绪队列有 B(3)、C(5)、D(2)、E(4),选最短的 D(2),以此类推。

对比:同一组数据用 FCFS 调度顺序为 A→B→C→D→E,平均周转时间 = 9、平均带权周转时间 = 2.8,可见 SJF 更优。

③ HRRN 高响应比优先

原理:每次调度时计算各就绪作业的响应比,选择响应比最高者投入运行。属于非抢占式算法。

响应比 Rp = (等待时间 + 要求服务时间) / 要求服务时间
= 1 + 等待时间 / 要求服务时间

特点:等待越久响应比越高(照顾长作业,避免饥饿),服务时间越短响应比也越高(照顾短作业),兼顾长短作业、无饥饿,是 FCFS 与 SJF 的折中。但每次调度都要重新计算响应比,开销较大。

示例:4 个作业,到达时间与 CPU 时间如下。

作业到达时间CPU 时间开始时间完成时间周转时间等待时间
A020020200
C10520251510
B51525403520
D151040503525
调度顺序:A → C → B → D
t=20 时刻 A 完成,计算各就绪作业响应比:
Rp(B) = (15+15)/15 = 2.0
Rp(C) = (10+5)/5 = 3.0 ← 选中 C
Rp(D) = (5+10)/10 = 1.5
t=25 时刻 C 完成:
Rp(B) = (20+15)/15 ≈ 2.33 ← 选中 B
Rp(D) = (10+10)/10 = 2.0
平均周转时间 = (20+35+15+35)/4 = 26.25
平均等待时间 = (0+20+10+25)/4 = 13.75

④ 优先级调度

原理:为每个进程设置优先级,调度时选择优先级最高(数值通常最小)的进程。可分为抢占式与非抢占式。

  • 静态优先级:进程创建时确定,运行期间不变。优点是简单、开销小;缺点是可能产生饥饿,低优先级进程长期得不到调度。
  • 动态优先级:运行期间优先级可变(如随等待时间增加而提高,随占用 CPU 时间增加而降低)。更灵活、可防止饥饿,但开销大。
优先级倒置问题:采用优先级调度时,高优先级进程可能因等待低优先级进程占用的临界资源而被低优先级进程延迟或阻塞,甚至被中优先级进程抢占,导致优先级“倒置”。解决方法:① 优先级继承(低优先级进程临时继承等待它的高优先级进程的优先级);② 优先级天花板协议。

⑤ 时间片轮转 RR

原理:将 CPU 处理时间划分为一个个时间片(q),就绪进程按 FCFS 排成队列。进程获得 CPU 后运行一个时间片,若未完成则被抢占并插入就绪队列末尾,循环执行。

特点:公平、响应快,适合分时/交互式系统。

时间片大小选择:

  • q 过大 → 退化为 FCFS;
  • q 过小 → 上下文切换频繁,系统开销过大;
  • 通常 q 略大于一次典型交互所需时间,使大多数交互进程在一个时间片内完成。
关键公式:周转时间 = 完成时间 − 到达时间;等待时间 = 开始时间 − 到达时间;带权周转时间 = 周转时间 / 服务时间。

⑥ 多级反馈队列调度 MFQ

原理:设置多个就绪队列,优先级从高到低排列,而各队列时间片从短到长(如第 1 级 q=1,第 2 级 q=2,第 3 级 q=4……)。

  • 新作业进入最高优先级队列队尾;
  • 进程用完当前队列的时间片仍未完成,则降级到下一级队列末尾;
  • 进程主动放弃 CPU(如等 I/O),则留在原队列或升级;
  • 仅当高优先级队列为空时,才调度低优先级队列;高优先级队列有进程到达时可抢占低优先级队列中正在运行的进程。

优点:短作业/交互型作业优先完成,长作业自动降级,兼顾响应时间与吞吐量,自适应性好,是目前公认较好的调度算法

缺点:实现复杂;存在饥饿可能(若高优先级队列总有新进程到来)。

调度算法对比总结

算法抢占优点缺点是否饥饿适用场景
FCFS简单、公平平均等待长,护航效应批处理
SJF否/是平均等待时间最短需预知时间,长作业饥饿批处理
HRRN兼顾长短作业,无饥饿每次需算响应比,开销大批处理
优先级否/是灵活,反映紧迫程度可能饥饿实时/通用
RR公平,响应快切换开销大分时
MFQ综合性能好,自适应实现复杂可能通用(最常用)
实时调度补充:实时系统常用 EDF(最早截止时间优先)——按截止时间调度,可用于抢占/非抢占;LLF(最低松弛度优先)——松弛度 = 必须完成时间 − 本身运行时间 − 当前时间,松弛度越低越紧急,优先级越高,主要用于抢占式。

六、内存管理

6.1 内存管理功能

  • 内存分配与回收:为程序分配内存空间,使用完毕后回收。
  • 地址转换(重定位):将逻辑地址转换为物理地址。
  • 存储保护:保证各作业在自己的内存空间运行,互不干扰。
  • 存储扩充:借助虚拟存储技术,从逻辑上扩充内存容量。

6.2 地址重定位

地址重定位(地址映射)是把程序的逻辑地址(相对地址)转换为物理地址(绝对地址)的过程。

对比项静态重定位动态重定位(运行时装入)
转换时机装入内存时一次完成程序运行时逐条指令转换
是否需要硬件否(软件完成)是(需重定位寄存器/MMU)
程序能否移动不能移动可以移动(便于紧凑/共享)
地址空间是否连续必须连续分配可离散分配(支持分页/分段)
能否虚拟扩充不能能(虚拟存储基础)
物理地址 = 逻辑地址 + 重定位寄存器中的地址

6.3 分区管理

固定分区分配

将内存预先划分为若干个固定大小的分区,每个分区装入一道作业。

优点:实现简单;支持多道程序。

缺点:分区大小固定,会产生内部碎片(作业小于分区时浪费);大作业可能放不下;限制了并发作业数。

动态分区分配

根据作业的实际需要,动态地划分内存分区。分区大小与作业大小一致,无内部碎片,有外部碎片。常用分配算法:

算法搜索策略优点缺点
首次适应 FF从低地址开始找第一个能满足的空闲区算法简单,保留高地址大空闲区低地址端碎片多,查找开销大
最佳适应 BF找能满足要求的最小空闲区匹配度高,节省大空闲区产生大量小碎片(外部碎片)
最坏适应 WF找能满足要求的最大空闲区剩余碎片不至于太小大空闲区很快耗尽,对大作业不利
下次适应 NF从上次分配位置继续查找分配均匀,查找快缺乏大空闲区

碎片问题

类型含义产生场景解决办法
内部碎片已分配区域内未被利用的空闲部分固定分区、分页(页内碎片)减小分配单元
外部碎片未分配但太小无法使用的小空闲区动态分区、分段紧凑(紧缩)技术
记忆:分页产生内部碎片(页内浪费);分段产生外部碎片(段间空隙)。在分页管理中所产生的内存碎片,最多小于一页(帧)的大小。

6.4 分页存储管理

基本概念

  • 页(页面):将进程的逻辑地址空间划分为大小相等的离散单元,页大小由硬件决定,等长。
  • 帧(物理块):将内存物理空间划分为与页大小相同的块。
  • 页表:记录逻辑页号 → 物理块号映射关系的表,实现从页号到块号的地址映像。
  • 页表寄存器 PTR:存放页表始址和页表长度,用于地址转换和越界检查。

分页管理中作业地址空间是一维的,页的长度等长。每存取一个数据需访问两次内存(一次查页表,一次取数据)。

地址转换公式

页号 P = INT[逻辑地址 / 页面大小]
页内偏移 d = 逻辑地址 mod 页面大小
物理地址 = 块号 × 页面大小 + 页内偏移

转换步骤:① 用逻辑地址求出页号 P 和页内偏移 d;② 用 P 与页表长度比较,若 P ≥ 页表长度则越界中断;③ 查页表得块号;④ 块号 × 页大小 + 偏移 = 物理地址。

地址转换示例

设页面大小为 1024B,页表为 {0→2, 1→3, 2→1, 3→6}(即页表长度 4,有效页号 0~3)。将逻辑地址 1011、2148、5012 转换为物理地址。

逻辑地址页号 P页内偏移 d查页表得块号物理地址
1011INT[1011/1024]=01011 mod 1024 = 10110 → 22×1024 + 1011 = 3059
2148INT[2148/1024]=22148 mod 1024 = 1002 → 11×1024 + 100 = 1124
5012INT[5012/1024]=4916越界(P=4 > 3)
易错点:逻辑地址 5012 的页号 P=4,超过页表最大有效页号 3(页表只有 4 项,页号 0~3),故越界,产生越界中断,该地址无有效物理地址。最大合法逻辑地址为 3×1024+1023 = 4095。

快表 TLB

快表(TLB,Translation Lookaside Buffer)是一个具有并行查找能力的高速缓存(小容量联想寄存器),用于存放当前访问过的页表项,以加速地址转换过程。

作用:避免每次访存都先查内存中的页表,把“两次访存”降为可能一次访存,大幅提高有效访问速度。

工作过程:先查快表,若命中(页表项在快表中)则直接得到块号、计算物理地址;若未命中则查内存页表,并将该页表项写入快表。

6.5 分段存储管理

基本概念

按程序的逻辑结构(如主程序、子程序、数据段等)划分为若干,每段是一组有意义的信息,段长不等段表记录每段的段号、段长(段限)和内存始址(基址)。分段地址空间是二维的,地址由 (段号, 段内偏移) 给出。

地址转换公式

物理地址 = 段基址 + 段内偏移

转换步骤:① 用段号 S 与段表长度比较,若 S ≥ 段表长度则越界中断;② 查段表得该段基址和段长 L;③ 若段内偏移 d ≥ 段长 L,则越界中断;④ 否则物理地址 = 基址 + d。

地址转换示例

设段表如下(段号 → 基址/段长):

段号基址段长
0219600
1230014
290100
31327580
4195296

转换逻辑地址 (2, 88) 与 (4, 100):

逻辑地址段号段内偏移越界检查物理地址
(2, 88)28888 < 100,合法90 + 88 = 178
(4, 100)4100100 > 96,越界无有效物理地址
易错点:(4, 100) 中段内偏移 100 超过段 4 的段长 96,产生越界中断。分段管理要做两次越界检查:段号是否越界、段内偏移是否越界。

6.6 分页 vs 分段对比

对比维度分页分段
目的提高内存利用率(物理划分)方便编程/共享/保护(逻辑划分)
大小页大小固定、由硬件决定段长可变、由程序决定
地址空间一维(线性地址)二维(段号, 段内地址)
用户可见性不可见(透明)可见(程序员指定段)
碎片类型内部碎片外部碎片
共享/保护较困难易于实现(按逻辑段)
访存次数至少 2 次(查页表 + 取数)至少 3 次

七、虚拟存储

7.1 虚拟存储概念

虚拟存储器是指具有请求调入置换功能,能从逻辑上对内存容量进行扩充的存储器系统。它通过把内存和外存统一管理,为用户提供了比实际物理内存大得多的地址空间。

三大特征:

  • 多次性:一个作业被分为多段,分多次调入内存运行(而非一次全部装入)。
  • 对换性:运行过程中内存中的数据可与外存上的数据换入/换出
  • 虚拟性:从逻辑上扩充内存,可用空间远大于物理内存。
本质:虚拟存储 = 离散分配 + 请求调入 + 置换功能。实现方式有请求分页请求分段请求段页式

7.2 请求分页机制

页表项与缺页中断

请求分页的页表项在基本分页基础上增加了若干字段:

  • 状态位(存在位):标识该页是否在内存中。
  • 访问位(引用位):记录该页最近是否被访问,供置换算法使用。
  • 修改位:记录该页是否被修改过,决定换出时是否写回外存。
  • 外存地址:该页在外存上的位置。

缺页中断:当访问的页不在内存时(状态位为 0),产生缺页中断,由操作系统将该页从外存调入内存;若内存已满则需用置换算法淘汰一页。

缺页中断的特殊性:① 在指令执行期间产生(而非指令执行后);② 一条指令执行过程中可能产生多次缺页中断;③ 处理完后应回到被中断的那一条指令重新执行(而非下一条)。

请求分页需要的三项基础:① 页表机制;② 缺页中断机构;③ 地址变换机构。

7.3 页面置换算法

以下四个算法采用统一引用串便于对比(物理块数 = 3):

引用串:7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1(共 20 次访问)

① OPT 最佳置换

定义:选择未来最长时间内不再被访问的页面进行淘汰。这是理论上的最优算法,缺页率最低。

特点:缺页率最低,作为其他算法的衡量标准;但需要预知未来的页面访问情况,无法实现,仅用于理论分析。

示例(3 个物理块):

访问:7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
块1:7 7 7 2 2 2 2 2 2 2 2 2 2 2 2 2 2 7 7 7
块2:- 0 0 0 0 0 0 4 4 4 0 0 0 0 0 0 0 0 0 0
块3:- - 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1
缺页:√ √ √ √ √ √ √ √ √ √

关键置换决策:访问 2 时淘汰 7(7 在第 18 步才再用);访问 3 时淘汰 1(1 在第 14 步才再用);访问 4 时淘汰 0;访问 0 时淘汰 4(4 不再使用);访问 1 时淘汰 3(不再使用);访问 7 时淘汰 2(不再使用)。

结果:共 9 次缺页,6 次置换(缺页率 45%)

② FIFO 先进先出

定义:选择最早进入内存的页面淘汰(按进入内存的先后顺序,先进先出)。实现简单,可用队列(移位寄存器)实现。

特点:最简单;但性能差,且会产生 Belady 异常

示例(同一引用串,3 个物理块):

访问:7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
块1:7 7 7 2 2 2 2 4 4 4 0 0 0 0 0 0 0 7 7 7
块2:- 0 0 0 0 3 3 3 2 2 2 2 2 1 1 1 1 1 0 0
块3:- - 1 1 1 1 0 0 0 3 3 3 3 3 2 2 2 2 2 1
缺页:√ √ √ √ √ √ √ √ √ √ √ √ √ √ √
结果:共 15 次缺页,12 次置换(缺页率 75%)

③ LRU 最近最久未使用

定义:选择最近最长时间未被访问的页面淘汰。性能接近 OPT,但实现开销大(需硬件支持记录访问时间,可用栈或计数器实现)。

特点:性能好,是常用的优秀算法;LRU 属于栈式算法,不会产生 Belady 异常。

示例(同一引用串,3 个物理块):

访问:7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
块1:7 7 7 2 2 2 2 4 4 4 0 0 0 1 1 1 1 1 1 1
块2:- 0 0 0 0 0 0 0 0 3 3 3 3 3 3 0 0 0 0 0
块3:- - 1 1 1 3 3 3 2 2 2 2 2 2 2 2 2 7 7 7
缺页:√ √ √ √ √ √ √ √ √ √ √ √
结果:共 12 次缺页,9 次置换(缺页率 60%)

④ Clock / NRU 简单时钟置换

定义:LRU 的近似算法。为每页设置一个访问位(使用位),把内存中的页面链接成循环队列,配一个循环指针。

机制:

  • 页面装入或被访问时,访问位置 1;
  • 需淘汰页面时,指针顺时针扫描循环队列:若访问位 = 1,则清 0 并跳过;若访问位 = 0,则淘汰该页;
  • 最坏情况下指针需扫描一圈(把所有访问位清 0),再淘汰遇到的第一个页面。

示例:引用串 2 3 2 1 5 2 4 5 3 2 5 2,3 个物理块。

访问:2 3 2 1 5 2 4 5 3 2 5 2
缺页:√ √ √ √ √ √ √ √
结果:共 8 次缺页,5 次置换
改进型 Clock:同时考虑访问位与修改位,优先淘汰既未被访问又未被修改 (0,0) 的页面,以减少写回外存的开销。

7.4 Belady 异常

定义:在采用某种置换算法时,分配的物理块数增加,缺页次数反而增加的现象。

注意:Belady 异常仅 FIFO 会出现;LRU、OPT 等栈式算法不会出现。这是 FIFO 的一个重大缺陷。

7.5 算法对比总结

算法缺页次数置换次数优点缺点Belady异常
OPT(最佳)96缺页率最低,理论最优无法实现(需预知未来)
LRU129性能好,接近 OPT实现开销大,需硬件
Clock/NRULRU 近似,开销小近似 LRU,性能略差
FIFO1512实现最简单性能差,有 Belady 异常

(上表中 OPT/LRU/FIFO 的缺页、置换次数为同一引用串、3 个物理块下的计算结果。)

7.6 内存有效访问时间

λ 为查快表时间,t 为访问一次内存的时间,ε 为缺页中断处理时间。则有效访问时间 EAT 分三种情况:

① 命中快表: EAT = λ + t
② 不在快表但在内存: EAT = λ + t + λ + t
③ 缺页: EAT = λ + t + ε + λ + t
综合公式(考虑命中率):设快表命中率为 α、缺页率为 f,则
EAT = λ + α·t + (1−α)·[ t + f·(ε + λ + t) + (1−f)·(λ + t) ]
即:查快表 λ → 若命中直接访存 t;若未命中则查页表 t,再按缺页率 f 决定是缺页中断 ε 后重查,还是更新快表后访存。

八、文件系统

8.1 文件定义和分类

文件:指具有标识符(文件名)的一组相关信息的集合,是文件系统中最大的数据单位。

数据组织层次:数据项 → 记录 → 文件 → 文件系统。其中数据项是最小逻辑单位,记录是一组相关数据项的集合。

文件分类:

分类维度类型
按用途系统文件、库文件、用户文件
按数据形式源文件、目标文件、可执行文件
按性质(组织方式)普通文件、目录文件、特殊文件

8.2 文件结构

类型组成特点示例
无结构文件(流式文件)由字符流/字节序列组成长度以字节为单位,顺序访问,管理简单源程序、文本文件
有结构文件(记录式文件)由若干记录组成可按记录访问,支持定长/变长记录数据库、表格数据

8.3 文件逻辑结构

有结构文件按记录的组织方式分为以下逻辑结构:

结构组织方式优点缺点
顺序文件记录按关键字排序(串结构按时间先后,顺序结构按关键字)管理简单,顺序存取快增删改困难,查找慢
索引文件为每个文件建立索引表,索引项指向记录,按关键字排序支持随机访问,适合变长记录索引表占额外空间
索引顺序文件顺序文件 + 索引文件(分组索引)折中方案,兼顾顺序与随机结构较复杂(如 ISAM)
直接文件由记录键值直接得到物理地址查找快无顺序性
哈希文件利用 Hash 函数将键值转换为地址平均 O(1) 查找需处理冲突,无顺序性

8.4 文件控制块 FCB

FCB(File Control Block,文件控制块)是用于描述和控制文件的数据结构,是文件存在的标志(类似 PCB 之于进程)。FCB 的有序集合构成文件目录(目录项即 FCB)。

FCB 包含三类信息:

  • 基本信息:文件名、物理位置、逻辑结构、物理结构等。
  • 存取控制信息:文件主、权限(读/写/执行)、访问属性等。
  • 使用信息:建立时间、修改时间、访问时间、当前使用状态等。

8.5 文件目录

① 单级目录

整个系统只设置一张目录表,每个文件占一个目录项。

优点:简单,能实现按名存取。

缺点:查找速度慢;不允许文件重名;不便于文件共享。

② 两级目录

分为主文件目录 MFD(记录各用户名及对应用户文件目录位置)和用户文件目录 UFD(记录该用户的文件)。

优点:查找较快;允许不同用户文件重名;提高了安全性(用户间隔离)。

缺点:灵活性低;用户之间共享文件不便

③ 树形目录

采用层次结构,目录可以包含文件和子目录,是目前广泛使用的目录结构。

  • 当前目录(工作目录):进程当前所在的目录,便于相对路径访问。
  • 绝对路径:从根目录开始的完整路径(如 /home/user/file.txt)。
  • 相对路径:从当前目录开始的路径(如 ../doc/file.txt)。

优点:层次清晰,便于分类管理;允许重名(不同目录下);便于共享与保护。

目录查询技术

  • 线性检索法:顺序扫描目录项进行比较,实现简单但效率低。
  • Hash 方法:对文件名进行 Hash 得到目录项位置,平均 O(1) 查找,效率高;需处理冲突。

8.6 文件物理结构(外存组织方式)

① 连续分配

为每个文件分配一组连续的磁盘盘块。

优点:顺序存取速度快;实现简单;支持随机访问(直接定位)。

缺点:产生外部碎片;需预先知道文件大小;文件不能动态增长;删除后产生碎片。

② 链接分配

每个文件对应一个盘块链表,盘块可以离散分配。

  • 隐式链接:每个盘块中存放指向下一盘块的指针。
    优点:无外部碎片,空间利用率高。
    缺点:只能顺序存取,随机访问效率低;可靠性差(指针丢失导致链断裂);指针占空间。
  • 显式链接(FAT,文件分配表):将所有盘块的链接指针集中存放在一张 FAT 表中(常驻内存)。
    优点:支持随机访问(在内存中查 FAT);空间利用率高。
    缺点:FAT 表占用内存空间。

③ 索引分配

为每个文件建立一张索引表,索引表记录文件各逻辑块对应的物理盘块号。

  • 单级索引:每个文件一张索引表。优点:支持随机访问。缺点:索引表占空间,大文件需要多块索引。
  • 多级索引:为索引表再建索引,适合大文件,空间利用高效,但查找层次多。
  • 增量式(混合)索引:结合直接索引 + 一级索引 + 二级索引 + 三级索引(如 UNIX inode),小文件直接索引即可,大文件动态扩展,兼顾效率与空间。

优点:支持随机访问,文件可动态增长,空间利用率高。缺点:索引表本身占额外空间,开销较大。

8.7 文件存储空间管理

用于管理磁盘上的空闲盘块,主要有四种方法:

方法原理特点
空闲表法建立空闲区表,记录每个空闲区首块号和块数适合连续分配,与内存动态分区类似
空闲链表法用链表组织空闲盘块/空闲区适合离散分配,但不适合分配多个连续块
位示图法每位对应一个盘块,1=已分配,0=空闲占用空间小,现代系统最常用
成组链接法把空闲盘块分组,组间用指针链接UNIX 系统典型方法,兼顾效率与空间

8.8 易错点总结

易错点速记:
  • FCB 是文件存在的标志(对应 PCB 是进程存在的唯一标志)。
  • 单级目录不允许重名;两级目录允许不同用户重名;树形目录允许不同目录下重名。
  • 绝对路径从根目录开始,相对路径从当前目录开始。
  • 连续分配产生外部碎片;分页产生内部碎片;FAT 属于显式链接分配。
  • 索引分配支持随机访问,inode(混合索引)是 UNIX 的典型实现。
  • 文件存储空间管理中,位示图法最常用;成组链接法是 UNIX 的典型方法。
  • 无结构文件又称流式文件;有结构文件又称记录式文件。
补充——磁盘调度算法(设备管理,常与文件系统结合考查):常见有 FCFS(先来先服务)、SSTF(最短寻道时间优先,可能饥饿)、SCAN(电梯算法,双向扫描)、C-SCAN(循环扫描,单向服务返回时不服务)、LOOK/C-LOOK(不走到端点)。目标都是最小化磁头移动总距离。提高磁盘 I/O 速度的方法还有:磁盘高速缓存、提前读、延迟写、优化物理块分布、虚拟盘(RAM disk)等。

九、设备管理

本章概览

设备管理是操作系统的重要功能之一,负责管理和控制各类 I/O 设备,完成用户提出的 I/O 请求、加快 I/O 速度、方便设备使用。核心内容包括:I/O 设备分类、I/O 控制方式、缓冲技术、SPOOLing 技术、设备分配与中断处理。

9.1 I/O 设备的分类

按设备的共享属性(分配方式)可分为三类:

类型定义典型设备特点
独占设备 一段时间内只允许一个进程独占使用的设备 打印机、磁带机 属于临界资源,必须互斥访问;分配方式为静态分配
共享设备 一段时间内允许多个进程同时(交叉)访问的设备 磁盘 可动态分配,多个进程分时交替使用;需通过调度算法管理访问
虚拟设备 通过 SPOOLing 技术将独占设备改造成的可共享设备 虚拟打印机 把独占设备变为可共享的"虚拟"设备,提高设备利用率
易考点:共享设备(如磁盘)可被多进程并发访问,不会因竞争磁盘而产生死锁;独占设备(如打印机)才可能因竞争产生死锁。考试中"肯定不会因竞争 ___ 而产生死锁"应选 磁盘/CPU 等共享资源。

9.2 I/O 控制方式(四种)

I/O 控制方式的发展目标是:尽量减少 CPU 对 I/O 的干预,提高 CPU 与 I/O 设备的并行程度。共有四种方式,效率由低到高。

控制方式工作原理CPU 干预程度数据传输单位优缺点
程序 I/O 方式(轮询/查询) CPU 不断循环查询设备状态,设备就绪才进行数据传送 全程参与,CPU 与 I/O 串行 字/字节 实现简单;CPU 利用率极低,浪费严重
中断驱动 I/O 方式 CPU 发出 I/O 命令后做其他工作,设备完成后向 CPU 发中断,CPU 中断处理 每传一个单位中断一次 字/字节 CPU 与设备并行;但每字节都要中断,中断频繁时开销大
DMA 方式(直接存储器存取) 由 DMA 控制器直接控制数据在设备与内存之间成块传送,CPU 仅在块传送开始和结束时干预 一个数据块中断一次 数据块(连续的多个字节) 大幅减少 CPU 中断次数;需 DMA 控制器硬件支持,传输方向、大小由 CPU 预置
I/O 通道控制方式 通道是一个专用处理机,能执行由通道指令组成的通道程序,独立完成一组数据块的 I/O 一组数据块中断一次 数据块组 CPU 干预最少,效率最高;通道昂贵,适用于大型机
四种方式效率递进:程序查询 → 中断驱动 → DMA → 通道控制
CPU 干预递减、数据传输单位递增、并行程度递增
易错:DMA 方式中数据传输的基本单位是数据块(不是字节);DMA 控制器与 CPU 共享内存,传送期间 CPU 可执行其他不需访存的指令。

9.3 缓冲技术

引入缓冲的目的

  • 缓和 CPU 与 I/O 设备之间速度不匹配的矛盾
  • 减少对 CPU 的中断频率,放宽对中断响应时间的限制
  • 提高 CPU 与 I/O 设备之间的并行程度

缓冲的实现形式主要有四种:

类型结构工作特点适用场景
单缓冲 仅一个缓冲区 设备与 CPU 不能真正并行,需交替使用同一缓冲区;处理一块数据时间约为 max(C, T) + M(C 处理时间、T 输入时间、M 缓冲区操作时间) 简单 I/O 场景
双缓冲 两个缓冲区交替使用 一个缓冲区供设备输入时,另一个供 CPU 处理,可实现设备与 CPU 并行;处理一块数据时间约为 max(C, T) 需要一定并行性的场景
循环缓冲 多个缓冲区组成环形队列,含 in 指针和 out 指针 类似生产者—消费者模型,缓冲区可循环复用 多缓冲、持续 I/O 场景
缓冲池 多个缓冲区统一管理,分为输入/输出队列 可供多个设备共享,含收容输入、提取输入、收容输出、提取输出四种工作方式 多设备、复杂系统
关键对比:单缓冲每块处理时间 ≈ max(C, T) + M;双缓冲 ≈ max(C, T)。双缓冲比单缓冲多了 M(缓冲区传送时间) 的节省。

9.4 SPOOLing 技术(假脱机操作)

什么是 SPOOLing

SPOOLing(Simultaneous Peripheral Operations On-Line,外部设备联机并行操作)又称假脱机技术。它利用高速磁盘模拟脱机 I/O,把独占设备改造为共享设备,从而实现虚拟设备

核心思想:用一道程序模拟脱机输入/输出,使慢速 I/O 设备与 CPU 并行工作。

SPOOLing 系统的组成

SPOOLing 系统主要由三部分组成:

  • 输入井 / 输出井:位于磁盘上的两个区域,用于模拟脱机输入/输出时的磁带,暂存多个进程的输入/输出数据。
  • 输入缓冲区 / 输出缓冲区:位于内存,用于暂存输入设备→输入井、输出井→输出设备之间的数据,缓和 CPU 与磁盘速度差异。
  • 输入进程 SI / 输出进程 SO:模拟脱机 I/O 的外围控制机。SI 负责将输入设备数据经输入缓冲区送入输入井;SO 负责将输出井数据经输出缓冲区送到输出设备。

SPOOLing 原理示意图

     ┌──────────┐      输入缓冲区      ┌──────────┐      输出缓冲区      ┌──────────┐
     │  输入设备 │ ────→ (内存) ────→ │ 输入井   │                     │ 输出设备 │
     └──────────┘                    │ (磁盘)   │ ────→ (内存) ────→ └──────────┘
               输入进程 SI           │          │      输出进程 SO
               模拟脱机输入          │ 输出井   │      模拟脱机输出
                                    └──────────┘
                                          ↑│
                              用户进程读写输入井/输出井(井管理程序)

应用:共享打印机工作流程

打印机是典型的独占设备,通过 SPOOLing 可改造为共享设备:

  1. 用户进程请求打印时,不立即把打印机分配给该进程,而是由 SPOOLing 的输出进程 申请空闲磁盘块(输出井),将打印数据送入其中。
  2. 为该用户进程申请一张空白的用户请求打印表,填入打印要求,将其挂到请求打印队列末尾。
  3. 用户进程的打印请求完成,可继续执行其他任务(对用户而言"打印已完成")。
  4. 当打印机空闲时,输出进程 SO 从请求打印队列队首取一张表,按其中要求从输出井取出数据送到打印机进行真正的物理打印。
SPOOLing 的三大特点(高频考点):
  1. 提高了 I/O 速度:从对低速设备的 I/O 变为对高速磁盘的存取。
  2. 将独占设备改造为共享设备:多个进程可同时"使用"打印机。
  3. 实现了虚拟设备功能:每个用户都感觉自己独占了一台打印机。
易错:SPOOLing 技术本身不能缩短 I/O 设备的实际物理速度,而是通过缓冲把低速设备的 I/O 转换为高速磁盘存取来"提高(逻辑)I/O 速度"。SPOOLing 是用软件实现的,需磁盘空间支持。

9.5 设备独立性

概念

设备独立性(Device Independence)指应用程序独立于具体使用的物理设备,即用户程序中使用逻辑设备名,由系统将其映射为物理设备名。

  • 逻辑设备名:用户程序中使用的、与具体设备无关的名称(如 /dev/printer)。
  • 物理设备名:系统中实际设备的唯一标识。
  • 优点:提高程序可适应性,便于 I/O 重定向;设备故障时可用其他设备替代。

9.6 设备分配

设备分配所需的数据结构主要有设备控制表 DCT 和逻辑设备表 LUT:

数据结构全称作用主要内容
DCT 设备控制表(Device Control Table) 每个设备一张,记录设备特性与状态 设备类型、设备标识符、设备状态(忙/闲)、COCT 指针、阻塞队列指针
COCT 控制器控制表 每个控制器一张 控制器标识符、状态、CHCT 指针、阻塞队列指针
CHCT 通道控制表 每个通道一张 通道标识符、状态、阻塞队列指针
SDT 系统设备表 整个系统一张 系统中所有设备的登记表,记录设备入口
LUT 逻辑设备表(Logical Unit Table) 实现逻辑设备名→物理设备名的映射,保证设备独立性 逻辑设备名、物理设备名、设备驱动程序入口地址
设备分配流程:分配设备(查 DCT)→ 分配控制器(查 COCT)→ 分配通道(查 CHCT),三者都空闲才完成一次分配。

9.7 中断处理过程

当设备完成 I/O 操作后,向 CPU 发出中断请求,CPU 响应后进行中断处理,其标准过程分为 5 个步骤

  1. 唤醒被阻塞的驱动(I/O)程序进程:把等待该 I/O 完成的进程从阻塞队列移出,置为就绪态。
  2. 保护被中断进程的现场:保存 CPU 寄存器、程序状态字(PSW)等到被中断进程的 PCB 中,以便将来恢复。
  3. 分析中断原因,转入相应的设备中断处理程序:根据中断向量找到对应的中断处理程序入口。
  4. 进行中断处理:执行具体的中断处理程序,完成数据传送或错误处理。
  5. 恢复被中断进程的现场:从 PCB 中恢复现场,返回被中断的程序继续执行。
易错:"保护现场"与"恢复现场"是中断处理的必要步骤;中断处理过程中可能发生进程切换(如唤醒更高优先级进程),也可能不发生(仅模式切换)。设备驱动程序负责把上层的抽象命令转换为具体设备能执行的操作。

十、磁盘管理

本章概览

磁盘是现代计算机中最重要的共享 I/O 设备,磁盘管理的核心是磁盘调度算法(决定服务请求的顺序以减少寻道时间)。本章重点掌握 5 种调度算法的计算。

10.1 磁盘结构基本概念

  • 盘片(Platter):磁盘的物理载体,两面涂有磁性材料。
  • 磁道(Track):盘片上一个面上的同心圆环,是磁头读写的基本轨迹。
  • 柱面(Cylinder):所有盘面上同一半径的磁道组成的圆柱面。柱面号即磁道号。
  • 扇区(Sector):磁道被划分为若干弧段,每个扇区是磁盘读写的最小物理单位(通常 512B)。
寻址方式:磁盘地址由 柱面号 + 磁头号(盘面号)+ 扇区号 三部分组成。

10.2 磁盘访问时间

磁盘访问时间 = 寻道时间 Ts + 旋转延迟时间 Tr + 传输时间 Tt
组成部分含义决定因素
寻道时间 Ts 磁头移动到目标柱面所需时间 由磁盘调度算法决定,是主要优化对象
旋转延迟时间 Tr 磁头定位后,等待目标扇区旋转到磁头下方的时间 与磁盘转速有关,平均取旋转一周时间的一半
传输时间 Tt 读写数据时数据在磁头下通过的时间 与磁盘转速、读写字节数有关

例题(旋转延迟计算)

若磁盘转速为 5400 转/分,平均寻道时间为 8ms,每个磁道包含 1000 个扇区,求访问一个扇区的平均存取时间。

解:转速 5400 转/分 = 90 转/秒,旋转一周 = 1000/90 ≈ 11.11ms

平均旋转延迟 = 11.11 / 2 ≈ 5.56ms

传输一个扇区时间 = 11.11 / 1000 ≈ 0.011ms

平均存取时间 = 8 + 5.56 + 0.011 ≈ 13.57ms

10.3 磁盘调度算法

磁盘调度的目标是使各请求的平均寻道时间最小。常见 5 种算法如下,并以同一组数据演示计算。

统一示例条件

假设磁盘有 200 个磁道(编号 0~199),磁头当前位置 149,请求队列(按到达顺序)为:

88, 147, 95, 177, 94, 150, 102, 175, 138

(无特殊说明时,SCAN/C-SCAN 默认磁头当前向磁道号增大方向移动。)

① FCFS(先来先服务)

原理:按请求到达的先后顺序服务,最简单最公平。

服务顺序:149 → 88 → 147 → 95 → 177 → 94 → 150 → 102 → 175 → 138

计算:|149-88|+|88-147|+|147-95|+|95-177|+|177-94|+|94-150|+|150-102|+|102-175|+|175-138|

= 61+59+52+82+83+56+48+73+37 = 551

平均寻道长度:551 / 9 ≈ 61.2

② SSTF(最短寻道时间优先)

原理:每次选择与当前磁头位置距离最近的请求服务。是贪心算法。

服务顺序:149 → 150 → 147 → 138 → 102 → 95 → 94 → 88 → 175 → 177

计算:1+3+9+36+7+1+6+87+2 = 152

平均寻道长度:152 / 9 ≈ 16.9

缺点:可能导致饥饿——远离磁头位置的请求可能长期得不到服务(例如一直有靠近磁头的新请求到来)。

③ SCAN(电梯调度/扫描算法)

原理:磁头沿当前方向移动,服务沿途所有请求,到达该方向最远请求(或磁盘边界)后反向移动,继续服务。

服务顺序:149 → 150 → 175 → 177 →(转向)→ 147 → 138 → 102 → 95 → 94 → 88

计算:1+25+2+30+9+36+7+1+6 = 117

平均寻道长度:117 / 9 ≈ 13.0

方向判断(高频考点):若给出"刚完成对 X 号柱面的服务",则磁头移动方向由当前位置与刚完成位置的关系决定。如当前位置 134、刚完成 152,说明磁头从 152 移动到 134,即向磁道号减小方向扫描。

方向判断例题(来自样卷)

磁盘有 200 个柱面(0~199),当前存储臂在 134 号柱面,刚刚完成 152 号柱面的服务请求。请求队列为:68, 174, 91, 137, 94, 152, 102, 157, 120。求 SCAN 算法的磁道移动总和。

方向判断:134 < 152,磁头从 152 移到 134,向小方向扫描。

服务顺序:134 → 120 → 102 → 94 → 91 → 68 →(到底端 0 后转向)→ 137 → 152 → 157 → 174

计算:14+18+8+3+23+68+137+15+5+17 = 308

④ C-SCAN(循环扫描)

原理:磁头沿一个方向移动服务沿途请求,到达磁盘边界(端点 0 或 199)后,直接跳回另一端,沿同方向继续服务。提供更均匀的等待时间。

服务顺序:149 → 150 → 175 → 177 →(走到 199 后跳回 0)→ 88 → 94 → 95 → 102 → 138 → 147

计算:1+25+2+(177→199→0:22+199)+(0→88:88)+6+1+7+36+9 = 352

平均寻道长度:352 / 9 ≈ 39.1

注意:C-SCAN 到达方向边界后要移动到磁盘端点(0 或 199)再返回,返回过程不服务请求。

⑤ C-LOOK

原理:与 C-SCAN 类似,但到达方向上最后一个请求后立即返回另一端的第一个请求(不走到磁盘端点)。

服务顺序:149 → 150 → 175 → 177 →(返回到 88)→ 94 → 95 → 102 → 138 → 147

计算:1+25+2+89+6+1+7+36+9 = 176

平均寻道长度:176 / 9 ≈ 19.6

10.4 五种磁盘调度算法对比

算法策略优点缺点是否会饥饿
FCFS 按到达顺序服务 公平、简单 寻道距离长、性能差
SSTF 选最近请求 性能优于 FCFS 远端请求可能长期等待
SCAN 双向扫描(到边界/最远请求转向) 性能较好,两端请求等待较均匀 新请求可能被立即服务(刚过的位置)
C-SCAN 单向扫描,到端点返回 各请求等待时间更均匀 返回时空跑,移动距离大
C-LOOK 单向扫描,到最远请求返回 比 C-SCAN 减少空跑距离 实现略复杂
本例移动距离汇总:FCFS=551,SSTF=152,SCAN=117,C-SCAN=352,C-LOOK=176。其中 SCAN(117) 总移动距离最小。
易错:SSTF 的"最短"是局部最优(贪心),不保证全局最优;OPT 才是理论最优但不可实现。SCAN 与 C-SCAN 的区别在于是否走到磁盘端点;SCAN 与 LOOK 的区别在于是否走到方向上最后一个请求

10.5 提高磁盘 I/O 速度的方法

方法原理说明
磁盘高速缓存(Disk Cache) 在内存中设置缓存区,暂存最近访问的磁盘数据 命中则直接读内存,减少磁盘访问
提前读(Read-Ahead) 读当前块时顺带把下一块也读入 利用顺序访问的局部性,减少后续缺页
延迟写(Delayed Write) 写操作先写缓存,不立即写回磁盘 减少写盘次数,但掉电可能丢数据
优化物理块分布 把可能顺序访问的块安排在同一柱面相邻扇区 减少寻道和旋转延迟
RAM 盘 / 虚拟盘 用一部分内存模拟磁盘 速度极快,但掉电丢失,用于临时数据

十一、实时调度

本章概览

实时系统要求在规定时限内对外部事件作出响应。实时调度的核心是保证任务在截止时间(Deadline)前完成,主要算法有 EDF(最早截止时间优先)和 LLF(最低松弛度优先)。

11.1 实时系统基本概念

类型定义特点/举例
硬实时(Hard Real-Time) 必须绝对满足截止时间约束,否则造成灾难性后果 导弹制导、核反应堆控制、汽车安全气囊
软实时(Soft Real-Time) 偶尔错过截止时间可接受,不致严重后果 视频播放、网络通信、多媒体
实时任务参数:到达时间、执行时间、截止时间(Deadline)、周期(对周期任务)。要求在规定时间内对外界请求必须给予及时响应的 OS 是实时系统。

11.2 EDF(最早截止时间优先)

原理

EDF(Earliest Deadline First)根据任务的截止时间确定优先级:截止时间越早,优先级越高

  • 可用于抢占式和非抢占式调度。
  • 主要用于非周期性实时任务,也可用于周期任务。
  • 当任务可调度时,EDF 能使 CPU 利用率达到理论最大(100%)。

11.3 LLF(最低松弛度优先)

原理

LLF(Least Laxity First)根据任务的松弛度(Laxity)确定优先级:松弛度越低,优先级越高(越紧急)。主要用于可抢占调度

松弛度公式:
松弛度 = 必须完成时间 − 运行时间 − 当前时间
= 剩余时间 − 还需运行时间
松弛度规则:
  • 松弛度 = 必须完成时间 − 还需运行时间 − 当前时间(剩余时间减去还需运行时间)。
  • 松弛度越低 = 优先级越高 = 越紧急。松弛度为 0 表示必须立即执行,否则将错过截止时间。
  • 松弛度 < 0 表示任务已不可能在截止时间前完成(不可调度)。

11.4 LLF 调度过程示例

例题条件

有两个周期性实时任务:

  • 任务 A:周期 20ms,执行时间 10ms(到达时刻 0,截止时刻 20)
  • 任务 B:周期 50ms,执行时间 25ms(到达时刻 0,截止时刻 50)

两任务在 t=0 同时到达,采用 LLF(可抢占)调度,求 0~50ms 的调度过程。

松弛度计算与调度决策表

松弛度 = 本周期截止时间 − 本周期还需运行时间 − 当前时间

时刻 t任务 A 松弛度任务 B 松弛度选择运行说明
0 20−10−0 = 10 50−25−0 = 25 A A 松弛度小,优先运行
10 —(A 第一周期已完成,A2 在 t=20 才到达) 50−25−10 = 15 B A 当前周期已完成,运行 B
20 40−10−20 = 10 50−15−20 = 15 A A2 到达且松弛度小,抢占 B
30 —(A 第二周期已完成) 50−5−30 = 15 B A 完成当前周期,继续运行 B
35 —(B 第一周期已完成) 空闲 无就绪任务,CPU 空闲(B2 在 t=50 到达)
40 60−10−40 = 10 —(B2 在 t=50 才到达) A A3 到达,运行 A
50 —(A3 完成于 50) 100−25−50 = 25 B B2 到达,运行 B

调度时序(甘特图)

|  A(0-10)  | B(10-20) | A(20-30) | B(30-35) |空闲(35-40)| A(40-50) | B(50-...) |
0           10         20         30         35          40         50
利用率检查:A 利用率 = 10/20 = 0.5,B 利用率 = 25/50 = 0.5,总利用率 = 1.0,处于临界可调度状态。调度过程中出现短暂空闲(35~40ms),但所有任务均在截止时间前完成,调度成功。
LLF 缺点:当两个任务松弛度相近时,可能产生频繁切换(抖动),导致调度开销增大。每次比较松弛度需重新计算,开销比 EDF 大。

11.5 EDF 与 LLF 对比

对比项EDF(最早截止时间优先)LLF(最低松弛度优先)
判断依据 截止时间(Deadline) 松弛度(Laxity)
抢占性 可用于抢占式和非抢占式 主要用于可抢占调度
适用任务 非周期/周期任务均可 周期任务为主
调度开销 较小(仅比较截止时间) 较大(需计算松弛度,可能抖动)

11.6 优先级倒置(Priority Inversion)

定义

优先级倒置是指高优先级进程被低优先级进程延迟或阻塞的现象。当低优先级进程持有高优先级进程所需资源时,若又有中等优先级进程抢占低优先级进程,会导致高优先级进程被中等优先级进程间接地长时间阻塞。

示例过程

设有三个进程,优先级 P1(高)> P2(中)> P3(低):

  1. P3 先运行,获得资源 R(如临界资源)。
  2. P1 就绪,因优先级高抢占 P3 运行。
  3. P1 运行中需要资源 R,但 R 被 P3 占用,P1 阻塞,等待 P3 释放 R。
  4. 此时 P2 就绪,P2 优先级高于 P3,P2 抢占 P3 运行。
  5. 结果:高优先级的 P1 反而被中优先级的 P2 长时间阻塞——P3 无法运行、无法释放 R,P1 持续等待。
危害:优先级倒置可能导致高优先级任务错过截止时间,在硬实时系统中造成严重后果。

解决方法:优先级继承(Priority Inheritance)

动态优先级继承:当高优先级进程阻塞等待低优先级进程所占资源时,低优先级进程临时继承高优先级进程的优先级,使中等优先级进程无法抢占它,从而尽快运行完毕释放资源,再恢复原优先级。

上述示例中,P1 阻塞后,P3 继承 P1 的高优先级,P2 无法抢占 P3,P3 迅速释放 R,P1 得以继续,避免了倒置。

易考点:解决优先级倒置的方法是动态优先级继承(不是静态优先级调整)。

十二、大题必考题型与解题方法

本章概览

本章汇总 8 个必考大题类型,每个题型给出解题步骤、核心公式和关键注意事项,是备考重点。

题型一:作业调度计算(FCFS / SJF / HRRN)

解题步骤

  1. 根据调度算法确定作业执行顺序
  2. 逐个作业计算:开始时间、完成时间。
  3. 套公式计算周转时间、带权周转时间
  4. 求平均值。
周转时间 = 完成时间 − 到达时间
带权周转时间 = 周转时间 / 要求服务时间
响应比 = (等待时间 + 要求服务时间) / 要求服务时间 = 1 + 等待时间/要求服务时间

三种算法选择规则

  • FCFS:按到达顺序,先到先服务。
  • SJF:从就绪作业中选服务时间最短的先执行(非抢占式)。
  • HRRN(最高响应比优先):每次调度时计算所有就绪作业响应比,选响应比最高的执行。
注意事项:①SJF/HRRN 调度时只能从已到达的作业中选;未到达的不参与。②带权周转时间 ≥ 1。③HRRN 既考虑等待时间又考虑执行时间,是 FCFS 和 SJF 的折中,不会饥饿。

题型二:进程同步 PV 操作

解题步骤

  1. 确定临界资源,设互斥信号量 mutex(初值 1)。
  2. 确定同步关系,设同步信号量(初值通常为可用资源数,如空缓冲区、满缓冲区)。
  3. 在临界区前后配对使用 P/V:P(申请资源)在前,V(释放资源)在后。
  4. 多个 P 操作时,先做同步 P,再做互斥 P,避免死锁。
P 操作(wait):S.value−−;若 S.value < 0,进程阻塞进等待队列
V 操作(signal):S.value++;若 S.value ≤ 0,唤醒等待队列中一个进程

生产者—消费者问题(经典代码)

semaphore mutex = 1;   // 互斥访问缓冲区
semaphore empty  = n;   // 空缓冲区数
semaphore full   = 0;   // 满缓冲区数

生产者:
  while(1) {
    生产一个产品;
    P(empty);     // 申请空位(同步P)
    P(mutex);     // 互斥进入临界区
    把产品放入缓冲区;
    V(mutex);     // 释放临界区
    V(full);      // 增加满位(通知消费者)
  }

消费者:
  while(1) {
    P(full);      // 申请产品(同步P)
    P(mutex);     // 互斥进入临界区
    从缓冲区取出产品;
    V(mutex);     // 释放临界区
    V(empty);     // 增加空位(通知生产者)
    消费产品;
  }
关键注意事项:①P 操作的次序不能颠倒(先同步 P 再互斥 P),否则会死锁;若先 P(mutex) 再 P(empty),当缓冲区满时生产者持有 mutex 却申请不到 empty,消费者又拿不到 mutex,死锁。②V 操作次序无关紧要,但应成对出现。③当 mutex<0 时其绝对值表示等待进入临界区的进程数

题型三:银行家算法

两个流程

流程一:安全性检查(判断当前状态是否安全)

  1. 初始化 Work = Available;Finish[i] = false(对所有 i)。
  2. 找一个 Finish[i]=false 且 Need[i] ≤ Work 的进程 i(逐分量比较)。
  3. 若找到,则 Work = Work + Allocation[i],Finish[i]=true,回到步骤 2。
  4. 若所有 Finish[i]=true,则安全(存在安全序列);否则不安全

流程二:资源请求分配(进程 Pi 请求 Request[i])

  1. Request[i] ≤ Need[i],继续;否则出错(请求超过最大需求)。
  2. Request[i] ≤ Available,继续;否则 Pi 必须等待(资源不足)。
  3. 试分配:Available = Available − Request[i];Allocation[i] += Request[i];Need[i] −= Request[i]。
  4. 执行安全性检查:若安全,则正式分配;否则回滚(恢复原值),Pi 等待。
Need = Max − Allocation(先求出 Need 矩阵)

示例(5 进程 4 资源类型)

系统有 4 种资源 A、B、C、D,总量 Total=(6,9,8,8)。各进程当前 Allocation、Max 如下:

进程AllocationMaxNeed = Max−Allocation
P00 1 0 02 3 2 12 2 2 1
P11 1 1 02 2 2 21 1 1 2
P21 2 0 13 3 1 12 1 1 0
P30 0 2 11 2 4 11 2 2 0
P41 0 0 11 2 1 20 2 1 1

计算 Available = Total − ΣAllocation = (6,9,8,8) − (3,4,3,3) = (3,5,5,5)

安全性检查过程

Work = Available = (3,5,5,5)

步骤进程NeedWork(分配前)Work+Allocation(分配后)Finish
1P02 2 2 13 5 5 53 6 5 5true
2P11 1 1 23 6 5 54 7 6 5true
3P22 1 1 04 7 6 55 9 6 6true
4P31 2 2 05 9 6 65 9 8 7true
5P40 2 1 15 9 8 76 9 8 8true

存在安全序列 P0 → P1 → P2 → P3 → P4,系统处于安全状态

资源请求示例

若 P1 提出请求 Request1 = (1,1,1,0):

  1. Request1 ≤ Need1?(1,1,1,0) ≤ (1,1,1,2) ✓
  2. Request1 ≤ Available?(1,1,1,0) ≤ (3,5,5,5) ✓
  3. 试分配:Available=(2,4,4,5),Allocation1=(2,2,2,0),Need1=(0,0,0,2)
  4. 安全性检查:Work=(2,4,4,5) → P0✓→P1✓→P2✓→P3✓→P4✓,安全序列存在。

结论:可以满足 P1 的请求,正式分配。

易考点:安全状态一定无死锁,不安全状态可能产生死锁(不一定);银行家算法属于死锁避免(不是预防)。

题型四:分页地址转换

解题步骤

  1. 由逻辑地址求页号页内偏移
  2. 判断是否越界:页号 ≥ 页表长度则越界(缺页中断/地址错误)。
  3. 查页表,由页号得到物理块号
  4. 计算物理地址
页号 = INT(逻辑地址 / 页面大小)(整除)
页内偏移 = 逻辑地址 mod 页面大小(取余)
物理地址 = 物理块号 × 页面大小 + 页内偏移

示例

分页系统,页面大小 4KB,页表:第 0、1、2 页依次存放在物理块 5H、AH、BH 中。逻辑地址为 1E6BH,求物理地址。

解:页面大小 4KB = 1000H。逻辑地址 1E6BH。

页号 = INT(1E6BH / 1000H) = 1H(高位部分)

页内偏移 = 1E6BH mod 1000H = E6BH(低位部分)

页号 1 → 物理块号 AH。物理地址 = AH × 1000H + E6BH = A000H + E6BH = AE6BH

注意事项:①页号与块号概念不同:页号是逻辑划分,块号是物理划分。②若采用快表(TLB),命中时只需访存 1 次,未命中需访存 2 次(查页表 + 取数据)。③有快表时有效访问时间 EAT = α×(快表时间+访存) + (1−α)×(快表时间+查页表访存+访存)。

题型五:分段地址转换

解题步骤

  1. 由逻辑地址拆分出段号段内偏移
  2. 段号越界检查:若段号 ≥ 段表长度,则越界(地址错误)。
  3. 查段表,得到该段的基地址段长
  4. 段内偏移越界检查:若段内偏移 ≥ 段长,则越界(地址错误)。
  5. 计算物理地址。
物理地址 = 基地址 + 段内偏移
(段表项 = 段号 → 段长、基地址)

示例

段表如下:

段号基地址段长
0210500
1235020
210090
31350590
4193895

逻辑地址 <0, 430>:段号 0 < 5 ✓;偏移 430 < 500 ✓;物理地址 = 210 + 430 = 640

逻辑地址 <3, 1400>:段号 3 < 5 ✓;偏移 1400 < 590?否,越界,地址错误

注意事项:①分段管理需两次越界检查(段号、段内偏移)。②分页是一维地址(硬件自动分页号/偏移),分段是二维地址(需显式给出段号和段内偏移)。③段式访问需 3 次访存(查段表 + 取数据 + …,无快表时)。

题型六:页面置换算法(缺页计算)

解题步骤

  1. 按访问串依次处理,维护当前驻留页帧集合。
  2. 每访问一页:若在内存中则命中;不在则缺页,按算法选淘汰页。
  3. 记录每次缺页,最后统计缺页次数和缺页率。

四种算法淘汰规则

  • OPT(最佳置换):淘汰未来最长时间不被使用的页(理论最优,不可实现,用于评价基准)。
  • FIFO(先进先出):淘汰最先进入内存的页(按进入时间排队)。
  • LRU(最近最久未用):淘汰最长时间未被访问的页(按上次访问时间)。
  • Clock(时钟/NRU):循环扫描各页的访问位,访问位为 0 则淘汰,为 1 则置 0 并跳过。

示例

页面访问串:7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1(共 20 次访问),分配 3 个页帧

算法缺页次数缺页率说明
OPT945%理论最优,性能上限
LRU1260%接近 OPT,实际常用
FIFO1575%最简单,性能最差

Clock 算法是 LRU 的近似实现,缺页次数介于 LRU 与 FIFO 之间。

关键注意事项:Belady 异常是 FIFO 特有的现象——分配页帧增多,缺页率反而升高(LRU/OPT 不会)。②初始空内存时前 3 次(页帧满前)必然缺页。③缺页率 = 缺页次数 / 总访问次数。④LRU 性能接近 OPT,但需硬件支持(寄存器/栈);Clock 用访问位近似 LRU,开销小。

题型七:磁盘调度算法

解题步骤

  1. 确定磁头当前位置移动方向(由"刚完成对 X 的服务"判断)。
  2. 按算法确定服务顺序
  3. 计算每步移动距离(相邻磁道号差的绝对值),求总移动距离
  4. 总移动距离 / 请求数 = 平均寻道长度。
总移动距离 = Σ |下一磁道 − 当前磁道|
注意事项:①SCAN 到达方向上最远请求后反向;C-SCAN 到达磁盘端点后跳回另一端;C-LOOK 到达方向最远请求后跳回另一端最远请求。②方向判断看"当前位置 vs 刚完成位置"。③详细例题见第十章(FCFS=551, SSTF=152, SCAN=117, C-SCAN=352, C-LOOK=176)。

题型八:实时调度(EDF / LLF 松弛度计算)

解题步骤

  1. 列出各任务的截止时间、还需运行时间、当前时间
  2. EDF:选截止时间最早的任务运行。
  3. LLF:计算各任务松弛度,选松弛度最低的任务运行。
  4. 若可抢占,每个时刻重新比较优先级(松弛度/截止时间)。
松弛度 = 必须完成时间 − 运行时间 − 当前时间
= 剩余时间 − 还需运行时间
EDF:截止时间越小 → 优先级越高
LLF:松弛度越小 → 优先级越高(越紧急)
注意事项:①松弛度 = 0 表示必须立即执行;< 0 表示已无法按时完成。②利用率 = Σ(执行时间/周期) ≤ 1 才可能可调度。③LLF 可能产生抖动(频繁切换),开销大于 EDF。④详细例题见第十一章(任务 A 周期 20ms 执行 10ms,任务 B 周期 50ms 执行 25ms 的 LLF 调度过程)。

十三、高频考点速记

本章概览

本章以紧凑列表/表格形式汇总最高频考点,适合考前快速回顾。

13.1 操作系统四大特征

特征含义关键点
并发宏观同时执行,微观交替执行并发≠并行(并行需多核)
共享资源可供多进程共同使用互斥共享 + 同时访问
虚拟一个物理实体映射为多个逻辑实体虚拟存储器、虚拟设备(SPOOLing)
异步进程以不可预知速度推进走走停停,但结果一致
核心:并发和共享是最基本的两个特征,二者互为存在条件;多道程序设计使并发和共享成为可能。

13.2 进程与程序、PCB

对比项程序进程
性质静态的(指令集合)动态的(执行过程)
生命周期永久的暂时的
有无状态
对应关系一个程序可对应多个进程;一个进程可包含多个程序
  • PCB 是进程存在的唯一标志,每个进程有且仅有唯一的 PCB,由 OS 创建管理,用户不能创建/删除。
  • 进程是资源分配的基本单位;线程是 CPU 调度的基本单位。
  • 进程撤销时不止释放 PCB,还需释放占用的所有资源(内存、打开文件等)。

13.3 进程状态转换(高频易错)

转换触发条件由谁决定
就绪 → 运行调度程序选中调度程序
运行 → 就绪时间片用完/更高优先级到来调度/中断
运行 → 阻塞请求 I/O/等待事件进程自身
阻塞 → 就绪I/O 完成/事件完成外部事件
最高频考点:只有 "运行→阻塞"是进程自身决定的;阻塞条件解除后变为就绪态(不是运行态)。"有新进程进入就绪状态"不是引起进程切换的直接原因。

13.4 死锁四个必要条件

条件含义
① 互斥资源一次只能被一个进程使用
② 请求与保持保持已有资源又请求新资源
③ 不剥夺资源不能被强行抢夺
④ 循环等待存在进程-资源的循环等待链
  • 四个条件必须同时满足才会死锁;破坏任一即可预防。
  • 互斥条件无法破坏(如打印机本质互斥)。
  • 死锁与推进顺序、资源分配策略有关,与进程数量无必然关系。
  • 饥饿可以只有 1 个进程,而死锁至少 2 个进程。
  • 安全状态一定无死锁;不安全状态可能死锁(不一定)。

13.5 核心公式速记

Need = Max − Allocation | 响应比 = (等待+服务)/服务
页号 = INT(逻辑地址/页面大小) | 页内偏移 = 逻辑地址 mod 页面大小
物理地址(分页) = 块号 × 页面大小 + 偏移 | 物理地址(分段) = 基地址 + 段内偏移
松弛度 = 必须完成时间 − 运行时间 − 当前时间 | 磁盘访问时间 = 寻道+旋转延迟+传输

13.6 页面置换算法缺页率对比

同一访问串(7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1,3 页帧):

OPT(9) < LRU(12) < Clock < FIFO(15)

  • OPT 最优不可实现,LRU 接近 OPT(常用),FIFO 最差。
  • Belady 异常只有 FIFO 有(增加页帧缺页反增)。
  • 缺页率 = 缺页次数 / 总访问次数。

13.7 磁盘调度算法要点

  • 总移动距离:FCFS=551 > C-SCAN=352 > C-LOOK=176 > SSTF=152 > SCAN=117。
  • SSTF 可能饥饿;SCAN/C-SCAN/C-LOOK 不会。
  • SCAN 到最远请求转向;C-SCAN 到磁盘端点返回;C-LOOK 到最远请求返回。
  • 方向判断:看"当前位置 vs 刚完成位置"。

13.8 SPOOLing 三大特点

  1. 提高 I/O 速度(低速设备 I/O → 高速磁盘存取)。
  2. 将独占设备改造为共享设备
  3. 实现虚拟设备功能

组成:输入井/输出井(磁盘)+ 输入/输出缓冲区(内存)+ 输入进程 SI/输出进程 SO。

13.9 动态分区分配算法

算法策略特点
首次适应 FF从链首找第一个能满足的空闲分区简单高效,保留大分区,低址碎片多
循环首次适应 NF从上次查找位置继续找分布均匀,但大分区可能被分小
最佳适应 BF选能满足且最小的分区留下大量小碎片,查找效率低
最坏适应 WF选能满足且最大的分区大作业可能无法分配

13.10 用户态 → 核心态切换时机

切换由以下事件引起(会导致从用户态进入核心态):

  • 系统调用(程序接口,用户主动请求 OS 服务)
  • 中断(I/O 中断、时钟中断等硬件中断)
  • 异常(缺页中断、除零、地址越界等)
易错:①I/O 操作必须在核心态下执行。②模式切换(用户态↔核心态)不一定引起进程切换(同一进程内状态切换,不改变运行状态)。③系统调用是用户态→核心态的途径。

十四、公式速查表

本章概览

汇总操作系统全课程核心公式,便于考前快速查阅。

所属章节公式名称公式说明
作业调度 响应比 响应比 = (等待时间 + 要求服务时间) / 要求服务时间 = 1 + 等待时间/服务时间,HRRN 用
作业调度 周转时间 周转时间 = 完成时间 − 到达时间 作业从到达到完成的总时间
作业调度 带权周转时间 带权周转时间 = 周转时间 / 要求服务时间 ≥ 1,越小越好
死锁 需求矩阵 Need = Max − Allocation 银行家算法先算 Need
内存管理 页号 页号 = INT(逻辑地址 / 页面大小) 整除
内存管理 页内偏移 页内偏移 = 逻辑地址 mod 页面大小 取余
内存管理 物理地址(分页) 物理地址 = 块号 × 页面大小 + 页内偏移 分页地址转换
内存管理 物理地址(分段) 物理地址 = 基地址 + 段内偏移 需两次越界检查
内存管理 内存地址(重定位) 物理地址 = 相对地址 + 重定位寄存器值 动态运行时装入
虚拟存储 有效访问时间 EAT EAT = α×(λ+t) + (1−α)×(2t+λ) α=快表命中率,λ=快表时间,t=访存时间,不考虑缺页
虚拟存储 EAT(含缺页) EAT = (1−f)×ma + f×缺页处理时间 f=缺页率,ma=有效访问时间
虚拟存储 缺页率 缺页率 = 缺页次数 / 总访问次数 OPT<LRU<Clock<FIFO
设备管理 缓冲处理时间 单缓冲:max(C,T)+M;双缓冲:max(C,T) C=处理时间,T=输入时间,M=传送时间
磁盘管理 磁盘访问时间 磁盘访问时间 = 寻道时间 + 旋转延迟时间 + 传输时间 调度算法优化寻道时间
磁盘管理 平均旋转延迟 平均旋转延迟 = 旋转一周时间 / 2 与转速有关
磁盘管理 总移动距离 总移动距离 = Σ |下一磁道 − 当前磁道| 磁盘调度计算
实时调度 松弛度 松弛度 = 必须完成时间 − 运行时间 − 当前时间 LLF:越小优先级越高
实时调度 CPU 利用率 利用率 = Σ(执行时间 / 周期) ≤ 1 才可能可调度
符号说明:α=快表(TLB)命中率,λ=快表查询时间,t=内存访问时间,f=缺页率,ma=单次访存有效时间,C=CPU 处理一块数据时间,T=设备输入一块数据时间,M=缓冲区间数据传送时间。

十五、练习题汇总

本章概览

从练习 HTML、样卷 2/3 中精选高频选择题、判断题与计算题,每题附答案与解析,覆盖操作系统各章节。

15.1 选择题精选

第 1 题【操作系统概念】

计算机的操作系统是一种 ____。

A、系统软件 B、应用软件 C、工具软件 D、字表处理软件

答案:A

解析:操作系统是管理计算机硬件与软件资源的系统软件,不是应用软件。应用软件在操作系统之上运行。

第 2 题【多道程序】

在现代操作系统中引入了 ____,从而使并发和共享成为可能。

A、单道程序 B、磁盘 C、对象 D、多道程序

答案:D

解析:多道程序设计使多个程序同时驻留内存交替执行,从而实现并发和共享。单道程序无法实现并发。

第 3 题【进程与 PCB】

进程控制块是描述进程状态和特性的数据结构,一个进程 ____。

A、可以有多个 PCB B、可与其他进程共用一个 PCB C、可以没有 PCB D、只能有唯一的 PCB

答案:D

解析:每个进程有且仅有唯一的 PCB,PCB 是进程存在的唯一标志,由 OS 创建管理。

第 4 题【进程状态转换】

一个正在 CPU 上运行的进程,其进程状态 ____。

A、只能转变为阻塞状态 B、可以转变为就绪状态也可以转变为阻塞状态 C、只能转变为就绪状态 D、可以转变为就绪状态也可以转变为执行状态

答案:B

解析:运行态进程可因时间片用完转为就绪态,也可因等待事件转为阻塞态

第 5 题【进程自身决定】

进程自身决定 ____。

A、从运行态到阻塞态 B、从就绪态到运行态 C、从运行态到就绪态 D、从阻塞态到就绪态

答案:A

解析:只有"运行→阻塞"是进程自身决定的(主动请求 I/O);其余转换由调度程序或外部事件决定。

第 6 题【PV 操作】

关于 PV 操作,以下说法不正确的是 ____。

A、P(S) 操作意味着申请一份关于信号量 S 的资源
B、V(S) 操作意味着释放一份关于信号量 S 的资源
C、进程调用一个 V(S) 操作,将信号量的值加 1 后,信号量的值小于 0,则应从信号量的等待队列中唤醒一个进程
D、进程调用一个 P(S) 操作,将信号量的值减 1 后,信号量的值小于 0,则进程应阻塞,进入等待队列

答案:C

解析:V 操作是先加 1 再判断,加 1 后若值≤ 0(不是 < 0)才唤醒一个进程。C 中"小于 0"表述错误。

第 7 题【信号量】

当某一信号量的值为 2 时,说明 ____。

A、有 2 个该信号量的资源实例可分配 B、在该信号量的队列中有两个进程 C、有两个进程由于申请相应资源而被阻塞 D、系统中有两个并发执行的进程

答案:A

解析:信号量值 > 0 时表示可用资源数;< 0 时其绝对值表示等待进程数

第 8 题【死锁】

在多进程的并发系统中,肯定不会因竞争 ____ 而产生死锁。

A、打印机 B、磁带机 C、磁盘 D、CPU

答案:D(磁盘/磁盘等共享设备也可,此处 CPU 为经典答案)

解析:CPU 和磁盘等可剥夺/共享资源不会因竞争而死锁。打印机、磁带机等独占设备可能死锁。

第 9 题【死锁原因】

操作系统讨论的死锁是与 ____ 有关。

A、进程申请的资源不存在 B、进程并发执行的进度和资源分配的策略 C、并发执行的进度 D、某个进程申请的资源数多于系统资源数

答案:B

解析:死锁与进程推进顺序(进度)和资源分配策略都有关,是时间相关错误。

第 10 题【缓冲技术】

在现代操作系统中采用缓冲技术的主要目的是 ____。

A、改善用户编程环境 B、提高 CPU 的处理速度 C、提高 CPU 和设备之间的并行程度 D、实现与设备无关性

答案:C

解析:缓冲主要缓和 CPU 与 I/O 设备速度不匹配矛盾,提高二者并行程度

第 11 题【实时系统】

要求在规定的时间内对外界的请求必须给予及时响应的 OS 是 ____。

A、多道系统 B、实时系统 C、分时系统 D、网络操作系统

答案:B

解析:实时系统强调在规定时限内响应,关键指标是可靠性和及时性。

第 12 题【核心态】

当计算机提供了用户态和内核态时,____ 必须在内核态下执行。

A、PC 自增 B、I/O 操作 C、算术运算 D、访存操作

答案:B

解析:I/O 操作是特权指令,必须在核心态执行;PC 自增、算术运算、访存是非特权指令,用户态可执行。

第 13 题【内存分配】

操作系统为 ____ 分配内存空间。

A、线程 B、高速缓冲存储器(Cache) C、进程 D、块表

答案:C

解析:进程是资源分配的基本单位,内存空间分配给进程;线程是调度基本单位,共享进程的地址空间。

第 14 题【安全状态】

非安全状态意味着 ____。

A、最终将必然产生死锁 B、存在一个不安全序列,将导致系统产生死锁 C、系统已进入死锁状态 D、以上说法均错误

答案:D

解析:非安全状态可能产生死锁(不是必然,B 错;A 也错),也不一定已死锁(C 错)。故选 D。

第 15 题【分段动态链接】

Which of following memory management schemes is fit for program's dynamic linking?

A、Segmentation B、Paging C、Dynamic-sized partitions D、Fixed-sized partitions

答案:A

解析:分段存储管理(Segmentation)便于实现段的动态链接和共享,因为段是有意义的逻辑信息单位,长度可变;分页是固定大小,不利于动态链接。

15.2 判断题精选

第 1 题【操作系统性质】

(F) 操作系统属于最重要的、最不可缺少的应用软件。

答案:错误(F)

解析:操作系统属于系统软件,不是应用软件。

第 2 题【进程状态透明】

(T) 进程状态的转换是由操作系统完成的,对用户是透明的。

答案:正确(T)

解析:进程状态转换由 OS 调度完成,用户不能直接控制,对用户透明。

第 3 题【进程撤销】

(F) 进程被撤消时,只需释放该进程的 PCB 就可以了,因为 PCB 是进程存在的唯一标志。

答案:错误(F)

解析:撤销进程时除释放 PCB,还须释放进程占用的所有资源(内存、打开的文件等)。

第 4 题【用户级线程】

(T) 用户级线程不依赖于内核。

答案:正确(T)

解析:用户级线程由用户空间线程库管理,切换不需模式切换,不依赖内核。

第 5 题【共享条件】

(F) 资源的共享是以程序的并行执行为条件的,没有程序的并行执行,就没有资源的共享。

答案:错误(F)

解析:资源共享以并发执行为条件(不是并行)。单处理机下只能并发不能并行,但仍可实现共享。

第 6 题【PV 操作次序】

(T) 在生产者消费者进程中,V 操作的次序无关紧要,而 P 操作次序不能颠倒。

答案:正确(T)

解析:P 操作次序颠倒会导致死锁(如先 P(mutex) 再 P(empty));V 操作次序不影响正确性。

第 7 题【饥饿与死锁】

(T) 系统中进入饥饿状态的进程可以只有 1 个,而进入死锁状态的进程至少有 2 个。

答案:正确(T)

解析:饥饿可只有一个进程(长期得不到资源),死锁需至少两个进程循环等待。

第 8 题【临界区操作】

(F) 互斥进程在临界区里,对共享变量的操作是相同的。

答案:错误(F)

解析:互斥进程在临界区对共享变量的操作不必相同,只是不能同时进入临界区。

第 9 题【文件管理】

(T) 操作系统是通过文件控制块对文件进行管理的。

答案:正确(T)

解析:文件控制块(FCB)是文件存在的标志,OS 通过 FCB 管理文件。文件系统主要目的是按名存取

第 10 题【SJF】

(F) 在各种作业调度算法中,短作业优先调度算法会使每个作业的等待时间变短。

答案:错误(F)

解析:SJF 使短作业等待时间短,但长作业等待时间可能很长,甚至饥饿。不是"每个作业"都变短。

第 11 题【时间片轮转】

(F) 采用简单的时间片轮转调度算法的系统中,也可能出现饥饿现象。

答案:错误(F)

解析:时间片轮转中每个进程轮流执行,等待时间有界,不会饥饿

第 12 题【多级页表】

(T) 采用多级页表存储管理不会产生外部碎片。

答案:正确(T)

解析:分页/多级页表按固定页大小分配,没有外部碎片(但有内部碎片,页内碎片)。

15.3 填空/计算题精选(来自样卷)

第 1 题【信号量取值范围】

有 3 个进程共享一程序段,而每次最多允许两个进程进入该程序段,则信号量的取值范围是 ____。

答案:(2, 1, 0, −1)

解析:信号量初值为 2(允许 2 个进入)。3 个进程中最多 2 个进入,剩 1 个等待时信号量为 2−3=−1。所以取值范围是 2、1、0、−1。

第 2 题【死锁最少资源数】

某系统中有 5 个并发进程,都需要 3 个同类资源。试问该系统不会产生死锁的最少资源总数应该是 ____。

答案:11

解析:公式 n×(m−1)+1,n=5 进程,m=3 每进程所需。5×2+1=11。当资源数为 10 时,每个进程持有 2 个(共 10),都差 1 个而互相等待,死锁;资源数 11 时至少有一个进程能拿到 3 个完成并释放,不死锁。

第 3 题【死锁资源范围】

某系统有 4 个并发进程,都需要同类资源 3 个,试问系统资源数在 3 到 ____ 这个范围内,可能因为进程推进顺序不当而引起死锁产生。

答案:8

解析:每个进程最多持有 m−1=2 个,4 个进程各持有 2 个共 8 个时,都差 1 个而互相等待,死锁。资源数 ≥ 9 时必有进程能完成。故范围是 3~8。

第 4 题【磁盘存取时间计算】

若磁盘转速为 5400 转/分,平均寻道时间为 8ms,每个磁道包含 1000 个扇区,则访问一个扇区平均存取时间大约是 ____ ms。

答案:13.57

解析:转速 5400/60=90 转/秒,旋转一周 1000/90≈11.11ms。平均旋转延迟 11.11/2≈5.56ms;传输一扇区 11.11/1000≈0.011ms。总时间 = 8+5.56+0.011 ≈ 13.57ms

第 5 题【SCAN 磁盘调度计算】

假定磁盘有 200 个柱面(编号 0~199),当前存储臂的位置在 134 号柱面上,并刚刚完成 152 号柱面的服务请求。若请求队列先后顺序为 68, 174, 91, 137, 94, 152, 102, 157, 120,则使用 SCAN 算法时,磁道移动总和为 ____。

答案:308

解析:134<152,磁头从 152 移到 134,向小方向扫描。顺序:134→120→102→94→91→68→(到底端 0 转向)→137→152→157→174。移动 = 14+18+8+3+23+68+137+15+5+17 = 308

第 6 题【分页地址转换】

在一分页存储管理系统中,逻辑地址长度为 16 位,页面大小为 4KB,有一逻辑地址为 1E6BH,且第 0、1、2 页依次存放在物理块 5H、AH、BH 中,问相应的物理地址为 ____ H。

答案:AE6BH

解析:页大小 4KB=1000H。页号 = INT(1E6BH/1000H)=1H,页内偏移 = 1E6BH mod 1000H=E6BH。页号 1→块号 AH。物理地址 = AH×1000H+E6BH = A000H+E6BH = AE6BH

第 7 题【信号量资源计数】

设与某资源关联的信号量初值为 3,当前值为 1。若 M 表示该资源的可用个数,N 表示等待该资源的进程数,则 M、N 分别是 ____。

答案:M=1,N=0(即 B、1 0)

解析:当前值 1>0,表示可用资源数 M=1;值>0 说明没有进程在等待,N=0。

第 8 题【响应比调度】

哪个进程调度算法既考虑进程等待时间又考虑进程执行时间?请简述。

答案:最高响应比优先(HRRN)

解析:响应比 = (等待时间+要求服务时间)/要求服务时间 = 1+等待时间/服务时间。①等待时间相同,短作业响应比高(类 SJF);②服务时间相同,等待久者响应比高(类 FCFS);③随等待增加长作业响应比上升,最终能获 CPU,不饥饿。是 FCFS 与 SJF 的折中。

第 9 题【死锁与环路】

系统资源分配图中出现了环路,则系统是否必然发生死锁?请解释。

答案:不一定。

解析:资源分配图出现环路是死锁的必要条件而非充分条件。当每类资源只有一个实例时,环路必死锁;若某类资源有多个实例,即使有环路也可能不死锁(进程推进使资源释放后环路可解除)。

第 10 题【动态分区放置算法】

请列举动态分区的三种放置算法,并简单解释。

答案:

  1. 首次适应(First Fit):从空闲分区链首开始找第一个能满足的分区。实现简单、分配快,但低址端产生大量小碎片。
  2. 最佳适应(Best Fit):找能满足且最小的分区。减少浪费,但产生大量难以利用的小碎片,查找效率低。
  3. 最坏适应(Worst Fit):选能满足且最大的分区。剩余空间大仍可利用,但大进程可能无法分配。

第 11 题【虚拟存储物质基础】

请列举实现虚拟存储系统的三个物质基础。

答案:

  1. 一定容量的内存:作为工作集,存放当前活跃页面/段。
  2. 足够大的外存(磁盘):作为后备存储,存放不在内存的页面/段。
  3. 地址变换机构(MMU):实现逻辑地址到物理地址转换,含页表/段表、快表(TLB)等硬件支持。

第 12 题【缺页中断原因】

请解释为什么在虚拟页式存储系统中需要引入缺页中断?

答案:当 CPU 访问的页面不在内存(在磁盘上)时,硬件无法完成地址转换,需缺页中断通知 OS。它是请求调页的核心机制,使程序可在部分页面在内存时正确运行。处理程序负责:①找到所需页在磁盘的位置;②在内存找空闲页框(或置换页面);③把页面从磁盘读入内存;④更新页表;⑤重新执行被中断的指令。

第 13 题【模式切换与进程切换】

试问模式切换是否一定会引起进程切换?解释原因。

答案:不一定。

解析:①模式切换只是 CPU 执行状态(用户态↔核心态)的转变,OS 内核处理完中断或系统调用后可返回原进程继续,此时只有模式切换,无进程切换。②只有当 OS 决定调度另一个进程执行时(如时间片用完、更高优先级进程就绪),才发生进程切换。

第 14 题【FSCAN 避免饥饿】

除 FCFS 外的所有磁盘调度算法都不是真正公平的(可能出现"饥饿")。请解释基于 SCAN 的改进算法 FSCAN 是如何避免饥饿的。

答案:①每个请求最多等待一轮扫描就能得到服务,等待时间有上界;②不像 SCAN 那样新请求可能立即被服务而老请求被推迟,FSCAN 保证先到的请求先被服务(在当前轮次内);③避免了 SCAN 中某些请求(位于磁头刚经过位置)长时间等待的问题。

复习建议:大题重点掌握 ①银行家算法(安全性检查+请求分配)②分页/分段地址转换 ③页面置换缺页计算 ④磁盘调度计算 ⑤PV 操作(生产者-消费者)⑥LLF/EDF 松弛度计算。计算题务必写出每步过程,避免只写结果。

资料来源

1. 操作系统复习考点笔记.pdf(手写笔记,16页)
2. (完整版)操作系统大题.pdf(大题汇总)
3. 操作系统期末复习资料.docx(50道问答)
4. 样卷2.docx / 样卷3.docx(模拟试卷)
5. 操作系统理论背.pptx(理论填空与判断)
6. os-knowledge-review.html(知识点清单)
7. 第二次OS作业解析.html(作业详解)
8. OS练习1-4选择/判断题.html(PTA练习题)
9. 自整理资料图片(5张手写笔记)
10. 真题卷图片(期中卷+历年试卷)

本复习指南由全部课程资料汇总整理而成 · 适用于操作系统期末考试冲刺复习