软考中级软件设计师——操作系统考试题型
一、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算法可能出现物理块增加时缺页次数反而增多。 
 
-  
