1681035 作業系統實驗4

2021-09-23 18:37:54 字數 3791 閱讀 3224

一、前期準備工作

二、頁面訪問序列隨機生成說明

三、輸入輸出函式

四、頁面置換演算法

五、實驗結果截圖

六、 完整源**

為什麼會有頁面置換演算法?

圖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 ...