【實驗】請求調頁儲存管理方式的模擬
實驗目的
本實驗的目的是通過請求頁式儲存管理中頁面置換演算法模擬設計,瞭解虛擬儲存技術的特點,掌握請求頁式儲存管理的頁面置換演算法。
實驗內容
(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、重複上述步驟,直至執行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
2.通過對頁面、頁表、地址轉換和頁面置換過程的模擬,加深對請求調頁系統的原理和實現過程的理解
3.用C語言模擬一個作業的執行過程,該作業共有320條指令,即它的地址空間為32頁,目前它的所有頁都還未調入記憶體。在模擬過程中,如果所訪問的指令已在記憶體,則顯示其實體地址,並轉下一條指令。如果所訪問的指令還未裝入記憶體,則發生缺頁,此時需記錄缺頁的次數,並將相應頁調入記憶體。如果4個記憶體塊均已裝入該作業,則需進行頁面置換,最後顯示其實體地址,並轉下一條指令。在所有320指令執行完畢後,請計算並顯示作業執行過程中發生的缺頁率。
4.置換演算法:最佳置換(OPT)演算法。
實驗的執行結果為:
地址流序列:1 4 7 3 3 1 2 1 3 1 7 3 6 6
M=3時FIFO的命中率為:26.6667% M=3時LRU的命中率為:30%
M=4時FIFO的命中率為:36.6667% M=4時LRU的命中率為:36.6667%
M=5時FIFO的命中率為:50% M=3時LRU的命中率為:46.6667%
M=6時FIFO的命中率為:66.6667% M=6時LRU的命中率為: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