软考中级软件设计师——操作系统考试题型
一、PV操作与进程同步(必考大题)
1. 真题示例(2020年真题)
题目:
三个进程P1、P2、P3共享一个缓冲区,P1生产数据放入缓冲区,P2和P3消费数据。要求:
-
缓冲区大小为10,满时P1等待,空时P2/P3等待;
-
P2和P3不能同时消费同一数据。
请用PV操作实现同步。
答案与解析:
semaphore empty = 10; // 缓冲区空槽数
semaphore full = 0; // 缓冲区数据数
semaphore mutex1 = 1; // 生产者互斥锁(P1)
semaphore mutex2 = 1; // 消费者互斥锁(P2/P3) // 生产者P1
void P1() { while(1) { 生产数据(); P(empty); // 申请空槽 P(mutex1); 放入缓冲区(); V(mutex1); V(full); // 增加数据数 }
} // 消费者P2/P3
void P2() { while(1) { P(full); // 申请数据 P(mutex2); // 互斥消费 取出数据(); V(mutex2); V(empty); // 释放空槽 消费数据(); }
}
解析:
-
信号量设计:
-
empty
和full
控制缓冲区空满状态。 -
mutex1
保护生产者操作缓冲区的互斥性。 -
mutex2
确保消费者(P2/P3)互斥消费。
-
-
易错点:
-
若消费者未加互斥锁,可能导致多个消费者同时取出同一数据。
-
二、死锁与银行家算法(高频计算题)
1. 题目:
系统资源总数A=9,B=6,当前分配如下:
进程 | 已分配(A,B) | 最大需求(A,B) |
---|---|---|
P1 | (2,1) | (4,3) |
P2 | (3,2) | (5,4) |
P3 | (1,1) | (2,2) |
当前剩余资源:A=3, B=2。 | ||
判断系统是否处于安全状态,并给出安全序列。 |
答案与解析:
-
计算各进程仍需资源:
-
P1需(2,2),P2需(2,2),P3需(1,1)。
-
-
模拟分配过程:
-
Step 1:剩余资源(3,2)可满足P3需求 → 分配后释放P3资源,剩余资源变为(3+1,2+1)=(4,3)。
-
Step 2:剩余资源(4,3)可满足P1需求 → 分配后释放P1资源,剩余资源变为(4+2,3+1)=(6,4)。
-
Step 3:剩余资源(6,4)可满足P2需求 → 安全序列为
P3→P1→P2
。
结论:系统安全,存在安全序列。
-
三、页面置换算法(计算缺页次数)
1.题目:
页面访问序列:1,2,3,4,1,2,5,1,2,3,物理块数为3。
分别计算FIFO和LRU算法的缺页次数。
答案与解析:
FIFO算法:
访问页 | 1 | 2 | 3 | 4 | 1 | 2 | 5 | 1 | 2 | 3 |
---|---|---|---|---|---|---|---|---|---|---|
块1 | 1 | 1 | 1 | 4 | 4 | 4 | 5 | 5 | 5 | 3 |
块2 | 2 | 2 | 2 | 1 | 1 | 1 | 1 | 1 | 1 | |
块3 | 3 | 3 | 3 | 2 | 2 | 2 | 2 | 2 | ||
缺页标记:✔️✔️✔️✔️✔️✔️✔️✔️ | ||||||||||
缺页次数:8次(替换顺序1→2→3→4→5→1→2→3)。 |
LRU算法:
访问页 | 1 | 2 | 3 | 4 | 1 | 2 | 5 | 1 | 2 | 3 |
---|---|---|---|---|---|---|---|---|---|---|
块1 | 1 | 1 | 1 | 4 | 1 | 1 | 5 | 1 | 1 | 3 |
块2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | |
块3 | 3 | 3 | 3 | 3 | 3 | 5 | 5 | 5 | ||
缺页标记:✔️✔️✔️✔️✔️✔️✔️ | ||||||||||
缺页次数:7次(替换顺序3→4→5→3)。 |
解析:
-
FIFO:淘汰最早进入的页面,注意Belady异常(物理块增加时缺页可能增多)。
-
LRU:淘汰最近最久未使用的页面,需记录访问时间戳或使用栈结构。
四、磁盘调度算法(计算寻道时间)
1. 题目:
当前磁头位于100号磁道,请求队列:45, 83, 62, 120, 20。
使用SCAN(电梯算法)计算总移动磁道数。
答案与解析:
-
排序请求队列:初始方向假设为磁道号增大方向。
-
当前磁道100 → 请求队列排序为:120, 83, 62, 45, 20。
-
-
移动路径:
-
100 → 120(移动20)→ 83(移动37)→ 62(移动21)→ 45(移动17)→ 20(移动25)。
-
总移动磁道数:20 + 37 + 21 + 17 + 25 = 120。
-
关键点:
-
SCAN算法先服务同一方向所有请求,再反向扫描。
-
若初始方向为减小方向,路径为100→20→45→62→83→120,总移动数可能不同。
五、进程调度算法(计算平均等待时间)
1. 题目:
进程到达时间和运行时间如下:
进程 | 到达时间 | 运行时间 |
---|---|---|
P1 | 0 | 5 |
P2 | 1 | 3 |
P3 | 2 | 2 |
使用短作业优先(SJF)算法计算平均等待时间。 |
答案与解析:
-
调度顺序:
-
0时刻:只有P1到达,执行P1(0~5)。
-
5时刻:P2和P3均已到达,选择运行时间短的P3(5~7)。
-
7时刻:执行P2(7~10)。
-
-
等待时间:
-
P1:0(无需等待)。
-
P2:7-1=6(到达时间1,开始时间7)。
-
P3:5-2=3(到达时间2,开始时间5)。
-
平均等待时间:(0 + 6 + 3)/3 = 3。
-
关键点:
-
SJF是非抢占式算法,需等待当前进程执行完毕再选择下一个最短作业。
六、高频易错点总结
-
PV操作顺序:
-
同步信号量(如
empty
)必须在互斥信号量(如mutex
)之前申请,否则可能死锁。
-
-
银行家算法安全序列:
-
必须按步骤模拟分配,不可跳跃。
-
-
Belady异常:
-
仅FIFO算法可能出现物理块增加时缺页次数反而增多。
-