?? fifolru.cpp
字號:
//文件FIFOLRU.cpp
#include"FIFOLRU.h"
#include<iomanip.h> //為下面調用setw()函數作聲明
void StoreM::Input1()
{ ap1=1; //標志著有輸入頁框數
cout<<endl<<"請輸入作業的頁框數:";
cin>>N;
page=new Pro[N];
}
void StoreM::Input2()
{ ap2=1; //標志著有輸入頁面走向
cout<<endl<<"請輸入該作業的頁面走向的總個數:";
do
{ cin>>m;
if(m>M) //已經定義了最大,所以不能超過最大的頁號數
cout<<endl<<"總頁面數太多,請重試!"<<endl;
else
break;
}while(1);
cout<<endl<<"請輸入此作業的頁面走向:";
for(int i=0;i<m;i++)
{ cin>>P[i].content;
P[i].time=0; //令其對應的頁面號在內存中的時間為0
}
}
void StoreM::BlockClear() //逐個的初始化頁面的基本情況
{ for(int i=0;i<N;i++)
{ page[i].content=-1;
page[i].time=0;
}
}
void StoreM::Display(int a,int b) //顯示被置換和被修改的頁面
{ for(int i=0;i<N;i++)
cout<<setw(3)<<page[i].content<<" ";
if(a!=-1)
cout<<" "<<b<<" 置換出上一個的 "<<a;
cout<<endl;
}
int StoreM::Search(int e)
{ for(int i=0;i<N;i++) //逐個從頁面中查找是否與傳值下來的頁號相匹配
if(e==page[i].content)
return i; //找到了就返回其下標
return -1; //沒找到就返回-1
}
int StoreM::Max() //在頁面中查找離現在時間最長的頁面
{ int e=page[0].time;
for(int i=0;i<N;i++) //逐個在頁面中找在頁面的時間最長
if(e<page[i].time)
e=page[i].time;
for(i=0;i<N;i++) //如果有就返回其下標
if(e==page[i].time)
return i;
return -1; //沒有就返回-1
}
void StoreM::FIFO()
{ int i=0,t=0,ne; //i是作輸入的頁號的下標,t作頁面的下標,ne用來儲存沒有置換前的頁面的頁號
float count=0; //計量總的缺業個數,初值為0
if(ap1==1&&ap2==1) //表示有輸入頁框數和頁面走向
{ cout<<endl<<"以下是FIFO(先進先出)算法頁面置換情況及被修改的信息!"<<endl;
while(i<m) //在P中逐個遍歷所有的頁號
{ if(Search(P[i].content)>=0)
i++;
else
{ if(t==N) t=0; //t到了末尾就令它到首位
else
{ count++; //表示有缺業情況計量就加1
ne=page[t].content; //儲存置換前的頁面的頁號
page[t].content=P[i].content; //置換相應的頁號
Display(ne,P[i].content); //顯示相關信息
t++; //下標移向下一個
}
}
}
cout<<endl<<"缺業次數為:"<<count<<" 缺業率為:"<<count/m<<endl<<endl;
}
else //沒有輸入頁框數和頁面走向就提示沒有輸入相關信息
cout<<endl<<"!!!想查詢FIFO頁面置換算法,請先確定頁框數及頁面走向都輸入了!!!"<<endl<<endl;
}
void StoreM::LRU()
{ int t,ne; //t用來接收在頁面中查找是否有相同的頁號的返回值,ne用來儲存沒有置換前的頁面的頁號
float count=0; //計量總的缺業個數,初值為0
if(ap1==1&&ap2==1) //表示有輸入頁框數和頁面走向
{ cout<<endl<<"以下是LRU(最近最久未使用)算法頁面置換情況及被修改的信息!"<<endl;
for(int i=0;i<m;i++) //在P中逐個遍歷所有的頁號
{ t=Search(P[i].content);
if(t>=0) //找到了就令其在內存中的時間為0
page[t].time=0;
else
{ count++; //表示有缺業情況計量就加1
t=Max(); //在頁面中找離現在時間最久的頁號下標
ne=page[t].content; //儲存置換前的頁面的頁號
page[t].content=P[i].content; //置換相應的頁號
Display(ne,P[i].content); //顯示相關信息
page[t].time=0; //用完了就令對應在內存的時間為0
}
for(int j=0;j<t;j++) //不是離現在時間最久的頁號對應的時間就相應的加1
page[j].time++;
for(j=t+1;j<N;j++)
page[j].time++;
}
cout<<endl<<"缺業次數為:"<<count<<" 缺業率為:"<<count/m<<endl<<endl;
}
else //沒有輸入頁框數和頁面走向就提示沒有輸入相關信息
cout<<endl<<"!!!想查詢LRU頁面置換算法,請先確定頁框數及頁面走向都輸入了!!!"<<endl<<endl;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -