操作系统高频考点


前言

本文章总结了大概100道操作系统的典型例题,包含选择、判断、填空、简答、计算、综合设计,能够涵盖现代操作系统的大半知识点。考点核心都在这里了如果能把这100道例题全搞懂,那么就差不多能过了。
注:有不对的地方欢迎指正。

第一部分 操作系统概述

操作系统发展阶段与批处理系统

【例题】

下列说法错误的是( )。

A. 手工操作阶段,程序运行的准备和撤销都需要手工完成,资源利用率低。
B. 单道批处理系统中,一个作业进行 I/O 时,CPU 可能空闲。
C. 单道批处理系统效率提高的根本原因是“可以把作业放成一批”。
D. 多道批处理系统尽量使 CPU 和外设同时处于忙碌状态。

【考点】

手工操作、单道批处理、多道批处理的特点;批处理效率提高的根本原因。

【答案】C

【解析】

单道批处理系统比手工操作阶段效率高,根本原因是监督程序自动完成作业转换,减少了人工干预,而不是“把作业放成一批”本身。多道批处理进一步把多个作业同时装入内存,一个作业等待 I/O 时,CPU 可转去运行另一个就绪作业,从而提高 CPU 利用率、设备利用率和吞吐量。


多道程序设计

【例题】

多道程序设计是指( )。

A. 多个程序在同一时刻共同占用同一个 CPU
B. 多个程序同时进入内存并发执行
C. 把一个程序划分为多个程序段并行执行
D. 一个程序只能生成一个进程

【考点】

多道程序设计、并发与并行。

【答案】B

【解析】

多道程序设计是把多个程序同时放入内存,由操作系统调度它们交替使用 CPU。单处理器系统中,它们在一个时间段内并发推进,但任一时刻只有一个程序真正执行;多处理器系统才可能同时并行执行。


多道程序吞吐量与单个作业周转时间

【例题】

多道程序设计技术可以 ____ 单位时间完成的任务量;对单个任务而言,其完成时间相对单道执行可能 ____。

A. 增加,减少
B. 增加,延长
C. 减少,延长
D. 减少,减少

【考点】

吞吐量、周转时间、多道程序的收益与代价。

【答案】B

【解析】

多道程序通过重叠 CPU 计算与 I/O 等待,提高系统总体吞吐量;但每个作业需要与其他作业竞争 CPU、内存和设备,因此单个作业的周转时间可能延长。不能把“系统整体效率提高” 误解为 “每个作业一定更快”。


操作系统的四个基本特征

【例题】

简述现代操作系统的四个基本特征。

【考点】

并发、共享、虚拟、异步。

【答案】并发性、共享性、虚拟性、异步性。

【解析】

并发是多个程序在同一时间间隔内推进;共享是多个进程共同使用系统资源;虚拟是通过软件把一个物理实体变成多个逻辑实体,或把有限资源扩展成更大的逻辑资源;异步是并发进程按不可预知的相对速度推进。并发与共享互为条件:没有并发就没有资源共享问题,没有资源共享也缺少并发协调的意义。


操作系统的主要功能

【例题】

操作系统作为资源管理器,通常具有处理机管理、存储器管理、____ 、_____和用户接口等功能。

【考点】

操作系统功能模块。

【答案】设备管理、文件管理。

【解析】

处理机管理负责进程控制、同步、通信和调度;存储器管理负责内存分配、地址映射、保护与扩充;设备管理负责 I/O 控制、驱动、缓冲和设备分配;文件管理负责文件、目录和外存空间;用户接口包括命令接口、图形接口和系统调用接口。


分时系统的特征

【例题】

分时系统的主要特征是多路性、独立性、及时性和 ____ 性;多个用户轮流共享 CPU 的基本时间单位是 ____ 。

【考点】

分时系统特征、时间片。

【答案】交互性;时间片。

【解析】

分时系统通过时间片轮转让多个用户终端获得近似独占计算机的体验。多路性表示多个用户同时联机;独立性表示各用户感觉彼此独立;及时性表示能在可接受时间内响应;交互性表示用户可边输入边获得结果。


批处理、分时和实时系统的区别

【例题】

“UNIX、Linux、Windows、macOS 和 Android 只能归为批处理系统、分时系统或实时系统中的一种。(×)

【考点】

操作系统分类不是互斥标签;通用系统可同时具备多种处理能力。

【解析】

现代通用操作系统通常以分时、多任务和交互处理为主体,同时保留批处理能力,并可提供一定的实时扩展。 UNIX/Linux/Windows/macOS/Android 并不是只属于某一个狭义类别;它们是通用多任务系统,核心调度通常具有分时性质,也可运行批处理任务,部分版本或扩展支持软实时/实时调度。


CPU 工作模式:用户态与内核态

【例题】

当处理器处于内核态时,可以执行的指令是( )。

A. 仅非特权指令
B. 仅特权指令
C. 体系结构支持的全部指令
D. 只能执行用户程序指令

【考点】

CPU 权限级、特权指令、用户态和内核态。

【答案】C

【解析】

内核态可以执行 特权指令和非特权指令,因此可执行体系结构支持的全部指令;用户态只能执行非特权指令。CPU 按对资源和机器指令的使用权限划分为用户态与内核态,实模式/保护模式则是操作系统的运行和寻址模式


用户态进入内核态的三种方式

【例题】

判断哪些操作会导致 CPU 从用户态进入内核态( )。

A. sin 函数调用
B. read 系统调用
C. 整数除 0
D. 普通函数调用

【考点】

系统调用、异常、外部中断。

【答案】BC

【解析】

普通函数调用和 sin 等数学库计算通常在用户空间完成,不需要操作系统介入。read 属于系统调用,必须通过陷入指令进入内核;整数除 0 会触发同步异常,CPU 转入内核异常处理程序。只有 系统调用、异常和外部中断会使 CPU 进入内核态;用户态直接执行特权指令时,也会因非法指令异常而进入内核处理。


系统调用执行过程

【例题】

系统调用执行过程正确的是( )。

A. 用户程序 → 内核 → 系统调用
B. 用户程序 → 调用库函数/设置参数 →Trap 或 syscall→ 内核服务程序 → 返回用户程序
C. 用户程序 → 普通函数调用 → 结束
D. 用户程序 → 直接执行设备指令

【考点】

系统调用入口、参数传递、陷入、分派与返回。

【答案】B

【解析】

典型流程为:用户程序准备参数并调用库函数;库函数放置系统调用号和参数;执行 trap、syscall 或 sysenter 等受控入口;CPU 保存必要现场并进入内核态;系统调用分派程序按调用号选择服务程序;内核完成服务并返回结果;恢复用户态继续执行。open、read、write、fork、exec、wait、pipe、socket 等都属于系统调用或由库函数封装的系统调用接口。


系统调用与普通函数调用

【例题】

“所有 C 库函数都是系统调用,执行时都会进入内核态。”(×)

【考点】

库函数与系统调用的关系。

【解析】

库函数是用户态函数接口,其中有些完全在用户态执行,例如 strlen、sin;有些内部会调用系统调用,例如 fread 最终可能调用 read;有些会组合多个系统调用。系统调用是用户程序请求内核服务的程序级接口,开销通常大于普通函数调用。


中断与异常的区别及处理过程

【例题】

简述中断和异常的区别,并写出中断响应的基本步骤。

【考点】

同步异常、异步外中断、保存现场、中断向量、服务程序、返回。

【答案】异常通常由当前执行指令同步引起;外部中断通常由设备或时钟异步提出。基本步骤:完成当前指令 → 判断并响应中断 → 保存程序计数器、程序状态字等现场 → 根据中断向量定位服务程序 → 进入内核态执行中断服务 → 清除/确认中断并可能唤醒等待进程 → 恢复现场 → 中断返回。

【解析】

除 0、非法指令、缺页等属于异常;键盘、磁盘完成、时钟等通常属于外部中断。中断处理程序必须保存会被破坏的现场,并在处理完成后恢复。中断是操作系统实现设备并行、时钟调度和异常处理的基础。


操作系统启动过程

【例题】

简述计算机从加电到进入操作系统的主要步骤。

【考点】

BIOS/UEFI、POST、启动设备、MBR/EFI、BootLoader、内核初始化。

【答案】加电复位 →BIOS/UEFI 执行加电自检和硬件初始化 → 选择启动设备 → 装入并运行引导程序 →BootLoader(如 GRUB)装入内核和必要参数 → 内核初始化内存、中断、设备、进程和文件系统 → 启动 init/systemd 及系统服务 → 进入登录或图形界面。

