📄 10.cpp
字号:
操作系统之存储管理
作者:论文百事通 来源:lwbst.com 【2006-09-28】 编辑:Admin
实验要求:设计一个请求页式存储管理方案,并编写模拟程序实现之。用随机数产生器生成一个指令系列。页面淘汰算法采用FIFO算法。
bst
设计思想:
产生一个需要访问的指令地址流,指定合适的页面大小,指定内存页表的最大长度,并对页表进行初始化。每访问一个地址,首先计算该地址所在的页号,然后查页表,判断该页是否在主存;如果该页在主存,则打印页表情况;如果该页不在主存且页表已满,则调入一页并打印页表情况;如果该页不在主存且页表已满,则按FIFO页面淘汰算法淘汰一页后调入所需的页,并打印页表情况。逐个地址访问,直到所有地址访问完毕
概要设计:
本次实验以c++builder为平台。随机产生一个需要访问的指令地址流,页面淘汰算法采用了FIFO和LRU两种 。整个程序大体分为3大模块:
1.生成地址流模块,程序自动算出该地址所在页面。
2.FIFO算法模块。
运行界面和过程如下:
源程序如下:
//---------------------------------------------------------------------------
#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)
{ //设置状态栏
String str;
str=Time();
StatusBar1->Panels->Items[0]->Text="指令条数: "+suiComboBox1->Text;
StatusBar1->Panels->Items[1]->Text="页面大小: "+suiComboBox2->Text;
StatusBar1->Panels->Items[2]->Text="页表大小: "+suiComboBox3->Text;
StatusBar1->Panels->Items[5]->Text="时间:"+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="页表中命中指令地址: ";
buffer3="页表中插入指令地址:";
for(i=0;i<100;i++) e[i]=0; //初始化e数组
int tag=0;
for(i=0;i<=100;i++) { //初始化记录数组
a[i]=320;
b[i]=320;
c[i]=320;
d[i]=320;
}
page_Length=StrToInt(suiComboBox3->Text);
d[0]=1;
num=StrToInt(suiComboBox1->Text); //产生随机地址序列
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++) //求出随机数的页号
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("内存页 页面号");
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="指令条数: "+suiComboBox1->Text;
StatusBar1->Panels->Items[1]->Text="页面大小: "+suiComboBox2->Text;
StatusBar1->Panels->Items[2]->Text="页表大小: "+suiComboBox3->Text;
StatusBar1->Panels->Items[3]->Text="FIFO命中率: " ;
StatusBar1->Panels->Items[5]->Text="时间:"+Time();
}
//---------------------------------------------------------------------------
本课程设计包含完整源程序、可执行程序、设计文档。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -