一、前期準備工作
二、頁面訪問序列隨機生成說明
三、輸入輸出函式
四、頁面置換演算法
五、實驗結果截圖
六、 完整源**
為什麼會有頁面置換演算法?
圖5. 虛擬記憶體和物理記憶體以及磁碟的對映關係
由圖5可以看出,虛擬記憶體實際上可以比物理記憶體大。當訪問虛擬記憶體時,會訪問mmu(記憶體管理單元)去匹配對應的實體地址(比如圖5的0,1,2),而如果虛擬記憶體的頁並不存在於物理記憶體中(如圖5的3,4),會產生缺頁中斷,從磁碟中取得缺的頁放入記憶體,如果記憶體已滿,還會根據某種演算法將磁碟中的頁換出。
mmu中儲存頁表,用來匹配虛擬記憶體和物理記憶體。頁表中每個項通常為32位,即4byte,除了儲存虛擬位址和頁框位址之外,還會儲存一些標誌位,比如是否缺頁,是否修改過,寫保護等。因為頁表中每個條目是4位元組,現在的32位作業系統虛擬位址空間是232,假設每頁分為4k,也需(232/(4*2^10))*4=4m的空間,為每個程序建立乙個4m的頁表並不明智。因此在頁表的概念上進行推廣,產生二級頁表,雖然頁表條目沒有減少,但記憶體中可以僅僅存放需要使用的二級頁表和一級頁表,大大減少了記憶體的使用。
每個程序有4gb的虛擬位址空間,每個程序自己的一套頁表。程式中使用的都是4gb位址空間中的虛擬位址。而訪問物理記憶體,需要使用實體地址。
經過計算可得該計算機的頁面最大64個,物理塊最大值為32個。所以在程式設計時,頁面及物理塊大小均不可以超過最大值,否則將在程式介面中進行提示,使用者重新輸入。
確定虛擬記憶體的尺寸n,工作集的起始位置p,工作集中包含的頁數e,工作集移動率m(每處理m個頁面訪問則將起始位置p +1),以及乙個範圍在0和1之間的值t;
生成m個取值範圍在p和p + e間的隨機數,並記錄到頁面訪問序列串中;
生成乙個隨機數r,0 ≤ r ≤ 1;
如果r < t,則為p生成乙個新值,否則p = (p + 1) mod n;
如果想繼續加大頁面訪問序列串的長度,請返回第2步,否則結束。
為了驗證方便,我將這個頁面訪問序列隨機生成的**作為另乙個新主程式,這樣驗證起來比較直觀。
後邊的源**我會把這段程式作為乙個頁面訪問序列隨機生成函式放入主程式中。
**的詳細解釋都在注釋中:
#include#include#include#includeconst int datamax = 64;
const int blocknum = 32;
int data[datamax]; // 儲存資料
int block[blocknum]; // 物理塊
int count[blocknum]; // 計數器
int n ; // 頁面個數
int m;//最小物理塊數
#define q 999
using namespace std;
int main()
cout<
cin>>n;
while(n > datamax) // 大於資料個數
srand((int)time(null));//用time(0)的返回值當種子
for(int o=0;o
cout<
cin>>n;
while(n > datamax) // 大於資料個數
int p = 1;
int e = 4;
int m = 5;//處理4個頁面後起始位置p+1
float t = 0.637;
float r;
int j = 0;
srand((int)time(null));//用time(0)的返回值當種子
for(int o=0;o
if(menu!=1&&menu!=2&&menu!=3) break;
}}
int main()
for(int j = 0; j < a; j++)
for(int i = 0; i < pagecount; i++)
void fifo()
void lru()
在將乙個頁面換出時,如果該頁已被修改過,便須將該頁重新寫回到磁碟上;但如果該頁未被修改過,則不必將它拷回磁碟。在改進型clock演算法中,除須考慮頁面的使用情況外,還須在增加乙個因素,即置換代價,這樣頁面換出時,既要是未使用過的頁面,又要是未被修改過的頁面。把同時滿足這兩個條件的頁面作為首選淘汰的頁面。由訪問位a和修改位m可以組合成下面四種型別的頁面:
1類(a=0,m=0):表示該頁最近既未被訪問,又未被修改,是最佳淘汰頁。
2類(a=0,m=0):表示該頁最近未被訪問,但已被修改,並不是很好的淘汰頁。
3類(a=1,m=0):表示該頁最近已被訪問,但未被修改,該頁有可能在被訪問。
4類(a=1,m=1):表示該頁最近已被訪問且被修改,該頁可能再被訪問。
oid lclock(int num)}}
//*/
void dataoutput()
cout<
cin>>n;
while(n > datamax) // 大於資料個數
int p = 1;
int e = 4;
int m = 5;//處理4個頁面後起始位置p+1
float t = 0.637;
float r;
int j = 0;
srand((int)time(null));//用time(0)的返回值當種子
for(int o=0;o
void optimal()
void lru()
#include#includeusing namespace std;
#define m 2
#define q 999
void datacreate();
int const a = 4;//記憶體中存放的頁面數
int count = 0;
int inside[a];
int const pagecount =10;//總的頁面數
int page[pagecount];
int insert = 0;//先到先出置換演算法fcfo中表示 當記憶體滿的時候,新進入的頁號放的位置
int suiji = 0; //隨機置換演算法randchange 當記憶體滿的時候,新進入的頁號放的位置
int state[a];//clock置換演算法中,記憶體中的每個頁面號對應的狀態
int state2[a][m];// 二維陣列,第一行第一列為訪問位,第一行的第二列為修改位
double lost = 0.0;
void datacreate()
for(int j = 0; j < a; j++)
for(int i = 0; i < pagecount; i++)
cout<
}break;
case '2':
for(int j = 0; j < a; j++)
for(int i = 0; i < pagecount; i++)
cout<
}break;
case '0':break;
} }
return 0;
}
作業系統實驗4
1.1.實驗目的 用高階語言完成乙個主存空間的分配和 程式,以加深對動態分割槽分配方式及其演算法的理解。1.2.實驗要求 採用連續分配方式之動態分割槽分配儲存管理,使用首次適應演算法 迴圈首次適應演算法 最佳適應演算法和最壞適應演算法4種演算法完成設計。1 設計乙個作業申請佇列以及作業完成後的釋放順...
作業系統實驗
一 實驗目的 理解vi的三種執行模式及其切方法。學會使用vi的各種操作命令進行文字檔案的編輯。用vi編寫linux下c程式,會用gcc編譯。二 實驗環境 一台裝有linux的機器 這裡預設是red hat linux 9 系統裡面有gcc編譯器。三 實驗內容 寫出主要的內容 首先用合法使用者登入系統...
作業系統實驗
分析bootloader進入保護模式的過程。在剛進入bootloader的時候,最先執行的操作分別為關閉中斷 清除eflags的df位以及將ax,ds,es,ss暫存器初始化為0 globl start start code16 cli 關中斷 cld 清除方向標誌 xorw ax,ax ax清0 ...