内存存储管理模拟算法

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, bsSkinData, BusinessSkinForm, bsSkinCtrls, StdCtrls,
  bsSkinBoxCtrls, ExtCtrls, ComCtrls, bsSkinTabs, bsMessages, bsDialogs,
  bsCalendar;

type
  TForm1 = class(TForm)

    bsBusinessSkinForm1: TbsBusinessSkinForm;
    bsSkinData1: TbsSkinData;
    bsCompressedStoredSkin1: TbsCompressedStoredSkin;
    bsSkinData2: TbsSkinData;
    bsCompressedStoredSkin2: TbsCompressedStoredSkin;
    bsSkinData3: TbsSkinData;
    bsCompressedStoredSkin3: TbsCompressedStoredSkin;
    bsSkinPageControl1: TbsSkinPageControl;
    bsSkinTabSheet1: TbsSkinTabSheet;
    bsSkinExPanel1: TbsSkinExPanel;
    bsSkinListBox1: TbsSkinListBox;
    bsSkinPanel1: TbsSkinPanel;
    bsSkinPanel2: TbsSkinPanel;
    bsSkinPanel5: TbsSkinPanel;
    bsSkinPanel6: TbsSkinPanel;
    bsSkinData4: TbsSkinData;
    bsCompressedStoredSkin4: TbsCompressedStoredSkin;
    bsSkinButton1: TbsSkinButton;
    Timer1: TTimer;
    minfo: TbsSkinStdLabel;
    Label1: TbsSkinLabel;
    Label2: TbsSkinLabel;
    Label4: TbsSkinLabel;
    Label3: TbsSkinLabel;
    Label5: TbsSkinLabel;
    Label6: TbsSkinLabel;
    Label7: TbsSkinLabel;
    Label8: TbsSkinLabel;
    Label10: TbsSkinLabel;
    Label9: TbsSkinLabel;
    Label12: TbsSkinLabel;
    Label11: TbsSkinLabel;
    Label14: TbsSkinLabel;
    Label13: TbsSkinLabel;
    Label15: TbsSkinLabel;
    Label16: TbsSkinLabel;
    Label19: TbsSkinLabel;
    Label17: TbsSkinLabel;
    Label18: TbsSkinLabel;
    Label20: TbsSkinLabel;
    labelb20: TbsSkinLabel;
    labelb18: TbsSkinLabel;
    labelb17: TbsSkinLabel;
    labelb19: TbsSkinLabel;
    labelb16: TbsSkinLabel;
    labelb15: TbsSkinLabel;
    labelb13: TbsSkinLabel;
    labelb14: TbsSkinLabel;
    labelb11: TbsSkinLabel;
    labelb12: TbsSkinLabel;
    labelb9: TbsSkinLabel;
    labelb10: TbsSkinLabel;
    labelb8: TbsSkinLabel;
    labelb7: TbsSkinLabel;
    labelb5: TbsSkinLabel;
    labelb6: TbsSkinLabel;
    labelb4: TbsSkinLabel;
    labelb3: TbsSkinLabel;
    labelb2: TbsSkinLabel;
    labelb1: TbsSkinLabel;
    bsSkinStdLabel1: TbsSkinStdLabel;
    bsSkinStdLabel2: TbsSkinStdLabel;
    bsSkinStdLabel3: TbsSkinStdLabel;
    bsSkinPanel7: TbsSkinPanel;
    bsSkinPanel8: TbsSkinPanel;
    bsSkinPanel11: TbsSkinPanel;
    bsSkinPanel12: TbsSkinPanel;
    bsSkinPanel9: TbsSkinPanel;
    bsSkinPanel10: TbsSkinPanel;
    bsSkinPanel3: TbsSkinPanel;
    bsSkinPanel4: TbsSkinPanel;
    bsSkinStdLabel4: TbsSkinStdLabel;
    bsSkinPanel13: TbsSkinPanel;
    bsSkinPanel14: TbsSkinPanel;
    ye1: TbsSkinStdLabel;
    ye2: TbsSkinStdLabel;
    bsSkinButton2: TbsSkinButton;
    bsSkinStdLabel5: TbsSkinStdLabel;
    bsSkinStdLabel6: TbsSkinStdLabel;
    bsSkinStdLabel7: TbsSkinStdLabel;
    bsSkinStdLabel8: TbsSkinStdLabel;
    bsSkinStdLabel9: TbsSkinStdLabel;
    bsSkinButton3: TbsSkinButton;
    bsSkinButton4: TbsSkinButton;
    bsSkinMonthCalendar1: TbsSkinMonthCalendar;
    procedure bsSkinButton1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure bsSkinButton2Click(Sender: TObject);
    procedure bsSkinButton3Click(Sender: TObject);
    procedure bsSkinButton4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
logicidarray=array[1..20]of integer;
physicidarray=array[1..20]of integer;

var
  Form1: TForm1;
 logicid:logicidarray;
  physicid:physicidarray;
  s1,s2,st,i:integer;

implementation

uses Unit2, Unit4;

{$R *.dfm}

