Linux頁面置換算法的C語言實現(xiàn)
更新時間:2020年12月29日 11:04:17 作者:蕾蕾昔
這篇文章主要為大家詳細介紹了Linux頁面置換算法的C語言實現(xiàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
Linux頁面置換算法的C語言實現(xiàn)
編寫算法,實現(xiàn)頁面置換算法FIFO、LRU、OPT;針對內(nèi)存地址引用串,進行頁面置換算法進行頁面置換。
其中,算法所需的各種參數(shù)由輸入產(chǎn)生(手工輸入或者隨機數(shù)產(chǎn)生);輸出內(nèi)存駐留的頁面集合,缺頁次數(shù)以及缺頁率。
#include <stdio.h>
//#include <conio.h>
#include <stdlib.h>
#include <time.h>//隨機數(shù)
#define Myprintf printf("|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n") //*表格控制*/
int M;
int N;
typedef struct page
{
int num; /*記錄頁面號*/
int time; /*記錄調(diào)入內(nèi)存時間*/ //(lru那用到)
int index; //記錄調(diào)入內(nèi)存的先后次序 //從1開始(FIFO那用到)
}Page; /* 頁面邏輯結(jié)構(gòu),結(jié)構(gòu)為方便算法實現(xiàn)設(shè)計*/
Page b[10]; /*內(nèi)存單元數(shù)*/ //從0開始
int c[10][150]; /*暫保存內(nèi)存當前的狀態(tài):緩沖區(qū)*/
int queue[100]; /*記錄調(diào)入隊列*/
int K; /*調(diào)入隊列計數(shù)變量*/
/*初始化內(nèi)存單元、緩沖區(qū)*/
void Init(Page *b,int c[10][150])
{
int i,j;
for(i=0;i<M;i++)
{
b[i].num=-1;
b[i].time=M-i-1;
b[i].index=i+1;
}
for(i=0;i<M;i++)
for(j=0;j<N;j++)
c[i][j]=-1;
}
/*取得在內(nèi)存中停留最久的頁面,默認狀態(tài)下為最早調(diào)入的頁面*/
int GetMaxTime(Page *b)
{
int i;
int max=-1;
int tag=0;
for(i=0;i<M;i++)
{
if(b[i].time>max)
{
max=b[i].time;
tag=i;
}
}
return tag;
}
/**int GetMinTime(Page *b)
{
int i;
int min=1000;
int tag=0;
for(i=0;i<M;i++)
{
if(b[i].time<min)
{
min=b[i].time;
tag=i;
}
}
return tag;
} **/
/*判斷頁面是否已在內(nèi)存中*/
int Equation(int fold,Page *b)
{
int i;
for(i=0;i<M;i++)
{
if (fold==b[i].num)
return i;
}
return -1;
}
//LRU核心部分 最近最久未使用置換算法
void Lru(int fold,Page *b)
{
int i;
int val;
val=Equation(fold,b); //判斷頁面是否已在內(nèi)存中,val代表在內(nèi)存中的位置
if (val>=0) //在內(nèi)存中
{
b[val].time=0; //存在就把那個東西的時間變成0
for(i=0;i<M;i++)
if (i!=val)
b[i].time++; // 其他的時間就要累加
}
else
{
queue[++K]=fold;/*記錄調(diào)入頁面*/
val=GetMaxTime(b); //取得在內(nèi)存中停留最久的頁面,默認狀態(tài)下為最早調(diào)入的頁面,val代表在內(nèi)存中的位置
b[val].num=fold;
b[val].time=0;
for(i=0;i<M;i++)
if (i!=val)
b[i].time++;
}
}
//FIFO核心部分 先進先出置換算法
void FIFO(int fold,Page *b)
{
int i;
int val;
bool flag=false;
val=Equation(fold,b); //判斷頁面是否已在內(nèi)存中,val代表在內(nèi)存中的位置
if (val<0) //不在內(nèi)存中
{
queue[++K]=fold;/*記錄調(diào)入頁面*/
for(i=0;i<M;i++)
{
if (b[i].num<0)//如果有空
{
b[i].num=fold;
b[i].index=i+1;
flag=true;
break;
}
}
if (flag==false)//如若沒有空余則找到最先進去的被淘汰
{
for(i=0;i<M;i++)
{
if(b[i].index==1)
{
val=i;
}
}
b[val].num=fold;
b[val].index=M;
for(i=0;i<M;i++)
{
if(i!=val)
b[i].index--; //因為有一個被淘汰了,所有其他的Index就需要更新
}
}
}
}
//Optimal核心部分 最佳置換算法
void Optimal(int a[150],int pos,Page *b)
{
int i,j;
int val;
int fold=a[pos];
bool flag=false;
val=Equation(fold,b); //判斷頁面是否已在內(nèi)存中,val代表在內(nèi)存中的位置
if (val<0) //不在內(nèi)存中
{
queue[++K]=fold;/*記錄調(diào)入頁面*/
for(i=0;i<M;i++)
{
if (b[i].num<0)
{
b[i].num=fold;
flag=true;
break;
}
}
if (flag==false)
{
for(i=0;i<M;i++)
{
for(j=pos+1;j<N;j++)
{
if (b[i].num!=a[j])
{ b[i].time= 1000; }//如果后面不需要再用它了把時間改成最大1000
else
{
b[i].time=j;//否則賦值為j
break;
}
}
}
val=GetMaxTime(b); //取得在內(nèi)存中停留最久的頁面,默認狀態(tài)下為最早調(diào)入的頁面,val代表在內(nèi)存中的位置
b[val].num=fold;
}
}
}
void LruMain(int a[150])
{
int i,j;
K=-1;
Init(b, c);
for(i=0;i<N;i++) //
{
Lru(a[i],b);
c[0][i]=a[i];
/*記錄當前的內(nèi)存單元中的頁面*/
for(j=0;j<M;j++)
c[j][i]=b[j].num;
}
/*結(jié)果輸出*/
printf("\n內(nèi)存狀態(tài)為:\n");
Myprintf;
for(j=0;j<N;j++)
printf("|%2d ",a[j]);
printf("|\n");
Myprintf; //#define Myprintf printf("|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n") //*表格控制*/
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
if(c[j][i]==-1)
printf("%3c ",32);
else
printf("%3d ",c[j][i]);
}
printf("\n");
}
Myprintf;
printf("\n調(diào)入隊列為:");
for(i=0;i<K+1;i++)
printf("%3d",queue[i]);
printf("\n缺頁次數(shù)為:%6d\n缺頁率:%16.6f",K+1,(float)(K+1)/N);
}
void FIFOMain(int a[150])
{
int i,j;
K=-1;
Init(b, c);
for(i=0;i<N;i++) //
{
FIFO(a[i],b);
c[0][i]=a[i];
/*記錄當前的內(nèi)存單元中的頁面*/
for(j=0;j<M;j++)
c[j][i]=b[j].num;
}
/*結(jié)果輸出*/
printf("\n內(nèi)存狀態(tài)為:\n");
Myprintf;
for(j=0;j<N;j++)
printf("|%2d ",a[j]);
printf("|\n");
Myprintf; //#define Myprintf printf("|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n") //*表格控制*/
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
if(c[j][i]==-1)
printf("%3c ",32);//空格
else
printf("%3d ",c[j][i]);
}
printf("\n");
}
Myprintf;
printf("\n調(diào)入隊列為:");
for(i=0;i<K+1;i++)
printf("%3d",queue[i]);
printf("\n缺頁次數(shù)為:%6d\n缺頁率:%16.6f",K+1,(float)(K+1)/N);
}
void OptimalMain(int a[150])
{
int i,j;
K=-1;
Init(b, c);
for(i=0;i<N;i++) //
{
Optimal(a,i,b);
c[0][i]=a[i];
/*記錄當前的內(nèi)存單元中的頁面*/
for(j=0;j<M;j++)
c[j][i]=b[j].num;
}
/*結(jié)果輸出*/
printf("\n內(nèi)存狀態(tài)為:\n");
Myprintf;
for(j=0;j<N;j++)
printf("|%2d ",a[j]);
printf("|\n");
Myprintf; //#define Myprintf printf("|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n") //*表格控制*/
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
if(c[j][i]==-1)
printf("%3c ",32);
else
printf("%3d ",c[j][i]);
}
printf("\n");
}
Myprintf;
printf("\n調(diào)入隊列為:");
for(i=0;i<K+1;i++)
printf("%3d",queue[i]);
printf("\n缺頁次數(shù)為:%6d\n缺頁率:%16.6f",K+1,(float)(K+1)/N);
}
void main()
{
int a[150];
int i;
char s;
printf("請輸入物理塊數(shù):");
scanf("%d",&M);
printf("請輸入所要訪問的頁面數(shù):");
scanf("%d",&N);
srand(time(NULL));
for(i=0;i<N;i++)
{
a[i]=rand()%10; /*隨機生成要訪問的頁面流*/
}
printf("所要訪問的頁面號序列為:");
for(i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
printf("頁面置換步驟如下:\n");
while(1)
{
printf("\n\n///");
printf("\nPlease select 1:FIFO算法\n 2:LRU算法\n 3:Optimal算法\n 4:退出\n");
scanf("%s",&s);
switch(s)
{
case '1':FIFOMain(a);break;
case '2':LruMain(a); break;
case '3':OptimalMain(a); break;
case '4':exit(0); break;
}
}
}
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
c++實現(xiàn)跳躍表(Skip List)的方法示例
跳表(skiplist)是一個非常優(yōu)秀的數(shù)據(jù)結(jié)構(gòu),實現(xiàn)簡單,插入、刪除、查找的復(fù)雜度均為O(logN),下面這篇文章主要介紹了c++實現(xiàn)跳躍表(Skip List)的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。2017-09-09
C++中的while循環(huán)和for循環(huán)語句學習教程
這篇文章主要介紹了C++中的while循環(huán)和for循環(huán)語句學習教程,是C++入門學習中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09
C++實現(xiàn)學生信息管理系統(tǒng)(Map實現(xiàn))
這篇文章主要為大家詳細介紹了C++實現(xiàn)學生信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06

