最佳置换算法(OPT)、先进先出置换算法(FIFO)、最近最久未使用(LRU)算法、时钟(CLOCK)置换算法

1.最佳置换算法(OPT)(理想置换算法)

从主存中移出永远不再需要的页面;如无这样的页面存在,则选择最长时间不需要访问的页面。于所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。 即被淘汰页面是以后永不使用或最长时间内不再访问的页面。

2.先进先出置换算法(FIFO)

是最简单的页面置换算法。这种算法的基本思想是:当需要淘汰一个页面时,总是选择驻留主存时间最长的页面进行淘汰,即先进入主存的页面先淘汰。其理由是:最早调入主存的页面不再被使用的可能性最大。 即优先淘汰最早进入内存的页面。
FIFO算法还会产生当所分配的物理块数增大而页故障数不减反增的异常现象,这是由 Belady于1969年发现,故称为Belady异常。
只有FIFO算法可能出现Belady 异常,而LRU和OPT算法永远不会出现Belady异常。

注意:内存的页面中“最老“的页面,会被新的网页直接覆盖,而不是“最老“的页面先出队,然后新的网页从队尾入队。

3.最近最久未使用(LRU)算法

这种算法的基本思想是:利用局部性原理,根据一个作业在执行过程中过去的页面访问历史来推测未来的行为。它认为过去一段时间里不曾被访问过的页面,在最近的将来可能也不会再被访问。所以,这种算法的实质是:当需要淘汰一个页面时,总是选择在最近一段时间内最久不用的页面予以淘汰。 即淘汰最近最长时间未访问过的页面。

4. 时钟(CLOCK)置换算法

