日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

操作系统学习之用C语言模拟LRU算法

發(fā)布時間:2025/3/15 windows 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作系统学习之用C语言模拟LRU算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

LRU算比較經(jīng)典,而且考的也比較多,LRU算法全稱Least Recently Used,譯為最近最少使用。用C模擬一下吧。

Buddy算法:操作系統(tǒng)學習之用C語言模擬伙伴(Buddy)算法
FIFO算法:操作系統(tǒng)學習之用C語言模擬FIFO算法
LRU算法:操作系統(tǒng)學習之用C語言模擬LRU算法
Clock算法:操作系統(tǒng)學習之用C語言模擬CLOCK算法
本源代碼原創(chuàng),轉(zhuǎn)載請注明,同時由于本人才疏學淺,剛?cè)腴T操作系統(tǒng),如有錯誤敬請指教
本文原創(chuàng),創(chuàng)作不易,轉(zhuǎn)載請注明!!!
本文鏈接
個人博客:https://ronglin.fun/?p=202
PDF鏈接:見博客網(wǎng)站
CSDN: https://blog.csdn.net/RongLin02/article/details/117632296

算法模擬

教科書原圖

算法解釋

先來看看課本上的解釋。
LRU策略置換內(nèi)存中最長時間未被引用的頁。根據(jù)局部性原理,這也是最近最不可能訪問到的頁。實際上,LRU策略的性能接近于OPT(OPTimal 最佳)策略。這種方法的問題是比較難實現(xiàn)。一種實現(xiàn)方法是給每頁添加一個最后一次訪問的時間戳,并在每次訪問內(nèi)存時更新這個時間戳。即使有支持這種方案的硬件,開銷仍然非常大。另一種方法是維護一個關于訪問頁的棧,但開銷同樣很大。 ——操作系統(tǒng)-精髓與設計原理(第九版)P227

代碼解釋

簡單的來說,就是LRU策略很好,但是實現(xiàn)起來比較復雜,我代碼用的是添加時間戳的方式。定義了一個結(jié)構(gòu)體,兩個屬性,一個用來存儲數(shù)據(jù)(data),另一個就是時間戳(time)。
在處理每一個到來的"進程"時,先判斷其是否在隊列中,如果在就更新時間戳,如果不在,就置換走時間戳最早的那個進程。

源代碼

#include<stdio.h> #define MAX_NUM 3 #define MAX_NUM_PROC 512//進程結(jié)構(gòu)體 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("請輸入個數(shù):");scanf("%d",&n);printf("請輸入%d個非零數(shù)字:\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; }

輸出解釋

請輸入個數(shù):12 請輸入12個非零數(shù)字: 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 ; 2

F表示缺頁,為了方便,當詢問LRU鏈表為空時也會被判定為缺頁。
可以看到和教科書上的結(jié)果相同。
LRU我用的是增加時間戳,用變量i作為時間戳。

總結(jié)

LRU算法用C模擬起來比較簡單,但是結(jié)合起硬件就比較麻煩了,維護其隊列開銷確實比較大。=w=

總結(jié)

以上是生活随笔為你收集整理的操作系统学习之用C语言模拟LRU算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。