### 进程调度练习题
#### 题目一:抢占式 SJF 调度算法
假设有一个系统采用 **抢占式最短作业优先 (SJF)** 调度策略。以下是五个进程的信息表:
| 进程 | 到达时间 | CPU Burst 时间 |
|------|----------|----------------|
| P1 | 0 | 8 |
| P2 | 1 | 4 |
| P3 | 2 | 9 |
| P4 | 3 | 5 |
| P5 | 4 | 2 |
计算以下指标并绘制 Gantt 图:
- 各进程的完成时间
- 周转时间
- 平均周转时间
- 等待时间
注意:此题考察 SRTF 的实现细节以及对概念的理解[^1]。
---
#### 题目二:页面置换算法与 Belady 现象
考虑一个具有三个物理页框的内存管理系统,初始为空。使用 FIFO 和 LRU 页面置换算法分别处理以下页面访问序列,并判断哪种情况会产生 **Belady 异常**(即增加分配给进程的帧数反而增加了缺页次数的现象)。
页面访问序列为:`7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2`
分析两种算法的结果,并解释为什么某些情况下会触发 Belady 异常[^2]。
---
#### 题目三:TCP 数据包传输中的系统调用
当一个进程通过系统调用来发送 TCP 数据包时,下列哪些操作并非总是发生?请选择正确的选项。
A. 将数据复制到内核缓冲区
B. 执行网络接口卡上的 DMA 操作
C. 更新套接字的状态信息
D. 触发硬件中断
提示:此题涉及操作系统中网络子系统的交互过程[^3]。
---
#### Python 实现代码示例:Gantt 图绘制工具
为了帮助解决上述问题中的绘图需求,可以利用如下 Python 工具来生成 Gantt 图表示调度结果。
```python
import matplotlib.pyplot as plt
def draw_gantt_chart(processes):
fig, gnt = plt.subplots()
gnt.set_ylim(0, len(processes))
gnt.set_xlim(0, max([p['end'] for p in processes]))
gnt.set_xlabel('Time')
gnt.set_ylabel('Process')
y_labels = ['P' + str(i+1) for i in range(len(processes))]
gnt.set_yticks(range(len(y_labels)))
gnt.set_yticklabels(y_labels)
for idx, proc in enumerate(processes):
gnt.barh(idx, width=proc['duration'], left=proc['start'], height=0.5)
process_data = [
{'name': 'P1', 'start': 0, 'end': 8, 'duration': 8},
{'name': 'P2', 'start': 1, 'end': 5, 'duration': 4},
{'name': 'P3', 'start': 2, 'end': 11, 'duration': 9}
]
draw_gantt_chart(process_data)
plt.show()
```
---
###