LRU算法的性能接近于OPT,但是实现起来比较困难,且开销大;FIFO算法实现简单,但性能差。所以操作系统的设计者尝试了很多算法,试图用比较小的开销接近LRU的性能,这类算法都是CLOCK算法的变体。
简单的CLOCK算法是给每一帧关联一个附加位,称为使用位。当某一页首次装入主存时,该帧的使用位设置为1;当该页随后再被访问到时,它的使用位也被置为1。对于页替换算法,用于替换的候选帧集合看做一个循环缓冲区,并且有一个指针与之相关联。当某一页被替换时,该指针被设置成指向缓冲区中的下一帧。当需要替换一页时,操作系统扫描缓冲区,以查找使用位被置为0的一帧。每当遇到一个使用位为1的帧时,操作系统就将该位重新置为0;如果在这个过程开始时,缓冲区中所有帧的使用位均为0,则选择遇到的第一个帧替换;如果所有帧的使用位均为1,则指针在缓冲区中完整地循环一周,把所有使用位都置为0,并且停留在最初的位置上,替换该帧中的页。由于该算法循环地检查各页面的情况,故称为CLOCK算法,又称为最近未用(Not Recently Used, NRU)算法。

  • 7
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 C 语言实现不同页面置换算法的示例代码: 1. 先进先出FIFO算法 ```c #include <stdio.h> int main() { int n, frames, hits = 0, faults = 0, index = 0, flag = 0; printf("Enter the number of pages: "); scanf("%d", &n); int reference_string[n]; printf("Enter the reference string: "); for(int i = 0; i < n; i++) { scanf("%d", &reference_string[i]); } printf("Enter the number of frames: "); scanf("%d", &frames); int frame[frames]; for(int i = 0; i < frames; i++) { frame[i] = -1; } for(int i = 0; i < n; i++) { flag = 0; for(int j = 0; j < frames; j++) { if(frame[j] == reference_string[i]) { hits++; flag = 1; break; } } if(flag == 0) { frame[index] = reference_string[i]; faults++; index++; if(index == frames) { index = 0; } } printf("Reference string: "); for(int j = 0; j <= i; j++) { printf("%d ", reference_string[j]); } printf("\n"); printf("Frames: "); for(int j = 0; j < frames; j++) { printf("%d ", frame[j]); } printf("\n"); } printf("Page faults: %d\n", faults); printf("Page hits: %d\n", hits); printf("Hit ratio: %f\n", (float)hits/n); return 0; } ``` 2. 最近最久使用LRU算法 ```c #include <stdio.h> int main() { int n, frames, hits = 0, faults = 0, min, index, flag; printf("Enter the number of pages: "); scanf("%d", &n); int reference_string[n]; printf("Enter the reference string: "); for(int i = 0; i < n; i++) { scanf("%d", &reference_string[i]); } printf("Enter the number of frames: "); scanf("%d", &frames); int frame[frames]; int counter[frames]; for(int i = 0; i < frames; i++) { frame[i] = -1; counter[i] = 0; } for(int i = 0; i < n; i++) { flag = 0; for(int j = 0; j < frames; j++) { if(frame[j] == reference_string[i]) { hits++; flag = 1; counter[j] = i; break; } } if(flag == 0) { faults++; min = counter[0]; index = 0; for(int j = 1; j < frames; j++) { if(counter[j] < min) { min = counter[j]; index = j; } } frame[index] = reference_string[i]; counter[index] = i; } printf("Reference string: "); for(int j = 0; j <= i; j++) { printf("%d ", reference_string[j]); } printf("\n"); printf("Frames: "); for(int j = 0; j < frames; j++) { printf("%d ", frame[j]); } printf("\n"); } printf("Page faults: %d\n", faults); printf("Page hits: %d\n", hits); printf("Hit ratio: %f\n", (float)hits/n); return 0; } ``` 3. 时钟Clock算法 ```c #include <stdio.h> #include <stdlib.h> typedef struct { int page; int use_bit; } Frame; int main() { int n, frames, hits = 0, faults = 0, flag; printf("Enter the number of pages: "); scanf("%d", &n); int reference_string[n]; printf("Enter the reference string: "); for(int i = 0; i < n; i++) { scanf("%d", &reference_string[i]); } printf("Enter the number of frames: "); scanf("%d", &frames); Frame frame[frames]; for(int i = 0; i < frames; i++) { frame[i].page = -1; frame[i].use_bit = 0; } int pointer = 0; for(int i = 0; i < n; i++) { flag = 0; for(int j = 0; j < frames; j++) { if(frame[j].page == reference_string[i]) { hits++; frame[j].use_bit = 1; flag = 1; break; } } if(flag == 0) { faults++; while(frame[pointer].use_bit == 1) { frame[pointer].use_bit = 0; pointer = (pointer + 1) % frames; } frame[pointer].page = reference_string[i]; frame[pointer].use_bit = 1; pointer = (pointer + 1) % frames; } printf("Reference string: "); for(int j = 0; j <= i; j++) { printf("%d ", reference_string[j]); } printf("\n"); printf("Frames: "); for(int j = 0; j < frames; j++) { printf("%d ", frame[j].page); } printf("\n"); } printf("Page faults: %d\n", faults); printf("Page hits: %d\n", hits); printf("Hit ratio: %f\n", (float)hits/n); return 0; } ``` 4. 最不经常使用(LFU)算法 ```c #include <stdio.h> #include <stdlib.h> typedef struct { int page; int freq; } Frame; int main() { int n, frames, hits = 0, faults = 0, flag, min, index; printf("Enter the number of pages: "); scanf("%d", &n); int reference_string[n]; printf("Enter the reference string: "); for(int i = 0; i < n; i++) { scanf("%d", &reference_string[i]); } printf("Enter the number of frames: "); scanf("%d", &frames); Frame frame[frames]; for(int i = 0; i < frames; i++) { frame[i].page = -1; frame[i].freq = 0; } for(int i = 0; i < n; i++) { flag = 0; for(int j = 0; j < frames; j++) { if(frame[j].page == reference_string[i]) { hits++; flag = 1; frame[j].freq++; break; } } if(flag == 0) { faults++; min = frame[0].freq; index = 0; for(int j = 1; j < frames; j++) { if(frame[j].freq < min) { min = frame[j].freq; index = j; } } frame[index].page = reference_string[i]; frame[index].freq = 1; } printf("Reference string: "); for(int j = 0; j <= i; j++) { printf("%d ", reference_string[j]); } printf("\n"); printf("Frames: "); for(int j = 0; j < frames; j++) { printf("%d(%d) ", frame[j].page, frame[j].freq); } printf("\n"); } printf("Page faults: %d\n", faults); printf("Page hits: %d\n", hits); printf("Hit ratio: %f\n", (float)hits/n); return 0; } ``` 5. 最优(OPT算法 ```c #include <stdio.h> #include <stdlib.h> int main() { int n, frames, hits = 0, faults = 0, max, index, flag; printf("Enter the number of pages: "); scanf("%d", &n); int reference_string[n]; printf("Enter the reference string: "); for(int i = 0; i < n; i++) { scanf("%d", &reference_string[i]); } printf("Enter the number of frames: "); scanf("%d", &frames); int frame[frames]; for(int i = 0; i < frames; i++) { frame[i] = -1; } int next[n]; for(int i = 0; i < n; i++) { next[i] = -1; for(int j = i + 1; j < n; j++) { if(reference_string[j] == reference_string[i]) { next[i] = j; break; } } } for(int i = 0; i < n; i++) { flag = 0; for(int j = 0; j < frames; j++) { if(frame[j] == reference_string[i]) { hits++; flag = 1; break; } } if(flag == 0) { faults++; max = -1; index = -1; for(int j = 0; j < frames; j++) { if(next[frame[j]] == -1) { index = j; break; } if(next[frame[j]] > max) { max = next[frame[j]]; index = j; } } frame[index] = reference_string[i]; } printf("Reference string: "); for(int j = 0; j <= i; j++) { printf("%d ", reference_string[j]); } printf("\n"); printf("Frames: "); for(int j = 0; j < frames; j++) { printf("%d ", frame[j]); } printf("\n"); } printf("Page faults: %d\n", faults); printf("Page hits: %d\n", hits); printf("Hit ratio: %f\n", (float)hits/n); return 0; } ``` 以上是使用 C 语言实现不同页面置换算法的示例代码,每个算法的实现方式略有不同,但都是基于相同的基本思想。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值