1. 程式人生 > >【實驗】請求調頁儲存管理方式的模擬

【實驗】請求調頁儲存管理方式的模擬

實驗目的

本實驗的目的是通過請求頁式儲存管理中頁面置換演算法模擬設計,瞭解虛擬儲存技術的特點,掌握請求頁式儲存管理的頁面置換演算法。

實驗內容

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

a50%的指令是順序執行的。

b25%的指令是均勻分佈在前地址部分

c25%的指令是均勻分佈在後地址部分

具體的實施方法是:

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

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

c、在前地址[0,m+1]中隨機選取一條指令並執行,該指令的地址為m’;

d、順序執行一條指令,其地址為m+1

e、在後地址[m+2,319]

中隨機選取一條指令並執行

f、重複上述步驟,直至執行320次指令

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

設:

a、頁面大小為1K

b、使用者記憶體容量為4頁到32

c、使用者虛存容量為32K

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

0條至第9條指令為第0(對應虛存地址為[0,9]);

10條至第19條指令為第1(對應虛存地址為[10,19]);

        ……………………

310條至第319條指令為第31(對應虛存地址為[310,319]);

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

    (3) 計算並輸出下述各種演算法在不同記憶體容量下的命中率。

     a、先進先出置換演算法(FIFO

     b、最近最少使用置換演算法(LRU)

     c、最佳置換演算法(OPT

在本實驗中,頁地址流長度為320,頁面失效次數為每次訪問相應指令時,該指令所對應的頁不在記憶體的次數。

3.隨機數產生辦法

關於隨機數產生辦法,Linux系統提供函式srand()rand(),分別進行初始化和產生隨機數。

例如:

srand()

語句可初始化一個隨機數;

a[0]=10*rand()/32767*319+1;

a[1]=10*rand()/32767*a[0];

………………………

語句可用來產生a[0]a[1]中的隨機數。

1.假設每個頁面中可存放10

條指令,分配給作業的記憶體塊數為4

2.通過對頁面、頁表、地址轉換和頁面置換過程的模擬,加深對請求調頁系統的原理和實現過程的理解

3.C語言模擬一個作業的執行過程,該作業共有320條指令,即它的地址空間為32頁,目前它的所有頁都還未調入記憶體。在模擬過程中,如果所訪問的指令已在記憶體,則顯示其實體地址,並轉下一條指令。如果所訪問的指令還未裝入記憶體,則發生缺頁,此時需記錄缺頁的次數,並將相應頁調入記憶體。如果4個記憶體塊均已裝入該作業,則需進行頁面置換,最後顯示其實體地址,並轉下一條指令。在所有320指令執行完畢後,請計算並顯示作業執行過程中發生的缺頁率。

4.置換演算法:最佳置換(OPT)演算法。

實驗的執行結果為:

地址流序列:1 4 7 3 3 1 2 1 3 1 7 3 6 6

M=3FIFO的命中率為:26.6667%  M=3LRU的命中率為:30%

M=4FIFO的命中率為:36.6667%  M=4LRU的命中率為:36.6667%

M=5FIFO的命中率為:50%  M=3LRU的命中率為:46.6667%

M=6FIFO的命中率為:66.6667%  M=6LRU的命中率為:63.3333%

#include <iostream.h> 

#include<stdlib.h> 

#include<conio.h> 

#include<stdio.h> 

#define Bsize 4 

typedef struct BLOCK//宣告一種新型別——物理塊型別

{    

   int pagenum;//頁號  

   int accessed;//訪問欄位,其值表示多久未被訪問

}BLOCK;  

int pc;//程式計數器,用來記錄指令的序號

int n;//缺頁計數器,用來記錄缺頁的次數  

static int temp[320];//用來儲存320條隨機數

BLOCK block[Bsize]; //定義一大小為4的物理塊陣列

//************************************************************* 

void init(); //程式初始化函式

int findExist(int curpage);//查詢物理塊中是否有該頁面

int findSpace();//查詢是否有空閒物理塊

int findReplace();//查詢應予置換的頁面

void display();//顯示

void suijishu();//產生320條隨機數,顯示並存儲到temp[320] 

void pagestring();//顯示呼叫的頁面佇列

void OPT();//OPT演算法

//------------------------------------------------------------- 

void init()  

{      

   for(int i=0;i<Bsize;i++)     

  {     

    block[i].pagenum=-1;        

    block[i].accessed=0;        

    pc=n=0;    

   } 

} 

//------------------------------------------------------------- 

int findExist(int curpage) 

{     

  for(int i=0; i<Bsize; i++)  

 {   

   if(block[i].pagenum == curpage )         

   return i;//檢測到記憶體中有該頁面,返回block中的位置  

  }     

   return -1; 

} 

//------------------------------------------------------------- 

int findSpace() 

{     

  for(int i=0; i<Bsize; i++)  

  {     

   if(block[i].pagenum == -1)         

   return i;//找到空閒的block,返回block中的位置  

  } 

return -1; 

} 

//------------------------------------------------------------- 

int findReplace() 

{    

  int pos = 0;    

  for(int i=0; i<Bsize; i++)    

  {     

    if(block[i].accessed >block[pos].accessed)          

    pos = i;//找到應予置換頁面,返回BLOCK中位置    

   }  

   return pos; 

} 

//------------------------------------------------------------- 

void display() 

{    

  for(int i=0; i<Bsize; i++)    

  {     

   if(block[i].pagenum != -1)     

   { 

    printf(" %02d",block[i].pagenum);

   }    

  }    

cout<<endl; 

} 

//------------------------------------------------------------- 

void suijishu() 

{   

  int flag=0;     

  cin>>pc;     

  cout<<"******按照要求產生的320個隨機數:*******"<<endl;     

  for(int i=0;i<320;i++)  

  {        

   temp[i]=pc;   

   if(flag%2==0) pc=++pc%320;         

   if(flag==1) pc=rand()% (pc-1);         

   if(flag==3) pc=pc+1+(rand()%(320-(pc+1)));         

   flag=++flag%4;   

   printf(" %03d",temp[i]);         

   if((i+1)%10==0) cout<<endl;  

  } 

} 

//------------------------------------------------------------- 

void pagestring() 

{     

  for(int i=0;i<320;i++)  

  {     

   printf(" %02d",temp[i]/10);        

   if((i+1)%10==0) cout<<endl;  

  } 

} 

//------------------------------------------------------------- 

void OPT() 

{  

   int exist,space,position ;  

   int curpage;     

   for(int i=0;i<320;i++)  

  {      

   //if(i%100==0) getch();   

   pc=temp[i];       

   curpage=pc/10;      

   exist = findExist(curpage);         

   if(exist==-1) 

  }

}

void main() 

{    

   int  select;   

   cout<<"請輸入第一條指令號(0~320):";   

   suijishu();   

   cout<<"*****對應的呼叫頁面佇列*******"<<endl;   

   pagestring();     

   cout<<"最佳置換演算法OPT:"<<endl;   

   cout<<"*****************"<<endl;   

   OPT();     

}

潭浩強《C++程式設計》清華大學出版社   2004

任滿傑等《作業系統原理實用教程》電子工業出版社  2006

湯子瀛《計算機作業系統》(修訂版)西安電子科技大學出版社 2001