【解析】

传统 OS 常把复位入口记为物理地址 0xFFFF0。GRUB 是典型引导程序。传统 MBR 模式下,第一阶段引导代码位于引导扇区而非普通文件;现代 UEFI 则从 EFI 系统分区加载可执行文件。


内核体系结构

【例题】

“Linux 是典型的微内核操作系统。”(×)

【考点】

宏内核、微内核、模块化内核。

【解析】

Linux 采用单体/宏内核结构,进程管理、内存管理、文件系统、网络和大量驱动运行在内核空间,同时支持可加载内核模块。微内核只把最基本机制留在内核,把更多服务放到用户态服务器中,隔离性强但通信开销较大。


第二部分 进程与线程

程序、作业与进程

【例题】

说明程序、作业和进程的区别与联系。

【考点】

静态程序、用户任务、动态执行实体。

【答案】程序是静态指令和数据集合;作业是用户提交给系统的一项完整任务,通常包含程序、数据和控制信息;进程是程序在某个数据集合上的一次动态执行过程,是操作系统进行调度和资源管理的基本活动实体。

【解析】

一个作业调入内存后可创建一个或多个进程;同一程序可被多次执行形成多个进程;程序本身不具有状态和生命周期,进程具有创建、运行、阻塞、唤醒和终止等动态过程。


进程的特征

【例题】

下列哪一项不是进程的典型特征( )。

A. 动态性
B. 并发性
C. 静态性
D. 异步性

【考点】

动态性、并发性、独立性、异步性。

【答案】C

【解析】

进程是程序的动态执行过程,具有动态性;多个进程可并发推进;进程是独立调度和资源分配的基本单位;并发进程按不可预知的相对速度推进,具有异步性。静态性属于程序,不属于进程。


PCB 进程控制块

【例题】

关于 PCB 说法错误的是( )。

A. PCB 是进程存在的标志
B. 创建进程时建立 PCB
C. PCB 内容在进程生命周期内始终不变
D. Linux 中相关核心结构为 task_struct

【考点】

PCB 作用、内容、生命周期。

【答案】C

【解析】

PCB 保存 PID、进程状态、CPU 现场、调度信息、内存信息、打开文件和资源信息等。进程切换和状态变化会不断修改 PCB。操作系统通过 PCB 感知、控制和调度进程;进程撤销时必须回收资源并释放 PCB。


进程三种基本状态与转换

【例题】

关于进程状态说法错误的是( )。

A. 阻塞进程只要得到 CPU 就能立即运行
B. 就绪进程已具备除 CPU 外的运行条件
C. 单 CPU 系统同一时刻最多一个进程处于运行态
D. 阻塞进程正在等待 I/O、资源或事件

【考点】

运行、就绪、阻塞及转换条件。

【答案】A

【解析】

阻塞进程缺少的是事件或资源,而不是 CPU;即使分配 CPU 也不能继续。就绪 → 运行由调度引起;运行 → 就绪由时间片到、被抢占或主动让出 CPU 引起;运行 → 阻塞由请求 I/O 或等待事件引起;阻塞 → 就绪由等待事件完成引起。阻塞态不能直接越过就绪态变为运行态。


进程控制与原语

【例题】

“原语由若干条指令组成,在执行过程中可以被同类操作中断。”(×)

【考点】

进程控制、原子性、原语。

【解析】

进程控制包括创建、撤销、阻塞和唤醒等操作。原语是完成特定系统功能的不可分割原子操作,要么全部完成,要么完全不发生;其关键执行过程不能被同类并发操作破坏。进程状态转换通常由原语实现。


进程创建、终止与层次结构

【例题】

说明进程创建和终止的主要工作,并解释孤儿进程与僵尸进程。

【考点】

创建 PCB、分配资源、fork、exit、wait、父子进程。

【答案】

创建进程时,系统申请 PID 和 PCB,初始化状态与 CPU 现场,建立地址空间和资源关系,并把进程放入就绪队列。

终止时释放大部分资源、保存退出状态并通知父进程。

孤儿进程是父进程先结束而自身仍运行的子进程,会被 init/systemd 或子收割进程接管;

僵尸进程是子进程已终止但父进程尚未 wait 回收其退出状态,仍保留少量进程表项。

【解析】

fork 具有“一次调用、两次返回”的特点:子进程返回 0,父进程返回子进程 PID。exit 终止进程并留下退出状态,wait/waitpid 由父进程取得状态并回收残余 PCB 信息。


进程创建后的状态

【例题】

进程创建完成后通常首先进入( )。

A. 就绪态
B. 运行态
C. 阻塞态
D. 内核态

【考点】

创建与调度的区别。

【答案】A

【解析】

创建完成只表示进程具备运行条件,通常先进入就绪队列等待 CPU。只有被调度程序选中并由分派程序恢复现场后,才进入运行态。内核态/用户态是 CPU 权限状态,不是进程生命周期状态。


线程引入的目的与适用场景

【例题】

下列应用场景中最不适合专门采用线程的是( )。

A. 多窗口程序需要保持界面响应
B. 网络服务器需要同时处理多个连接
C. 多个独立功能需要并发
D. 一次性顺序完成的应用初始化

【考点】

线程并发、响应性、结构化设计、开销。

【答案】D

【解析】

线程适合把一个进程中的多个可并发活动分开执行,例如界面、网络、后台计算。一次性顺序初始化通常没有并发收益,反而增加创建和同步开销。判断是否适合线程不能只看“任务多”,还要看任务是否可并发、是否共享进程资源以及是否需要快速通信。


进程与线程的区别

【例题】

比较进程和线程。

【考点】

资源分配单位、调度单位、地址空间、开销与故障隔离。

【答案】

进程通常是资源分配和保护的基本单位,拥有独立地址空间;

线程是进程内的基本调度单位。一个进程内的线程共享代码、数据、堆和打开文件,但各自拥有程序计数器、寄存器和栈。

线程创建、切换和通信开销较小,但故障隔离弱;

进程隔离性强,创建和 IPC 开销较大。

【解析】

在支持内核线程的系统中,CPU 实际调度的基本单位通常是线程。题目说“线程是资源分配基本单位”通常错误;进程才拥有主要资源集合。


用户级线程与内核级线程

【例题】

关于用户级线程和内核级线程,正确的是( )。

A. 用户级线程切换必须进入内核
B. 纯用户级线程可由内核分别调度到多个 CPU
C. 内核级线程阻塞时,同进程其他线程仍可运行
D. 同一进程的线程拥有各自独立地址空间

【考点】

线程实现方式、阻塞与多核。

【答案】C

【解析】

用户级线程由线程库在用户空间管理,切换快且可定制调度,但内核通常只看到一个进程,一个阻塞系统调用可能阻塞整个进程,纯用户级线程也难以利用多核并行。内核级线程由内核直接调度,一个线程阻塞不会阻塞同进程全部线程,也可在多个 CPU 并行,但创建和切换开销更大。线程共享进程地址空间。


进程通信方式

【例题】

列举进程间通信的主要方式,并说明共享内存与消息传递的区别。

【考点】

共享内存、管道、消息队列、信号、套接字。

【答案】

主要方式包括共享内存、匿名/命名管道、消息队列、信号、套接字和文件等。

共享内存把同一物理页映射到多个进程地址空间,传输大数据速度快,但必须另加锁或信号量同步;

消息传递由内核转发消息,隔离性好、编程清晰,但通常有系统调用和复制开销。

【解析】

信号量严格说主要是同步与互斥机制,不适合传递大量业务数据;信号主要传递事件通知;套接字可用于本机或跨主机通信。


管道通信

【例题】

关于管道通信,正确的是( )。

A. 一个普通管道天然支持全双工
B. 管道容量只受磁盘容量限制
C. 对管道的读、写操作都可能因空或满而阻塞
D. 一个管道只能有一个读进程和一个写进程

【考点】

管道的方向、内核缓冲、阻塞语义。

【答案】C

【解析】

普通管道是内核中的有限容量字节流,通常按单向或半双工使用。管道为空时阻塞式读可能等待;管道满时阻塞式写可能等待。多个进程可持有同一管道端点,并非严格限制为一个读者和一个写者。匿名管道常用于亲缘进程,命名管道可用于无亲缘关系进程。


第三部分 同步、互斥与调度

临界资源与临界区

【例题】

关于临界资源和临界区,说法错误的是( )。

A. 共享变量可能是临界资源
B. 临界区是访问临界资源的代码片段
C. 两个执行流可以不受限制地同时进入针对同一资源的临界区
D. 一个程序中可以有多个不同临界区

