操作系统实验三面置换算法实验报告.docx

上传人:b****8 文档编号:23756207 上传时间:2023-05-20 格式:DOCX 页数:20 大小:93.58KB
下载 相关 举报
操作系统实验三面置换算法实验报告.docx_第1页
第1页 / 共20页
操作系统实验三面置换算法实验报告.docx_第2页
第2页 / 共20页
操作系统实验三面置换算法实验报告.docx_第3页
第3页 / 共20页
操作系统实验三面置换算法实验报告.docx_第4页
第4页 / 共20页
操作系统实验三面置换算法实验报告.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

操作系统实验三面置换算法实验报告.docx

《操作系统实验三面置换算法实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统实验三面置换算法实验报告.docx(20页珍藏版)》请在冰豆网上搜索。

操作系统实验三面置换算法实验报告.docx

操作系统实验三面置换算法实验报告

实验三实验报告

实验源码:

#include"stdio.h"

#include

#include

#defineDataMax100//常量DataMax

#defineBlockNum10//常量BlockNum

intDataShow[BlockNum][DataMax];//用于存储要显示的数组

boolDataShowEnable[BlockNum][DataMax];//用于存储数组中的数据是否需要显示

intData[DataMax];//保存数据

intBlock[BlockNum];//物理块

intcount[BlockNum];//计数器

intN;//页面个数

intM;//最小物理块数

intChangeTimes;//缺页次数

voidDataInput();//输入数据的函数

voidDataOutput();//输出数据的函数

voidFIFO();//FIFO函数

voidOptimal();//Optimal函数

voidLRU();//LRU函数

intmain(intargc,char*argv[])

