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