【考点】

临界资源、临界区、竞态条件。

【答案】C

【解析】

临界资源是一次只允许一个执行流使用的共享资源;临界区是访问该资源的代码。若两个线程或进程同时进入同一资源的临界区,可能产生竞态条件。一个程序可以针对不同共享资源设置多个临界区。


同步与互斥

【例题】

生产者—消费者问题主要体现( )。

A. 只有同步
B. 只有互斥
C. 同步和互斥
D. 只有死锁

【考点】

同步、互斥的区别。

【答案】C

【解析】

互斥解决“同一时刻谁能访问共享缓冲区”的竞争问题;同步解决“缓冲区非空才能消费、未满才能生产”的先后和条件制约问题。竞争同一资源是互斥,存在前驱后继或条件等待是同步。


临界区访问原则

【例题】

所有同步互斥机制应尽量遵循哪四条原则?

【考点】

空闲让进、忙则等待、有限等待、让权等待。

【答案】

空闲让进、忙则等待、有限等待、让权等待。

【解析】

空闲让进要求临界区空闲时允许申请者进入;忙则等待要求已有执行流在临界区时其他执行流不能进入;有限等待要求申请者不会无限期等待;让权等待要求不能进入临界区时应释放 CPU 而非长期忙等。


互斥的软件与硬件实现

【例题】

列举实现互斥的主要方法,并指出 Peterson 算法和自旋锁的等待特点。

【考点】

关中断、原子指令、互斥锁、信号量、管程。

【答案】

方法有 Peterson 算法、关中断、TSL 指令法、互斥锁、信号量法、管程法等。

Peterson 算法与自旋锁通常采用忙等待,不满足让权等待。

【解析】

关中断只适合内核中的短临界区,在多处理器中关闭一个 CPU 的中断不能阻止其他 CPU 访问资源。阻塞互斥锁在争用时把线程挂起,可实现让权等待,但有上下文切换开销。


信号量的值与 P、V 操作

【例题】

某资源信号量初值为 3,当前值为 1。若 M 表示可用资源数,N 表示等待该资源的进程数,则 M、N 分别为( )。

A. 0,1
B. 1,0
C. 1,2
D. 2,0

【考点】

整型信号量含义、P/V 原语。

【答案】

B

【解析】

在常用整型信号量定义中,S > 0 表示可用资源数,因此 S = 1 时还有 1 个可用资源,没有进程等待。P(S):S = S-1,若 S < 0 则当前进程阻塞;V(S):S = S+1,若 S <= 0 则唤醒一个等待进程。


P、V 操作的基本判断

【例题】

关于 P、V 操作,错误的是( )。

A. P 操作可能阻塞调用进程
B. V 操作使信号量加 1
C. P 操作负责唤醒一个等待进程
D. P、V 必须作为原语执行

【考点】

P、V 原语的功能。

【答案】C

【解析】

P 操作申请资源或等待事件,资源不足时使当前进程阻塞;V 操作释放资源或通知事件,若有等待者则唤醒一个。P、V 必须原子执行,否则并发修改信号量会产生竞态。


普通生产者—消费者

【例题】

设容量为 n 的有界缓冲区,初始为空,信号量 mutex = 1、empty = n、full = 0。补全生产者和消费者的 P、V 顺序。

【考点】

同步信号量、互斥信号量、P 操作顺序。

【答案】

生产者:

while (1) {
produce(item);
P(empty);
P(mutex);
put(item);
V(mutex);
V(full);
}

消费者:

while (1) {
P(full);
P(mutex);
item = get();
V(mutex);
V(empty);
consume(item);
}

【解析】

empty 表示空槽数,生产前必须 P(empty);full 表示产品数,消费前必须 P(full);mutex 保护缓冲区结构。必须先申请同步资源,再进入互斥区,否则可能出现进程持有 mutex 却等待 empty/full,导致另一方无法进入缓冲区释放条件,形成死锁。


连续消费 10 件的生产者—消费者

【例题】

系统中有多个生产者和消费者,共享容量为 1000 的缓冲区。要求一个消费者一旦开始消费,必须连续取出 10 件产品后,其他消费者才能取产品。请用 P、V 操作实现。

【考点】

普通有界缓冲区模型;额外的批量消费互斥约束。

【答案】

设:

mutex = 1
empty = 1000
full = 0
consume = 1

生产者:

while (1) {
produce(item);
P(empty);
P(mutex);
put(item);
V(mutex);
V(full);
}

消费者:

while (1) {
P(consume);
for (int i = 0; i < 10; ++i) {
    P(full);
    P(mutex);
    item = get();
    V(mutex);
    V(empty);
    consume_item(item);
}
V(consume);
}

【解析】

mutex 只保护一次缓冲区操作,不能保证同一消费者连续取 10 次;因此增加 consume = 1,把整个 10 次循环包住,使消费者之间互斥。 P(full)必须放在每次取产品之前,因为产品可能暂时不足 10 件,当前消费者可等待后续生产者补充,但其他消费者不能插入。若题目要求“只有缓冲区已有 10 件时才开始连续取 10 件”,则需另设计计数或一次申请 10 个资源。


Peterson 算法

【例题】

两个进程使用 flag [2] 和 turn 实现互斥。若进入区使用:

flag[i] = true;
turn = j;
while (flag[j] && turn == j) ;

则该算法的性质是( )。

A. 不能保证互斥
B. 能保证互斥,但一定死锁
C. 能保证互斥和有限等待,但采用忙等待
D. 能让等待进程主动阻塞

【考点】

Peterson 算法、互斥、有限等待、忙等待。

【答案】C

【解析】

Peterson 算法对两个进程满足互斥、空闲让进和有限等待,但 while 循环持续占用 CPU,属于忙等待,不满足让权等待。变量读写还要求具备合适的原子性和内存可见性。


哲学家就餐与死锁避免

【例题】

哲学家就餐问题为什么可能死锁?列举三种避免方法。

【考点】

循环等待、资源申请顺序、并发限制。

【答案】

若所有哲学家都先拿左叉再等待右叉,会形成环路等待。可采用:设置服务员一次原子分配两把叉子;规定叉子全局编号并按同一顺序申请;限制同时尝试进餐的哲学家不超过 4 人;或令奇偶哲学家采用相反拿叉顺序。

【解析】

哲学家并发就餐并不必然死锁,只有在不当算法和特定交错次序下才可能发生。


进程调度的时机

【例题】

单处理器系统中有多个就绪进程,下列关于调度的说法错误的是( )。

A. 当前进程终止时需要调度
B. 创建新进程后可能发生调度
C. 当前进程正在执行不可中断原语的关键部分时可随意调度
D. 系统调用返回用户态前可能重新调度

【考点】

调度触发时机、原语不可分割性。

【答案】C

【解析】

进程结束、阻塞、时间片用完、更高优先级进程到达、创建/唤醒新进程以及从内核返回用户态时都可能触发调度。不可分割的原语或持有某些内核自旋锁的关键区不能随意被切换,否则会破坏内核一致性。


调度指标

【例题】

给定进程到达时间、服务时间和完成时间,写出周转时间、带权周转时间、等待时间和响应时间的计算公式。

【考点】

调度性能指标。

【答案】

周转时间 = 完成时间 − 到达时间。
带权周转时间 = 周转时间 ÷ 服务时间。
等待时间 = 周转时间 − 实际运行时间(若忽略 I/O)。
响应时间 = 第一次获得 CPU 的时间 − 到达时间。

【解析】

周转时间关注从提交到完成;响应时间只关注第一次响应,适合交互系统;吞吐量是单位时间完成的作业数;CPU 利用率是 CPU 忙碌时间占总时间的比例。


FCFS、SJF、HRRN 和优先级调度

【例题】

同时考虑作业等待时间和作业服务时间的调度算法是( )。

A. FCFS
B. SJF
C. HRRN
D. RR

【考点】

常见调度算法的选择依据。

【答案】C

【解析】

HRRN 响应比为:

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

它既照顾短作业,又随着等待时间增加提高长作业优先级。FCFS 按到达顺序;SJF 选服务时间最短者,平均等待时间较小但可能使长作业饥饿;优先级调度可能导致低优先级进程饥饿,可用老化缓解。


时间片轮转 RR 计算

【例题】

进程 A、B、C、D、E 的到达时间分别为 0、2、4、6、8,服务时间分别为 3、6、4、5、2,时间片 q = 1。要求给出 RR 执行序列并计算各进程完成时间、周转时间和带权周转时间。

【考点】