{

DataInput();

intmenu;

while(true)

{

printf("\n*菜单选择*\n");

printf("*******************************************************\n");

printf("*1-Optimal*\n");

printf("*2-FIFO*\n");

printf("*3-LRU*\n");

printf("*4-返回上一级*\n");

printf("*0-EXIT*\n");printf("*******************************************************\n");

scanf("%d",&menu);

switch(menu)

{

case1:

Optimal();

break;

case2:

FIFO();

break;

case3:

LRU();

break;

case0:

exit(0);

break;

case4:

system("cls");

DataInput();

break;

}

if(menu!

=1&&menu!

=2&&menu!

=3&&menu!

=0&&menu!

=4){

system("cls");

printf("\n请输入0-4之间的整数!

\n");

continue;

}

}

return0;

}

voidDataInput()

{

inti,choice;

printf("请输入最小物理块数:

");

scanf("%d",&M);

//输入最小物理块数大于数据个数

while(M>BlockNum)

{

printf("物理块数超过预定值,请重新输入:

");

scanf("%d",&M);

}

printf("请输入页面的个数:

");

scanf("%d",&N);

//输入页面的个数大于数据个数

while(N>DataMax)

{

printf("页面个数超过预定值,请重新输入:

");

scanf("%d",&N);

}

printf("请选择产生页面访问序列的方式(1.随机2.输入):

");

scanf("%d",&choice);

switch(choice)

{

case1:

//产生随机访问序列

for(i=0;i

{

Data[i]=(int)(((float)rand()/32767)*10);//随机数大小在0-9之间

}

system("cls");

//显示随机产生的访问序列

printf("\n随机产生的访问序列为:

");

for(i=0;i

{

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

}

printf("\n");

break;

case2:

//输入访问序列

printf("请输入页面访问序列:

\n");

for(i=0;i

scanf("%d",&Data[i]);

system("cls");

//显示输入的访问序列

printf("\n输入的访问序列为:

");

for(i=0;i

{

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

}

printf("\n");

break;

default:

while(choice!

=1&&choice!

=2)

{

printf("请输入1或2选择相应方式:

");

scanf("%d",&choice);

}

break;

}

}

voidDataOutput()

{

inti,j;

//对所有数据操作

for(i=0;i

{

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

}

printf("\n");

for(j=0;j

{

//对所有数据操作

for(i=0;i

{

if(DataShowEnable[j][i])

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

else

printf("");

}

printf("\n");

}

printf("缺页次数:

%d\n",ChangeTimes);

printf("缺页率:

%d%%\n",ChangeTimes*100/N);

}

//最佳置换算法

voidOptimal()

{

inti,j,k;

boolfind;

intpoint;

inttemp;//临时变量,比较离的最远的时候用

intm=1,n;

ChangeTimes=0;

for(j=0;j

{

for(i=0;i

{

DataShowEnable[j][i]=false;//初始化为false,表示没有要显示的数据

}

}

for(i=0;i

{

count[i]=0;//初始化计数器

}

//确定当前页面是否在物理块中,在继续,不在置换

///////////////////////////////////////////////////////////////////////////////////

Block[0]=Data[0];

for(i=1;m

{

intflag=1;

for(n=0;n

{

if(Data[i]==Block[n])flag=0;

}

if(flag==0)continue;

Block[m]=Data[i];

m++;

}

//////////////////////////////////////////////////////////////////////////////////

//对所有数据进行操作

for(i=0;i

{

//表示块中有没有该数据

find=false;

for(j=0;j

{

if(Block[j]==Data[i])

{

find=true;

}

}

if(find)continue;//块中有该数据,判断下一个数据

//块中没有该数据,最优算法

ChangeTimes++;//缺页次数++

for(j=0;j

{

//找到下一个值的位置

find=false;

for(k=i;k

{

if(Block[j]==Data[k])

{

find=true;

count[j]=k;

break;

}

}

if(!

find)count[j]=N;

}

//因为i是从0开始记,而BlockNum指的是个数,从1开始,所以i+1

if((i+1)>M)

{

//获得要替换的块指针

temp=0;

for(j=0;j

{

if(temp

{

temp=count[j];

point=j;//获得离的最远的指针

}

}

}

elsepoint=i;

//替换

Block[point]=Data[i];

//保存要显示的数据

for(j=0;j

{

DataShow[j][i]=Block[j];

DataShowEnable[i

(j<=i?

j:

i):

j][i]=true;//设置显示数据

}

}

//输出信息

printf("\nOptimal=>\n");

DataOutput();

}

//先进先出置换算法

voidFIFO()

{

inti,j;

boolfind;

intpoint;

inttemp;//临时变量

intm=1,n;

ChangeTimes=0;

for(j=0;j

{

for(i=0;i

{

DataShowEnable[j][i]=false;//初始化为false,表示没有要显示的数据

}

}

for(i=0;i

{

count[i]=0;//大于等于BlockNum,表示块中没有数据,或需被替换掉

//所以经这样初始化(321),每次替换>=3的块,替换后计数值置1,

//同时其它的块计数值加1,成了(132),见下面先进先出程序段

}

//确定当前页面是否在物理块中,在继续,不在置换

///////////////////////////////////////////////////////////////////////////////////

Block[0]=Data[0];

for(i=1;m

{

intflag=1;

for(n=0;n

{

if(Data[i]==Block[n])flag=0;

}

if(flag==0)continue;

Block[m]=Data[i];

m++;

}

//////////////////////////////////////////////////////////////////////////////////

//对有所数据操作

for(i=0;i

{

//增加count

for(j=0;j

{

count[j]++;

}

find=false;//表示块中有没有该数据

for(j=0;j

{

if(Block[j]==Data[i])

{

find=true;

}

}

//块中有该数据,判断下一个数据

if(find)continue;

//块中没有该数据

ChangeTimes++;//缺页次数++

//因为i是从0开始记,而M指的是个数,从1开始,所以i+1

if((i+1)>M)

{

//获得要替换的块指针

temp=0;

for(j=0;j

{

if(temp

{

temp=count[j];

point=j;//获得离的最远的指针

}

}

}

elsepoint=i;

//替换

Block[point]=Data[i];

count[point]=0;//更新计数值

//保存要显示的数据

for(j=0;j

{

DataShow[j][i]=Block[j];

DataShowEnable[i

(j<=i?

j:

i):

j][i]=true;//设置显示数据

}

}

//输出信息

printf("\nFIFO=>\n");

DataOutput();

}

//最近最久未使用置换算法

voidLRU()

{

inti,j;

boolfind;

intpoint;

inttemp;//临时变量

intm=1,n;

ChangeTimes=0;

for(j=0;j

{

for(i=0;i

{

DataShowEnable[j][i]=false;//初始化为false,表示没有要显示的数据

}

}

for(i=0;i

{

count[i]=0;//初始化计数器

}

//确定当前页面是否在物理块中,在继续,不在置换

///////////////////////////////////////////////////////////////////////////////////

Block[0]=Data[0];

for(i=1;m

{

intflag=1;

for(n=0;n

{

if(Data[i]==Block[n])flag=0;

}

if(flag==0)continue;

Block[m]=Data[i];

m++;

}

//////////////////////////////////////////////////////////////////////////////////

//对有所数据操作

for(i=0;i

{

//增加count

for(j=0;j

{

count[j]++;

}

find=false;//表示块中有没有该数据

for(j=0;j

{

if(Block[j]==Data[i])

{

count[j]=0;

find=true;

}

}

//块中有该数据,判断下一个数据

if(find)continue;

//块中没有该数据

ChangeTimes++;

//因为i是从0开始记,而BlockNum指的是个数,从1开始,所以i+1

if((i+1)>M)

{

//获得要替换的块指针

temp=0;

for(j=0;j

{

if(temp

{

temp=count[j];

point=j;//获得离的最远的指针

}

}

}

elsepoint=i;

//替换

Block[point]=Data[i];

count[point]=0;

//保存要显示的数据

for(j=0;j

{

DataShow[j][i]=Block[j];

DataShowEnable[i

(j<=i?

j:

i):

j][i]=true;//设置显示数据

}

}

//输出信息

printf("\nLRU=>\n");

DataOutput();

}

实验结果截图:

程序运行:

输入相应数据:

选择相应算法:

最佳置换算法:

先进先出算法:

最近最久未使用算法:

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1