关于FIFO和LRU页面置换算法的实现

  1. 操作系统题目

写一个程序来实现本章中的FIFOLRU页面置换算法。首先,产生一个随机的页面引用序列,页面数范围从09.将这个随机页面引用序列应用到每个算法并记录所发生的页错误的次数。假设使用请求调页,页帧数范围从17,分别实现置换算法。



  1. 实验原理

FIFO页面置换算法FIFO页面置换算法为每个页记录着该页调入内存(memory[size])的时间(time[size])

算法开始时,先判断内存是否已满(if(current<size)):

<1>若未满,查看当前帧reference[num]在不在内存中,若不在内存,将该页调入内存,同时页错误page-fault计数。

<2>若内存已满,则需要页面置换,查看当前帧在不在内存,若不在内存,寻找最旧的页(time[]数组中最小的页)然后替换之,同时页错误page-fault计数。


LRU页面置换算法:当必须置换一页时,LRU选择最长时间没有使用的页,这种策略为向后看的最优页置换算法。

算法开始时,先判断内存是否已满(if(current<size)):

<1>若未满,查看当前帧reference[num]在不在内存中,若不在内存,将该页调入内存,同时页错误page-fault计数;若在内存,则改变其时间,使其最新(方法:查找时间time[size]中最大的值,然后加1,即可构造最大值)

<2>若内存已满,则需要LRU置换算法,查看当前帧在不在内存,若不在内存中,查找时间最小的页(即最长时间没使用的页),然后替换之,并用同上的方法修改时间,使其最新;若该页面在内存中,则只需要刷新其时间即可。



  1. 算法代码段

FIFO算法:

if(e.getSource()==button1 )

{ int type=0;

size=Integer.parseInt(tf.getText());//获得内存大小size

if(size>=1&&size<=7)//合法输入1-7

{

button1.setEnabled(false);

button2.setEnabled(false);

ta.append("N"+"引用帧 "+"内存情况/n");

for(int num=0;num<20;num++){//引用串依次调入内存

//--------------------------------------------

if(current<size){//内存未满

for(int t=0;t<size&&memory[t]!=-1;t++){

if(reference[num]==memory[t]){//查看当前帧在不存中

type=1;

break;

}

}

if(type==0){

memory[current]=reference[num];

time[current]=num;

current++;

error++;//记录帧错误

}

else

type=0;//标志清0

}

//-------------------------------------------

else{//内存已满 需要页面置换

for(int a=0;a<size;a++){

if(reference[num]==memory[a]){//看当前帧在不在内存

type=1;

break;

}

}

if(type==0){//不在内存

int min= 0;//从内存中找到最旧的页面

for(int l=0;l<size;l++){

if(time[l]<time[min])

min=l;

}

//开始替换

memory[min]=reference[num];

time[min]=num;

error++;

}

else

type=0;

}

//显示FIFO算法的结果

ta.append("<> "+reference[num]+" ");

for(int v=0;v<size&&memory[v]!=-1;v++)

ta.append(memory[v]+" ");

ta.append("/n");

}//end for

ta.append("帧错误<Page-Fault>数目: "+error);

}

}





LRU算法:

if(e.getSource()==button2 )

{

int type=0;

int hold=0;

size=Integer.parseInt(tf.getText());//获得内存大小size

if(size>=1&&size<=7)//合法输入1-7

{

button1.setEnabled(false);

button2.setEnabled(false);

ta.append("N"+"引用帧 "+"内存情况/n");

for(int num=0;num<20;num++){//引用串依次调入内存

//--------------------------------------------

if(current<size){//内存未满

for(int t=0;t<size&&memory[t]!=-1;t++){

if(reference[num]==memory[t]){//查找当前帧

type=1;

hold=t;

break;

}

}

if(type==0){

memory[current]=reference[num];

time[current]=num;

current++;

error++;//记录帧错误

}

else{

int max=0;//找到最新的页,好更改当前时间

for(int x=0;x<size&&time[x]!=-1;x++){

if(time[x]>time[max])

max=x;

}

time[hold]=time[max]+1;//时间最新

type=0;//标志清0

}

}

//-------------------------------------------

else{//内存已满 需要页面置换

for(int a=0;a<size;a++){

if(reference[num]==memory[a]){//查找当前帧

type=1;

hold=a;

break;

}

}

if(type==0){//不在内存

int min=0;//找到最长时间没使用的页

int max=0;//找到最新的页,好更改当前时间

for(int l=0;l<size;l++){

if(time[l]<time[min])

min=l;

if(time[l]>time[max])

max=l;

}

//开始替换

memory[min]=reference[num];

time[min]=time[max]+1;

error++;

}

else{

int max=0;

for(int x=0;x<size;x++){//找到最新的页更改时间

if(time[x]>time[max])

max=x;

}

time[hold]=time[max]+1;//时间最新

type=0;//标志清0

}

}

//显示FIFO算法的结果

ta.append("<> "+reference[num]+" ");

for(int v=0;v<size&&memory[v]!=-1;v++)

ta.append(memory[v]+" ");

ta.append("/n");

}

ta.append("帧错误<Page-Fault>数目: "+error);

}

else{};

}











  1. 程序运行结果

自己在eclipse下运行就知道了


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值