RR 就绪队列模拟、到达事件、时间片结束入队。

【答案】

按“同一时刻先把新到达进程加入就绪队列,再把时间片用完但未结束的进程放到队尾”的口径,执行序列为:

A A B A B C B D C B E D C B E D C B D D

各进程结果:

进程 到达时间 服务时间 完成时间 周转时间 带权周转时间
A 0 3 4 4 1.33
B 2 6 18 16 2.67
C 4 4 17 13 3.25
D 6 5 20 14 2.80
E 8 2 15 7 3.50

平均周转时间:

(4+16+13+14+7)/5 = 10.8

平均带权周转时间:

(1.33+2.67+3.25+2.80+3.50)/5 ≈ 2.71

【解析】

RR 题最容易错在同一时刻“新进程到达”和“旧进程时间片结束”的入队顺序,先加入新进程之后再加入旧时间片结束的进程。时间片过大时 RR 接近 FCFS;时间片过小时响应快但上下文切换开销大。


多道程序 CPU 与 I/O 重叠计算

【例题】

系统只有作业 P1 和 P2,P2 比 P1 晚 5ms 到达:

P1:计算 60ms,I/O 80ms,计算 20ms
P2:计算 120ms,I/O 40ms,计算 40ms

忽略切换开销,求完成两作业所需的最短时间。

【考点】

CPU 与 I/O 并行、作业到达、甘特图。

【答案】最短完成时间为 260ms。

【解析】

最优安排可画成两条时间线:

CPU:0—60 P1计算 | 60—180 P2计算 | 180—200 P1计算 | 200—220 CPU空闲 | 220—260 P2计算
I/O:60—140 P1 I/O | 180—220 P2 I/O

P1 在 200ms 完成,P2 在 260ms 完成,因此两作业全部完成的最短时间为 260ms。关键是允许 CPU 计算与 I/O 设备并行,但同一时刻 CPU 只能执行一个作业。


第四部分 死锁

死锁的定义

【例题】

什么是死锁?

【考点】

死锁集合、相互等待、无法推进。

【答案】

如果一个进程集合中的每个进程都在等待只能由该集合中的其他进程才能引发的事件,则该进程集合发生死锁。

资源死锁中,该事件通常是其他进程释放资源。

【解析】

死锁不是“某个进程暂时阻塞”,而是集合内部形成封闭等待关系,所有成员都不能独立完成并释放资源。系统中其他不属于该集合的进程仍可能继续运行,因此“一旦死锁所有进程都不能运行”是错误的。


死锁的四个必要条件

【例题】

产生资源死锁的四个必要条件是互斥、 和环路等待。

【考点】

死锁的四个必要条件。

【答案】

占有并等待;不可抢占。

【解析】

四个条件 必须同时成立:资源只能互斥使用;进程占有部分资源同时等待新资源;已分配资源不能被强行剥夺;进程之间形成闭合等待链。预防死锁就是静态破坏其中至少一个条件。


资源分配图

【例题】

“资源分配图中只要出现环,就一定发生死锁。”(×)

【考点】

单实例与多实例资源分配图。

【解析】

每类资源只有一个实例时,图中有环是死锁的充要条件;每类资源有多个实例时,有环只表示可能死锁,因为某个进程仍可能获得其他实例完成并释放资源。进程 → 资源是请求边,资源实例 → 进程是分配边。


安全状态与不安全状态

【例题】

“系统处于不安全状态,就已经发生死锁。”(×)

【考点】

安全序列、安全状态、不安全状态。

【解析】

安全状态表示存在一个进程完成序列,使所有进程最终都能获得最大需求并完成。安全状态一定无死锁;不安全状态表示找不到这种保证,未来可能死锁,但当前不一定已经形成死锁。银行家算法通过拒绝导致不安全状态的请求来避免死锁。


银行家算法:Need 矩阵与安全序列

【例题】

某系统有 5 个进程 P0~P4,共有 A、B、C 三类资源。当前资源分配情况如下。

Allocation 矩阵

进程 A B C
P0 0 1 0
P1 2 0 0
P2 3 0 2
P3 2 1 1
P4 0 0 2

Max 矩阵

进程 A B C
P0 7 5 3
P1 3 2 2
P2 9 0 2
P3 2 2 2
P4 4 3 3

当前可用资源为:Available = (3, 3, 2)

要求:

  1. 计算Need矩阵;
  2. 判断系统当前是否处于安全状态;
  3. 若系统安全,给出一个安全序列。

【考点】

Need矩阵计算、安全性算法、Work向量、Finish数组、安全序列。

【答案】

Need矩阵的计算公式为:

Need = Max - Allocation

逐个进程计算:

P0:Need0 = (7,5,3) - (0,1,0) = (7,4,3)

P1:Need1 = (3,2,2) - (2,0,0) = (1,2,2)

P2:Need2 = (9,0,2) - (3,0,2) = (6,0,0)

P3:Need3 = (2,2,2) - (2,1,1) = (0,1,1)

P4:Need4 = (4,3,3) - (0,0,2) = (4,3,1)

因此Need矩阵为:

进程 A B C
P0 7 4 3
P1 1 2 2
P2 6 0 0
P3 0 1 1
P4 4 3 1

初始化:

Work = Available = (3,3,2)

Finish = (false, false, false, false, false)

安全性检查过程如下。

第一步:选择P1

Need1 = (1,2,2)
Work  = (3,3,2)

Need1 ≤ Work

P1可以完成,完成后释放已分配资源:

Work = Work + Allocation1
     = (3,3,2) + (2,0,0)
     = (5,3,2)

第二步:选择P3

Need3 = (0,1,1)
Work  = (5,3,2)

Need3 ≤ Work

P3完成后:

Work = (5,3,2) + (2,1,1)
     = (7,4,3)

第三步:选择P4

Need4 = (4,3,1)
Work  = (7,4,3)

Need4 ≤ Work

P4完成后:

Work = (7,4,3) + (0,0,2)
     = (7,4,5)

第四步:选择P0

Need0 = (7,4,3)
Work  = (7,4,5)

Need0 ≤ Work

P0完成后:

Work = (7,4,5) + (0,1,0)
     = (7,5,5)

第五步:选择P2

Need2 = (6,0,0)
Work  = (7,5,5)

Need2 ≤ Work

P2完成后:

Work = (7,5,5) + (3,0,2)
     = (10,5,7)

所有进程最终均可以完成,因此系统处于安全状态。

一个安全序列为:

P1 → P3 → P4 → P0 → P2

【解析】

安全性算法的核心是判断是否存在一种进程执行顺序,使所有进程都能够依次取得剩余资源并完成。

判断条件为:

Need[i] ≤ Work

这里的“小于等于”必须对每一类资源分别比较。例如:

Need = (1,2,2)
Work = (3,3,2)

因为:

1≤3,2≤3,2≤2

所以该进程可以完成。

进程完成后,释放的是它当前已经占有的资源,即:

Work = Work + Allocation[i]

不是加上Need,也不是加上Max。安全序列通常不唯一。本题还可能存在其他安全序列,题目只要求给出任意一个即可。


银行家算法:资源请求

【例题】

沿用上一题的数据,当前:

Available = (3,3,2)

进程P1提出资源请求:

Request1 = (1,0,2)

判断系统能否立即满足P1的资源请求。

【考点】

请求合法性检查、可用资源检查、试探分配、安全性算法、状态回滚。

【答案】

第一步:检查Request是否超过Need

P1当前的剩余需求为:

Need1 = (1,2,2)

请求为:

Request1 = (1,0,2)

逐项比较:

1≤1
0≤2
2≤2

因此:

Request1 ≤ Need1

请求没有超过P1声明的最大需求,属于合法请求。

第二步:检查Request是否超过Available

Request1 = (1,0,2)
Available = (3,3,2)

逐项比较:

1≤3
0≤3
2≤2

因此:

Request1 ≤ Available

当前系统拥有足够的可用资源。

第三步:试探分配

试探分配后的Available为:

Available' = Available - Request1
           = (3,3,2) - (1,0,2)
           = (2,3,0)

P1新的Allocation为:

Allocation1' = Allocation1 + Request1
             = (2,0,0) + (1,0,2)
             = (3,0,2)

P1新的Need为:

Need1' = Need1 - Request1
       = (1,2,2) - (1,0,2)
       = (0,2,0)

第四步:执行安全性算法

初始化:

Work = Available' = (2,3,0)

首先检查P1:

Need1' = (0,2,0)
Work   = (2,3,0)

Need1' ≤ Work

P1可以完成,释放新的Allocation:

