操作系统期末大题预测合集
操作系统期末大题预测合集:8章核心考点,逐个击破
期末考试临近,操作系统这门课最大的拉分点就是大题。选择题大家都能蒙对几个,但大题一道不会就是零分。这篇文章,我根据高校期末考试命题规律和408历年真题考察频率,把操作系统8个核心章节的必考大题类型全部整理出来,每类都给出了典型例题 + 详细解答 + 解题模板。
不管你是突击复习还是系统冲刺,这篇都是你的大题"押题库"。
本文目录
-
操作系统引论 — 系统调用分析题
-
进程的描述与控制 — PV操作(必考中的必考)
-
处理机调度与死锁 — 调度算法 + 银行家算法
-
存储器管理 — 地址变换 + 内存分配
-
虚拟存储器 — 页面置换算法
-
输入输出系统 — 缓冲计算 + I/O软件
-
文件管理 — 索引分配 + 文件计算
-
磁盘存储器的管理 — 磁盘调度算法
考频速查表
先放一张总表,让你一眼看清哪些章节必考、哪些偶尔考:
|
章节 |
大题类型 |
高校期末考频 |
408考频 |
重要程度 |
|---|---|---|---|---|
|
引论 |
系统调用分析 |
偶尔 |
偶尔 |
了解 |
|
进程描述与控制 |
PV操作 |
必考 |
必考 |
核心 |
|
处理机调度 |
调度算法计算 |
必考 |
必考 |
核心 |
|
死锁 |
银行家算法 |
必考 |
高频 |
核心 |
|
存储器管理 |
地址变换/内存分配 |
必考 |
高频 |
核心 |
|
虚拟存储器 |
页面置换算法 |
必考 |
必考 |
核心 |
|
输入输出 |
缓冲/I/O计算 |
中频 |
中频 |
掌握 |
|
文件管理 |
索引/目录计算 |
高频 |
高频 |
掌握 |
|
磁盘管理 |
磁盘调度算法 |
高频 |
高频 |
掌握 |
一、操作系统引论:系统调用分析题
考频:高校偶尔考,408偶尔出选择题/简答题,大题较少
预测题型:用户态与内核态、系统调用过程分析
【例题】 请分析以下程序的执行过程,指出哪些操作会触发系统调用,并说明每次系统调用属于哪一类(进程控制/文件管理/设备管理/信息维护)。
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main() {
int fd = open("/tmp/data.txt", O_RDWR); // ①
char buf[100];
read(fd, buf, 100); // ②
printf("Hello World\n"); // ③
fork(); // ④
wait(NULL); // ⑤
close(fd); // ⑥
return 0;
}
【解答】
|
序号 |
操作 |
系统调用 |
类别 |
|---|---|---|---|
|
① |
open() |
是 |
文件管理 |
|
② |
read() |
是 |
文件管理 |
|
③ |
printf() |
是(底层调用 |
设备管理 |
|
④ |
fork() |
是 |
进程控制 |
|
⑤ |
wait() |
是 |
进程控制 |
|
⑥ |
close() |
是 |
文件管理 |
解题要点:
-
用户程序不能直接操作硬件,必须通过系统调用陷入内核态
-
printf()虽然是C库函数,但底层最终调用了write()系统调用 -
系统调用会导致用户态→内核态的切换,这是常考的"陷阱点"
二、进程的描述与控制:PV操作(必考中的必考)
考频:高校必考,408每年必考,是操作系统大题的"压轴常客"
预测题型1:生产者-消费者问题(经典PV操作)
【例题】 有一个缓冲区B,容量为N。有k个生产者进程和m个消费者进程共享B。生产者每次放入一个产品,消费者每次取出一个产品。用PV操作实现同步与互斥。
【解答】
semaphore mutex = 1; // 互斥信号量:访问缓冲区
semaphore empty = N; // 同步信号量:空闲缓冲区数量
semaphore full = 0; // 同步信号量:已放产品的缓冲区数量
// 生产者进程
Producer() {
while(true) {
生产一个产品;
P(empty); // ① 先申请空位(同步)
P(mutex); // ② 再申请互斥访问缓冲区
将产品放入B;
V(mutex); // ③ 释放互斥
V(full); // ④ 通知消费者有新产品(同步)
}
}
// 消费者进程
Consumer() {
while(true) {
P(full); // ① 先等待产品(同步)
P(mutex); // ② 再申请互斥访问缓冲区
从B取出产品;
V(mutex); // ③ 释放互斥
V(empty); // ④ 通知生产者有空位(同步)
消费产品;
}
}
解题模板(PV操作万能套路):
-
找互斥:哪些资源是互斥访问的?设
mutex=1 -
找同步:谁先谁后有先后依赖?设同步信号量
-
P的顺序:先P同步,再P互斥("先同步后互斥",写反了会死锁!)
-
V的顺序:先V互斥,再V同步
预测题型2:读者-写者问题
【例题】 多个读者进程和多个写者进程共享一个文件。要求:允许多个读者同时读;只允许一个写者写;写者写时不允许任何读者读。用PV操作实现。
【解答】
semaphore rw_mutex = 1; // 互斥:读者和写者之间
semaphore r_mutex = 1; // 互斥:修改readcount
int readcount = 0; // 当前读者数量
// 读者进程
Reader() {
while(true) {
P(r_mutex);
readcount++;
if(readcount == 1) // 第一个读者,锁住写者
P(rw_mutex);
V(r_mutex);
读文件;
P(r_mutex);
readcount--;
if(readcount == 0) // 最后一个读者,解锁写者
V(rw_mutex);
V(r_mutex);
}
}
// 写者进程
Writer() {
while(true) {
P(rw_mutex);
写文件;
V(rw_mutex);
}
}
预测题型3:哲学家进餐问题
【例题】 5个哲学家围坐圆桌,每人左右各一根筷子(共5根)。每人交替思考和进餐,进餐需同时拿到左右两根筷子。用PV操作避免死锁。
【解答】(采用"至多4人同时拿筷子"方案)
semaphore chopstick[5] = {1, 1, 1, 1, 1};
semaphore room = 4; // 最多允许4人同时进入餐厅
Philosopher(i) {
while(true) {
思考;
P(room); // 进入餐厅
P(chopstick[i]); // 拿左筷子
P(chopstick[(i+1) % 5]); // 拿右筷子
进餐;
V(chopstick[i]); // 放左筷子
V(chopstick[(i+1) % 5]); // 放右筷子
V(room); // 离开餐厅
}
}
常考的PV操作变形题:
-
吸烟者问题(3人共享3种材料)
-
独木桥问题(单向/双向过桥)
-
理发师问题
-
司机-售票员问题
三、处理机调度与死锁
预测题型1:处理机调度算法(必考)
考频:高校必考,408高频
【例题】 设有4个进程到达时间和运行时间如下表:
|
进程 |
到达时间 |
运行时间 |
优先级(数字小优先) |
|---|---|---|---|
|
P1 |
0 |
7 |
2 |
|
P2 |
2 |
4 |
1 |
|
P3 |
4 |
1 |
3 |
|
P4 |
5 |
4 |
4 |
分别用以下算法调度,计算各进程的周转时间和平均周转时间:(1) FCFS (2) SJF(非抢占) (3) SRTF(抢占式SJF) (4) 优先级调度(非抢占) (5) RR(时间片=2)
【解答】
(1) FCFS(先来先服务)
执行顺序:P1(0-7) → P2(7-11) → P3(11-12) → P4(12-16)
|
进程 |
完成时间 |
周转时间 |
带权周转时间 |
|---|---|---|---|
|
P1 |
7 |
7 |
1.00 |
|
P2 |
11 |
9 |
2.25 |
|
P3 |
12 |
8 |
8.00 |
|
P4 |
16 |
11 |
2.75 |
平均周转时间 = (7+9+8+11)/4 = 8.75
(2) SJF(非抢占最短作业优先)
0时刻只有P1到达,P1执行到7。7时刻P2/P3/P4都已到达,按运行时间选P3(1)→P2(4)→P4(4)。
执行顺序:P1(0-7) → P3(7-8) → P2(8-12) → P4(12-16)
|
进程 |
完成时间 |
周转时间 |
|---|---|---|
|
P1 |
7 |
7 |
|
P2 |
12 |
10 |
|
P3 |
8 |
4 |
|
P4 |
16 |
11 |
平均周转时间 = (7+10+4+11)/4 = 8.0
(3) SRTF(抢占式SJF,最短剩余时间优先)
|
时间段 |
执行进程 |
说明 |
|---|---|---|
|
0-2 |
P1 |
P1剩余5 |
|
2-4 |
P2 |
P2到达,剩余4<P1的5,抢占 |
|
4-5 |
P3 |
P3到达,剩余1<P2的2,抢占 |
|
5-6 |
P2 |
P3完成,P2剩余2,P4剩余4,选P2 |
|
6-8 |
P2 |
P2完成 |
|
8-12 |
P4 |
P4执行4个单位完成 |
|
12-17 |
P1 |
P1剩余5个单位完成 |
平均周转时间 = (17+6+1+7)/4 = 7.75
(5) RR(时间片轮转,q=2)
就绪队列变化:
|
时间 |
事件 |
就绪队列 |
|---|---|---|
|
0 |
P1执行 |
[] |
|
2 |
P1用完时间片,P2到达 |
[P2, P1] |
|
4 |
P2用完时间片,P3到达 |
[P1, P3, P2] |
|
5 |
P3用完时间片,P4到达 |
[P3, P2, P4, P1] |
|
6 |
P3完成(只用1) |
[P2, P4, P1] |
|
8 |
P2完成 |
[P4, P1] |
|
10 |
P4用完时间片 |
[P1, P4] |
|
12 |
P1用完时间片 |
[P4, P1] |
|
14 |
P4完成 |
[P1] |
|
17 |
P1完成 |
[] |
解题要点:
-
画甘特图(时间线)是最关键的一步
-
注意"到达时间"——进程没到达之前不能参与调度
-
周转时间 = 完成时间 - 到达时间
-
带权周转时间 = 周转时间 / 运行时间
预测题型2:银行家算法(必考)
考频:高校必考,408高频
【例题】 系统有5个进程(P0~P4),3类资源(A/B/C),总量分别为10/5/7。T0时刻各进程的资源分配和需求如下:
|
进程 |
Allocation |
Need |
Available |
|---|---|---|---|
|
A B C |
A B C |
A B C |
|
|
P0 |
0 1 0 |
7 4 3 |
3 3 2 |
|
P1 |
2 0 0 |
1 2 2 |
|
|
P2 |
3 0 2 |
6 0 0 |
|
|
P3 |
2 1 1 |
0 1 1 |
|
|
P4 |
0 0 2 |
4 3 1 |
(1) 判断T0时刻系统是否安全?给出安全序列。
(2) 若P1请求资源Request(1,0,2),能否分配?
【解答】
(1) 安全性检查
Available = (3, 3, 2)
|
步骤 |
Work |
找Need≤Work |
分配后Work |
Finish |
|---|---|---|---|---|
|
1 |
(3,3,2) |
P1: Need(1,2,2)≤(3,3,2) ✓ |
(3,3,2)+(2,0,0)=(5,3,2) |
true |
|
2 |
(5,3,2) |
P3: Need(0,1,1)≤(5,3,2) ✓ |
(5,3,2)+(2,1,1)=(7,4,3) |
true |
|
3 |
(7,4,3) |
P4: Need(4,3,1)≤(7,4,3) ✓ |
(7,4,3)+(0,0,2)=(7,4,5) |
true |
|
4 |
(7,4,5) |
P0: Need(7,4,3)≤(7,4,5) ✓ |
(7,4,5)+(0,1,0)=(7,5,5) |
true |
|
5 |
(7,5,5) |
P2: Need(6,0,0)≤(7,5,5) ✓ |
(7,5,5)+(3,0,2)=(10,5,7) |
true |
安全序列:P1 → P3 → P4 → P0 → P2,系统处于安全状态。
(2) P1请求Request(1,0,2)
检查:Request(1,0,2) ≤ Need_P1(1,2,2) ✓,Request(1,0,2) ≤ Available(3,3,2) ✓
试探分配后:
-
Available = (3,3,2) - (1,0,2) = (2,3,0)
-
Allocation_P1 = (2,0,0) + (1,0,2) = (3,0,2)
-
Need_P1 = (1,2,2) - (1,0,2) = (0,2,0)
安全性检查:Work=(2,3,0),找Need≤Work → P1(0,2,0)≤(2,3,0) ✓ → P3 → P4 → P0 → P2 ✓
存在安全序列,可以分配。
银行家算法解题模板:
-
检查 Request ≤ Need(不能超过最大需求)
-
检查 Request ≤ Available(系统有足够资源)
-
试探分配:修改 Available、Allocation、Need
-
执行安全性检查(找安全序列)
-
安全则真正分配,不安全则回滚
四、存储器管理:地址变换 + 内存分配
预测题型1:基本分页地址变换(必考)
考频:高校必考,408必考
【例题】 某系统采用分页存储管理,页面大小为4KB。某进程的页表如下:
|
页号 |
物理块号 |
|---|---|
|
0 |
2 |
|
1 |
7 |
|
2 |
4 |
|
3 |
5 |
|
4 |
9 |
(1) 将逻辑地址 8244 转换为物理地址。
(2) 将逻辑地址 15000 转换为物理地址。
(3) 若进程大小为20KB,计算该进程占用的物理块数及内部碎片大小。
【解答】
页面大小 = 4KB = 4096B
(1) 逻辑地址 8244
-
页号 = 8244 / 4096 = 2(取整)
-
页内偏移 = 8244 % 4096 = 52
-
查页表:页号2 → 物理块号4
-
物理地址 = 4 × 4096 + 52 = 16436
(2) 逻辑地址 15000
-
页号 = 15000 / 4096 = 3(取整)
-
页内偏移 = 15000 % 4096 = 2712
-
查页表:页号3 → 物理块号5
-
物理地址 = 5 × 4096 + 2712 = 23192
(3) 进程大小20KB
-
20KB / 4KB = 5页,需要 5个物理块
-
刚好整除,内部碎片 = 0
-
若进程大小为18KB:18KB / 4KB = 4余2KB → 需要5个物理块,最后一页只用2KB,内部碎片 = 2KB
地址变换公式:
-
页号 = ⌊逻辑地址 / 页面大小⌋
-
页内偏移 = 逻辑地址 % 页面大小
-
物理地址 = 物理块号 × 页面大小 + 页内偏移
预测题型2:多级页表地址变换
【例题】 某系统采用二级页表,页面大小4KB,每个页表项4字节。逻辑地址32位,其中:高10位为一级页表索引,中间10位为二级页表索引,低12位为页内偏移。逻辑地址为 0x00401028,求物理地址(假设查表得到一级页表项指向物理块5,二级页表项指向物理块8)。
【解答】
-
逻辑地址
0x00401028=0000 0000 01 | 00 0000 0001 | 0000 0010 1000 -
一级页表索引 =
0000 0000 01= 1 -
二级页表索引 =
0000 0000 01= 1 -
页内偏移 =
0000 0010 1000= 40
查表过程:
-
一级页表第1项 → 物理块5(存放二级页表的起始地址 = 5×4096 = 20480)
-
二级页表(从20480开始)第16项 → 物理块8
-
物理地址 = 8 × 4096 + 40 = 32808
预测题型3:动态分区分配算法
【例题】 内存空闲分区如下(按地址递增排列):
|
分区号 |
起始地址 |
大小 |
|---|---|---|
|
1 |
100K |
30K |
|
2 |
200K |
60K |
|
3 |
350K |
40K |
|
4 |
500K |
80K |
依次有进程请求:20K、50K、10K。分别用首次适应(FF)、最佳适应(BF)、最坏适应(WF)分配,给出分配结果。
【解答】
(1) 首次适应(FF)——从低地址开始找第一个够大的
|
请求 |
分配位置 |
剩余 |
|---|---|---|
|
20K |
分区1(100K)的前20K |
分区1剩10K |
|
50K |
分区2(200K)的前50K |
分区2剩10K |
|
10K |
分区1剩余的10K |
分区1剩0K |
(2) 最佳适应(BF)——找最小且够大的
|
请求 |
分配位置 |
剩余 |
|---|---|---|
|
20K |
分区1(30K),最小够大 |
分区1剩10K |
|
50K |
分区2(60K) |
分区2剩10K |
|
10K |
分区1剩余的10K(或分区2剩余的10K) |
无剩余 |
(3) 最坏适应(WF)——找最大的
|
请求 |
分配位置 |
剩余 |
|---|---|---|
|
20K |
分区4(80K),最大 |
分区4剩60K |
|
50K |
分区4剩余的60K |
分区4剩10K |
|
10K |
分区1(30K)/分区2(60K)/分区4(10K)中选最大:分区2(60K) |
分区2剩50K |
五、虚拟存储器:页面置换算法(必考)
考频:高校必考,408必考,每年都有计算题
【例题】 某进程访问如下页面序列:7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1。系统分配给该进程3个物理块(初始为空)。分别计算以下算法的缺页次数和缺页率:
(1) OPT(最佳置换) (2) FIFO(先进先出) (3) LRU(最近最少使用)
【解答】
(1) OPT(最佳置换)——淘汰将来最久不用的页面
|
时刻 |
访问页 |
块状态 |
淘汰 |
缺页 |
|---|---|---|---|---|
|
1 |
7 |
[7,,] |
- |
✓ |
|
2 |
0 |
[7,0,_] |
- |
✓ |
|
3 |
1 |
[7,0,1] |
- |
✓ |
|
4 |
2 |
[2,0,1] |
7 |
✓ |
|
5 |
0 |
[2,0,1] |
- |
✗ |
|
6 |
3 |
[2,0,3] |
1 |
✓ |
|
7 |
0 |
[2,0,3] |
- |
✗ |
|
8 |
4 |
[2,4,3] |
0 |
✓ |
|
9 |
2 |
[2,4,3] |
- |
✗ |
|
10 |
3 |
[2,4,3] |
- |
✗ |
|
11 |
0 |
[2,0,3] |
4 |
✓ |
|
12 |
3 |
[2,0,3] |
- |
✗ |
|
13 |
2 |
[2,0,3] |
- |
× |
|
14 |
1 |
[2,0,1] |
3 |
√ |
|
15 |
2 |
[2,0,1] |
- |
x |
|
16 |
0 |
[2,0,1] |
- |
x |
|
17 |
1 |
[2,0,1] |
- |
x |
|
18 |
7 |
[7,0,1] |
2 |
√ |
|
19 |
0 |
[7,0,1] |
- |
× |
|
20 |
1 |
[7,0,1] |
- |
× |
OPT缺页次数 = 9次,缺页率 = 9/20 = 45%
(2) FIFO(先进先出)
|
时刻 |
访问页 |
块状态 |
淘汰 |
缺页 |
|---|---|---|---|---|
|
1 |
7 |
[7,,] |
- |
✓ |
|
2 |
0 |
[7,0,_] |
- |
✓ |
|
3 |
1 |
[7,0,1] |
- |
✓ |
|
4 |
2 |
[2,0,1] |
7(最早进入) |
✓ |
|
5 |
0 |
[2,0,1] |
- |
✗ |
|
6 |
3 |
[2,3,1] |
0 |
✓ |
|
7 |
0 |
[2,3,0] |
1 |
✓ |
|
8 |
4 |
[4,3,0] |
2 |
✓ |
|
9 |
2 |
[4,2,0] |
3 |
✓ |
|
10 |
3 |
[4,2,3] |
0 |
✓ |
|
11 |
0 |
[0,2,3] |
4 |
✓ |
|
12 |
3 |
[0,2,3] |
- |
✗ |
|
13 |
2 |
[0,2,3] |
- |
✗ |
|
14 |
1 |
[1,2,3] |
0 |
✓ |
|
15 |
2 |
[1,2,3] |
- |
✗ |
|
16 |
0 |
[1,0,3] |
2 |
✓ |
|
17 |
1 |
[1,0,3] |
- |
✗ |
|
18 |
7 |
[1,0,7] |
3 |
✓ |
|
19 |
0 |
[1,0,7] |
- |
✗ |
|
20 |
1 |
[1,0,7] |
- |
✗ |
FIFO缺页次数 = 15次,缺页率 = 15/20 = 75%
(3) LRU(最近最少使用)
|
时刻 |
访问页 |
块状态(最近→最久) |
淘汰 |
缺页 |
|---|---|---|---|---|
|
1 |
7 |
[7,,] |
- |
✓ |
|
2 |
0 |
[0,7,_] |
- |
✓ |
|
3 |
1 |
[1,0,7] |
- |
✓ |
|
4 |
2 |
[2,1,0] |
7(最久未用) |
✓ |
|
5 |
0 |
[0,2,1] |
- |
✗ |
|
6 |
3 |
[3,0,2] |
1 |
✓ |
|
7 |
0 |
[0,3,2] |
- |
✗ |
|
8 |
4 |
[4,0,3] |
2 |
✓ |
|
9 |
2 |
[2,4,0] |
3 |
✓ |
|
10 |
3 |
[3,2,4] |
0 |
✓ |
|
11 |
0 |
[0,3,2] |
4 |
✓ |
|
12 |
3 |
[3,0,2] |
- |
✗ |
|
13 |
2 |
[2,3,0] |
- |
✗ |
|
14 |
1 |
[1,2,3] |
0 |
✓ |
|
15 |
2 |
[2,1,3] |
- |
✗ |
|
16 |
0 |
[0,2,1] |
3 |
✓ |
|
17 |
1 |
[1,0,2] |
- |
✗ |
|
18 |
7 |
[7,1,0] |
2 |
✓ |
|
19 |
0 |
[0,7,1] |
- |
✗ |
|
20 |
1 |
[1,0,7] |
- |
✗ |
LRU缺页次数 = 12次,缺页率 = 12/20 = 60%
三种算法对比:
|
算法 |
缺页次数 |
缺页率 |
|---|---|---|
|
OPT |
9 |
45% |
|
LRU |
12 |
60% |
|
FIFO |
15 |
75% |
解题技巧:
-
OPT:往后看,找"最久不再被访问"的页淘汰
-
FIFO:维护一个"进入顺序"队列,淘汰队头
-
LRU:往前看,找"最久没被访问"的页淘汰
-
注意:FIFO可能出现Belady异常(增加物理块反而缺页率升高)
六、输入输出系统:缓冲计算 + I/O软件
考频:高校中频,408中频
预测题型1:缓冲时间计算
【例题】 某系统采用单缓冲方式处理磁盘数据。磁盘一块数据读入缓冲区的时间 T = 100μs,CPU处理一块数据的时间 C = 50μs,将缓冲区数据传送到用户区的时间 M = 10μs。
(1) 单缓冲方式下,处理一块数据的总时间是多少?
(2) 双缓冲方式下,处理一块数据的总时间是多少?
【解答】
(1) 单缓冲
处理一块数据的时间 = C+T + M = 50+100 + 10 = 160μs
(当CPU处理缓冲区数据时,不能同时往缓冲区读新数据)
(2) 双缓冲
处理一块数据的时间 = max(C, T) + M= max(50, 100)+10 = 110μs
(CPU处理一个缓冲区时,磁盘可以同时往另一个缓冲区写数据)
预测题型2:SPOOLing系统分析
【例题】 简述SPOOLing系统的组成和工作原理,并说明它如何将独占设备改造为共享设备。
【解答要点】
-
组成:输入井、输出井(磁盘上)+ 输入缓冲区、输出缓冲区(内存中)+ 输入进程、输出进程
-
原理:利用磁盘模拟独占设备。以打印机为例:
-
用户请求打印 → 数据写入磁盘输出井 → 用户进程结束
-
输出进程从输出井取数据 → 发送到实际打印机
-
对每个用户来说像独享一台打印机,实际共享一台
-
-
本质:通过缓冲 + 后台进程实现虚拟设备
七、文件管理:索引分配 + 文件计算
考频:高校高频,408高频
预测题型1:混合索引(inode)计算
【例题】 某文件系统采用Unix inode方式管理文件。inode中有:10个直接地址项、1个一次间接地址项、1个二次间接地址项、1个三次间接地址项。每个磁盘块大小为4KB,每个磁盘块号占4字节。
(1) 一个一次间接地址项可寻址多大的文件?
(2) 一个二次间接地址项可寻址多大的文件?
(3) 该文件系统支持的最大文件有多大?
(4) 某文件大小为100KB,需要多少个物理块?访问该文件的第100KB数据需要访问几次磁盘?
【解答】
每个磁盘块可存放的块号数 = 4KB / 4B = 1024个
(1) 一次间接
一个索引块可指向 1024 个数据块。可寻址大小 = 1024 × 4KB = 4MB
(2) 二次间接
一层索引有1024个项,每项指向一个一级索引块,每个一级索引块又指向1024个数据块。可寻址大小 = 1024 × 1024 × 4KB = 4GB
(3) 最大文件
-
直接地址:10 × 4KB = 40KB
-
一次间接:1024 × 4KB = 4MB
-
二次间接:1024 × 1024 × 4KB = 4GB
-
三次间接:1024 × 1024 × 1024 × 4KB = 4TB
最大文件 = 40KB + 4MB + 4GB + 4TB ≈ 4TB(主要由三次间接决定)
(4) 文件100KB
-
需要物理块数 = ⌈100KB / 4KB⌉ = 25个
-
前10块:直接地址(0次间接)
-
第11~25块:一次间接
访问第100KB(即第25块,编号24,从0开始):
-
24 ≥ 10,在直接地址范围外
-
24 < 10 + 1024 = 1034,在一次间接范围内
-
需要:读inode(1次) → 读一次间接索引块(1次) → 读数据块(1次) = 3次磁盘访问
预测题型2:FAT文件系统计算
【例题】 某磁盘采用FAT32文件系统,簇大小为4KB,磁盘总容量为8GB。
(1) FAT表需要多少个表项?
(2) 每个FAT表项至少需要多少位?
(3) FAT表至少占用多少磁盘空间?
【解答】
(1) 磁盘总簇数 = 8GB / 4KB = 8 × 1024 × 1024 × 1024 / (4 × 1024) = 2,097,152 个簇
FAT表项数 = 2,097,152(每簇一个表项,加少量保留项)≈ 2M个表项
(2) 需要表示 2,097,152 个不同值,至少需要 21位(2²¹ = 2,097,152)。FAT32实际用32位。
(3) FAT表大小 = 2,097,152 × 4字节 = 8,388,608 字节 = 8MB
八、磁盘存储器的管理:磁盘调度算法
考频:高校高频,408高频
预测题型:磁盘调度算法计算
【例题】 假设磁头当前位于第100号磁道,正在向磁道号增大的方向移动。磁盘请求队列(按到达顺序)为:55, 58, 39, 18, 90, 160, 150, 38, 184。磁道号范围为0~199。
分别计算以下算法的磁头移动总磁道数和平均寻道长度:
(1) FCFS (2) SSTF (3) SCAN (4) C-SCAN (5) LOOK (6) C-LOOK
【解答】
(1) FCFS
移动顺序:100 → 55 → 58 → 39 → 18 → 90 → 160 → 150 → 38 → 184
|
移动 |
磁道差 |
|---|---|
|
100→55 |
45 |
|
55→58 |
3 |
|
58→39 |
19 |
|
39→18 |
21 |
|
18→90 |
72 |
|
90→160 |
70 |
|
160→150 |
10 |
|
150→38 |
112 |
|
38→184 |
146 |
总磁道数 = 45+3+19+21+72+70+10+112+146 = 498
平均寻道 = 498/9 = 55.3
(2) SSTF
每次选最近的:100 → 90 → 58 → 55 → 39 → 38 → 18 → 150 → 160 → 184
|
移动 |
磁道差 |
|---|---|
|
100→90 |
10 |
|
90→58 |
32 |
|
58→55 |
3 |
|
55→39 |
16 |
|
39→38 |
1 |
|
38→18 |
20 |
|
18→150 |
132 |
|
150→160 |
10 |
|
160→184 |
24 |
总磁道数 = 10+32+3+16+1+20+132+10+24 = 248
(3) SCAN(电梯算法,向增大方向)
100 → 150 → 160 → 184 → 199(端点) → 90 → 58 → 55 → 39 → 38 → 18
|
移动 |
磁道差 |
|---|---|
|
100→150 |
50 |
|
150→160 |
10 |
|
160→184 |
24 |
|
184→199 |
15 |
|
199→90 |
109 |
|
90→58 |
32 |
|
58→55 |
3 |
|
55→39 |
16 |
|
39→38 |
1 |
|
38→18 |
20 |
总磁道数 = 50+10+24+15+109+32+3+16+1+20 = 280
注意:SCAN必须扫到端点(199),即使199没有请求。
(4) C-SCAN(循环扫描)
100 → 150 → 160 → 184 → 199(端点) → 0(跳回) → 18 → 38 → 39 → 55 → 58 → 90
总磁道数 = (199-100) + (199-0) + (90-0) = 99 + 199 + 90 = 388
(也有算法不算回跳的距离,只看服务请求的移动:50+10+24+15+199+18+20+1+16+3+32 = 388)
(5) LOOK
100 → 150 → 160 → 184(最远请求,不到199) → 90 → 58 → 55 → 39 → 38 → 18
总磁道数 = (184-100) + (184-18) = 84 + 166 = 250
(6) C-LOOK
100 → 150 → 160 → 184 → 18(最远端请求) → 38 → 39 → 55 → 58 → 90
总磁道数 = (184-100) + (184-18) + (90-18) = 84 + 166 + 72 = 322
汇总对比:
|
算法 |
总磁道数 |
平均寻道 |
|---|---|---|
|
FCFS |
498 |
55.3 |
|
SSTF |
248 |
27.6 |
|
SCAN |
280 |
31.1 |
|
C-SCAN |
388 |
43.1 |
|
LOOK |
250 |
27.8 |
|
C-LOOK |
322 |
35.8 |
易错点提醒:
-
SCAN必须扫到物理端点(0或199),LOOK不需要
-
C-SCAN/C-LOOK的回跳距离是否计入总磁道数,要看题目要求(通常计入)
-
SSTF注意"当前最近"是动态变化的
终极复习清单
考前最后看一遍这个清单,确认每种题型你都能独立做出来:
-
PV操作:能写生产者-消费者、读者-写者、哲学家进餐
-
调度算法:FCFS/SJF/SRTF/RR/优先级,会画甘特图算周转时间
-
银行家算法:安全性检查 + 资源请求判断
-
地址变换:基本分页(一级/多级)地址计算
-
内存分配:FF/BF/WF动态分区分配
-
页面置换:OPT/FIFO/LRU,会算缺页率
-
缓冲计算:单缓冲/双缓冲时间公式
-
inode计算:直接/间接寻址的文件大小
-
FAT计算:表项数、表大小
-
磁盘调度:FCFS/SSTF/SCAN/C-SCAN/LOOK/C-LOOK的磁道数计算
全都会了?那期末稳了。祝考试顺利!
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)