假設每個頁面中可存放10條指令,分配給作業的記憶體塊數為4。用c語言模擬乙個作業的執行過程,該作業共有320條指令,即它的位址空間為32頁,目前它的所有頁都還未調入記憶體。在模擬過程中,如果所訪問的指令已在記憶體,則顯示其實體地址,並轉下一條指令。如果所訪問的指令還未裝入記憶體,則發生缺頁,此時需記錄缺頁的次數,並將相應頁調入記憶體。如果4個記憶體塊均已裝入該作業,則需進行頁面置換,最後顯示其實體地址,並轉下一條指令。在所有320指令執行完畢後,請計算並顯示作業執行過程中發生的缺頁率。
置換演算法:採用先進先出(fifo)頁面置換演算法。
通過隨機數產生乙個指令序列,共320條指令:
1)指令的位址按下述原則生成:
① 50%的指令是順序執行的;
② 25%的指令是均勻分布在前位址部分;
③ 25%的指令是均勻分布在後位址部分;
具體的實施方法是:
① 在[0,319]的指令位址之間隨機選取一起點m;
② 順序執行一條指令,即執行序號為m+1的指令;
③ 在前位址[0,m-1]中隨機選取一條指令並執行,該指令的序號為m1;
④ 順序執行一條指令,其序號為m1+1的指令;
⑤ 在後位址[m1+2,319]中隨機選取一條指令並執行,該指令的序號為m2;
⑥ 順序執行一條指令,其序號為m2+1的指令;
重複上述步驟①~⑥,直到執行320次指令。
2)將指令序列變換為頁位址流
設頁面大小為1k, 使用者虛存容量為32k。在使用者虛存中,按每k存放10條指令排列虛存位址,即320條指令在虛存中的存放方式為:
第0條~第9條指令為第0頁(對應虛存位址為[0,9]);
第10條~第19條指令為第1頁(對應虛存位址為[10,19]);
…………
第310條~第319條指令為第31頁(對應虛存位址為[310,319])。
按以上方式,使用者指令可組成32頁。
#include
#include
float count =0;
//缺頁次數
typedef
struct data //資料域
data;
typedef
struct blocknode //單向迴圈鍊錶
block,
*blocklist;
//定義記憶體塊
blocklist block1;
blocklist block2;
blocklist block3;
blocklist block4;
block *p;
void
initialize()
//初始化
intfifo
(int pagenum,
int viraddr)
//先進先出頁面置換演算法
if(p->data.pagenum == pagenum)
p = p->next;
} p->data.pagenum = pagenum;
count++
;printf
(, pagenum,
(viraddr %10)
, p->data.blocknum,
(viraddr %10)
);p = p->next;
//指向最老的頁面
return1;
}void
calculate()
//生成頁位址流並計算缺頁率
printf
("\n");
printf
("缺頁次數:%.0f\n"
, count)
;printf
("計算得到的缺頁率為:%.4f \n"
, count /
320);}
intmain()
FIFO先進先出頁面置換演算法實現
學校要做的實驗,很久沒有寫 了orz,所以寫的很亂。不過可以直接提交到oj平台上。自己寫的 歡迎討論。fifo先進先出頁面置換演算法,是最早出現的頁面置換演算法,該演算法總是淘汰最先進入記憶體的頁面。以下是 include include include using namespace std fi...
頁面置換 先進先出置換(FIFO)
先進先出置換 淘汰最先進入記憶體的頁面 輸入 記憶體物理塊的大小,以及頁面號引用串的大小,引用串的各個頁面編號。輸出 被置換出去的頁面編號。執行結果 所需的資料結構 頁面 struct page 輔助函式 在記憶體中尋找最先進入記憶體的頁面。返回記憶體下標。int findfirst page q,...
作業系統 頁面置換演算法 先進先出置換演算法
位址對映過程中,若在頁面中發現所要訪問的頁面不再記憶體中,則產生缺頁中斷。當發生 缺頁中斷 時作業系統必須在記憶體選擇乙個頁面將其移出記憶體,以便為即將調入的頁面讓出空間。而用來選擇淘汰哪一頁的規則叫做 頁面置換演算法 最簡單的頁面置換演算法是先入先出 fifo 法。假定系統為某程序分配了三個物理塊...