Work = (2,3,0) + (3,0,2)
     = (5,3,2)

接下来可以依次选择:

P3 → P4 → P0 → P2

完整安全序列为:

P1 → P3 → P4 → P0 → P2

因此,试探分配之后系统仍然处于安全状态。

结论:可以立即满足P1的请求Request1=(1,0,2)。

【解析】

银行家算法不能因为:

Request ≤ Available

就立即分配资源。

必须依次完成以下四步:

1. Request[i] ≤ Need[i]

2. Request[i] ≤ Available

3. 进行试探分配

4. 执行安全性算法

只有试探分配后系统仍然安全,才能正式分配。

试探分配的三个矩阵变化为:

Available = Available - Request

Allocation[i] = Allocation[i] + Request

Need[i] = Need[i] - Request

如果试探分配后系统不安全,则必须恢复原来的状态:

Available = Available + Request

Allocation[i] = Allocation[i] - Request

Need[i] = Need[i] + Request

不能只恢复Available,而遗漏Allocation或Need。即使有足够的Available资源也不代表分配后系统仍然安全,必须进行试探分配和安全性检查。


保证不死锁的资源数量

【例题】

系统有 13 台同类设备,N 个进程共享,每个进程最多需要 3 台。为了保证不发生死锁,N 最大是多少?

【考点】

单类资源的死锁保证条件。

【答案】6

【解析】

若每个进程最多需要 k 个资源,系统有 R 个同类资源,为保证不死锁,应满足:

R ≥ N(k-1) + 1

因为最坏情况下每个进程先占有 k−1 个资源,还必须至少剩 1 个资源让其中一个进程完成。代入 R = 13、k = 3:

13 ≥ 2N + 1
N ≤ 6

因此最多 6 个进程。


死锁预防、避免、检测与解除

【例题】

比较死锁预防、死锁避免、死锁检测和死锁解除。

【考点】

四类处理策略。

【答案】

预防:通过规则破坏四个必要条件之一,如一次申请全部资源、允许剥夺、按资源编号申请。
避免:运行时判断分配后是否安全,典型为银行家算法。
检测:允许死锁发生,定期用资源分配图或检测算法找出死锁进程。
解除:检测后终止进程、剥夺资源、回滚或重启相关任务。

【解析】

预防较保守、资源利用率低;避免需要知道最大需求;检测与解除允许更高利用率,但死锁发生后恢复有损失。资源剥夺时要考虑选择牺牲者和防止同一进程反复被剥夺而饥饿。


死锁、饥饿与活锁

【例题】

说明死锁、饥饿和活锁的区别。

【考点】

系统推进性问题。

【答案】

死锁:一组进程相互等待,均无法推进。
饥饿:某进程长期得不到 CPU 或资源,但系统中其他进程仍在推进。
活锁:进程不断改变状态或重试,表面活跃但始终无法完成有效工作。

【解析】

优先级调度可能导致低优先级进程饥饿,可用老化解决;不恰当的资源释放和重申请策略可能导致活锁;死锁通常具有闭合等待关系。


第五部分 存储管理

存储管理的基本功能

【例题】

以下哪项不是存储管理的基本功能( )。

A. 地址映射
B. 内存分配与回收
C. 进程调度
D. 内存保护

【考点】

内存分配、映射、保护、扩充、共享。

【答案】C

【解析】

存储管理负责内存分配与回收、逻辑地址到物理地址的转换、内存保护、通过覆盖/交换/虚拟存储进行扩充,以及受控共享。进程调度属于处理机管理。


52. 三级存储体系

【例题】

计算机系统常说的三级存储体系是( )。

A. 寄存器、内存、外存
B. Cache、内存、外存
C. 内存、外存、闪存
D. 寄存器、Cache、总线

【考点】

Cache、主存、外存的层次关系。

【答案】B

【解析】

Cache 位于 CPU 与主存之间,速度最快、容量较小;主存保存当前运行程序和数据;外存容量大、非易失但速度慢。层次结构利用局部性,用较小的高速层缓存较大慢速层中的热点数据。


静态重定位与动态重定位

【例题】

目标程序在装入内存时一次完成全部地址变换,采用的是( )。

A. 静态重定位
B. 动态重定位
C. 请求分页
D. 交换

【考点】

地址映射、装入时与运行时重定位。

【答案】A

【解析】

静态重定位在装入时把逻辑地址一次改成物理地址,程序运行期间通常不能移动。动态重定位在每次访问内存时由 MMU、页表、段表或基址寄存器完成,支持进程移动、离散分配、交换和虚拟存储,但增加硬件和访问开销。


固定分区与动态分区

【例题】

在固定分区分配中,每个分区的大小( )。

A. 必须全部相同
B. 可不同,但在系统运行前预先固定
C. 随每个作业动态变化
D. 由页表决定

【考点】

连续分配、内部碎片、外部碎片。

【答案】B

【解析】

固定分区可划分为相同或不同大小,但分区边界预先固定,容易产生内部碎片。动态分区按进程实际需要从空闲区划分,减少内部碎片,但产生外部碎片,需要维护空闲表/链表并在回收时合并相邻空闲区。


动态分区分配算法

【例题】

空闲区大小依次为 10、4、20、18、7、9、12、15MB,依次申请 12、10、9MB。分别说明首次适应、最佳适应、最坏适应和下次适应选择的空闲区。

【考点】

First Fit、Best Fit、Worst Fit、Next Fit。

【答案】

首次适应:20、10、18MB。
最佳适应:12、10、9MB。
最坏适应:20、18、15MB。
下次适应:20、18、9MB。

【解析】

首次适应从低地址开始找第一个足够大的空闲区;最佳适应选最小可满足区,容易留下小碎片;最坏适应选最大区;下次适应从上次查找结束位置继续。做题时每次分配后要更新剩余空闲区,题目若说明分割后的剩余块继续参与分配,必须把剩余大小放回对应位置。


动态分区回收与合并

【例题】

回收一个分区时,造成空闲区表记录数减少 1 的情况是( )。

A. 上下都不是空闲区
B. 只有上邻空闲
C. 只有下邻空闲
D. 上下邻均为空闲区

【考点】

空闲区合并。

【答案】D

【解析】

无相邻空闲区时新增一个空闲记录,数量加 1;只有一侧空闲时与该侧合并,记录数不变;上下均为空闲时,原来两个空闲区和回收区合成一个,记录数由 2 变 1,因此减少 1。


位图与空闲链表

【例题】

位图和空闲链表分别用来做什么?适用于哪些场景?

【考点】

固定大小块管理、可变大小空闲区管理。

【答案】

位图把内存页框或磁盘块划分为固定单位,每个单位用 1 位表示空闲/占用,适合分页页框和磁盘块管理。

空闲链表把空闲区按地址连接,每个节点记录起始地址和长度,适合动态分区或连续空闲区管理。

【解析】

位图空间开销小,便于判断某块状态和寻找连续 0 位;链表便于分割和合并可变大小区域,但查找合适块可能需要遍历。位图大小为“块数 ÷8”字节。


位图位置计算

【例题】

用 8 个 32 位字组成位图,字号和位号都从 0 开始。归还块号 100 时,对应位图位置是什么?

【考点】

位图的字索引和字内位索引。

【答案】

字号 = 100 div 32 = 3;位号 = 100 mod 32 = 4。

【解析】

通用公式:

字号 = 块号 div 每字位数
字内位号 = 块号 mod 每字位数

覆盖与交换

【例题】

比较覆盖技术和交换技术。

【考点】

早期内存扩充方法。

【答案】

覆盖由程序员把不会同时执行的模块放在同一覆盖区,需要时调入相应模块,单位是程序内部模块;交换由操作系统把整个进程暂时换出磁盘,需要时再换入,单位是进程。

【解析】

覆盖设计复杂、依赖人工安排,单个模块仍不能超过可用内存;交换自动性更强,但整个进程换入换出会产生大量 I/O,并要求动态重定位。二者都不等同于现代请求分页虚拟存储。


分页地址结构与物理地址计算

【例题】

页面大小为 4KB,虚拟地址 8644 所在页映射到物理块 8,求物理地址。

【考点】

页号、页内偏移、物理地址。

【答案】

4KB=4096B
页号 = 8644 div 4096 = 2
页内偏移 = 8644 mod 4096 = 452
物理地址 = 8 × 4096 + 452 = 33220

【解析】

分页地址转换固定三步:先除页面大小求页号,再取余求偏移,再查页表取得页框号。偏移在转换前后不变。若页表项无效或“不在内存”,分别产生地址异常或缺页中断。