procedure TForm1.bsSkinButton1Click(Sender: TObject);
var
k,p,w:integer;
begin
//form2.show;
logicid[1]:=257;
logicid[2]:=382;
logicid[3]:=3174;
logicid[4]:=3910;
logicid[5]:=2448;
logicid[6]:=2449;
logicid[7]:=2450;
logicid[8]:=2451;
logicid[9]:=2452;
logicid[10]:=2453;
logicid[11]:=2454;
logicid[12]:=2455;
logicid[13]:=2456;
logicid[14]:=2457;
logicid[15]:=743;
logicid[16]:=3731;
logicid[17]:=3542;
logicid[18]:=3320;
logicid[19]:=824;
logicid[20]:=561;
for k:=1 to 20 do
begin
p:=logicid[k] div 1024;
w:=logicid[k] mod 1024;
if p>3 then
showmessage(inttostr(logicid[i])+'发生页出界');
if w>1024 then
showmessage(inttostr(logicid[i])+'发生页偏移量出界');
case p of
0:physicid[k]:=2*1024+w;
1:physicid[k]:=3*1024+w;
2:physicid[k]:=5*1024+w;
3:physicid[k]:=7*1024+w;
end;//case
end;//for k

label1.Caption:=inttostr(logicid[1]);
label2.Caption:=inttostr(logicid[2]);
label3.Caption:=inttostr(logicid[3]);
label3.Caption:=inttostr(logicid[3]);
label4.Caption:=inttostr(logicid[4]);
label5.Caption:=inttostr(logicid[5]);
label6.Caption:=inttostr(logicid[6]);
label7.Caption:=inttostr(logicid[7]);
label8.Caption:=inttostr(logicid[8]);
label9.Caption:=inttostr(logicid[9]);
label10.Caption:=inttostr(logicid[10]);
label11.Caption:=inttostr(logicid[11]);
label12.Caption:=inttostr(logicid[12]);
label13.Caption:=inttostr(logicid[13]);
label14.Caption:=inttostr(logicid[14]);
label15.Caption:=inttostr(logicid[15]);
label17.Caption:=inttostr(logicid[17]);
label18.Caption:=inttostr(logicid[18]);
label19.Caption:=inttostr(logicid[19]);
label20.Caption:=inttostr(logicid[20]);
label16.Caption:=inttostr(logicid[16]);


labelb1.Caption:=inttostr(physicid[1]);
labelb2.Caption:=inttostr(physicid[2]);
labelb3.Caption:=inttostr(physicid[3]);
labelb3.Caption:=inttostr(physicid[3]);
labelb4.Caption:=inttostr(physicid[4]);
labelb5.Caption:=inttostr(physicid[5]);
labelb6.Caption:=inttostr(physicid[6]);
labelb7.Caption:=inttostr(physicid[7]);
labelb8.Caption:=inttostr(physicid[8]);
labelb9.Caption:=inttostr(physicid[9]);
labelb10.Caption:=inttostr(physicid[10]);
labelb11.Caption:=inttostr(physicid[11]);
labelb12.Caption:=inttostr(physicid[12]);
labelb13.Caption:=inttostr(physicid[13]);
labelb14.Caption:=inttostr(physicid[14]);
labelb15.Caption:=inttostr(physicid[15]);
labelb17.Caption:=inttostr(physicid[17]);
labelb18.Caption:=inttostr(physicid[18]);
labelb19.Caption:=inttostr(physicid[19]);
labelb20.Caption:=inttostr(physicid[20]);
labelb16.Caption:=inttostr(physicid[16]);
timer1.Enabled:=true;


end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
p,w,addr,j:integer;
begin
if i<21 then
begin
i:=i+1;
p:=logicid[i] div 1024;
w:=logicid[i] mod 1024;
if p>3 then
showmessage(inttostr(logicid[i])+'发生页出界');
if w>1024 then
showmessage(inttostr(logicid[i])+'发生页偏移量出界');
bsskinlistbox1.Items.Add(inttostr(logicid[i])+'请求页:'+inttostr(p));
case p of
0:
begin
addr:=2*1024+w;
if s1 =100 then
s1:=0
else
if  s1 <>0 then
if s2 =100 then
s2:=0
else
if  s2<>0 then
begin
st:=s1;
s1:=s2;
s1:=0;
bsskinlistbox1.Items.Add('页'+inttostr(st)+'被调出!');
end;


