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