分页系统页号与页数

【例题】

逻辑地址用 m 位表示,页内偏移占 n 位,则最大虚拟页数为( )。

A. 2^n
B. 2^(m-n)
C. 2^m
D. 2^(m+n)

【考点】

地址位数分解。

【答案】B

【解析】

低 n 位表示页内偏移,因此页面大小为 2^n 字节;剩余 m−n 位表示虚拟页号,可表示 2^(m−n)个页。若物理内存大小为 2^p 字节,则页框号位数为 p−n。


两级页表索引位数

【例题】

32 位逻辑地址,页大小为 2^12 字节,一级页表索引占 8 位,二级页表索引占多少位?

【考点】

多级页表地址划分。

【答案】12 位

【解析】

页内偏移占 12 位,剩余页号位数为 32−12 = 20 位。一级索引占 8 位,因此二级索引占 20−8 = 12 位。多级页表的主要目的不是减少总映射能力,而是只为实际使用的地址区间建立下级页表,避免单级页表连续占用过大。


页表、TLB 和两次访存

【例题】

分页系统页表存放在内存,未设置 TLB。若一次内存访问需要 0.6μs,CPU 取得一个数据需要多少时间?

【考点】

页表访问次数、有效访问时间。

【答案】1.2μs

【解析】

先访问内存中的页表得到页框号,再访问目标数据,共两次内存访问:

0.6 + 0.6 = 1.2μs

若有 TLB,命中时通常只需 TLB 查询加一次内存访问;未命中时还需访问页表。计算 EAT 时要按命中率加权。


TLB 有效访问时间

【例题】

TLB 查询时间为 t,内存访问时间为 m,TLB 命中率为 h;忽略缺页,写出单级页表系统的有效访问时间。

【考点】

TLB 命中与未命中路径。

【答案】

若 TLB 查询与内存访问串行:

EAT = h(t+m) + (1-h)(t+2m)

若硬件允许 TLB 查询与 Cache/访存部分并行,应按题目给定模型调整。

【解析】

命中路径:查询 TLB 后访问数据;未命中路径:查询 TLB、访问页表、再访问数据。不能把缺页率与 TLB 未命中率混为一谈。


虚拟存储与局部性原理

【例题】

虚拟存储技术的理论基础是( )。

A. 交换原理
B. 程序局部性原理
C. 连续分配原理
D. 设备独立性

【考点】

时间局部性、空间局部性、请求调入。

【答案】B

【解析】

虚拟存储允许程序不必全部装入内存即可运行,其可行性来自局部性:近期访问的内容可能再次访问(时间局部性),附近地址可能很快被访问(空间局部性)。请求分页和页面置换是实现手段,不是理论基础。


缺页中断处理

【例题】

简述缺页中断的处理过程。

【考点】

合法性检查、空闲页框、牺牲页、脏页写回、更新页表。

【答案】

MMU 发现页面不在内存并产生缺页中断;内核检查地址是否合法;定位页面在外存的位置;寻找空闲页框,无空闲则选择牺牲页;若牺牲页已修改则写回;把所需页读入;更新页表和 TLB;恢复现场并重新执行被中断指令。

【解析】

缺页中断属于同步异常,处理过程中可能发生磁盘 I/O、分配页框和修改页表。被缺页打断的指令必须能够重新执行。


缺页率与 EAT 上界

【例题】

正常内存访问时间 100ns;缺页且淘汰页未修改时 8ms,淘汰页已修改时 20ms;被淘汰页 70%已修改。要求 EAT≤200ns,求缺页率 p 的最大值。

【考点】

缺页平均处理时间、概率加权、数量级换算。

【答案】

平均缺页代价:

0.3×8ms + 0.7×20ms = 16.4ms

EAT 近似:

(1-p)×100ns + p×16.4ms ≤ 200ns

16.4ms = 16.4×10^6ns,因此:

p ≤ 100 / (16.4×10^6 - 100)
  ≈ 6.1×10^-6

按选项取约 0.6×10^-5。

【解析】

此题关键是统一时间单位。缺页代价比内存访问大约高 5 个数量级,所以允许的缺页率必须极低。若题目把缺页处理时间定义为额外开销,公式需加上正常访存时间;数量级结论不变。


页面置换:FIFO、LRU 与 OPT

【例题】

进程有 3 个页框,访问串为:

4,3,2,1,4,3,5,4,3,2,1,5

分别求 OPT、FIFO 和 LRU 的缺页次数。

【考点】

逐步维护页框;三种置换规则。

【答案】

逐项模拟可得:

  • OPT:7 次缺页
  • FIFO:9 次缺页
  • LRU:10 次缺页

(初始页框为空,首次装入也计缺页。)

【解析】

OPT 淘汰未来最长时间不访问的页,是理论最优;FIFO 淘汰最早进入的页,可能发生 Belady 异常;LRU 淘汰过去最长时间未访问的页,是栈算法,不会发生 Belady 异常。不同访问串上,LRU 不保证每次都比 FIFO 少缺页,但总体性质更稳定。


NRU 与改进 CLOCK

【例题】

页面的访问位 A 和修改位 M 分别表示近期访问和是否被修改。最佳优先淘汰的组合是( )。

A. A = 0,M = 0
B. A = 0,M = 1
C. A = 1,M = 0
D. A = 1,M = 1

【考点】

访问位、修改位、淘汰优先级。

【答案】A

【解析】

未访问且未修改的页面既不活跃,又不需要写回,淘汰成本最低。NRU 按(R, M)分为(0,0)、(0,1)、(1,0)、(1,1)四类,从编号最小的非空类选择。改进 CLOCK 也优先寻找(0,0),再考虑(0,1)。


工作集

【例题】

页面访问序列在时刻 t 之前为:

..., 1,3,4,5,6,0,3,2,3,2,1,0,4,0,3,2,9,2,1, ...

若工作集窗口大小为 6,求图示 t 时刻工作集。

【考点】

工作集定义、时间窗口、集合去重。

【答案】

从图示 t 位置向前取最近 6 次页面访问,再去重。若 t 位于序列中第二个“2”之后、后续“1,0,4…”之前,则窗口为:

6,0,3,2,3,2

工作集为:

{6,0,3,2}

【解析】

工作集是最近 Δ 个访问或最近 Δ 时间内访问过的页面集合,不保留重复次数。题目必须根据箭头所在位置确定窗口边界;窗口方向是向过去回看,不是向未来。


颠簸及处理

【例题】

虚拟页式系统频繁缺页导致 CPU 利用率下降,系统管理员最有效的措施是( )。

A. 更换更快 CPU
B. 增大外存
C. 减少多道程序度
D. 增加磁盘分区

【考点】

颠簸、工作集、页框不足。

【答案】

C

【解析】

颠簸是进程工作集超过可用页框,系统大部分时间用于换页。减少多道程序度可释放页框,让保留在内存中的进程容纳主要工作集。也可增加物理内存、采用工作集/PFF 控制或调整页框分配。更快 CPU 不能解决频繁磁盘 I/O。


分段地址转换与越界

【例题】

段表中段 2 长度为 300,基址为 4000,权限为读写。访问段 2、段内地址 400 时,结果是( )。

A. 物理地址 4400
B. 段号异常
C. 越权异常
D. 越界异常

【考点】

段长检查、基址加偏移、权限检查。

【答案】D

【解析】

分段地址转换先检查段号是否合法,再检查段内偏移是否小于段长。400≥300,超出段界限,因此产生越界异常,不能计算为 4400。只有偏移合法后才执行“物理地址 = 段基址+段内偏移”,并检查读写执行权限。


分页与分段比较

【例题】

比较分页和分段。

【考点】

划分依据、地址空间、碎片、共享与保护。

【答案】

分页由系统按固定大小划分,地址为页号+页内偏移,程序员通常不可见,消除外部碎片但可能有内部碎片;分段按程序逻辑模块划分可变长段,地址为段号+段内偏移,便于共享、保护和独立增长,但会产生外部碎片。段页式先分段再分页,兼顾逻辑结构与离散分配。

【解析】

“分页是一维地址空间、分段是二维地址空间”是常见教材表述:分页地址可由单个线性地址自动分解,分段时程序员需给出段号和段内地址。


第六部分 文件系统

文件、文件系统与逻辑结构

【例题】

什么是文件和文件系统?文件的典型逻辑结构有哪些?

【考点】

文件定义、无结构流式文件、有结构记录文件。

【答案】

