《蘭州大學(xué)操作系統(tǒng)實(shí)驗(yàn)八存儲(chǔ)管理模擬題目和答案,實(shí)驗(yàn)報(bào)告.docx》由會(huì)員分享,可在線閱讀,更多相關(guān)《蘭州大學(xué)操作系統(tǒng)實(shí)驗(yàn)八存儲(chǔ)管理模擬題目和答案,實(shí)驗(yàn)報(bào)告.docx(11頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
實(shí)驗(yàn)報(bào)告 實(shí)驗(yàn)八
實(shí)驗(yàn)名稱:
存儲(chǔ)管理模擬
實(shí)驗(yàn)?zāi)康模?
1. 掌握請(qǐng)求分頁(yè)存儲(chǔ)管理系統(tǒng)的基本原理
2. 實(shí)現(xiàn)一個(gè)模擬的虛擬分頁(yè)存儲(chǔ)管理系統(tǒng)
實(shí)驗(yàn)要求:
編寫一個(gè)程序,模擬一個(gè)虛擬分頁(yè)存儲(chǔ)管理系統(tǒng)。其中,由系統(tǒng)隨機(jī)產(chǎn)生進(jìn)程;
進(jìn)程大小、進(jìn)程到達(dá)次序、時(shí)間、進(jìn)程執(zhí)行軌跡(頁(yè)面訪問(wèn)順序)也隨機(jī)生成,但進(jìn)程之間必須有并發(fā)存在,進(jìn)程執(zhí)行時(shí)間需有限,進(jìn)程調(diào)度采用時(shí)間片輪轉(zhuǎn)算法(以頁(yè)面模擬);rss駐留集大小物理塊分配策略采取固定分配局部置換;分配算法采用按比例分配算法;調(diào)頁(yè)采用請(qǐng)求調(diào)頁(yè)方式;置換分別采用FIFO、LRU(一直沒用) 訪問(wèn)次數(shù) 和簡(jiǎn)單CLOCK算法(循環(huán)鏈表)標(biāo)志 有沒有被訪問(wèn);
駐留集大小可調(diào),觀察駐留集大小對(duì)缺頁(yè)率的影響。
算法思想:
FIFO 先進(jìn)先出法
LRU 最久未使用算法
CLOCK 簡(jiǎn)單時(shí)鐘算法
命中率=1-頁(yè)面失效次數(shù)/頁(yè)地址流(序列)長(zhǎng)度
駐留集大小可調(diào),觀察駐留集大小對(duì)缺頁(yè)率的影響。
結(jié)構(gòu)體定義
頁(yè)面控制表
表結(jié)構(gòu)
頁(yè)面號(hào)
指針
頁(yè)面控制結(jié)構(gòu)
單位時(shí)間訪問(wèn)次數(shù)
頁(yè)框號(hào)
上次訪問(wèn)時(shí)間
頁(yè)面序號(hào)
頁(yè)面
頁(yè)框號(hào)
包含鏈表:空閑頁(yè)面表 忙頁(yè)面表
包含數(shù)組:進(jìn)程數(shù)組 頁(yè)面號(hào)數(shù)組
開始
流程圖:
引用塊編號(hào)大于物理塊?
分配物理塊
為其分配頁(yè)號(hào)
隨機(jī)得到進(jìn)程指令序列
否
頁(yè)號(hào)在物理塊內(nèi)?
是
是
是否完成?
選擇FIFO LRU CLOCK 置換算法置換
是
結(jié)束
實(shí)驗(yàn)結(jié)果分析:
觀察數(shù)據(jù)可看出:橫向:三種替換算法的命中率由高到底排列應(yīng)該是LRU>CLOCK>FIFO。
縱向:進(jìn)程的駐留級(jí)越大,其缺頁(yè)率就越低。
實(shí)驗(yàn)體會(huì):
1. 內(nèi)存中進(jìn)程的多少會(huì)影響駐留集大小和缺頁(yè)中斷率。
如果內(nèi)存中進(jìn)程太多,將導(dǎo)致每個(gè)進(jìn)程的駐留集太小,發(fā)生缺頁(yè)中斷的概率很大。相應(yīng)地,系統(tǒng)發(fā)生抖動(dòng)的可能性就會(huì)很大。
如果在內(nèi)存中保持太少的活動(dòng)進(jìn)程,那么所有活動(dòng)進(jìn)程同時(shí)處于阻塞狀態(tài)的可能性就會(huì)很大,從而降低處理機(jī)的利用率。
2. 置換算法的好壞將直接影響系統(tǒng)的性能,不適當(dāng)?shù)闹脫Q算法可能導(dǎo)致系統(tǒng)出現(xiàn)“抖動(dòng)”現(xiàn)象。常用的頁(yè)面置換算法:最佳置換算法、最近最少使用算法、先進(jìn)先出算法和時(shí)鐘算法等。最佳置換算法難以實(shí)現(xiàn)但可以成為核對(duì)其他算法的標(biāo)準(zhǔn)。
3. 也應(yīng)注意負(fù)載問(wèn)題,解決系統(tǒng)應(yīng)當(dāng)保持多少個(gè)活動(dòng)進(jìn)程駐留在內(nèi)存的問(wèn)題,即控制多道程序系統(tǒng)的度。當(dāng)內(nèi)存中的活動(dòng)進(jìn)程數(shù)太少時(shí),負(fù)載控制將增加新進(jìn)程或激活一些掛起進(jìn)程進(jìn)入內(nèi)存;反之,當(dāng)內(nèi)存中的進(jìn)程數(shù)太多時(shí),負(fù)載控制將暫時(shí)掛起一些進(jìn)程,減少內(nèi)存中的活動(dòng)進(jìn)程數(shù)。
實(shí)驗(yàn)代碼:
#include
#include
#include
#include
#define TRUE 1
#define FALSE 0
#define INVALID -1
#define total_instruction 320 //指令流長(zhǎng)
#define total_vp 32 //頁(yè)長(zhǎng)
#define clear_period 50
typedef struct //頁(yè)面結(jié)構(gòu)
{
int pn, //頁(yè)面序號(hào)
pfn, //頁(yè)面所在內(nèi)存區(qū)的頁(yè)框號(hào)
counter, //單位時(shí)間內(nèi)訪問(wèn)次數(shù)
time; //上次訪問(wèn)的時(shí)間
}pl_type;
pl_type pl[total_vp]; //頁(yè)面結(jié)構(gòu)數(shù)組
struct pfc_struct{ //頁(yè)面控制結(jié)構(gòu)
int pn, //頁(yè)面號(hào)
pfn; //內(nèi)存區(qū)頁(yè)面的頁(yè)框號(hào)
struct pfc_struct *next; //頁(yè)面指針,用于維護(hù)內(nèi)存緩沖區(qū)的鏈?zhǔn)浇Y(jié)構(gòu)
};
typedef struct pfc_struct pfc_type; //主存區(qū)頁(yè)面控制結(jié)構(gòu)別名
pfc_type pfc[total_vp], //主存區(qū)頁(yè)面控制結(jié)構(gòu)數(shù)組
*freepf_head, //主存區(qū)頁(yè)面控制結(jié)構(gòu)的空閑頁(yè)面頭指針
*busypf_head, //主存區(qū)頁(yè)面控制結(jié)構(gòu)的忙頁(yè)面頭指針
*busypf_tail; //主存區(qū)頁(yè)面控制結(jié)構(gòu)的忙頁(yè)面尾指針
int diseffect; //頁(yè)錯(cuò)誤計(jì)數(shù)器,初次把頁(yè)面載入主存時(shí)也當(dāng)做頁(yè)錯(cuò)誤
int a[total_instruction]; //隨即指令流數(shù)組
int page[total_instruction]; //指令對(duì)應(yīng)的頁(yè)面號(hào)
int offset[total_instruction]; //指令所在頁(yè)面中的偏移量
int initialize(int); //初始化頁(yè)面結(jié)構(gòu)數(shù)組和頁(yè)面控制結(jié)構(gòu)數(shù)組
int FIFO(int); //先進(jìn)先出算法
int LRU(int); //最近最久未使用算法
int CLOCK(int); //簡(jiǎn)單時(shí)鐘(鐘表)算法
int main( )
{
int s; //隨機(jī)數(shù)
int i;
srand(10*getpid()); /*每次運(yùn)行時(shí)進(jìn)程號(hào)不同,用來(lái)作為初始化隨機(jī)數(shù)隊(duì)列的"種子"*/
s = (int)((float)(total_instruction-1)*(rand()/(RAND_MAX+1.0)));
printf("\n--------rand instructions queue--------\n");
for (i=0; ipl[j].time&&pl[j].pfn!=INVALID)
{
MinT=pl[j].time;
MinPn=j;
}
}
freepf_head=&pfc[pl[MinPn].pfn]; //最久沒被訪問(wèn)過(guò)的頁(yè)被釋放
pl[MinPn].pfn=INVALID; //最久沒被訪問(wèn)過(guò)的頁(yè)被換出主存
pl[MinPn].time=-1; //最久沒被訪問(wèn)過(guò)的頁(yè)的訪問(wèn)時(shí)間置為無(wú)效
freepf_head->next=NULL;
}
pl[page[i]].pfn=freepf_head->pfn; //有空閑頁(yè)面,把相應(yīng)的頁(yè)面換入主存,并把pfn改為相應(yīng)的頁(yè)框號(hào)
pl[page[i]].time=CurrentTime; //令訪問(wèn)時(shí)間為當(dāng)前系統(tǒng)時(shí)間
freepf_head=freepf_head->next; //減少一個(gè)空閑頁(yè)面
}
else
pl[page[i]].time=CurrentTime; //命中則刷新該單元的訪問(wèn)時(shí)間
CurrentTime++; //系統(tǒng)當(dāng)前時(shí)間加
}
printf("%6.3f\t",1-(float)diseffect/320);
return 0;
}
//簡(jiǎn)單時(shí)鐘算法
//int total_pf; 用戶進(jìn)程的內(nèi)存頁(yè)面數(shù)
int CLOCK(int total_pf)
{
int i;
int use[total_vp]; //使用位
int swap;
swap=0; //發(fā)生替換
initialize(total_pf);
pfc_type *pnext; //時(shí)鐘指針
pfc_type *head; //隊(duì)列頭指針
pnext=freepf_head;
head=freepf_head;
for(i=0;ipfn]==1) //若時(shí)鐘指針指向的頁(yè)的使用位為,則改為并跳過(guò)
{
use[pnext->pfn]=0;
pnext=pnext->next;
if(pnext==NULL) pnext=head; //如果時(shí)鐘指針到達(dá)隊(duì)列尾部,重新返回頭部
}
//換出被替換的頁(yè)
pl[pnext->pn].pfn=INVALID;
swap=1;
}
if(use[pnext->pfn]==0){ //如果使用位為,則換入相應(yīng)的頁(yè)
pl[page[i]].pfn=pnext->pfn; //頁(yè)面結(jié)構(gòu)中要標(biāo)記頁(yè)框號(hào)
pnext->pn=page[i]; //頁(yè)面控制結(jié)構(gòu)中要標(biāo)記頁(yè)號(hào)
use[pnext->pfn]=1; //重置使用位為
pnext=pnext->next; //時(shí)鐘指針下移
if(pnext==NULL) pnext=head; //如果時(shí)鐘指針到達(dá)隊(duì)列尾部,重新返回頭部
if(swap==0){ freepf_head=freepf_head->next; }
}
}else{//頁(yè)面在主存中
use[pl[page[i]].pfn]=1; //刷新使用位為
}
}
printf("%6.3f\t",1-(float)diseffect/320);
return 0;
}
//先進(jìn)先出算法版本
//int total_pf; 用戶進(jìn)程的內(nèi)存頁(yè)面數(shù)
//實(shí)現(xiàn)細(xì)節(jié)由CLOCK算法退化而來(lái),與FIFO同效果
int FIFO(int total_pf)
{
int i;
int use[total_vp];
int swap=0;
initialize(total_pf);
pfc_type *pnext,*head;
pnext=freepf_head;
head=freepf_head;
for(i=0;ipfn]==1)
{
use[pnext->pfn]=0;
pnext=pnext->next;
if(pnext==NULL) pnext=head;
}
//換出被替換的頁(yè)
pl[pnext->pn].pfn=INVALID;
swap=1;
}
if(use[pnext->pfn]==0){ //如果使用位為,則換入相應(yīng)的頁(yè)
pl[page[i]].pfn=pnext->pfn; //頁(yè)面結(jié)構(gòu)中要標(biāo)記頁(yè)框號(hào)
pnext->pn=page[i]; //頁(yè)面控制結(jié)構(gòu)中要標(biāo)記頁(yè)號(hào)
use[pnext->pfn]=1; //重置使用位為
pnext=pnext->next;
if(pnext==NULL) pnext=head;
if(swap==0){ freepf_head=freepf_head->next; }
}
}
}
printf("%6.3f\t",1-(float)diseffect/320);
return 0;
}
鏈接地址:http://appdesigncorp.com/p-12771974.html