資源簡介
假設每個頁面中可存放10條指令,分配給作業的內存塊數為4。
用C語言語言模擬一個作業的執行過程,該作業共有320條指令, 即它的地址空間為32頁,目前它的所有頁都還未調入內存。在模擬過程中,如果所訪問的指令已在內存,則顯示其物理地址,并轉下一條指令。如果所訪問的指令還未裝入內存,則發生缺頁,此時需要記錄缺頁的次數,并將相應頁調入內存。如果4個內存塊均已裝入該作業,則需要進行頁面置換,最后顯示其物理地址,并轉向下一條指令。在所有320條指令執行完畢后,請計算并顯示作業運行過程中發生的缺頁率。
置換算法:請分別考慮最佳置換算法(OPT)、先進先出(FIFO)算法和最近最久未使用算法(LRU)。
作業中指令的訪問次序按下述原則生成: 50%的指令是順序執行的; 25%的指令是均勻分布在前地址部分; 25%的指令是均勻分布在后地址部分;
具體的實施方法是:
在[0,319]的指令地址之間隨機選取一起點m;
順序執行下一條指令,即執行地址序號為m+1的指令;
通過隨機數,跳轉到前地址部分[0,m+1]中的某條指令處,其序號為m1;
順序執行下一條指令,其地址序號為m1+1的指令;
通過隨機數,跳轉到后地址部分[m1+2,319]中的某條指令處,其序號為m2;
順序執行下一條指令,其地址序號為m2+1的指令;
重復跳轉到前地址部分,順序執行,跳轉到后地址部分,順序執行的過程直至執行320條指令。
代碼片段和文件信息
#include
#include
#define?Bsize?4
typedef?struct?BLOCK????????//定義物理塊結構體
{
????int?pageNum;????????????//頁號
????int?accessed_time;??????//訪問字段,其值表示多久未被訪問
}?BLOCK;
int?pc;?????????????????????//程序計數器,用來記錄指令的序號
int?n;??????????????????????//缺頁計數器,用來記錄缺頁的次數
static?int?temp[320];???????//用來存儲320條隨機數
BLOCK?block[Bsize];?????????//定義一大小為4的物理塊數組
void?init();????????????????//程序初始化函數
int?findExist(int?curpage);?//查找物理塊中是否有該頁面
int?findSpace();????????????//查找空閑物理塊
int?findReplace();??????????//查找應予置換的頁面
void?random();??????????????//產生320條隨機數顯示并存儲到temp[320]
void?show_Q_Page();?????????//顯示調用的頁面隊列
void?OPT();?????????????????//OPT算法
void?LRU();?????????????????//LRU算法
void?FIFO();????????????????//FIFO算法
void?init()
{
????//初始化內存物理塊數組,缺頁次數和程序計數器
????for(int?i?=?0;?i?????{
????????block[i].pageNum?=?-1;
????????block[i].accessed_time?=?0;
????????pc?=?n?=?0;
????}
}
int?findExist(int?curpage)
{
????//查找物理塊中是否有curpage頁面
????for(int?i?=?0;?i?????{
????????//若檢測到內存中有該頁面,返回在block中的位置
????????if(block[i].pageNum?==?curpage?)
????????????return?i;
????}
????return?-1;??????????????//若沒有則返回-1.
}
int?findSpace()
{
????//查找是否有空閑物理塊
????for(int?i?=?0;?i?????{
????????//若找到空閑的block,返回在block的位置
????????if(block[i].pageNum?==?-1)
????????????return?i;
????}
????return?-1;??????????????//否則返回-1.
}
int?findReplace()
{
????//找到應予置換頁面,即最近最久未使用的頁面,返回其所在塊的位置
????int?pos?=?0;
????for(int?i?=?0;?i?????{
????????if(block[i].accessed_time?>?block[pos].accessed_time)
????????????pos?=?i;
????}
????return?pos;
}
void?random()
{
????//產生320條隨機數顯示并存儲到temp[320]
????int?flag?=?0;
????scanf(“%d“?&pc);????????????????//在[0,319]的指令地址之間隨機選取一起點m
????printf(“?????????-?-?-?-?-?-?產生的320條指令序列:-?-?-?-?-\n“);
????for(int?i?=?0;?i?320;?i++)
????{
????????temp[i]?=?pc;
????????if(flag?%?2?==?0)?pc?=?++pc?%?320;?//產生50%的順序執行指令(flag=0或2時順序執行)
????????if(flag?==?1)?pc?=?rand()?%?(pc?-?1);?//產生25%的均勻分布在前地址部分指令
????????if(flag?==?3)?pc?=?pc?+?1?+?(rand()?%?(320?-?(pc?+?1)));
????????//產生25%的均勻分布在后地址部分指令
????????flag?=?++flag?%?4;
????????printf(“?%03d“?temp[i]);
????????if((i?+?1)?%?15?==?0)?printf(“\n“);
????}
}
void?show_Q_Page()
{
????//顯示隨機數
????for(int?i?=?0;?i?320;?i++)
????{
????????printf(“?%03d“?temp[i]?/?10);
????????if((i?+?1)?%?15?==?0)?printf(“\n“);
????}
}
void?OPT()
{???
????int?exist?space?position?;
????int?curpage;
????int?f?=?0;
????printf(“訪問頁???物理地址\t缺頁\t\t訪問頁???物理地址\t缺頁“);
????for(int?i?=?0;?i?320;?i++)
????{
????????f++;
????????if(f?%?2?==?1)printf(“\n“);
????????if(i?%?100?==?0)?getchar();
????????pc?=?temp[i];
????????curpage?=?pc?/?10;
????????printf(“%4d“?curpage);
????????exist?=?findExist(curpage);//查找內存中是否有當前頁面
????????if(exist?==?-1)???????????//若沒有
????????{
????????????space?=?findSpace();???????????//在內存中查找是否有空閑塊
????????????if(space?!=?-1)????????
- 上一篇:c++教師排課程序
- 下一篇:C++串口類 RS232
評論
共有 條評論