資源簡介
一、實驗目的
1、了解虛擬存儲器的基本原理和實現方法。
2、掌握幾種頁面置換算法。
二、實驗內容
設計模擬實現采用不同內外存調度算法進行頁面置換,并計算缺頁率。
三、實驗原理
內存在計算機中的作用很大,電腦中所有運行的程序都需要經過內存來執行,如果執行的程序很大或很多,就會導致內存消耗殆盡。為了解決這個問題,Window中運用了虛擬內存技術,即拿出一部分硬盤空間來充當內存使用,當內存占用完時,電腦就會自動調用硬盤來充當內存,以緩解內存的緊張。
虛擬存儲器是指具有請求調入功能和置換功能,能從邏輯上對內存容量加以擴充的一種存儲器系統。它是采用一定的方法將一定的外存容量模擬成內存,同時對程序進出內存的方式進行管理,從而得到一個比實際內存容量大得多的內存空間,使得程序的運行不受內存大小的限制。虛擬存儲區的容量與物理主存大小無關,而受限于計算機的地址結構和可用磁盤容量。
虛擬內存的設置主要有兩點,即內存大小和分頁位置,內存大小就是設置虛擬內存最小為多少和最大為多少;而分頁位置則是設置虛擬內存應使用那個分區中的硬盤空間。
1. 最佳置換算法(OPT):選擇永不使用或是在最長時間內不再被訪問(即距現在最長時間才會被訪問)的頁面淘汰出內存。
2. 先進先出置換算法(FIFO):選擇最先進入內存即在內存駐留時間最久的頁面換出到外存。
3. 最近最久未使用置換算法(LRU): 以“最近的過去”作為“最近的將來”的近似,選擇最近一段時間最長時間未被訪問的頁面淘汰出內存

代碼片段和文件信息
#include?
#include?
#include?
#include?
?
#define?Myprintf?printf(“|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n“)???//*表格控制*/
int?M;?
int?N;??
typedef?struct?page?
{?
int?num;??/*記錄頁面號*/?
int?time;???/*記錄調入內存時間*/????????//(lru那用到)
int?index;??//記錄調入內存的先后次序???//從1開始(FIFO那用到)
}Page;???????????????????/*?頁面邏輯結構,結構為方便算法實現設計*/?
Page?b[10];????????????/*內存單元數*/??//從0開始
int?c[10][150];???/*暫保存內存當前的狀態:緩沖區*/?
int?queue[100];???????/*記錄調入隊列*/?
int?K;?????????????/*調入隊列計數變量*/?
/*初始化內存單元、緩沖區*/?
void?Init(Page?*bint?c[10][150])?
{?
int?ij;?
for(i=0;i {?
b[i].num=-1;?
b[i].time=M-i-1;?
b[i].index=i+1;
}?
for(i=0;i for(j=0;j c[i][j]=-1;?
}?
/*取得在內存中停留最久的頁面默認狀態下為最早調入的頁面*/?
int?GetMaxTime(Page?*b)?
{
int?i;
int?max=-1;?
int?tag=0;?
for(i=0;i {?
if(b[i].time>max)?
{?
max=b[i].time;?
tag=i;?
}?
}?
return?tag;?
}?
int?GetMinTime(Page?*b)?
{
int?i;
int?min=1000;?
int?tag=0;?
for(i=0;i {?
if(b[i].time {?
min=b[i].time;?
tag=i;?
}?
}?
return?tag;?
}?
/*判斷頁面是否已在內存中*/?
int????Equation(int?foldPage?*b)?
{?
int?i;?
for(i=0;i {?
if?(fold==b[i].num)?
return?i;?
}?
return?-1;?
}?
//LRU核心部分?????最近最久未使用置換算法
void?Lru(int?foldPage?*b)?
{?
int?i;?
int?val;?
val=Equation(foldb);???//判斷頁面是否已在內存中,val代表在內存中的位置
if?(val>=0)???????//在內存中
{?
b[val].time=0;???//存在就把那個東西的時間變成0
for(i=0;i if?(i!=val)?
b[i].time++;??//?其他的時間就要累加
}?
else?
{?
queue[++K]=fold;/*記錄調入頁面*/?
val=GetMaxTime(b);????//取得在內存中停留最久的頁面默認狀態下為最早調入的頁面,val代表在內存中的位置
b[val].num=fold;?
b[val].time=0;?
for(i=0;i if?(i!=val)?
b[i].time++;?
}?
}?
//先進先出置換算法
void?FIFO(int?foldPage?*b)
{
int?i;?
int?val;?
bool?flag=false;
val=Equation(foldb);???//判斷頁面是否已在內存中,val代表在內存中的位置
if?(val<0)???????//不在內存中?
{
queue[++K]=fold;/*記錄調入頁面*/
for(i=0;i {
if?(b[i].num<0)
{
b[i].num=fold;
b[i].index=i+1;
flag=true;
break;
}
}
if?(flag==false)
{
for(i=0;i {?
if(b[i].index==1)?
{?
val=i;?
}?
}?
b[val].num=fold;?
b[val].index=M;??
for(i=0;i {
if(i!=val)?
??????b[i].index--;?
}
}
}??
}
//最佳置換算法
void?Optimal(int?a[150]int?posPage?*b)
{
int?ij;?
int?val;
int?fold=a[pos];
bool?flag=false;
val=Equation(foldb);???//判斷頁面是否已在內存中,val代表在內存中的位置
if?(val<0)???????//不在內存中?
{
queue[++K]=fold;/*記錄調入頁面*/
for(i=0;i {
if?(b[i].num<0)
{
b[i].num=fold;
flag=true;
break;
}
}
if?(flag==false)
{
for(i=0;i {?
for(j=pos+1;j {
if?(b[i].num!=a[j])
{?b[i].time=?1000;?}
else
{
b[i].time=j;
break;
}
}
}?
val=Ge
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????6732??2011-12-14?18:05??虛擬存儲器.cpp
?????文件?????111616??2012-01-15?12:17??虛擬存儲器.doc
-----------?---------??----------?-----??----
???????????????118348????????????????????2
評論
共有 條評論