操作系统期末复习全景指南
基于全部课程资料整理
操作系统概述
1.1 操作系统的定义
操作系统(Operating System, OS)是管理和控制计算机系统中的所有软件、硬件资源,合理地组织计算机的工作流程,并为用户提供一个良好的工作环境和友好接口的系统软件。
OS 是配置在计算机硬件上的第一层软件,是硬件之上的第一层扩充,其他所有软件都在 OS 的支持下运行。
1.2 操作系统的层次结构
计算机系统由上而下的层次:
操作系统位于其他系统软件之下,直接管理硬件资源,是最基本的系统软件。
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)交还控制权
进程切换则是不同进程之间的切换,涉及保存/恢复上下文。
两者是不同的概念,不要混淆。
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 不完全空闲:系统进程仍在运行
- OS 是系统软件,不是应用软件
- OS 层次结构中,OS 在其他系统软件之下
- 系统资源包括硬件和软件资源,不只是程序和数据
- 并发 ≠ 并行;单处理机只能并发不能并行
- 多道程序设计提高吞吐量,但延长单道程序执行时间
- 模式切换 ≠ 进程切换
进程管理
2.1 进程的定义
进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位。
进程是一个动态的概念,具有生命周期:由创建而产生,由调度而执行,由撤销而消亡。
2.2 进程的组成
进程由三部分组成:
- 程序段:进程要执行的代码
- 数据段:进程处理的数据
- 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 引起进程切换的五种情况
- 时间片用完:当前运行进程的时间片耗尽
- 进程阻塞:请求 I/O 或等待某事件
- 进程终止:执行完毕或出错退出
- 更高优先级进程到来:抢占式调度中,高优先级进程抢占 CPU
- 中断发生:如 I/O 中断完成,唤醒了更高优先级的进程
2.9 线程
基本概念
- 线程是进程内的一个相对独立的执行单位
- 线程是CPU 调度的基本单位,进程是资源分配的基本单位
- 同一进程内的线程共享进程的资源(地址空间、文件描述符等)
- 同一进程或不同进程内的线程都可以并发执行
- 线程切换的开销远小于进程切换(无需切换地址空间)
| 对比维度 | 进程 | 线程 |
|---|---|---|
| 基本单位 | 资源分配的基本单位 | 调度的基本单位 |
| 地址空间 | 独立的地址空间 | 共享进程的地址空间 |
| 资源 | 拥有独立的资源 | 共享进程资源 |
| 切换开销 | 大(需切换地址空间) | 小(同一地址空间内) |
| 通信 | 需 IPC 机制,开销大 | 可直接读写共享变量 |
| 并发性 | 可以并发 | 可以并发(粒度更细) |
用户级线程
不依赖内核,由用户空间线程库管理。切换不需要模式切换,开销小。但内核不知道其存在,一个线程阻塞会导致整个进程阻塞。
内核级线程
依赖内核支持。切换需要模式切换,开销大。但能利用多处理机并行,一个线程阻塞不影响其他线程。
- 进程 = 程序 + 数据 + PCB(不能遗漏 PCB)
- PCB 是进程存在的唯一标志,由OS创建管理
- 撤销进程需释放所有资源,不只是 PCB
- 阻塞 → 就绪(不是运行)
- 进程自身只能决定"运行 → 阻塞"
- "新进程进入就绪"不是进程切换的直接原因
- 线程是调度单位,进程是资源分配单位
2.10 进程间的制约关系
- 间接制约(互斥):源于进程间共享资源的竞争关系 — 如多个进程竞争打印机
- 直接制约(同步):源于进程间合作的协同关系 — 如生产者-消费者的协作
- 进程通信:进程间交换数据的方式(共享存储、消息传递、管道通信等)
进程同步与互斥
3.1 同步与互斥的概念
- 同步(Synchronization):进程间的直接制约关系(合作关系)。多个进程为完成同一任务而相互合作,需要按一定顺序协调执行。例如接力赛中选手之间的配合。
- 互斥(Mutual Exclusion):进程间的间接制约关系(竞争关系)。多个进程因共享临界资源而必须排他地访问。例如多人借同一本书、多人同时选课。
3.2 临界区与临界资源
- 临界资源:一次仅允许一个进程访问的共享资源(如打印机、共享变量)
- 临界区:访问临界资源的代码段(是一段程序,不是缓冲区或数据区)
临界区访问的四个准则
- 空闲让进:临界区空闲时,应允许一个进程进入
- 忙则等待:已有进程在临界区时,其他进程必须等待
- 有限等待:等待进入的进程不能无限期等待(避免饥饿)
- 让权等待:不能进入临界区的进程应释放 CPU,避免"忙等"
3.3 信号量机制(P/V 操作)
信号量的组成
S.value 表示可用资源数量,S.queue 是等待该信号量的进程队列。
P 操作(wait / 申请资源)
V 操作(signal / 释放资源)
V 操作后:S.value ≤ 0 → 唤醒(有进程在等)
理解:S.value 加 1 后如果仍 ≤ 0,说明加 1 之前是负数(有进程在等),需要唤醒。
- 初值不能为负数,表示可用资源数量
- 初值为正数时:有多个资源实例可用
- 运行中值为负数时:绝对值 = 等待队列中的进程数
- S.queue 为空时,S.value ≥ 0
- 互斥信号量初值通常为 1,同步信号量初值根据资源数确定
3.4 信号量值的含义
| 信号量值 | 含义 | 可用资源数 | 等待进程数 |
|---|---|---|---|
| 初值=3,当前值=1 | 已分配2个,剩余1个 | 1 | 0 |
| 初值=3,当前值=-1 | 已分配4个,1个在等待 | 0 | 1 |
| mutex=1,当前值=-3 | 1个在临界区,3个在等待 | 0 | 3 |
| 当前值=2 | 有2个资源实例可分配 | 2 | 0 |
3.5 经典问题一:生产者-消费者问题
问题描述
一组生产者向缓冲区放入产品,一组消费者从缓冲区取出产品。缓冲区大小为 N。
同步关系:缓冲区不满时生产者才能放(empty),缓冲区不空时消费者才能取(full)。
互斥关系:对缓冲区的访问互斥(mutex)。
信号量定义
生产者进程
消费者进程
- P(empty) 必须在 P(mutex) 之前!若先 P(mutex) 再 P(empty),当缓冲区满时生产者持有 mutex 却被 empty 阻塞,消费者也无法获取 mutex 取出产品 → 死锁
- V 操作顺序无关紧要:V 操作不会阻塞,交换 V(mutex) 和 V(full) 的顺序不影响正确性
3.6 经典问题二:读者-写者问题
问题描述
多个读者可以同时读,写者必须互斥(与读者和其他写者都互斥)。
互斥关系:写-写互斥、读-写互斥;读-读不互斥(可共享)。
信号量定义
写者进程
读者进程(读优先)
3.7 经典问题三:哲学家进餐问题
问题描述
5 个哲学家围圆桌而坐,桌上每两人之间放一根筷子。哲学家交替进行思考和进餐。进餐需要同时拿起左右两根筷子。
互斥关系:每根筷子是临界资源(相邻哲学家共享一根筷子)。
死锁风险:若所有哲学家同时拿起左筷子,再拿右筷子时全部阻塞 → 死锁。
信号量定义
哲学家进程(防死锁方案一:限制人数)
防死锁方案二:奇偶号不同拿法
防死锁方案三:两根都可用才拿
- 限制人数:最多 4 人同时拿筷子 → 至少有1人能拿到两根(破坏循环等待)
- 奇偶策略:奇数号和偶数号拿筷子顺序不同 → 不会形成环路(破坏循环等待)
- 原子拿两根:两根筷子都可用时才拿 → 不会出现只拿一根的情况(破坏请求与保持)
3.8 管程(Monitor)
管程是一种高级同步机制,将共享变量及对共享变量的操作封装在一个模块中。
管程的特点
- 管程内的共享变量只能被管程内的过程访问
- 每次仅允许一个进程进入管程执行(互斥由编译器/语言自身保证)
- 程序员无需手动编写 P/V 操作,降低了出错风险
- 管程中使用 condition 变量实现同步(类似信号量但有区别)
3.9 前驱关系同步问题
当多个进程中的语句有前驱依赖关系时,每条边对应一个信号量,初值为 0。
- 前驱语句执行完后 V(对应信号量)
- 后继语句执行前 P(对应信号量)
例如 S1 → S2 表示 S1 必须先于 S2 执行,则设信号量 s=0,S1 后 V(s),S2 前 P(s)。
3.10 经典同步问题分类
| 问题 | 类型 | 说明 |
|---|---|---|
| 生产者-消费者 | 同步 + 互斥 | 同步(空/满缓冲),互斥(缓冲区访问) |
| 读者-写者 | 互斥 | 写者互斥,读者可共享 |
| 哲学家就餐 | 互斥 | 筷子是临界资源,可能死锁 |
| 司机-售票员 | 同步(无互斥) | 前驱后继合作关系 |
| 飞机订票 | 互斥 | 共享票务资源 |
| 吸烟者问题 | 同步 | 供应者与吸烟者的合作关系 |
| 桥梁交通管理 | 互斥 + 同步 | 不同方向互斥,同方向计数同步 |
- P 操作后 S < 0 才阻塞;V 操作后 S ≤ 0 才唤醒(注意等号!)
- 生产者-消费者中 P(empty) 必须在 P(mutex) 之前,否则死锁
- V 操作顺序无关紧要(不会阻塞)
- 临界区内进程可被中断(但其他进程不能进入临界区)
- 信号量初值不能为负,运行中可为负(绝对值=等待进程数)
- 使用多个互斥信号量时应按相同顺序加锁,避免死锁
死锁
4.1 死锁的定义
多个进程因竞争资源而形成一种互相等待的僵局,若无外力作用,这些进程都将无法继续执行。
死锁与进程并发执行的进度和资源分配策略有关,是一种和时间有关的错误。
4.2 死锁的四个必要条件
条件一:互斥条件(Mutual Exclusion)
资源一次只能被一个进程使用。即资源具有独占性,不能被多个进程同时访问。例如打印机、磁带机。
条件二:请求与保持条件(Hold and Wait)
进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
条件三:不可抢占条件(No Preemption)
进程已获得的资源在未使用完之前,不能被强行夺走,只能由进程自己主动释放。
条件四:循环等待条件(Circular Wait)
存在一个进程的循环等待链 P0→P1→...→Pn→P0,链中每个进程都在等待下一个进程所占有的资源。
(互、请、不、环)
4.3 可抢占资源 vs 不可抢占资源
- 可抢占(可剥夺)资源:CPU — 可以被高优先级进程抢占,竞争 CPU 不会产生死锁
- 不可抢占资源:打印机、磁带机、磁盘等 — 必须由占有者主动释放,可能导致死锁
4.4 死锁处理策略对比
| 策略 | 核心思想 | 并发性 | 实现方式 | 优缺点 |
|---|---|---|---|---|
| 死锁预防 | 破坏四个必要条件之一,从根源上防止 | 最低 | 静态分配、有序分配 | 简单可靠,但资源利用率低 |
| 死锁避免 | 分配前检查是否安全,动态决策 | 中等 | 银行家算法 | 资源利用率较高,但开销大 |
| 死锁检测与解除 | 允许死锁发生,检测到后再解除 | 最高 | 资源分配图、终止进程 | 并发性最高,但恢复代价大 |
4.5 死锁预防
通过破坏四个必要条件之一来预防死锁。
| 破坏条件 | 方法 | 说明 |
|---|---|---|
| 破坏互斥 | 将互斥资源改为共享 | 如 SPOOLing 将打印机改为共享设备。但不是所有资源都能共享,实际难以实现 |
| 破坏请求与保持 | 静态分配(一次性申请全部资源) | 进程运行前一次性申请所需全部资源。简单但资源利用率低 |
| 破坏不可抢占 | 允许抢占资源 | 新资源得不到时释放已占有资源。实现复杂,可能造成前功尽弃 |
| 破坏循环等待 | 有序分配(资源编号按序申请) | 所有资源编号,进程按序号递增申请。实际可行但限制多 |
4.6 死锁避免
安全状态
系统能按某种顺序为每个进程分配资源,使所有进程都能顺利完成,则称系统处于安全状态,该顺序称为安全序列。
安全序列
一个进程序列 <P1, P2, ..., Pn>,对于每个 Pi,它还需要的资源数 ≤ 当前可用资源数 + 前面所有进程释放的资源数,则该序列为安全序列。
- 安全状态 → 一定无死锁
- 不安全状态 → 可能产生死锁(非必然)
- 不安全状态 ≠ 已进入死锁!不安全只是"有死锁的可能"
4.7 银行家算法(核心重点)
算法思想
在每次资源分配前,先模拟分配,检查分配后系统是否仍处于安全状态。若安全则真正分配,否则拒绝分配让进程等待。
数据结构
其中: 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 |
资源请求算法(步骤一:判断是否允许分配)
- 若 Request[i] ≤ Need[i],转步骤 2;否则出错(请求超过最大需求)
- 若 Request[i] ≤ Available,转步骤 3;否则进程等待(资源不足)
- 系统试探性分配:
Available = Available - Request[i]
Allocation[i] = Allocation[i] + Request[i]
Need[i] = Need[i] - Request[i] - 执行安全性算法检查分配后状态是否安全。若安全则正式分配,否则回滚(恢复原值),进程等待
安全性检查算法(步骤二:判断是否安全)
安全性检查要点
- 每次找到一个可满足的进程后,将其已分配资源加回 Work(因为该进程完成后会释放所有资源)
- 检查顺序就是安全序列的顺序
- 如果最终所有进程都能完成 → 安全
- 如果有进程无法完成 → 不安全
- 先算 Need = Max - Allocation
- 试探分配后,用安全性算法逐个检查哪个进程的 Need ≤ Work
- 找到的进程"释放"其 Allocation 加入 Work,继续找下一个
- 能找完全部进程 → 安全,输出安全序列
- 找不完 → 不安全,拒绝分配
4.8 死锁检测与解除
死锁检测
- 利用资源分配图检测死锁
- 如果资源分配图中存在环路,且资源数为 1,则发生死锁
- 定期运行检测算法,检查系统是否已进入死锁状态
死锁解除方法
| 方法 | 说明 |
|---|---|
| 终止一个死锁进程 | 选择代价最小的进程终止,释放其资源 |
| 终止所有死锁进程 | 简单粗暴,但代价大 |
| 从死锁进程处抢夺资源 | 挂起某些死锁进程,抢占其资源给其他进程 |
4.9 死锁 vs 饥饿 vs 活锁
| 对比维度 | 死锁 | 饥饿 |
|---|---|---|
| 进程数 | 至少 2 个(循环等待) | 可以只有 1 个 |
| 本质 | 循环等待,互相持有对方所需资源 | 长期得不到所需资源 |
| 是否阻塞 | 所有死锁进程都被阻塞 | 可能处于就绪态但得不到调度 |
| 解决方法 | 预防/避免/检测解除 | 公平调度(如强信号量 FIFO) |
4.10 死锁资源数计算公式
死锁最大资源数 = 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 个哲学家同时坐下;或奇偶号不同拿法
- 破坏请求与保持:两根筷子都可用时才允许拿
死锁避免
- 银行家算法:拿筷子前检查是否导致不安全状态
死锁检测与解除
- 检测:定期检查分配图是否存在环路
- 解除:剥夺某个哲学家的筷子或终止进程
- 死锁四条件必须同时满足,破坏任何一个即可预防
- 安全状态 ≠ 无死锁(安全一定无死锁,但反过来不一定)
- 不安全状态 ≠ 死锁(不安全只是有死锁可能)
- 竞争 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,到达时间与运行时间如下,求周转时间。
| 作业 | 到达时间 | 运行时间 | 开始时间 | 完成时间 | 周转时间 | 带权周转时间 |
|---|---|---|---|---|---|---|
| A | 0 | 4 | 0 | 4 | 4 | 1.00 |
| D | 3 | 2 | 4 | 6 | 3 | 1.50 |
| B | 1 | 3 | 6 | 9 | 8 | 2.67 |
| E | 4 | 4 | 9 | 13 | 9 | 2.25 |
| C | 2 | 5 | 13 | 18 | 16 | 3.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 时间 | 开始时间 | 完成时间 | 周转时间 | 等待时间 |
|---|---|---|---|---|---|---|
| A | 0 | 20 | 0 | 20 | 20 | 0 |
| C | 10 | 5 | 20 | 25 | 15 | 10 |
| B | 5 | 15 | 25 | 40 | 35 | 20 |
| D | 15 | 10 | 40 | 50 | 35 | 25 |
调度顺序:A → C → B → Dt=20 时刻 A 完成,计算各就绪作业响应比: Rp(B) = (15+15)/15 = 2.0 Rp(C) = (10+5)/5 = 3.0 ← 选中 C Rp(D) = (5+10)/10 = 1.5t=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 | 是 | 综合性能好,自适应 | 实现复杂 | 可能 | 通用(最常用) |
六、内存管理
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 | 查页表得块号 | 物理地址 |
|---|---|---|---|---|
| 1011 | INT[1011/1024]=0 | 1011 mod 1024 = 1011 | 0 → 2 | 2×1024 + 1011 = 3059 |
| 2148 | INT[2148/1024]=2 | 2148 mod 1024 = 100 | 2 → 1 | 1×1024 + 100 = 1124 |
| 5012 | INT[5012/1024]=4 | 916 | — | 越界(P=4 > 3) |
快表 TLB
快表(TLB,Translation Lookaside Buffer)是一个具有并行查找能力的高速缓存(小容量联想寄存器),用于存放当前访问过的页表项,以加速地址转换过程。
作用:避免每次访存都先查内存中的页表,把“两次访存”降为可能一次访存,大幅提高有效访问速度。
工作过程:先查快表,若命中(页表项在快表中)则直接得到块号、计算物理地址;若未命中则查内存页表,并将该页表项写入快表。
6.5 分段存储管理
基本概念
按程序的逻辑结构(如主程序、子程序、数据段等)划分为若干段,每段是一组有意义的信息,段长不等。段表记录每段的段号、段长(段限)和内存始址(基址)。分段地址空间是二维的,地址由 (段号, 段内偏移) 给出。
地址转换公式
物理地址 = 段基址 + 段内偏移
转换步骤:① 用段号 S 与段表长度比较,若 S ≥ 段表长度则越界中断;② 查段表得该段基址和段长 L;③ 若段内偏移 d ≥ 段长 L,则越界中断;④ 否则物理地址 = 基址 + d。
地址转换示例
设段表如下(段号 → 基址/段长):
| 段号 | 基址 | 段长 |
|---|---|---|
| 0 | 219 | 600 |
| 1 | 2300 | 14 |
| 2 | 90 | 100 |
| 3 | 1327 | 580 |
| 4 | 1952 | 96 |
转换逻辑地址 (2, 88) 与 (4, 100):
| 逻辑地址 | 段号 | 段内偏移 | 越界检查 | 物理地址 |
|---|---|---|---|---|
| (2, 88) | 2 | 88 | 88 < 100,合法 | 90 + 88 = 178 |
| (4, 100) | 4 | 100 | 100 > 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 次置换7.4 Belady 异常
定义:在采用某种置换算法时,分配的物理块数增加,缺页次数反而增加的现象。
7.5 算法对比总结
| 算法 | 缺页次数 | 置换次数 | 优点 | 缺点 | Belady异常 |
|---|---|---|---|---|---|
| OPT(最佳) | 9 | 6 | 缺页率最低,理论最优 | 无法实现(需预知未来) | 否 |
| LRU | 12 | 9 | 性能好,接近 OPT | 实现开销大,需硬件 | 否 |
| Clock/NRU | — | — | LRU 近似,开销小 | 近似 LRU,性能略差 | 否 |
| FIFO | 15 | 12 | 实现最简单 | 性能差,有 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 的典型方法。
- 无结构文件又称流式文件;有结构文件又称记录式文件。
九、设备管理
本章概览
设备管理是操作系统的重要功能之一,负责管理和控制各类 I/O 设备,完成用户提出的 I/O 请求、加快 I/O 速度、方便设备使用。核心内容包括:I/O 设备分类、I/O 控制方式、缓冲技术、SPOOLing 技术、设备分配与中断处理。
9.1 I/O 设备的分类
按设备的共享属性(分配方式)可分为三类:
| 类型 | 定义 | 典型设备 | 特点 |
|---|---|---|---|
| 独占设备 | 一段时间内只允许一个进程独占使用的设备 | 打印机、磁带机 | 属于临界资源,必须互斥访问;分配方式为静态分配 |
| 共享设备 | 一段时间内允许多个进程同时(交叉)访问的设备 | 磁盘 | 可动态分配,多个进程分时交替使用;需通过调度算法管理访问 |
| 虚拟设备 | 通过 SPOOLing 技术将独占设备改造成的可共享设备 | 虚拟打印机 | 把独占设备变为可共享的"虚拟"设备,提高设备利用率 |
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 干预最少,效率最高;通道昂贵,适用于大型机 |
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 场景 |
| 缓冲池 | 多个缓冲区统一管理,分为输入/输出队列 | 可供多个设备共享,含收容输入、提取输入、收容输出、提取输出四种工作方式 | 多设备、复杂系统 |
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 可改造为共享设备:
- 用户进程请求打印时,不立即把打印机分配给该进程,而是由 SPOOLing 的输出进程 申请空闲磁盘块(输出井),将打印数据送入其中。
- 为该用户进程申请一张空白的用户请求打印表,填入打印要求,将其挂到请求打印队列末尾。
- 用户进程的打印请求完成,可继续执行其他任务(对用户而言"打印已完成")。
- 当打印机空闲时,输出进程 SO 从请求打印队列队首取一张表,按其中要求从输出井取出数据送到打印机进行真正的物理打印。
- 提高了 I/O 速度:从对低速设备的 I/O 变为对高速磁盘的存取。
- 将独占设备改造为共享设备:多个进程可同时"使用"打印机。
- 实现了虚拟设备功能:每个用户都感觉自己独占了一台打印机。
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) | 实现逻辑设备名→物理设备名的映射,保证设备独立性 | 逻辑设备名、物理设备名、设备驱动程序入口地址 |
9.7 中断处理过程
当设备完成 I/O 操作后,向 CPU 发出中断请求,CPU 响应后进行中断处理,其标准过程分为 5 个步骤:
- 唤醒被阻塞的驱动(I/O)程序进程:把等待该 I/O 完成的进程从阻塞队列移出,置为就绪态。
- 保护被中断进程的现场:保存 CPU 寄存器、程序状态字(PSW)等到被中断进程的 PCB 中,以便将来恢复。
- 分析中断原因,转入相应的设备中断处理程序:根据中断向量找到对应的中断处理程序入口。
- 进行中断处理:执行具体的中断处理程序,完成数据传送或错误处理。
- 恢复被中断进程的现场:从 PCB 中恢复现场,返回被中断的程序继续执行。
十、磁盘管理
本章概览
磁盘是现代计算机中最重要的共享 I/O 设备,磁盘管理的核心是磁盘调度算法(决定服务请求的顺序以减少寻道时间)。本章重点掌握 5 种调度算法的计算。
10.1 磁盘结构基本概念
- 盘片(Platter):磁盘的物理载体,两面涂有磁性材料。
- 磁道(Track):盘片上一个面上的同心圆环,是磁头读写的基本轨迹。
- 柱面(Cylinder):所有盘面上同一半径的磁道组成的圆柱面。柱面号即磁道号。
- 扇区(Sector):磁道被划分为若干弧段,每个扇区是磁盘读写的最小物理单位(通常 512B)。
10.2 磁盘访问时间
| 组成部分 | 含义 | 决定因素 |
|---|---|---|
| 寻道时间 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
方向判断例题(来自样卷)
磁盘有 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-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 减少空跑距离 | 实现略复杂 | 否 |
10.5 提高磁盘 I/O 速度的方法
| 方法 | 原理 | 说明 |
|---|---|---|
| 磁盘高速缓存(Disk Cache) | 在内存中设置缓存区,暂存最近访问的磁盘数据 | 命中则直接读内存,减少磁盘访问 |
| 提前读(Read-Ahead) | 读当前块时顺带把下一块也读入 | 利用顺序访问的局部性,减少后续缺页 |
| 延迟写(Delayed Write) | 写操作先写缓存,不立即写回磁盘 | 减少写盘次数,但掉电可能丢数据 |
| 优化物理块分布 | 把可能顺序访问的块安排在同一柱面相邻扇区 | 减少寻道和旋转延迟 |
| RAM 盘 / 虚拟盘 | 用一部分内存模拟磁盘 | 速度极快,但掉电丢失,用于临时数据 |
十一、实时调度
本章概览
实时系统要求在规定时限内对外部事件作出响应。实时调度的核心是保证任务在截止时间(Deadline)前完成,主要算法有 EDF(最早截止时间优先)和 LLF(最低松弛度优先)。
11.1 实时系统基本概念
| 类型 | 定义 | 特点/举例 |
|---|---|---|
| 硬实时(Hard Real-Time) | 必须绝对满足截止时间约束,否则造成灾难性后果 | 导弹制导、核反应堆控制、汽车安全气囊 |
| 软实时(Soft Real-Time) | 偶尔错过截止时间可接受,不致严重后果 | 视频播放、网络通信、多媒体 |
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
11.5 EDF 与 LLF 对比
| 对比项 | EDF(最早截止时间优先) | LLF(最低松弛度优先) |
|---|---|---|
| 判断依据 | 截止时间(Deadline) | 松弛度(Laxity) |
| 抢占性 | 可用于抢占式和非抢占式 | 主要用于可抢占调度 |
| 适用任务 | 非周期/周期任务均可 | 周期任务为主 |
| 调度开销 | 较小(仅比较截止时间) | 较大(需计算松弛度,可能抖动) |
11.6 优先级倒置(Priority Inversion)
定义
优先级倒置是指高优先级进程被低优先级进程延迟或阻塞的现象。当低优先级进程持有高优先级进程所需资源时,若又有中等优先级进程抢占低优先级进程,会导致高优先级进程被中等优先级进程间接地长时间阻塞。
示例过程
设有三个进程,优先级 P1(高)> P2(中)> P3(低):
- P3 先运行,获得资源 R(如临界资源)。
- P1 就绪,因优先级高抢占 P3 运行。
- P1 运行中需要资源 R,但 R 被 P3 占用,P1 阻塞,等待 P3 释放 R。
- 此时 P2 就绪,P2 优先级高于 P3,P2 抢占 P3 运行。
- 结果:高优先级的 P1 反而被中优先级的 P2 长时间阻塞——P3 无法运行、无法释放 R,P1 持续等待。
解决方法:优先级继承(Priority Inheritance)
动态优先级继承:当高优先级进程阻塞等待低优先级进程所占资源时,低优先级进程临时继承高优先级进程的优先级,使中等优先级进程无法抢占它,从而尽快运行完毕释放资源,再恢复原优先级。
上述示例中,P1 阻塞后,P3 继承 P1 的高优先级,P2 无法抢占 P3,P3 迅速释放 R,P1 得以继续,避免了倒置。
十二、大题必考题型与解题方法
本章概览
本章汇总 8 个必考大题类型,每个题型给出解题步骤、核心公式和关键注意事项,是备考重点。
题型一:作业调度计算(FCFS / SJF / HRRN)
解题步骤
- 根据调度算法确定作业执行顺序。
- 逐个作业计算:开始时间、完成时间。
- 套公式计算周转时间、带权周转时间。
- 求平均值。
带权周转时间 = 周转时间 / 要求服务时间
响应比 = (等待时间 + 要求服务时间) / 要求服务时间 = 1 + 等待时间/要求服务时间
三种算法选择规则
- FCFS:按到达顺序,先到先服务。
- SJF:从就绪作业中选服务时间最短的先执行(非抢占式)。
- HRRN(最高响应比优先):每次调度时计算所有就绪作业响应比,选响应比最高的执行。
题型二:进程同步 PV 操作
解题步骤
- 确定临界资源,设互斥信号量 mutex(初值 1)。
- 确定同步关系,设同步信号量(初值通常为可用资源数,如空缓冲区、满缓冲区)。
- 在临界区前后配对使用 P/V:P(申请资源)在前,V(释放资源)在后。
- 多个 P 操作时,先做同步 P,再做互斥 P,避免死锁。
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); // 增加空位(通知生产者)
消费产品;
}
题型三:银行家算法
两个流程
流程一:安全性检查(判断当前状态是否安全)
- 初始化 Work = Available;Finish[i] = false(对所有 i)。
- 找一个 Finish[i]=false 且 Need[i] ≤ Work 的进程 i(逐分量比较)。
- 若找到,则 Work = Work + Allocation[i],Finish[i]=true,回到步骤 2。
- 若所有 Finish[i]=true,则安全(存在安全序列);否则不安全。
流程二:资源请求分配(进程 Pi 请求 Request[i])
- 若 Request[i] ≤ Need[i],继续;否则出错(请求超过最大需求)。
- 若 Request[i] ≤ Available,继续;否则 Pi 必须等待(资源不足)。
- 试分配:Available = Available − Request[i];Allocation[i] += Request[i];Need[i] −= Request[i]。
- 执行安全性检查:若安全,则正式分配;否则回滚(恢复原值),Pi 等待。
示例(5 进程 4 资源类型)
系统有 4 种资源 A、B、C、D,总量 Total=(6,9,8,8)。各进程当前 Allocation、Max 如下:
| 进程 | Allocation | Max | Need = Max−Allocation |
|---|---|---|---|
| P0 | 0 1 0 0 | 2 3 2 1 | 2 2 2 1 |
| P1 | 1 1 1 0 | 2 2 2 2 | 1 1 1 2 |
| P2 | 1 2 0 1 | 3 3 1 1 | 2 1 1 0 |
| P3 | 0 0 2 1 | 1 2 4 1 | 1 2 2 0 |
| P4 | 1 0 0 1 | 1 2 1 2 | 0 2 1 1 |
计算 Available = Total − ΣAllocation = (6,9,8,8) − (3,4,3,3) = (3,5,5,5)
安全性检查过程
Work = Available = (3,5,5,5)
| 步骤 | 进程 | Need | Work(分配前) | Work+Allocation(分配后) | Finish |
|---|---|---|---|---|---|
| 1 | P0 | 2 2 2 1 | 3 5 5 5 | 3 6 5 5 | true |
| 2 | P1 | 1 1 1 2 | 3 6 5 5 | 4 7 6 5 | true |
| 3 | P2 | 2 1 1 0 | 4 7 6 5 | 5 9 6 6 | true |
| 4 | P3 | 1 2 2 0 | 5 9 6 6 | 5 9 8 7 | true |
| 5 | P4 | 0 2 1 1 | 5 9 8 7 | 6 9 8 8 | true |
存在安全序列 P0 → P1 → P2 → P3 → P4,系统处于安全状态。
资源请求示例
若 P1 提出请求 Request1 = (1,1,1,0):
- Request1 ≤ Need1?(1,1,1,0) ≤ (1,1,1,2) ✓
- Request1 ≤ Available?(1,1,1,0) ≤ (3,5,5,5) ✓
- 试分配:Available=(2,4,4,5),Allocation1=(2,2,2,0),Need1=(0,0,0,2)
- 安全性检查:Work=(2,4,4,5) → P0✓→P1✓→P2✓→P3✓→P4✓,安全序列存在。
结论:可以满足 P1 的请求,正式分配。
题型四:分页地址转换
解题步骤
- 由逻辑地址求页号和页内偏移。
- 判断是否越界:页号 ≥ 页表长度则越界(缺页中断/地址错误)。
- 查页表,由页号得到物理块号。
- 计算物理地址。
页内偏移 = 逻辑地址 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
题型五:分段地址转换
解题步骤
- 由逻辑地址拆分出段号和段内偏移。
- 段号越界检查:若段号 ≥ 段表长度,则越界(地址错误)。
- 查段表,得到该段的基地址和段长。
- 段内偏移越界检查:若段内偏移 ≥ 段长,则越界(地址错误)。
- 计算物理地址。
(段表项 = 段号 → 段长、基地址)
示例
段表如下:
| 段号 | 基地址 | 段长 |
|---|---|---|
| 0 | 210 | 500 |
| 1 | 2350 | 20 |
| 2 | 100 | 90 |
| 3 | 1350 | 590 |
| 4 | 1938 | 95 |
逻辑地址 <0, 430>:段号 0 < 5 ✓;偏移 430 < 500 ✓;物理地址 = 210 + 430 = 640
逻辑地址 <3, 1400>:段号 3 < 5 ✓;偏移 1400 < 590?否,越界,地址错误
题型六:页面置换算法(缺页计算)
解题步骤
- 按访问串依次处理,维护当前驻留页帧集合。
- 每访问一页:若在内存中则命中;不在则缺页,按算法选淘汰页。
- 记录每次缺页,最后统计缺页次数和缺页率。
四种算法淘汰规则
- 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 个页帧。
| 算法 | 缺页次数 | 缺页率 | 说明 |
|---|---|---|---|
| OPT | 9 | 45% | 理论最优,性能上限 |
| LRU | 12 | 60% | 接近 OPT,实际常用 |
| FIFO | 15 | 75% | 最简单,性能最差 |
Clock 算法是 LRU 的近似实现,缺页次数介于 LRU 与 FIFO 之间。
题型七:磁盘调度算法
解题步骤
- 确定磁头当前位置和移动方向(由"刚完成对 X 的服务"判断)。
- 按算法确定服务顺序。
- 计算每步移动距离(相邻磁道号差的绝对值),求总移动距离。
- 总移动距离 / 请求数 = 平均寻道长度。
题型八:实时调度(EDF / LLF 松弛度计算)
解题步骤
- 列出各任务的截止时间、还需运行时间、当前时间。
- EDF:选截止时间最早的任务运行。
- LLF:计算各任务松弛度,选松弛度最低的任务运行。
- 若可抢占,每个时刻重新比较优先级(松弛度/截止时间)。
= 剩余时间 − 还需运行时间
EDF:截止时间越小 → 优先级越高
LLF:松弛度越小 → 优先级越高(越紧急)
十三、高频考点速记
本章概览
本章以紧凑列表/表格形式汇总最高频考点,适合考前快速回顾。
13.1 操作系统四大特征
| 特征 | 含义 | 关键点 |
|---|---|---|
| 并发 | 宏观同时执行,微观交替执行 | 并发≠并行(并行需多核) |
| 共享 | 资源可供多进程共同使用 | 互斥共享 + 同时访问 |
| 虚拟 | 一个物理实体映射为多个逻辑实体 | 虚拟存储器、虚拟设备(SPOOLing) |
| 异步 | 进程以不可预知速度推进 | 走走停停,但结果一致 |
13.2 进程与程序、PCB
| 对比项 | 程序 | 进程 |
|---|---|---|
| 性质 | 静态的(指令集合) | 动态的(执行过程) |
| 生命周期 | 永久的 | 暂时的 |
| 有无状态 | 无 | 有 |
| 对应关系 | 一个程序可对应多个进程;一个进程可包含多个程序 | |
- PCB 是进程存在的唯一标志,每个进程有且仅有唯一的 PCB,由 OS 创建管理,用户不能创建/删除。
- 进程是资源分配的基本单位;线程是 CPU 调度的基本单位。
- 进程撤销时不止释放 PCB,还需释放占用的所有资源(内存、打开文件等)。
13.3 进程状态转换(高频易错)
| 转换 | 触发条件 | 由谁决定 |
|---|---|---|
| 就绪 → 运行 | 调度程序选中 | 调度程序 |
| 运行 → 就绪 | 时间片用完/更高优先级到来 | 调度/中断 |
| 运行 → 阻塞 | 请求 I/O/等待事件 | 进程自身 |
| 阻塞 → 就绪 | I/O 完成/事件完成 | 外部事件 |
13.4 死锁四个必要条件
| 条件 | 含义 |
|---|---|
| ① 互斥 | 资源一次只能被一个进程使用 |
| ② 请求与保持 | 保持已有资源又请求新资源 |
| ③ 不剥夺 | 资源不能被强行抢夺 |
| ④ 循环等待 | 存在进程-资源的循环等待链 |
- 四个条件必须同时满足才会死锁;破坏任一即可预防。
- 互斥条件无法破坏(如打印机本质互斥)。
- 死锁与推进顺序、资源分配策略有关,与进程数量无必然关系。
- 饥饿可以只有 1 个进程,而死锁至少 2 个进程。
- 安全状态一定无死锁;不安全状态可能死锁(不一定)。
13.5 核心公式速记
页号 = 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 三大特点
- 提高 I/O 速度(低速设备 I/O → 高速磁盘存取)。
- 将独占设备改造为共享设备。
- 实现虚拟设备功能。
组成:输入井/输出井(磁盘)+ 输入/输出缓冲区(内存)+ 输入进程 SI/输出进程 SO。
13.9 动态分区分配算法
| 算法 | 策略 | 特点 |
|---|---|---|
| 首次适应 FF | 从链首找第一个能满足的空闲分区 | 简单高效,保留大分区,低址碎片多 |
| 循环首次适应 NF | 从上次查找位置继续找 | 分布均匀,但大分区可能被分小 |
| 最佳适应 BF | 选能满足且最小的分区 | 留下大量小碎片,查找效率低 |
| 最坏适应 WF | 选能满足且最大的分区 | 大作业可能无法分配 |
13.10 用户态 → 核心态切换时机
切换由以下事件引起(会导致从用户态进入核心态):
- 系统调用(程序接口,用户主动请求 OS 服务)
- 中断(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 才可能可调度 |
十五、练习题汇总
本章概览
从练习 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 题【动态分区放置算法】
请列举动态分区的三种放置算法,并简单解释。
答案:
- 首次适应(First Fit):从空闲分区链首开始找第一个能满足的分区。实现简单、分配快,但低址端产生大量小碎片。
- 最佳适应(Best Fit):找能满足且最小的分区。减少浪费,但产生大量难以利用的小碎片,查找效率低。
- 最坏适应(Worst Fit):选能满足且最大的分区。剩余空间大仍可利用,但大进程可能无法分配。
第 11 题【虚拟存储物质基础】
请列举实现虚拟存储系统的三个物质基础。
答案:
- 一定容量的内存:作为工作集,存放当前活跃页面/段。
- 足够大的外存(磁盘):作为后备存储,存放不在内存的页面/段。
- 地址变换机构(MMU):实现逻辑地址到物理地址转换,含页表/段表、快表(TLB)等硬件支持。
第 12 题【缺页中断原因】
请解释为什么在虚拟页式存储系统中需要引入缺页中断?
答案:当 CPU 访问的页面不在内存(在磁盘上)时,硬件无法完成地址转换,需缺页中断通知 OS。它是请求调页的核心机制,使程序可在部分页面在内存时正确运行。处理程序负责:①找到所需页在磁盘的位置;②在内存找空闲页框(或置换页面);③把页面从磁盘读入内存;④更新页表;⑤重新执行被中断的指令。
第 13 题【模式切换与进程切换】
试问模式切换是否一定会引起进程切换?解释原因。
答案:不一定。
解析:①模式切换只是 CPU 执行状态(用户态↔核心态)的转变,OS 内核处理完中断或系统调用后可返回原进程继续,此时只有模式切换,无进程切换。②只有当 OS 决定调度另一个进程执行时(如时间片用完、更高优先级进程就绪),才发生进程切换。
第 14 题【FSCAN 避免饥饿】
除 FCFS 外的所有磁盘调度算法都不是真正公平的(可能出现"饥饿")。请解释基于 SCAN 的改进算法 FSCAN 是如何避免饥饿的。
答案:①每个请求最多等待一轮扫描就能得到服务,等待时间有上界;②不像 SCAN 那样新请求可能立即被服务而老请求被推迟,FSCAN 保证先到的请求先被服务(在当前轮次内);③避免了 SCAN 中某些请求(位于磁头刚经过位置)长时间等待的问题。
评论交流
欢迎留下你的想法