?? 10.cpp
字號(hào):
操作系統(tǒng)之存儲(chǔ)管理
作者:論文百事通 來源:lwbst.com 【2006-09-28】 編輯:Admin
實(shí)驗(yàn)要求:設(shè)計(jì)一個(gè)請(qǐng)求頁(yè)式存儲(chǔ)管理方案,并編寫模擬程序?qū)崿F(xiàn)之。用隨機(jī)數(shù)產(chǎn)生器生成一個(gè)指令系列。頁(yè)面淘汰算法采用FIFO算法。
bst
設(shè)計(jì)思想:
產(chǎn)生一個(gè)需要訪問的指令地址流,指定合適的頁(yè)面大小,指定內(nèi)存頁(yè)表的最大長(zhǎng)度,并對(duì)頁(yè)表進(jìn)行初始化。每訪問一個(gè)地址,首先計(jì)算該地址所在的頁(yè)號(hào),然后查頁(yè)表,判斷該頁(yè)是否在主存;如果該頁(yè)在主存,則打印頁(yè)表情況;如果該頁(yè)不在主存且頁(yè)表已滿,則調(diào)入一頁(yè)并打印頁(yè)表情況;如果該頁(yè)不在主存且頁(yè)表已滿,則按FIFO頁(yè)面淘汰算法淘汰一頁(yè)后調(diào)入所需的頁(yè),并打印頁(yè)表情況。逐個(gè)地址訪問,直到所有地址訪問完畢
概要設(shè)計(jì):
本次實(shí)驗(yàn)以c++builder?yàn)槠脚_(tái)。隨機(jī)產(chǎn)生一個(gè)需要訪問的指令地址流,頁(yè)面淘汰算法采用了FIFO和LRU兩種 。整個(gè)程序大體分為3大模塊:
1.生成地址流模塊,程序自動(dòng)算出該地址所在頁(yè)面。
2.FIFO算法模塊。
運(yùn)行界面和過程如下:
源程序如下:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::suiButton1Click(TObject *Sender)
{ //設(shè)置狀態(tài)欄
String str;
str=Time();
StatusBar1->Panels->Items[0]->Text="指令條數(shù): "+suiComboBox1->Text;
StatusBar1->Panels->Items[1]->Text="頁(yè)面大小: "+suiComboBox2->Text;
StatusBar1->Panels->Items[2]->Text="頁(yè)表大小: "+suiComboBox3->Text;
StatusBar1->Panels->Items[5]->Text="時(shí)間:"+str;
suiEdit1->Text="";
suiMemo1->Clear();
suiMemo2->Clear();
int i,j,num,page_Length,temp,check=0;
int fifotemp=0;
int lrutemp=0;
String buffer1,buffer2,buffer3;
buffer1="頁(yè)表中命中指令地址: ";
buffer3="頁(yè)表中插入指令地址:";
for(i=0;i<100;i++) e[i]=0; //初始化e數(shù)組
int tag=0;
for(i=0;i<=100;i++) { //初始化記錄數(shù)組
a[i]=320;
b[i]=320;
c[i]=320;
d[i]=320;
}
page_Length=StrToInt(suiComboBox3->Text);
d[0]=1;
num=StrToInt(suiComboBox1->Text); //產(chǎn)生隨機(jī)地址序列
temp=(num-1)/4+1;
randomize();
a[0]=random(319);
for( i=0;i<temp;i++)
{
a[i*4+1]=a[i*4]+1;
a[i*4+2]=random(a[i*4+1]);
a[i*4+3]=a[i*4+2]+1;
Randomize();
a[i*4+4]=RandomRange(a[i*4+2]+2,319);
}
a[num]=320;
for(i=0;i<num;i++) suiEdit1->Text=suiEdit1->Text+":"+IntToStr(a[i]);
for(i=0;i<num;i++) //求出隨機(jī)數(shù)的頁(yè)號(hào)
b[i]=a[i]/StrToInt(suiComboBox2->Text);
//FIFO算法
for(i=0;i<num;i++)
{for( j=0;j<page_Length;j++)
{if(b[i]==c[j]) { buffer2=IntToStr(a[i]);
suiMemo1->Lines->Add(buffer1+buffer2+" 命中");
check=1;
fifotemp++;
show(suiMemo1);
break;
}
}
if(check!=1)
{
check=0;
for(j=0;j<page_Length;j++)
{ if(d[j]==1) {
buffer2=IntToStr(a[i]);
suiMemo1->Lines->Add(buffer3+buffer2+" 插入");
c[j]=b[i];
show(suiMemo1);
if(j==page_Length-1) d[0]=1;
else d[j+1]=1;
d[j]=320;
if(page_Length==1) d[0]=1;
break;
}
}
}check=0;
}
FIFO_RATE=fifotemp*100/StrToInt(suiComboBox1->Text);
StatusBar1->Panels->Items[3]->Text="FIFO命中率:"+IntToStr(FIFO_RATE)+"%";
}
//---------------------------------------------------------------------------
void TForm1::show(TsuiMemo * memo)
{
//TODO: Add your source code here
int len;
String buffer;
len=StrToInt(suiComboBox3->Text);
memo->Lines->Add("內(nèi)存頁(yè) 頁(yè)面號(hào)");
for(int i=0;i<len;i++)
{
if(c[i]==320) buffer="空" ;
else buffer=IntToStr(c[i]);
memo->Lines->Add(IntToStr(i)+" "+buffer) ;
}
memo->Lines->Add("======{=====================>>");
return;
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
StatusBar1->Panels->Items[0]->Text="指令條數(shù): "+suiComboBox1->Text;
StatusBar1->Panels->Items[1]->Text="頁(yè)面大小: "+suiComboBox2->Text;
StatusBar1->Panels->Items[2]->Text="頁(yè)表大小: "+suiComboBox3->Text;
StatusBar1->Panels->Items[3]->Text="FIFO命中率: " ;
StatusBar1->Panels->Items[5]->Text="時(shí)間:"+Time();
}
//---------------------------------------------------------------------------
本課程設(shè)計(jì)包含完整源程序、可執(zhí)行程序、設(shè)計(jì)文檔。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -