FIFO、LRU、OPT页面调度算法及例子

网上很多介绍3种页面置换算法的例子和过程是不正确的, 本文根据《操作系统概念》第七版对三种算法做介绍,并给出正确的例子以验证算法。


一、FIFO先进先出页面置换算法,创建一个FIFO队列来管理内存中的所有页。在计算缺页率的时候最好把每一次页面调度的队列写出来,这样不容易出错。

下面举例说明:

假设页帧为3,引用串为:7,0,1,2,0,3,0,4,2


页面走向:7,0,1,2,0,3,0,4,2,

               -----------------------------------------------

物理页:   7,7,7,2,2,2,2,4,4,

                       0,0,0,0,3,3,3,2,

                             1,1,1,1,0,0,0,


FIFO队列:7, 7,7,0,0,1,2,3,0,

                       0,0,1,1,2,3,0,4,

                             1,2,2,3,0,4,2,

首先7,0,1页面依次进入页帧,队列变为7,0,1,下一个引用2要调入,则队列头部的7出队,队列变为0,1,2,物理页内将7换成2,下一个引用0调入,已经存在页帧中,队列不变,下一个3调入,队列头的0出队,3入队列尾,队列变为1,2,3,页帧将0变为3。后面同理依次进行。


二、LRU是Least Recently Used 近期最少使用算法 ( 待更新 )


三、OPT是最佳页面替换算法(待更新)



下面举一些例子及答案,可根据上述算法验证调度算法的正确性。

1、在一个请求分页系统中,假如一个作业的页面走向为:1,2,3,6,4,7,3,2,1,4,7,5,6,5,2,1。当分配给该作业的物理块数为4时,分别采用最佳置换算法、LRU和FIFO页面置换算法,计算访问过程中所发生的缺页次数和缺页率。

答:最佳置换算法的情况如下表

页面走向

1

2

3

6

4

7

3

2

1

4

7

5

6

5

2

1

物理页0

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

物理页1

 

2

2

2

2

2

2

2

2

2

2

2

2

2

2

2

物理页2

 

 

3

3

3

3

3

3

3

4

4

5

5

5

5

5

物理页3

 

 

 

6

4

7

7

7

7

7

7

7

6

6

6

6

缺页否

Y

Y

Y

Y

Y

Y

N

N

N

Y

N

Y

Y

N

N

N

缺页次数为9,缺页率为9/16


LRU算法的情况如下表:

页面走向

1

2

3

6

4

7

3

2

1

4

7

5

6

5

2

1

物理页0

1

1

1

1

4

4

4

4

1

1

1

1

6

6

6

6

物理页1

 

2

2

2

2

7

7

7

7

4

4

4

4

4

2

2

物理页2

 

 

3

3

3

3

3

3

3

3

7

7

7

7

7

1

物理页3

 

 

 

6

6

6

6

2

2

2

2

5

5

5

5

5

缺页否

Y

Y

Y

Y

Y

Y

N

Y

Y

Y

Y

Y

Y

N

Y

Y

缺页次数为14,缺页率为14/16

FIFO算法的情况如下表:

页面走向

1

2

3

6

4

7

3

2

1

4

7

5

6

5

2

1

物理页0

1

1

1

1

4

4

4

4

4

4

4

5

5

5

5

5

物理页1

 

2

2

2

2

7

7

7

7

7

7

7

6

6

6

6

物理页2

 

 

3

3

3

3

3

2

2

2

2

2

2

2

2

2

物理页3

 

 

 

6

6

6

6

6

1

1

1

1

1

1

1

1

缺页否

Y

Y

Y

Y

Y

Y

N

Y

Y

N

N

Y

Y

N

N

N

缺页次数为10,缺页率为10/16


二、在一个请求分页系统中,假如一个作业的页面走向为:4,3,2,1,4,3,5,4,3,2,1,5。当分配给该作业的物理块数M4,分别采用最佳置换算法、LRUFIFO页面置换算法,计算访问过程中所发生的缺页次数和缺页率。

答:最佳置换算法的情况如下表:

页面走向

4

3

2

1

4

3

5

4

3

2

1

5

物理页0

4

4

4

4

4

4

4

4

4

4

1

1

物理页1

 

3

3

3

3

3

3

3

3

3

3

3

物理页2

 

 

2

2

2

2

2

2

2

2

2

2

物理页3

 

 

 

1

1

1

5

5

5

5

5

5

缺页否

Y

Y

Y

Y

N

N

Y

N

N

N

Y

N

缺页次数为6,缺页率为6/12

LRU置换算法的情况如下表:

页面走向

4

3

2

1

4

3

5

4

3

2

1

5

物理页0

4

4

4