文件是由文件名标识的一组相关信息集合;文件系统是操作系统中负责文件组织、存储、访问、共享、保护和外存管理的软件及数据结构。逻辑结构主要有无结构的字节流文件和有结构的记录式文件,记录可定长或变长。

【解析】

逻辑结构是用户看到的组织形式;物理结构是文件块在磁盘上的实际分配方式。二者不能混淆。


文件物理结构:连续、链接和索引

【例题】

文件需要频繁修改和扩展时,最不适合采用的物理结构是( )。

A. 连续分配
B. 链接分配
C. FAT 式链接
D. 索引分配

【考点】

文件块分配方式。

【答案】A

【解析】

连续分配顺序和随机访问速度快,但文件扩展困难并产生外部碎片;链接分配扩展方便且无外部碎片,但随机访问差;索引分配支持随机访问和灵活扩展,但需要索引块空间。题目出现“随机访问且易扩展”,通常选索引结构。


UNIX i 节点与最大文件大小

【例题】

磁盘块大小 4KB,块指针 4B,i 节点包含 10 个直接地址和 1 个一级间接地址。最大文件大小是多少?

【考点】

直接块、一级间接块、索引容量。

【答案】

一级间接块可存:

4096 / 4 = 1024个块地址

可访问数据块总数:

10 + 1024 = 1034块

最大文件大小:

1034 × 4KB = 4136KB ≈ 4.04MB

若为选择题且选项为 4MB、8MB、16MB、40KB,选 4MB。

【解析】

索引块本身不存文件数据,只存块地址。若增加二级间接,容量再增加 1024² 个数据块;访问某个间接块内的数据通常需要读取 i 节点/索引块和数据块,缓存命中时实际磁盘次数会减少。


FCB 与 i 节点

【例题】

文件访问控制信息最合理的存放位置是( )。

A. 文件控制块 FCB/i 节点
B. 文件分配表
C. 用户口令表
D. 系统注册表

【考点】

文件元数据、目录项与 i 节点。

【答案】A

【解析】

FCB 保存文件类型、大小、所有者、权限、时间和物理位置等,是文件存在和管理的核心数据结构。UNIX 把文件名保存在目录项中,目录项指向 i 节点;i 节点通常不保存文件名。一个 i 节点可被多个硬链接目录项引用。


open 操作与打开文件表

【例题】

为什么使用文件前通常必须先 open?open 完成哪些工作?

【考点】

路径查找、权限检查、系统打开文件表、文件描述符。

【答案】

open 按路径逐级查找目录项,找到 FCB/i 节点并检查权限;把必要控制信息装入内存打开文件表;在进程文件描述符表中建立条目;初始化访问方式和文件偏移量;返回文件描述符或句柄。之后 read/write 通过描述符快速定位,不必每次重新按文件名查找。

【解析】

close 减少引用计数并释放进程级描述符;只有当相关引用均释放时,系统级打开文件表项才可回收。open 不是“开始使用文件后再执行”,而是后续读写的前提。


文件删除

【例题】

下列哪项不是删除文件必须完成的工作( )。

A. 删除目录项
B. 释放文件占用的空间
C. 处理共享链接计数
D. 把原数据块逐字节全部清零

【考点】

目录项、i 节点、空间回收、链接计数。

【答案】D

【解析】

删除文件通常删除目录项、更新链接计数,并在最后一个链接消失且无进程保持打开时释放数据块和 i 节点。一般不要求立刻把原磁盘内容全部清零;安全擦除是额外安全需求。


目录结构与路径

【例题】

相同文件名要在同一文件系统中同时存在,最直接的解决办法是( )。

A. 采用多级目录
B. 采用连续分配
C. 使用 SPOOLing
D. 使用页面置换

【考点】

树形目录、绝对路径、相对路径。

【答案】A

【解析】

多级树形目录允许不同目录中存在同名文件,并通过路径唯一定位。绝对路径从根目录开始;相对路径从当前工作目录开始;“.”表示当前目录,“…”表示父目录。单级目录不支持全系统文件重名。


硬链接与符号链接

【例题】

硬链接通过哪种方式实现文件共享( )。

A. 多个目录项指向同一个 i 节点
B. 每个链接复制一份文件数据
C. 链接文件只保存目标路径
D. 在共享目录中复制 FCB

【考点】

硬链接、软链接、i 节点链接计数。

【答案】A

【解析】

硬链接是同一文件的另一个目录项,多个文件名共享同一个 i 节点和数据块;删除一个名字只使链接计数减 1。符号链接是独立的特殊文件,内容保存目标路径,有独立 i 节点,可跨文件系统,但目标删除后可能失效。


文件空闲空间管理

【例题】

UNIX 传统文件系统管理空闲磁盘块常采用( )。

A. 空白文件目录
B. 位示图
C. 成组链接法
D. 页面置换表

【考点】

位图、空闲链表、成组链接法。

【答案】C

【解析】

位示图为每个磁盘块设置一位,结构简单且适合寻找连续块;空闲链表把空闲块串联;成组链接法把一批空闲块号存入一个块,并链接下一组,兼顾链表和批量管理,传统 UNIX 常采用。


目录查找磁盘次数

【例题】

一个 FCB 占 64B,磁盘块 1KB,目录共有 3200 个 FCB,采用顺序查找且目录块未缓存。平均启动磁盘多少次?

【考点】

每块目录项数、目录块数、平均顺序查找。

【答案】100 次

【解析】

每块可放:

1024 / 64 = 16个FCB

目录占:

3200 / 16 = 200块

顺序查找平均查一半:

200 / 2 = 100次磁盘访问

文件系统可靠性

【例题】

文件系统如何提高可靠性并在崩溃后恢复?

【考点】

备份、一致性检查、日志。

【答案】

可采用全量/增量备份;用一致性检查核对目录、i 节点、数据块和空闲表,发现丢失块、重复块和链接计数错误;采用日志文件系统,在修改实际结构前记录事务,崩溃后重做已提交事务或撤销未完成事务。

【解析】

日志主要保证元数据和事务一致性,不等同于备份;备份用于应对硬件损坏、误删除和长期恢复。


文件系统性能优化

【例题】

下列不能明显改善同一物理磁盘 I/O 性能的是( )。

A. 重排 I/O 请求次序
B. 在同一磁盘上建立多个逻辑分区
C. 预读和延迟写
D. 优化文件物理块分布

【考点】

缓存、预读、延迟写、布局、磁盘调度。

【答案】B

【解析】

重排请求可减少寻道;预读利用空间局部性;延迟写可合并写操作;让文件块相邻可减少磁头移动。仅把同一物理磁盘划分成多个逻辑分区不会增加磁头和介质的物理性能,甚至可能限制布局。


目录树操作与文件保护

【例题】

在树形目录中:

  1. 同一目录下能否建立与已有目录同名的文件?
  2. 两个用户如何共享同一文件?
  3. 如何使某文件只允许所有者使用?

【考点】

同目录命名唯一性、链接共享、访问控制。

【答案】

  1. 通常不能,同一目录中的目录项名称必须唯一;不同目录可同名。
  2. 可建立硬链接或符号链接,或设置公共目录/ACL。
  3. 修改文件所有者权限或 ACL,取消组用户和其他用户的读写执行权限。

【解析】

硬链接共享同一 i 节点;符号链接保存路径。目录重命名还必须避免与目标目录中已有名称冲突,并保持目录树不形成非法环。


第七部分 设备管理

字符设备、块设备与虚拟设备

【例题】

说明字符设备、块设备、独占设备、共享设备和虚拟设备。

【考点】

设备分类。

【答案】

字符设备以字节流顺序传输,如键盘、串口;块设备按固定块随机访问,如磁盘。独占设备同一时刻只能分配给一个进程;共享设备可由多个进程交替访问;虚拟设备通过软件把一个物理独占设备表现为多个逻辑设备,典型技术是 SPOOLing。

【解析】

“虚拟设备”不是虚拟内存,也不是允许程序不装入内存;其核心是设备使用方式的虚拟化。


设备独立性与逻辑设备名

【例题】

程序员通过系统调用打开 I/O 设备时,通常使用( )。

A. 逻辑设备名或设备类相对号
B. 物理设备的精确硬件端口
C. 主设备号和从设备号的裸值
D. 控制器寄存器地址

【考点】

设备独立性、逻辑到物理映射。

【答案】A

【解析】

设备独立性使应用程序不依赖具体物理设备型号和连接位置。设备无关软件把逻辑设备名映射到物理设备,由驱动程序处理硬件细节。更换设备时应用程序通常不需要修改。


I/O 端口统一编址与独立编址

【例题】

比较统一编址和独立 I/O 编址。

