作業系統實驗五 儲存管理 頁面置換演算法模擬

2021-10-25 01:24:34 字數 4096 閱讀 3958

[實驗目的]

通過模擬實現請求頁式儲存管理的幾種基本頁面置換演算法,了解虛擬儲存技術的特點,掌握虛擬儲存請求頁式儲存管理中幾種基本頁面置換演算法的基本思想和實現過程,並比較它們的效率。

[實驗學時]

4學時[實驗型別]

設計性[實驗內容]

設計乙個虛擬分頁系統,並使用下述演算法計算訪問命中率(選擇2種演算法即可)。

1、最佳淘汰演算法(opt)

2、先進先出的演算法(fifo)

3、最近最久未使用演算法(lru)

命中率=1-頁面失效次數/頁位址流長度

本實驗的程式設計基本上按照實驗內容進行。視能力可以在完整演算法模擬和基本簡要演算法模擬其中二選一

1.完整演算法要求:即首先用srand( )和rand( )函式定義和產生指令序列,然後將指令序列變換成相應的頁位址流,並針對不同的演算法計算出相應的命中率。

(1)通過隨機數產生乙個指令序列,共320條指令。指令的位址按下述原則生成:

a:50%的指令是順序執行的

b:25%的指令是均勻分布在前位址部分

c:25%的指令是均勻分布在後位址部分

具體的實施方法是:

a:在[0,319]的指令位址之間隨機選取一起點m

b:順序執行一條指令,即執行位址為m+1的指令

c:在前位址[0,m+1]中隨機選取一條指令並執行,該指令的位址為m』

d:順序執行一條指令,其位址為m』+1

e:在後位址[m』+2,319]中隨機選取一條指令並執行

f:重複步驟a-e,直到320次指令

(2)將指令序列變換為頁位址流

設:頁面大小為1k;

使用者記憶體容量4頁到32頁;

使用者虛存容量為32k。

在使用者虛存中,按每k存放10條指令排列虛存位址,即320條指令在虛存中的存放方式為:

第 0 條-第 9 條指令為第0頁(對應虛存位址為[0,9])

第10條-第19條指令為第1頁(對應虛存位址為[10,19])

………………………………

第310條-第319條指令為第31頁(對應虛存位址為[310,319])

按以上方式,使用者指令可組成32頁。

2.基本簡要演算法要求:忽略指令的位址對映過程,首先直接生成合法的頁面訪問序列號,並設定關鍵的資料結構-擴充頁表,再針對不同的演算法計算出相應的命中率。

[實驗步驟]

一、虛擬儲存系統

unix中,為了提高記憶體利用率,提供了內外存程序對換機制;記憶體空間的分配和**均以頁為單位進行;乙個程序只需將其一部分(段或頁)調入記憶體便可執行;還支援請求調頁的儲存管理方式。

當程序在執行中需要訪問某部分程式和資料時,發現其所在頁面不在記憶體,就立即提出請求(向cpu發出缺中斷),由系統將其所需頁面調入記憶體。這種頁面調入方式叫請求調頁。

為實現請求調頁,核心配置了四種資料結構:頁表、頁框號、訪問位、修改位、有效位、保護位等。

二、頁面置換演算法

當cpu接收到缺頁中斷訊號,中斷處理程式先儲存現場,分析中斷原因,轉入缺頁中斷處理程式。該程式通過查詢頁表,得到該頁所在外存的物理塊號。如果此時記憶體未滿,能容納新頁,則啟動磁碟i/o將所缺之頁調入記憶體,然後修改頁表。如果記憶體已滿,則須按某種置換演算法從記憶體中選出一頁準備換出,是否重新寫盤由頁表的修改位決定,然後將缺頁調入,修改頁表。利用修改後的頁表,去形成所要訪問資料的實體地址,再去訪問記憶體資料。整個頁面的調入過程對使用者是透明的。

常用的頁面置換演算法有

