操作系统 页面置换算法FIFO与LRU的实现
生活随笔
收集整理的這篇文章主要介紹了
操作系统 页面置换算法FIFO与LRU的实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
FIFO
FIFO算法是最早出現的置換算法。該算法總是淘汰最先進入內存的頁面,即選擇在內存中駐留時間最久的頁面予以淘汰。
LRU
最近最久未使用(LRU)的頁面置換算法是根據頁面調入內存后的使用情況做出決策的,需要記錄頁面的訪問時間。每當進程訪問某頁面時, 便將該頁面的頁面號從棧中移出,將它壓入棧頂。因此,棧頂始終是最新被訪問頁面的編號,而棧底則是最近最久未使用頁面的頁面號。
代碼實現
#include<conio.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #define Myprintf printf("|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n") //表格控制 #define bsize 4 //物理塊大小 #define psize 16 //進程大小 typedef struct page{ int num; //記錄頁面號int time; //記錄調入內存時間 }Page; //頁面邏輯結構,結構為方便算法實現設計Page b[bsize]; //內存單元數 int c[bsize][psize]; //暫保存內存當前的狀態:緩沖區 int queue[100]; //記錄調入隊列 int K; //調入隊列計數變量 int phb[bsize] = {0}; //物理塊標號 int pro[psize] = {0}; //進程序列號 int flag[bsize] = {0}; //進程等待次數(存放最久未被使用的進程標志) int i = 0, j = 0, k = 0; //i表示進程序列號,j表示物理塊號 int m = -1, n = -1; //物理塊空閑和進程是否相同判斷標志 int max = -1,maxflag = 0; //標記替換物理塊進程下標 int count = 0; //統計頁面缺頁次數int* build(){//隨機產生序列號函數printf("隨機產生一個進程序列號為:\n");int i = 0;for(i=0; i<psize; i++){pro[i] = 10*rand()/(RAND_MAX+1)+1;printf("%d ",pro[i]);}printf("\n");return(pro); }int searchpb(){//查找空閑物理塊for(j=0; j<bsize; j++){if(phb[j] == 0){m = j; return m; break;} }return -1; }int searchpro(){//查找相同進程for(j = 0; j < bsize; j++){if(phb[j] == pro[i]){n = j;return j;}}return -1; }void empty(){//初始化內存for(i=0;i<bsize;i++){phb[i]=0;}count=0; //計數器置零 }void FIFO(){//先進先出頁面置換算法for(i = 0; i<psize; i++){ m=searchpb();n=searchpro();for(j = 0; j < bsize;j++){//找flag值最大的if(flag[j]>maxflag){maxflag = flag[j];max = j;}} if(n == -1){ //不存在相同進程if(m != -1){ //存在空閑物理塊phb[m] = pro[i]; //進程號填入該空閑物理塊count++;flag[m] = 0;for(j = 0;j <= m; j++){flag[j]++;}m = -1;}else{ //不存在空閑物理塊phb[max] = pro[i];flag[max] = 0;for(j = 0;j < bsize; j++){flag[j]++;}max = -1;maxflag = 0;count++;}}else{ //存在相同的進程phb[n] = pro[i];for(j = 0;j < bsize; j++){flag[j]++;}n = -1;}for(j = 0 ;j < bsize; j++){printf("%d ",phb[j]);}printf("\n");}printf("缺頁次數為:%d\n",count);printf("\n"); }void Init(Page *b,int c[bsize][psize]){ //初始化內存單元、緩沖區int i,j; for(i=0;i<psize;i++){ b[i].num=-1; b[i].time=psize-i-1; } for(i=0;i<bsize;i++) for(j=0;j<psize;j++) c[i][j]=-1; } int GetMax(Page *b){ //取得在內存中停留最久的頁面,默認狀態下為最早調入的頁面int i; int max=-1;int tag=0;for(i=0;i<bsize;i++){ if(b[i].time>max){ max=b[i].time; tag=i; } } return tag; }int Equation(int fold,Page *b){ //判斷頁面是否已在內存中int i; for(i=0;i<bsize;i++){ if (fold==b[i].num) return i; } return -1; } void Lruu(int fold,Page *b){ //LRU核心部分int i; int val; val=Equation(fold,b); if (val>=0){ b[val].time=0; for(i=0;i<bsize;i++) if (i!=val) b[i].time++; } else{queue[++K]=fold; //記錄調入頁面val=GetMax(b); b[val].num=fold; b[val].time=0; for(i=0;i<bsize;i++) if (i!=val) b[i].time++; } }void LRU(){int i,j; K=-1; Init(b, c); for(i=0;i<psize;i++){ Lruu(pro[i],b); c[0][i]=pro[i]; //記錄當前的內存單元中的頁面for(j=0;j<bsize;j++) c[j][i]=b[j].num; } //結果輸出 printf("內存狀態為:\n"); Myprintf; for(j=0;j<psize;j++) printf("|%2d ",pro[j]); printf("|\n"); Myprintf; for(i=0;i<bsize;i++){ for(j=0;j<psize;j++){ if(c[i][j]==-1) printf("|%2c ",32); else printf("|%2d ",c[i][j]); } printf("|\n"); } Myprintf; printf("\n調入隊列為:"); for(i=0;i<K+1;i++) printf("%3d",queue[i]); printf("\n缺頁次數為:%6d\n缺頁率:%16.6f",K+1,(float)(K+1)/psize); }int main() {int sel; do{ printf("0、退出(Exit)\n");printf("1、產生隨機序列\n");printf("2、最久未使用(LRU)\n");printf("3、先進先出(FIFO)\n");printf("<請選擇所要執行的操作:(0)(1)(2)(3)>\n");scanf("%d",&sel);if(sel == 0){printf("退出 \n");}if(sel == 1){build();}if(sel == 2){printf("LRU\n");LRU();empty();printf("\n");}if(sel == 3){printf("FIFO\n");FIFO();empty();printf("\n");}}while(sel!=0); }效果圖
先輸入1,產生隨機序列,模擬進程序號列
再輸入2調用LRU
輸入3調用FIFO
輸入0退出
總結
以上是生活随笔為你收集整理的操作系统 页面置换算法FIFO与LRU的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MATLAB GUI设计如何弹出新界面?
- 下一篇: 双系统修改开机默认引导项