bsskinpanel1.SkinData:=bsskindata1;
bsskinpanel2.SkinData:= bsskindata1;
bsskinpanel2.Height:=w div 2;
end; //0
1:
begin
addr:=3*1024+w;
if s1 =100 then
s1:=1
else
if s1<>1 then
if s2 =100 then
s2:=1
else
if s2<>1 then
begin
st:=s1;
s1:=s2;
s1:=1;
bsskinlistbox1.Items.Add('页'+inttostr(st)+'被调出!');
end;
bsskinpanel1.SkinData:=bsskindata2;
bsskinpanel2.SkinData:= bsskindata2;
bsskinpanel2.Height:=w div 2;
end; //1
2:
begin
if s1 =100 then
s1:=2
else
if  s1<>2 then
if s2 =100 then
s2:=2
else
if  s2<>2 then
begin
st:=s1;
s1:=s2;
s1:=2;
bsskinlistbox1.Items.Add('页'+inttostr(st)+'被调出!');
end;
addr:=5*1024+w;
//end; //if s1=100  then
bsskinpanel1.SkinData:=bsskindata3;
bsskinpanel2.SkinData:= bsskindata3;
bsskinpanel2.Height:=w div 2;
;
end; //2
3:
begin
if s1 =100 then
s1:=3
else
if  s1<>3 then
if s2 =100 then
begin
s2:=3;
end
else
if  s2<>3 then
begin
st:=s1;
s1:=s2;
s1:=3;
bsskinlistbox1.Items.Add('页'+inttostr(st)+'被调出!');
end;
addr:=7*1024+w;
//end;
bsskinpanel1.SkinData:=bsskindata4;
bsskinpanel2.SkinData:= bsskindata4;
bsskinpanel2.Height:=w div 2;

end; //3
end ;//case over
minfo.Caption:=inttostr(physicid[i]);
minfo.top:=bsskinpanel2.Top+bsskinpanel2.Height+100;
  for j:=0 to componentCount-1 do
  begin
  //form1.Caption:=form1.Components[j+1].Name;
   if components[j] is TbsSkinLabel then


    if  TbsSkinLabel(components[j]).Tag =i then
      TbsSkinLabel(components[j]).SkinData:=bsskindata2
      else
       TbsSkinLabel(components[j]).SkinData:=bsskindata3;
    //end; //if  TbsSkinLabel(components[j]).Tag =i
   //end;// components[j] is TbsSkinLabel then
  end;//for j
case s1 of
0:
begin
ye1.Caption:='0号页  ' ;
bsskinpanel3.SkinData:=bsskindata1;
bsskinpanel4.SkinData:=bsskindata1;
end;//case s1 0
1:
begin
ye1.Caption:='1号页  ' ;
bsskinpanel3.SkinData:=bsskindata2;
bsskinpanel4.SkinData:=bsskindata2;
end;//case s2 1
2:
begin
ye1.Caption:='2号页  ' ;
bsskinpanel3.SkinData:=bsskindata3;
bsskinpanel4.SkinData:=bsskindata3;
end;//case s2 2
3:
begin
ye1.Caption:='3号页  ' ;
bsskinpanel3.SkinData:=bsskindata4;
bsskinpanel4.SkinData:=bsskindata4;
end;//case s2 3
end;//case s2 over
case s2 of
0:
begin
ye2.Caption:='0号页  ' ;
bsskinpanel13.SkinData:=bsskindata1;
bsskinpanel14.SkinData:=bsskindata1;
end;//case s2 0
1:
begin
ye2.Caption:='1号页  ' ;
bsskinpanel13.SkinData:=bsskindata2;
bsskinpanel14.SkinData:=bsskindata2;
end;//case s2 1
2:
begin
ye2.Caption:='2号页  ' ;
bsskinpanel13.SkinData:=bsskindata3;
bsskinpanel14.SkinData:=bsskindata3;
end;//case s2 2
3:
begin
ye2.Caption:='3号页  ' ;
bsskinpanel13.SkinData:=bsskindata4;
bsskinpanel14.SkinData:=bsskindata4;
end;//case s2 3
end;//case s2 over
end;//if
if i=20 then
messagebox(form1.Handle,'演示完毕!!!','',MB_OK);

end;

procedure TForm1.FormCreate(Sender: TObject);
var
j:integer;
begin
s1:=100;
s2:=100;

end;

procedure TForm1.bsSkinButton2Click(Sender: TObject);
begin
form2.Show;
end;

procedure TForm1.bsSkinButton3Click(Sender: TObject);
begin
bsskinexpanel1.Show;
end;

procedure TForm1.bsSkinButton4Click(Sender: TObject);
begin
form4.show;
end;

end.

【实验目的】 1. 通过编写和调试存储管理模拟程序以加深对存储管理方案的理解; 2. 熟悉虚存管理的各种页面淘汰算法; 3. 通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 【实验准备】 1.虚拟存储器的管理方式  段式管理  页式管理  段页式管理 2.页面置换算法  先进先出置换算法  最近最久未使用置换算法  Clock置换算法  其他置换算法 【实验内容】 1. 实验题目 设计一个请求页式存储管理方案。并编写模拟程序实现之。产生一个需要访问的指令地址流。它是一系列需要访问的指令的地址。为不失一般性,你可以适当地(用人工指定地方法或用随机数产生器)生成这个序列,使得 50%的指令是顺序执行的。25%的指令均匀地散布在前地址部分,25%的地址是均匀地散布在后地址部分。为简单起见。页面淘汰算法采用 FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中抹去。而不再判断它是否被改写过,也不将它写回到辅存。 2. 具体做法 产生一个需要访问的指令地址流;指令合适的页面尺寸(例如以 1K或2K为1页);指定内存页表的最大长度,并对页表进行初始化;每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页表未满,则调入一页并打印页表情况;如果该页不足主存且页表已满,则按 FIFO页面淘汰算法淘汰一页后调入所需的页,打印页表情况;逐个地址访问,直到所有地址访问完毕。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值