c语言页面置换算法报告,C语言实现页面置换算法

本文实例为大家分享了C语言实现页面置换算法的具体代码,供大家参考,具体内容如下

操作系统实验

页面置换算法(FIFO、LRU、OPT)

概念:

1.最佳置换算法(OPT)(理想置换算法):从主存中移出永远不再需要的页面;如无这样的页面存在,则选择最长时间不需要访问的页面。于所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。

2.先进先出置换算法(FIFO):是最简单的页面置换算法。这种算法的基本思想是:当需要淘汰一个页面时,总是选择驻留主存时间最长的页面进行淘汰,即先进入主存的页面先淘汰。其理由是:最早调入主存的页面不再被使用的可能性最大。

3.最近最久未使用(LRU)算法:这种算法的基本思想是:利用局部性原理,根据一个作业在执行过程中过去的页面访问历史来推测未来的行为。它认为过去一段时间里不曾被访问过的页面,在最近的将来可能也不会再被访问。所以,这种算法的实质是:当需要淘汰一个页面时,总是选择在最近一段时间内最久不用的页面予以淘汰。

题目:

编写一个程序,实现本章所述的FIFO、LRU和最优页面置换算法。首先,生成一个随机的页面引用串,其中页码范围为0-9.将这个随机页面引用串应用到每个算法,并记录每个算法引起的缺页错误的数量。实现置换算法,一遍页面帧的数量可以从1~7。

#include

#include

#include

int numbers[20]={7,0,1,2,

0,3,0,4,

2,3,0,3,

2,1,2,0,

1,7,0,1};//本地数据,与课本一致,方便测试

int nums=0;//输入栈的个数,为了方便使用,

int stack[20][7]={10};

void begin();

void randomnum();//用于产生随机数

void init();//初始化

void FIFO();//FIFO算法

void LRU();//LRU算法

void OPT();//最优页面置换算法(OPT)

void print();//输出

int main() {

begin();

FIFO();

LRU();

OPT();

return 0;

}

void begin()//开始菜单界面

{

int i,j,k;

printf("请输入页面帧的数量(1-7):");

scanf("%d",&nums);

for(k=0;;k++)

{

printf("是否使用随机数产生输入串(0:是,1:否)");

scanf("%d",&j);

if(j==0)

{

randomnum();

break;

}

else if(j==1)

{

break;

}

else

{

printf("请输入正确的选择!\n");

}

}

printf("页面引用串为:\n");

for(i=0;i<20;i++)

{

printf("%d ",numbers[i]);

}

printf("\n");

init();

}

void randomnum()//如果需要使用随机数生成输入串,调用该函数

{

srand(time(0));//设置时间种子

for(int i = 0; i < 20; i++) {

numbers[i] = rand() % 10;//生成区间0`9的随机页面引用串

}

}

void init()//用于每次初始化页面栈中内容,同时方便下面输出的处理

{

int i,j;

for(i=0;i<20;i++)

for(j=0;j

stack[i][j]=10;

}

void print()//输出各个算法的栈的内容

{

int i,j;

for(i=0;i

{

for(j=0;j<20;j++)

{

if(stack[j][i]==10)

printf("* ");

else

printf("%d ",stack[j][i]);

}

printf("\n");

}

}

void FIFO()//FIFO算法

{

init();

int i,j=1,n=20,k,f,m;

stack[0][0]=numbers[0];

for(i=1;i<20;i++)

{

f=0;

for(m=0;m

{

stack[i][m]=stack[i-1][m];

}

for(k=0;k

{

if(stack[i][k]==numbers[i])

{

n--;

f=1;

break;

}

}

if(f==0)

{

stack[i][j]=numbers[i];

j++;

}

if(j==nums)

j=0;

}

printf("\n");

printf("FIFO算法:\n");

print();

printf("缺页错误数目为:%d\n",n);

}

void LRU()//LRU算法

{

int i,j,m,k,sum=1;

int sequence[7]={0};//记录序列

init();

stack[0][0]=numbers[0];

sequence[0]=nums-1;

for(i=1;i

{

for(j=0;j

{

stack[i][j]=stack[i-1][j];

}

for(j=0;j

{

if(sequence[j]==0)

{

stack[i][j]=numbers[i];

break;

}

}

for(j=0;j

{

sequence[j]--;

}

sequence[i]=nums-1;//最近使用的优先级列为最高

sum++;

}

for(i=nums;i<20;i++)//页面不空,需要替换的情况

{

int f;

f=0;

for(j=0;j

{

stack[i][j]=stack[i-1][j];

}

for(j=0;j

{

if(stack[i][j]==numbers[i])

{

f=1;

k=j;

break;

}

}

if(f==0)//如果页面栈中没有,不相同

{

for(j=0;j

{

if(sequence[j]==0)

{

m=j;

break;

}

}

for(j=0;j

{

sequence[j]--;

}

sequence[m]=nums-1;

stack[i][m]=numbers[i];

sum++;

}

else//如果页面栈中有,替换优先级

{

if(sequence[k]==0)//优先级为最小优先序列的

{

for(j=0;j

{

sequence[j]--;

}

sequence[k]=nums-1;

}

else if(sequence[k]==nums-1)//优先级为最大优先序列的

{

//无需操作

}

else//优先级为中间优先序列的

{

for(j=0;j

{

if(sequence[k]

{

sequence[j]--;

}

}

sequence[k]=nums-1;

}

}

}

printf("\n");

printf("LRU算法:\n");

print();

printf("缺页错误数目为:%d\n",sum);

}

void OPT()//OPT算法

{

int i,j,k,sum=1,f,q,max;

int seq[7]={0};//记录序列

init();

stack[0][0]=numbers[0];

seq[0]=nums-1;

for(i=1;i

{

for(j=0;j

{

stack[i][j]=stack[i-1][j];

}

for(j=0;j

{

if(seq[j]==0)

{

stack[i][j]=numbers[i];

break;

}

}

for(j=0;j

{

seq[j]--;

}

seq[i]=nums-1;//最近使用的优先级列为最高

sum++;

}

for(i=nums;i<20;i++)//后半部分,页面栈中没有空的时候情况

{

//k=nums-1;//最近的数字的优先级

for(j=0;j

{

stack[i][j]=stack[i-1][j];

}

for(j=0;j

{

f=0;

if(stack[i][j]==numbers[i])

{

f=1;

break;

}

}

if(f==0)//页面中没有,需要替换的情况

{

for(q=0;q

{

seq[q]=20;

}

for(j=0;j

{

for(q=i+1;q<20;q++)

{

if(stack[i][j]==numbers[q])

{

seq[j]=q-i;

break;

}

}

}

max=seq[0];

k=0;

for(q=0;q

{

if(seq[q]>max)

{

max=seq[q];

k=q;

}

}

stack[i][k]=numbers[i];

sum++;

}

else

{

//页面栈中有需要插入的数字,无需变化,替换的优先级也不需要变化

}

}

printf("\n");

printf("OPT算法:\n");

print();

printf("缺页错误数目为:%d\n",sum);

}

运行结果截图:

dec4e4dba9b32beb1bba602b50b1f0e6.png

c7d35e1cb27c60283c7701d7d73e921f.png

c321f42179705ef4932393a41e84c2e6.png

这个代码能在linux上跑通的,在windows上肯定也没得问题

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持免费资源网。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值