【考点】

内存映射 I/O、专用 I/O 指令。

【答案】

统一编址把设备寄存器映射到内存地址空间,CPU 用普通访存指令访问,编程统一但占用地址空间;独立编址为 I/O 端口设置独立地址空间,用 IN/OUT 等专用指令,不占内存地址空间但指令和寻址方式专门化。

【解析】

统一编址的设备寄存器通常不能像普通内存一样随意缓存和重排,需要硬件和内核保证访问语义。


I/O 控制方式

【例题】

常见 I/O 控制传输方式有哪四种?从 CPU 参与程度和传输单位比较。

【考点】

程序查询、中断驱动、DMA、通道。

【答案】

程序查询:CPU 循环检查设备状态,逐字节/字传输,忙等待。
中断驱动:CPU 启动设备后执行其他任务,设备完成后中断 CPU,仍常按小单位传输。
DMA:CPU 设置地址、长度和方向,DMA 控制器在设备与内存间直接传送数据块,完成后中断 CPU。
通道:专用 I/O 处理机执行通道程序,可独立控制多个设备和一系列 I/O 操作。

【解析】

CPU 干预程度通常依次降低:程序查询 > 中断 > DMA > 通道。DMA 并非完全不需要 CPU,CPU 仍负责初始化和完成处理。


I/O 软件四层结构

【例题】

I/O 软件从上到下的合理层次是( )。

A. 用户级 I/O 软件 → 设备无关软件 → 设备驱动程序 → 中断处理程序
B. 用户级 I/O 软件 → 驱动程序 → 设备无关软件 → 中断处理程序
C. 中断处理程序 → 用户级软件 → 驱动程序 → 设备无关软件
D. 用户级软件 → 中断处理程序 → 设备无关软件 → 驱动程序

【考点】

I/O 软件分层。

【答案】A

【解析】

用户级 I/O 软件提供库函数和格式化接口;设备无关层负责统一命名、保护、缓冲、分配和错误报告;驱动程序把抽象请求转换为设备命令,设置寄存器和计算磁道/扇区/磁头;中断处理程序处理完成中断、读取状态并唤醒等待的驱动或进程。


I/O 请求处理流程

【例题】

用户程序发出磁盘 I/O 请求后的典型顺序是( )。

A. 用户程序 → 系统调用处理 → 设备驱动 → 设备执行 → 中断处理
B. 用户程序 → 中断处理 → 驱动程序 → 系统调用
C. 用户程序 → 直接写设备 → 系统调用
D. 用户程序 → 设备驱动 → 系统调用 → 中断处理

【考点】

系统调用、设备无关层、驱动和中断。

【答案】A

【解析】

用户态程序通过系统调用进入内核;设备无关层完成统一检查和缓冲;驱动程序设置控制器并启动设备;设备异步执行,完成后产生中断;中断处理程序确认状态并唤醒等待进程。


缓冲与缓存

【例题】

采用缓冲技术的主要目的是( )。

A. 提高 CPU 本身运算速度
B. 提高 CPU 与设备之间的并行程度并协调速度差
C. 实现用户身份认证
D. 增大磁盘物理容量

【考点】

单缓冲、双缓冲、循环缓冲、缓存区别。

【答案】B

【解析】

缓冲暂存传输中的数据,用于缓解速度不匹配、协调传输单位并提高并行性;双缓冲可在设备填充一个缓冲区时由 CPU 处理另一个。缓存保存可能再次使用的数据副本,目的是减少访问慢速设备。缓冲强调“平滑传输”,缓存强调“重复利用”。


SPOOLing 技术

【例题】

关于 SPOOLing,说法错误的是( )。

A. 通过磁盘输入井/输出井暂存作业数据
B. 可把独占设备在逻辑上改造成共享设备
C. 物理打印机从此不再具有独占性
D. 可使用户进程不必等待慢速打印完成

【考点】

SPOOLing、虚拟设备、输入井和输出井。

【答案】C

【解析】

SPOOLing 利用磁盘和预输入/缓输出进程,把多个用户的输出先存入输出井,再由专门进程依次驱动打印机。用户感觉拥有独立逻辑打印机,但物理打印机在任一时刻仍由一个输出进程独占使用。


磁盘访问时间

【例题】

磁盘访问时间由 和数据传输时间组成。

【考点】

寻道时间、旋转延迟、传输时间。

【答案】

寻道时间;旋转延迟时间。

【解析】

寻道时间是磁头移动到目标磁道的时间;旋转延迟是等待目标扇区转到磁头下方的时间,平均约为半圈;传输时间取决于数据量和磁盘传输率。机械磁盘中前两项常占主要开销。


磁盘传输率

【例题】

磁盘转速 7200r/min,每磁道 160 个扇区,每扇区 512B。理想连续传输率是多少?

【考点】

转/秒、每转字节数、传输率。

【答案】

约 9.6MB/s(9600KB/s)

【解析】

7200r/min = 120r/s。每转传输:

160 × 512B = 81920B

每秒:

120 × 81920 = 9,830,400B/s

按 1KB = 1024B 约为 9600KB/s。


SSTF 磁盘调度

【例题】

磁头当前在 50 号柱面,请求序列为 10、180、80、90、135、30、20、140、25。采用 SSTF,给出服务顺序和总移动量。

【考点】

最短寻道时间优先、最近请求选择。

【答案】

服务顺序:

50→30→25→20→10→80→90→135→140→180

总移动量:

20+5+5+10+70+10+45+5+40 = 210

【解析】

SSTF 每次选择当前磁头位置最近的请求,平均寻道距离通常较小,但远端请求可能长期得不到服务而饥饿。每一步都要根据新的磁头位置重新比较。


SCAN 电梯调度

【例题】

磁头在 105 号磁道,正向磁道号增加方向移动。请求序列为 35、45、12、68、110、180、170、195。采用 SCAN/电梯调度,服务顺序是什么?

【考点】

磁头方向、同向排序、反向服务。

【答案】

110→170→180→195→68→45→35→12

【解析】

严格 SCAN 通常要求磁头继续移动到磁盘物理端点后再反向;LOOK 在该方向最后一个请求处反向。


设备分配与死锁

【例题】

设备分配时为什么可能发生死锁?静态分配和动态分配各有什么特点?

【考点】

独占设备、控制器、通道、资源等待。

【答案】

动态分配允许进程运行中逐步申请设备,利用率高,但多个进程可能各占部分设备并等待其他设备而死锁。静态分配要求进程运行前一次申请全部所需设备,可破坏占有并等待条件,但设备可能长期闲置,利用率低。

【解析】

设备分配通常还需考虑设备、控制器和通道是否同时可用,并维护系统设备表、设备控制表、控制器控制表和通道控制表。


设备驱动程序与中断处理程序职责

【例题】

下列工作由设备驱动程序完成的是( )。

A. 检查用户是否有权访问设备
B. 为磁盘读操作计算磁道、扇区和磁头并写控制寄存器
C. 唤醒已完成 I/O 的驱动/进程
D. 提供 printf 接口

【考点】

设备无关层、驱动层、中断层职责。

【答案】B

【解析】

权限检查和统一命名属于设备无关软件;计算设备地址、把抽象命令转成控制器命令并写设备寄存器属于驱动程序;I/O 完成后确认中断并唤醒等待者属于中断处理程序;printf 属于用户级 I/O 库。


高频公式汇总

周转时间 = 完成时间 - 到达时间
带权周转时间 = 周转时间 / 服务时间
响应时间 = 第一次获得CPU时间 - 到达时间

Need = Max - Allocation

页号 = 逻辑地址 div 页面大小
页内偏移 = 逻辑地址 mod 页面大小
物理地址 = 页框号 × 页面大小 + 页内偏移

无TLB单级页表访存时间 = 2 × 内存访问时间
TLB串行查询EAT = h(t+m) + (1-h)(t+2m)

缺页率 = 缺页次数 / 页面访问总次数
EAT = (1-p)×正常访问时间 + p×缺页访问时间

动态分区回收:
无相邻空闲区:空闲区数+1
单侧相邻空闲区:空闲区数不变
上下均为空闲区:空闲区数-1

保证N个进程、每个最多需要k个同类资源不死锁:
资源总数 R ≥ N(k-1)+1

磁盘访问时间 = 寻道时间 + 旋转延迟 + 传输时间
平均旋转延迟 = 半圈旋转时间

一级间接块可存指针数 = 块大小 / 指针大小
最大文件数据块数 = 直接块数 + 一级间接指针数 + 二级间接指针数 + ...
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