4

4

4

4

4

4

4

4

5

物理页1

 

3

3

3

3

3

3

3

3

3

3

3

物理页2

 

 

2

2

2

2

5

5

5

5

1

1

物理页3

 

 

 

1

1

1

1

1

1

2

2

2

缺页否

Y

Y

Y

Y

N

N

Y

N

N

Y

Y

Y

缺页次数为8,缺页率为8/12

FIFO算法的情况如下表:

页面走向

4

3

2

1

4

3

5

4

3

2

1

5

物理页0

4

4

4

4

4

4

5

5

5

5

1

1

物理页1

 

3

3

3

3

3

3

4

4

4

4

5

物理页2

 

 

2

2

2

2

2

2

3

3

3

3

物理页3

 

 

 

1

1

1

1

1

1

2

2

2

缺页否

Y

Y

Y

Y

N

N

Y

Y

Y

Y

Y

Y

缺页次数为10,缺页率为10/12




  • 14
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这个实验可以分为以下几个步骤: 1. 定义数据结构和变量 在开始编写程序之前,我们需要定义一些数据结构和变量来存储虚拟存储器的信息,包括页面大小、物理页面数、虚拟页面数、页面访问序列等。 2. 实现页面调度算法 根据实验要求,我们需要实现三种页面调度算法OPTFIFOLRU。这些算法的实现方式各不相同,但是它们都需要根据页面访问序列和当前内存中的页面来选择合适的页面进行置换。 3. 模拟页面调度过程 在实现页面调度算法之后,我们需要编写代码来模拟页面调度过程。具体来说,我们需要按照页面访问序列的顺序逐个模拟页面的访问,并根据不同的页面调度算法来选择要置换的页面。 4. 输出模拟结果 最后,我们需要将模拟结果输出到屏幕上或者保存到文件中。输出结果应该包括每个页面的访问情况、每次页面置换的信息以及页面调度算法的性能评估(例如缺页率页面置换次数等)。 下面是一个简单的示例程序,其中包括了 OPTFIFO 两种页面调度算法的实现。请注意,这个程序仅供参考,实际的代码可能需要根据实验要求进行修改和完善。 ```c #include <stdio.h> #include <stdlib.h> #define PAGE_SIZE 4096 // 页面大小为 4KB #define PHYSICAL_PAGES 16 // 物理页面数为 16 个 #define VIRTUAL_PAGES 64 // 虚拟页面数为 64 个 int page_table[VIRTUAL_PAGES]; // 页面表 int page_access_sequence[] = {0, 1, 2, 3, 1, 4, 5, 6, 1, 7, 8, 9, 2, 10, 11, 12, 1, 13, 14, 15}; // 页面访问序列 // OPT 页面置换算法 int opt_replace(int* memory, int page) { int max_distance = 0, replace_page = -1; for (int i = 0; i < PHYSICAL_PAGES; i++) { int distance = 0; for (int j = 0; j < sizeof(page_access_sequence) / sizeof(int); j++) { if (memory[i] == page_access_sequence[j]) { if (distance > max_distance) { max_distance = distance; replace_page = i; } break; } distance++; } } return replace_page; } // FIFO 页面置换算法 int fifo_replace(int* memory, int page) { static int current_page = 0; int replace_page = current_page; current_page = (current_page + 1) % PHYSICAL_PAGES; return replace_page; } // 模拟页面调度过程 void simulate(int(*replace)(int*, int)) { int memory[PHYSICAL_PAGES]; // 物理内存 int page_faults = 0; // 缺页次数 int page_replaces = 0; // 页面置换次数 for (int i = 0; i < sizeof(page_access_sequence) / sizeof(int); i++) { int page = page_access_sequence[i]; if (page_table[page] == 1) { // 页面已经在内存中 printf("Page %d is in memory.\n", page); } else { // 页面不在内存中,需要进行页面置换 page_faults++; int replace_page = replace(memory, page); page_table[memory[replace_page]] = 0; // 将要置换的页面页面表中删除 memory[replace_page] = page; // 将新页面放入物理内存中 page_table[page] = 1; // 将新页面加入页面表中 page_replaces++; printf("Page fault: page %d is not in memory, replace page %d.\n", page, memory[replace_page]); } } printf("Page faults: %d\n", page_faults); printf("Page replaces: %d\n", page_replaces); printf("Page fault rate: %.2f%%\n", (float)page_faults / sizeof(page_access_sequence) * 100); } int main(void) { for (int i = 0; i < VIRTUAL_PAGES; i++) { page_table[i] = 0; } printf("OPT algorithm:\n"); simulate(opt_replace); printf("FIFO algorithm:\n"); simulate(fifo_replace); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值