1、最佳置換演算法(optimal)

2、先進先出法(fisrt in first out)

3、最近最久未使用(least recently used)

程式源**:

#define true1

#definefalse 0

#defineinvalid -1

#define null0

#define total_instruction 320 /*指令流長*/

#definetotal_vp 32 /*虛頁長*/

#defineclear_period 50 /*清0週期*/

typedef struct /*頁面結構*/

pl_type;

pl_typepl[total_vp]; /*頁面結構陣列*/

structpfc_struct

; typedefstruct pfc_struct pfc_type;

pfc_typepfc[total_vp],*freepf_head,*busypf_head,*busypf_tail;

intdiseffect, a[total_instruction];

intpage[total_instruction], offset[total_instruction];

int initialize(int);

intnur(int);

int main()

a[i]=s; /*任選一指令訪問點m*/

a[i+1]=a[i]+1; /*順序執行一條指令*/

a[i+2]=(float)a[i]*rand( )/32767/32767/2; /*執行前位址指令m' */

a[i+3]=a[i+2]+1;/*順序執行一條指令*/

s=(float)(318-a[i+2])*rand()/32767/32767/2+a[i+2]+2;

if((a[i+2]>318)||(s>319))

printf("a[%d+2],a number which is :%d ands==%d\n",i,a[i+2],s);

}for(i=0;inext=null;

}pl[page[i]].pfn=freepf_head->pfn;

freepf_head=freepf_head->next;

}else

pl[page[i]].counter=1;

if(i%clear_period==0)

for(j=0;j319)

a[i]=s; /*任選一指令訪問點m*/

a[i+1]=a[i]+1; /*順序執行一條指令*/

a[i+2]=(float)a[i]*rand( )/32767/32767/2; /*執行前位址指令m' */

a[i+3]=a[i+2]+1;/*順序執行一條指令*/

s=(float)(318-a[i+2])*rand()/32767/32767/2+a[i+2]+2;

if((a[i+2]>318)||(s>319))

printf("a[%d+2],a number which is :%d ands==%d\n",i,a[i+2],s);

}for(i=0;inext=null;

}pl[page[i]].pfn=freepf_head->pfn;

freepf_head=freepf_head->next;

}else

pl[page[i]].counter=1;

if(i%clear_period==0)

for(j=0;j執行後截圖:

程式**所表示的流程圖:

一、 心得體會。

是用佇列儲存記憶體中的頁面,佇列的特點是先進先出,與該演算法是一致的,所以每當發生缺頁時,就從隊頭刪除一頁,而從隊尾加入缺頁。或者借助輔助陣列time[msize]記錄物理塊中對應頁面的進入時間,每次需要置換時換出進入時間最小的頁面。所以fifo需要進行頁面置換,即把記憶體中裝入最早的那個頁面淘汰,換入當前的頁面。總的來說使用fifo演算法,總是淘汰最先進入記憶體的頁面,即即選擇在記憶體中駐留時間最久的頁面予以淘汰。通過這個實驗我體會到了程式設計的思路流程,結構流程圖的作用。乙個程式如果一開始計畫的好,結構設計完善,才可能順利進行。

實驗五 儲存管理實驗

include stdio.h include stdlib.h include time.h struct wuli 記憶體表 struct wuli wuli table 20 struct page 頁表 struct page page table 10 int allocate int w...

作業系統 II 頁面置換

作業系統概念 原書第9版 當必須置換頁面時,將選擇最舊的頁面 頁面調入記憶體的時間 可能出現belady異常 對於有些頁面置換演算法,隨著分配幀數量的增加,缺頁錯誤率可能會增加 置換最長時間不會使用的頁面 位於記憶體的3個頁面中最後被再次引用的頁面 頁面將來使用的時間 具有所有演算法的最低的缺頁錯誤...

作業系統頁面置換模擬系統

include include include include include include include include include include include include include include include using namespace std int addres...