一、进程管理:进程调度算法学习任务(测验题要求计算平均周转时间、平均带权周转时间)
1、先进先出法
2、短进程优先法
3、时间片轮转法
4、优先级调度法
二、存储管理:页面置换算法学习任务(测验题要求给出置换页面顺序,缺页次数,缺页率)
5、先进先出法(FIFO)
6、最近最少使用法(LRU)
三、文件管理:磁盘调度算法(测验题要求计算平均寻道长度)
7、先来先服务法(FCFS)
8、最短寻道时间算法(SSTF)
9、SCAN基本扫描算法(电梯算法)
二、存储管理:页面置换算法学习任务
本部分聚焦页面置换算法的核心学习任务,测验题要求能够给出置换页面顺序、缺页次数以及缺页率。下面分别介绍先进先出法(FIFO)和最近最少使用法(LRU)。
5、先进先出法(FIFO)
先进先出法是最简单的页面置换算法,其核心思想是:当需要淘汰页面时,选择最早进入内存的页面进行置换。该算法实现简单,但可能出现Belady异常,即分配的物理块数增加,缺页次数反而增加。
学习要点:
- 理解FIFO算法的置换顺序:按页面进入内存的时间顺序依次淘汰。
- 能够手动模拟给定页面访问序列下的置换过程,记录每次缺页时被置换出去的页面。
- 统计缺页次数,并计算缺页率(缺页次数 / 页面访问总次数)。
6、最近最少使用法(LRU)
最近最少使用法基于局部性原理,当需要淘汰页面时,选择最近最长时间未被访问的页面进行置换。该算法性能较好,但实现开销较大,需要记录每个页面的访问时间。
学习要点:
- 理解LRU算法的置换顺序:每次淘汰最久未被访问的页面。
- 能够手动模拟给定页面访问序列下的置换过程,注意区分"最近最少使用"与"最早进入"的区别。
- 统计缺页次数,并计算缺页率,与FIFO算法进行对比分析。
测验题解题步骤
面对测验题时,建议按以下步骤作答:
- 明确题目给定的页面访问序列和物理块数。
- 按算法规则逐步模拟置换过程,记录每次缺页时置换出的页面顺序。
- 统计缺页次数,缺页率 = 缺页次数 / 页面访问总次数。
- 对比不同算法的缺页率,分析各自优缺点。
下面通过一个具体例子演示完整的解题过程。假设页面访问序列为:7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1 ,物理块数为 3,页面访问总次数为 20。
(1)FIFO 算法模拟
FIFO 按页面进入内存的时间顺序淘汰最早进入的页面。初始时 3 个物理块均为空,前 3 次访问必然缺页。模拟过程如下:
| 访问序号 | 访问页面 | 物理块1 | 物理块2 | 物理块3 | 是否缺页 | 置换出的页面 |
|---|---|---|---|---|---|---|
| 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 置换顺序为:7 → 0 → 1 → 2 → 3 → 0 → 4 → 2 → 3 → 0 → 1 → 2 → 3。缺页次数为 13 次,缺页率 = 13 / 20 = 65%。
(2)LRU 算法模拟
LRU 每次淘汰最近最长时间未被访问的页面。模拟过程如下:
| 访问序号 | 访问页面 | 物理块1 | 物理块2 | 物理块3 | 是否缺页 | 置换出的页面 |
|---|---|---|---|---|---|---|
| 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 | 命中 | --- |
LRU 置换顺序为:7 → 0 → 1 → 2 → 3 → 0 → 4 → 2 → 3 → 0 → 1 → 2 → 3。缺页次数为 13 次,缺页率 = 13 / 20 = 65%。
(3)结果对比
在本例中,FIFO 和 LRU 的缺页次数均为 13 次,缺页率均为 65%,两者表现相同。但在其他访问序列下,LRU 通常优于 FIFO,因为 LRU 基于局部性原理,能更好地保留近期频繁访问的页面。需要注意的是,FIFO 可能出现 Belady 异常,而 LRU 不会出现该异常。
(4)FIFO 与 LRU 算法对比
下表从算法思想、实现复杂度、是否可能发生 Belady 异常、适用场景以及平均缺页率表现等维度,对 FIFO 和 LRU 两种页面置换算法进行系统对比。
| 对比维度 | FIFO(先进先出法) | LRU(最近最少使用法) |
|---|---|---|
| 算法思想 | 按页面进入内存的时间顺序,淘汰最早进入的页面,只考虑进入时间,不考虑访问频率。 | 基于局部性原理,淘汰最近最长时间未被访问的页面,兼顾进入时间和访问频率。 |
| 实现复杂度 | 实现简单,只需维护一个先进先出的队列,开销小。 | 实现较复杂,需要记录每个页面的访问时间或维护访问顺序链表,开销较大。 |
| 是否可能 Belady 异常 | 可能发生。物理块数增加时,缺页次数反而可能增加。 | 不会发生。物理块数增加时,缺页次数不会增加。 |
| 适用场景 | 适用于页面访问规律性较强、对实现开销敏感、对性能要求不高的简单系统。 | 适用于局部性特征明显、对缺页率要求较高的系统,如现代操作系统和数据库缓冲管理。 |
| 平均缺页率表现 | 缺页率通常较高,性能一般,且可能因 Belady 异常出现性能退化。 | 缺页率通常较低,性能优于 FIFO,能更好地保留近期频繁访问的页面。 |
综合来看,FIFO 的优点是实现简单、开销小,缺点是缺页率偏高且可能出现 Belady 异常;LRU 的优点是缺页率低、性能稳定且不会出现 Belady 异常,缺点是实现复杂、开销较大。在实际系统中,通常优先选择 LRU 或其近似实现(如时钟算法)来获得更好的性能。