三种页面置换算法

1、为什么要有页面置换算法

程序运行过程中,有时要访问的页面不在内存中,而需要将其调入内存。但是内存已经无空闲空间存储页面,为保证程序正常运行,系统必须从内存中调出一页程序或数据送到磁盘对换区,此时需要一定的算法来决定到低需要调出那个页面。通常将这种算法称为“页面置换算法”。

2.页面置换算法的分类

2.1 最佳置换算法(OPT)

(1)实现原理:每次选择未来长时间不被访问的或者以后永不使用的页面进行淘汰。

(2)举例:假定系统为某进程分配了三块物理块,并有以下页面:

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

  • 程序运行时,先将7,0,1三个页面装入内存。
  • 之后,当进程要访问页面2的时候,将会产生缺页中断。此时根据最佳置换算法,因为页面7要在第18次才能访问,页面0在第5次访问,页面1在第14次访问,页面7最久不被使用,所以将页面7淘汰;
  • 当进程0要访问时,因为它已存在在内存所以不必产生缺页中断;
  • 当页面3要访问时,又引起缺页中断淘汰1;
  • 依次类推直到最后一个页面访问完。下图为采用最佳置换算法的置换图。由图可得,采用最佳置换算法发生了6次缺页中断。

(3)特点

  • 缺点:最佳置换算法是一种理想化算法,具有较好的性能,但是实际上无法实现(无法预知一个进程中的若干页面哪一个最长时间不被访问);
  • 优点:最佳置换算法可以保证获得最低的缺页率

2.2 先进先出页面置换算法(FIFO)

(1)实现原理:淘汰最先进入内存的页面,即选择在页面待的时间最长的页面淘汰。

(2)举例

依旧是上一个算法的例子

  • 程序运行时,先将7,0,1三个页面装入内存。
  • 之后,当进程要访问页面2的时候,将会产生缺页中断。此时根据先进先出置换算法,因为页面7是最先进入内存的,所以将页面7换出;
  • 当进程0要访问时,因为它已存在在内存所以不必产生缺页中断;
  • 在进程要访问页面3的时候,因为页面0是最早进入内存的,所以将页面0换出;
  • 依次类推直到最后一个页面访问完。下图为采用先进先出置换算法的置换图。由图可得,采用最佳置换算法发生了12次缺页中断。先进先出的页面置换比最佳置换算法的页面置换正好多了一倍;

(3)特点

  • 优点:先进先出算法实现简单,是最直观的一个算法
  • 缺点:先进先出的性能最差,因为与通常页面的使用规则不符合,所以实际应用少

2.3 最近最久未使用置换算法(LRU)

(1)实现原理:选择最近且最久未被使用的页面进行淘汰

(2)举例:

依旧是上一个算法的例子

  • 程序运行时,先将7,0,1三个页面装入内存。
  • 之后,当进程要访问页面2的时候,将会产生缺页中断。此时根据最近最久未使用置换算法,因为页面7是最近最久未被使用的的,所以将页面7淘汰;
  • 当进程0要访问时,因为它已存在在内存所以不必产生缺页中断;
  • 在进程要访问页面3的时候,因为页面1是最近最久未被使用的,所以将页面1淘汰;
  • 依次类推直到最后一个页面访问完。下图为采用最近最久未使用的置换算法的置换图。由图可得,采用最近最久未使用置换算法发生了9次缺页中断。

(3)特点

  • 优点:由于考虑程序访问的时间局部性,一般能有较好的性能;实际应用多
  • 缺点:实现需要较多的硬件支持,会增加硬件成本
  • 56
    点赞
  • 210
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
页面置换算法是一种内存管理算法,常用于虚拟内存系统中。常见的三种页面置换算法包括FIFO算法、最优算法(OPT)和最近最久未使用算法(LRU)。以下是三种算法的C语言代码实现。 1. FIFO算法 ``` #include <stdio.h> int main() { int pages[100], frames[10], pageNum, frameNum, faults=0, j, k, l, flag; printf("Enter the number of pages: "); scanf("%d", &pageNum); printf("Enter the page reference string: "); for(j=0; j<pageNum; j++) scanf("%d", &pages[j]); printf("Enter the number of frames: "); scanf("%d", &frameNum); for(j=0; j<frameNum; j++) frames[j] = -1; j = 0; printf("\nReference String\t Page Frames\n"); for(k=0; k<pageNum; k++) { printf("%d\t\t", pages[k]); flag = 0; for(l=0; l<frameNum; l++) { if(frames[l] == pages[k]) { flag = 1; break; } } if(flag == 0) { frames[j] = pages[k]; j = (j+1)%frameNum; faults++; for(l=0; l<frameNum; l++) printf("%d\t", frames[l]); } printf("\n"); } printf("\nTotal Page Faults: %d", faults); return 0; } ``` 2. 最优算法(OPT) ``` #include <stdio.h> #include <limits.h> int main() { int pages[100], frames[10], pageNum, frameNum, faults=0, j, k, l, m, max, flag; printf("Enter the number of pages: "); scanf("%d", &pageNum); printf("Enter the page reference string: "); for(j=0; j<pageNum; j++) scanf("%d", &pages[j]); printf("Enter the number of frames: "); scanf("%d", &frameNum); for(j=0; j<frameNum; j++) frames[j] = -1; printf("\nReference String\t Page Frames\n"); for(k=0; k<pageNum; k++) { flag = 0; for(l=0; l<frameNum; l++) { if(frames[l] == pages[k]) { flag = 1; break; } } if(flag == 0) { max = INT_MIN; for(l=0; l<frameNum; l++) { flag = 0; for(m=k+1; m<pageNum; m++) { if(frames[l] == pages[m]) { flag = 1; break; } } if(flag == 0 && pages[m] != -1 && max < m) { max = m; j = l; } } frames[j] = pages[k]; faults++; printf("%d\t\t", pages[k]); for(l=0; l<frameNum; l++) printf("%d\t", frames[l]); printf("\n"); } } printf("\nTotal Page Faults: %d", faults); return 0; } ``` 3. 最近最久未使用算法(LRU) ``` #include <stdio.h> int main() { int pages[100], frames[10], pageNum, frameNum, faults=0, j, k, l, m, min, flag[10], counter=0; printf("Enter the number of pages: "); scanf("%d", &pageNum); printf("Enter the page reference string: "); for(j=0; j<pageNum; j++) scanf("%d", &pages[j]); printf("Enter the number of frames: "); scanf("%d", &frameNum); for(j=0; j<frameNum; j++) frames[j] = -1; printf("\nReference String\t Page Frames\n"); for(k=0; k<pageNum; k++) { flag[k] = 0; for(l=0; l<frameNum; l++) { if(frames[l] == pages[k]) { flag[k] = 1; break; } } if(flag[k] == 1) { counter++; continue; } if(counter < frameNum) { frames[counter] = pages[k]; counter++; } else { min = 9999; for(l=0; l<frameNum; l++) { if(flag[l] < min) { min = flag[l]; j = l; } } frames[j] = pages[k]; faults++; } printf("%d\t\t", pages[k]); for(l=0; l<frameNum; l++) printf("%d\t", frames[l]); printf("\n"); for(l=0; l<frameNum; l++) flag[l]++; } printf("\nTotal Page Faults: %d", faults); return 0; } ```
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值