操作系统题目:
写一个程序来实现本章中的FIFO和LRU页面置换算法。首先,产生一个随机的页面引用序列,页面数范围从0到9.将这个随机页面引用序列应用到每个算法并记录所发生的页错误的次数。假设使用请求调页,页帧数范围从1到7,分别实现置换算法。
实验原理
■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置换算法,查看当前帧在不在内存,若不在内存中,查找时间最小的页(即最长时间没使用的页),然后替换之,并用同上的方法修改时间,使其最新;若该页面在内存中,则只需要刷新其时间即可。
算法代码段:
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{};
}
程序运行结果