操作系统学习之用C语言模拟LRU算法
前言
LRU算比較經典,而且考的也比較多,LRU算法全稱Least Recently Used,譯為最近最少使用。用C模擬一下吧。
Buddy算法:操作系統學習之用C語言模擬伙伴(Buddy)算法
FIFO算法:操作系統學習之用C語言模擬FIFO算法
LRU算法:操作系統學習之用C語言模擬LRU算法
Clock算法:操作系統學習之用C語言模擬CLOCK算法
本源代碼原創,轉載請注明,同時由于本人才疏學淺,剛入門操作系統,如有錯誤敬請指教
本文原創,創作不易,轉載請注明!!!
本文鏈接
個人博客:https://ronglin.fun/?p=202
PDF鏈接:見博客網站
CSDN: https://blog.csdn.net/RongLin02/article/details/117632296
算法模擬
教科書原圖
算法解釋
先來看看課本上的解釋。
LRU策略置換內存中最長時間未被引用的頁。根據局部性原理,這也是最近最不可能訪問到的頁。實際上,LRU策略的性能接近于OPT(OPTimal 最佳)策略。這種方法的問題是比較難實現。一種實現方法是給每頁添加一個最后一次訪問的時間戳,并在每次訪問內存時更新這個時間戳。即使有支持這種方案的硬件,開銷仍然非常大。另一種方法是維護一個關于訪問頁的棧,但開銷同樣很大。 ——操作系統-精髓與設計原理(第九版)P227
代碼解釋
簡單的來說,就是LRU策略很好,但是實現起來比較復雜,我代碼用的是添加時間戳的方式。定義了一個結構體,兩個屬性,一個用來存儲數據(data),另一個就是時間戳(time)。
在處理每一個到來的"進程"時,先判斷其是否在隊列中,如果在就更新時間戳,如果不在,就置換走時間戳最早的那個進程。
源代碼
#include<stdio.h> #define MAX_NUM 3 #define MAX_NUM_PROC 512//進程結構體 struct LList {int data;int time; }LRU_list[MAX_NUM];/* 12 2 3 2 1 5 2 4 5 3 2 5 2 */int main() {for(int i=0;i<MAX_NUM;i++){LRU_list[i].data = 0;LRU_list[i].time = 0;}int n;int a[MAX_NUM_PROC];printf("請輸入個數:");scanf("%d",&n);printf("請輸入%d個非零數字:\n",n);for(int i=0;i<n;i++){scanf("%d",&a[i]);}for(int i=0;i<n;i++){//先找原來的隊列中是否存在int exist =0;for(int j=0;j<MAX_NUM;j++){if(LRU_list[j].data == a[i]){exist = 1;LRU_list[j].time = i+1;//留下時間戳break;}}//不存在if(!exist){int i_minn=0;for(int j=1;j<MAX_NUM;j++){if(LRU_list[i_minn].time > LRU_list[j].time){i_minn = j;}}LRU_list[i_minn].data = a[i];LRU_list[i_minn].time = i+1;}printf("本次隊列情況:");for(int j=0;j<MAX_NUM;j++){printf("%d",LRU_list[j].data);if(j==MAX_NUM-1){if(!exist)printf(" F");printf("\n");}else{printf(" ; ");}}}return 0; }輸出解釋
請輸入個數:12 請輸入12個非零數字: 2 3 2 1 5 2 4 5 3 2 5 2 本次隊列情況:2 ; 0 ; 0 F 本次隊列情況:2 ; 3 ; 0 F 本次隊列情況:2 ; 3 ; 0 本次隊列情況:2 ; 3 ; 1 F 本次隊列情況:2 ; 5 ; 1 F 本次隊列情況:2 ; 5 ; 1 本次隊列情況:2 ; 5 ; 4 F 本次隊列情況:2 ; 5 ; 4 本次隊列情況:3 ; 5 ; 4 F 本次隊列情況:3 ; 5 ; 2 F 本次隊列情況:3 ; 5 ; 2 本次隊列情況:3 ; 5 ; 2F表示缺頁,為了方便,當詢問LRU鏈表為空時也會被判定為缺頁。
可以看到和教科書上的結果相同。
LRU我用的是增加時間戳,用變量i作為時間戳。
總結
LRU算法用C模擬起來比較簡單,但是結合起硬件就比較麻煩了,維護其隊列開銷確實比較大。=w=
總結
以上是生活随笔為你收集整理的操作系统学习之用C语言模拟LRU算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: office2010 启动man_Off
- 下一篇: centos7光盘修复 grub_cen