操作系统页面置换算法代码doc.docx

上传人:b****6 文档编号:8314268 上传时间:2023-01-30 格式:DOCX 页数:23 大小:305.54KB
下载 相关 举报
操作系统页面置换算法代码doc.docx_第1页
第1页 / 共23页
操作系统页面置换算法代码doc.docx_第2页
第2页 / 共23页
操作系统页面置换算法代码doc.docx_第3页
第3页 / 共23页
操作系统页面置换算法代码doc.docx_第4页
第4页 / 共23页
操作系统页面置换算法代码doc.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

操作系统页面置换算法代码doc.docx

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

操作系统页面置换算法代码doc.docx

操作系统页面置换算法代码doc

通达学院

课程设计I报告

(2018/2019学年第2学期)

题目:

页面置换算法

专业

计算机科学与技术

学生姓名

班级学号

指导教师

指导单位

计算机学院

日期

2019.5.13-5.23

指导教师成绩评定表

学生姓名

班级学号

专业

计算机科学与技术

评分内容

评分标准

优秀

良好

中等

平时成绩

认真对待课程设计,遵守实验室规定,上机不迟到早退,不做和设计无关的事

设计成果

设计的科学、合理性

功能丰富、符合题目要求

界面友好、外观漂亮、大方

程序功能执行的正确性

程序算法执行的效能

设计报告

设计报告正确合理、反映系统设计流程

文档内容详实程度

文档格式规范、排版美观

验收答辩

简练、准确阐述设计内容,能准确有条理回答各种问题,系统演示顺利。

评分等级

指导教师

简短评语

指导教师签名

日期

备注

评分等级有五种:

优秀、良好、中等、及格、不及格

页面置换算法

一、课题内容和要求

通过实现页面置换的四种算法,理解虚拟存储器的概念、实现方法,页面分配的总体原则、进程运行时系统是怎样选择换出页面的,并分析四种不同的算法各自的优缺点是哪些。

以下算法都要实现:

1)最佳置换算法(OPT):

将以后永不使用的或许是在最长(未来)时间内不再被访问的页面换出。

2)先进先出算法(FIFO):

淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。

3)最近最久未使用算法(LRU):

淘汰最近最久未被使用的页面。

4)最不经常使用算法(LFU)

设计要求:

1、编写算法,实现页面置换算法;

2、针对内存地址引用串,运行页面置换算法进行页面置换;

3、算法所需的各种参数由输入产生(手工输入或者随机数产生);

4、输出内存驻留的页面集合,缺页次数以及缺页率;

二、需求分析

通过这次实验,加深对虚拟内存页面置换概念的理解,进一步掌握先进先出FIFO、最佳置换OPI和最近最久未使用LRU页面置换算法及最不经常使用算法LFU的实现方法。

通过已知最小物理块数、页面个数、页面访问序列、及采用置换方式可以得出页面置换的缺页次数和缺页率,及每次缺页时物理块中存储!

(1) 输入的形式页面序列

物理块数、页面数、页面序列

(2) 输出的形式

驻留页面集合、缺页数、缺页率

注:

如果命中用*表示,为空用-1表示

(3)程序所能达到的功能

模拟先进先出FIFO、最佳置换OPI、最近最久未使用LRU页面置换算法和最不经常使用算法LFU的工作过程。

假设内存中分配给每个进程的最小物理块数为m,在进程运行过程中要访问的页面个数为n,页面访问序列为P1, …,Pn,分别利用不同的页面置换算法调度进程的页面访问序列,给出页面访问序列的置换过程,计算每种算法缺页次数和缺页率。

测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。

三、概要设计

说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。

intmSIZE;/*物理块数*/

intpSIZE;/*页面号引用串个数*/

staticintmemery[10]={0};/*物理块中的页号*/

staticintpage[100]={0};/*页面号引用串*/

staticinttemp[100][10]={0};/*辅助数组*/

/*置换算法函数*/

voidFIFO();

voidLRU();

voidOPT();

voidLFU();

/*输出格式控制函数*/

voidprint(unsignedintt);

流程图如下:

图1

FIFO算法是最简单的页面置换算法。

FIFO页面置换算法为每个页面记录了调到内存的时间,当必须置换页面时会选择最旧的页面。

注意,并不需要记录调入页面的确切时间,可以定义一个数,来管理所有的内存页面。

置换是队列的首个页面。

然后加1,当这个数达到物理块数的值了,清零从头开始。

LRU使用最近的过去作为不远将来的近似,那么可以置换最长时间没有使用的页。

这种方法称为最近最少使用算法。

LRU置换将每个页面与它的上次使用的时间关联起来。

当需要置换页面时,LRU选择最长时间没有使用的页面。

这种策略可当作在时间上向后看而不是向前看的最优页面置换

OPT是用一维数组page[]存储页面号序列,memery[]是存储装入物理块中的页面。

数组next[]记录物理块中对应页面的最后访问时间。

每当发生缺页时,就从物理块中找出最后访问时间最大的页面,调出该页,换入所缺的页面。

若物理块中的页面都不再使用,则每次都置换物理块中第一个位置的页面。

LFU是用一个一维数组time[]记录每个物理块被访问的次数,当物理块满且发生

置换的时候,将最小的time数组上位置的数置换出来,如果一样就置换第一个数。

四、详细设计

1、输出格式控制函数:

voidprint(unsignedintt)

{

inti,j,k,l;

intflag;

for(k=0;k<=(pSIZE-1)/30;k++)//k为行数

{

for(i=30*k;(i

{

if(((i+1)%30==0)||(((i+1)%30)&&(i==pSIZE-1)))

printf("%d\n",page[i]);

else

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

}

for(j=0;j

{

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

{

if(i>=j)//物理块未占满的情况

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

else

printf("||");

}

for(i=2+30*k;(i

{

for(flag=0,l=0;l

if(temp[i][l]==temp[i-1][l])

flag++;

if(flag==mSIZE)/*页面在物理块中*/

printf("|*|");

else

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

}

if(i%30==0)

continue;

printf("\n");

}

}

printf("----------------------------------------\n");

printf("缺页次数:

%d\t\t",t);

printf("缺页率:

%.2f%%\n",(float)t/pSIZE*100);

printf("----------------------------------------\n");

}

2、FIFO算法:

voidFIFO()

{

intmemery[10]={-1,-1,-1,-1,-1};

inti,j,k,m;

intmax=0;/*记录换出页*/

intcount=0;/*记录置换次数*/

for(i=0;i

{

/*判断新页面号是否在物理块中*/

for(j=0,k=0;j

{

if(memery[j]!

=page[i])

k++;

}

if(k==mSIZE)/*如果不在物理块中*/

{

count++;

/*计算换出页*/

memery[max]=page[i];

max++;

if(max==mSIZE)

{

max=0;

}

}

for(j=0;j

temp[i][j]=memery[j];

}

printf("FIFO算法:

");

print(count);

}

3、LRU算法:

voidLRU()

{

intmemery[10]={-1,-1,-1,-1,-1};

intflag[10]={0};/*记录页面的访问时间*/

inti,j,k,m,c=0;

intmax=0;/*记录换出页*/

intcount=0;/*记录置换次数*/

for(i=0;i

{

/*判断新页面号是否在物理块中*/

for(j=0,k=0;j

{

if(memery[j]!

=page[i])

k++;

else

flag[j]=i;/*刷新该页的访问时间*/

}

if(k==mSIZE)/*如果不在物理块中*/

{

count++;

/*计算换出页*/

if(memery[mSIZE-1]==0)

{

memery[c]=page[i];

flag[c]=i;

c++;

}

else

{

max=flag[0]

0:

1;

for(m=2;m

{

if(flag[m]

max=m;

memery[max]=page[i];

flag[max]=i;/*记录该页的访问时间*/

}

}

}

for(j=0;j

temp[i][j]=memery[j];

}

printf("LRU算法:

");

print(count);

}

4、OPT算法:

voidOPT()

{

intmemery[10]={-1,-1,-1,-1,-1};

intnext[10]={0};/*记录下一次访问时间*/

inti,j,k,l,m,c=0;

intmax;/*记录换出页*/

intcount=0;/*记录置换次数*/

for(i=0;i

{

/*判断新页面号是否在物理块中*/

for(j=0,k=0;j

{

if(memery[j]!

=page[i])

k++;

}

if(k==mSIZE)/*如果不在物理块中*/

{

count++;

if(memery[mSIZE-1]==0)

{

memery[c]=page[i];

c++;

}

else

{

/*得到物理快中各页下一次访问时间,l最大的被替换*/

for(m=0;m

{

for(l=i+1;l

if(memery[m]==page[l])

break;

next[m]=l;

}

/*计算换出页*/

max=next[0]>=next[1]?

0:

1;

for(m=2;m

if(next[m]>next[max])

max=m;

memery[max]=page[i];

}

}

for(j=0;j

temp[i][j]=memery[j];

}

printf("OPT算法:

");

print(count);

}

5、LFU算法:

voidLFU()

{

intmemery[10]={-1,-1,-1,-1,-1};

inttime[10]={0};/*记录访问次数*/

inti,j,k,l,m,c=0;

intmax;/*记录换出页*/

intcount=0;/*记录置换次数*/

for(i=0;i

{

/*判断新页面号是否在物理块中*/

for(j=0,k=0;j

{

if(memery[j]!

=page[i])

k++;

else

time[j]++;

}

if(k==mSIZE)/*如果不在物理块中*/

{

count++;

if(memery[mSIZE-1]==0)

{

memery[c]=page[i];

time[c]++;

c++;

}

else

{

/*计算换出页,次数少的被置换*/

max=time[0]<=time[1]?

0:

1;

for(m=2;m

if(time[m]

max=m;

memery[max]=page[i];

}

}

for(j=0;j

temp[i][j]=memery[j];

}

printf("LFU算法:

");

print(count);

}

五、测试数据及其结果分析

测试数据:

(1)页面个数:

10 最小物理块数:

页面序列:

1212682413

(2)页面个数:

20 最小物理块数:

页面序列:

70120304230321201701

数据一截图:

图2

图3

数据二截图:

图4

图5

六、调试过程中的问题

(1)算法缺陷问题

1、原来代码规定了前mSIZE个数据是直接放入数组的,但是通过多组数据的测试发现当前mSIZE个数据中有重复的数据时,算法并不能判定命中,而是判定缺页,这显然是错误的。

于是重新思考数据放入问题,认为只有第一个数据可以直接放入,从第二个开始就要进行循环判断,于是对四项算法进行改进,加入一个物理块数组最后一个值是否为初始值的判断条件进行循环解决了问题。

2、最初物理块数组的初始值是定为0,之前是通过判断物理块数组的最后一个值是否为初值判断是否进行置换的,但是当数据中有0值就会干扰这个判断条件,思考页面号为0也是客观存在的,所以这又是一个bug。

然后我就令初值为-1,页面号为负当然是不可能的,可是当我把赋值0改为-1,再运行时,又出现两个算法计算出错。

经过多次排查,我认为算法主体是正确的,最终发现是因为赋初始值出错的问题。

因为赋0时,数组整体都为0,但赋-1时只是第一个数据是-1,而不是数组全体。

这是一个低级错误,最后我通过对数组全体赋值-1解决了问题。

(2)输出界面问题

输出界面我是通过一个输出格式控制函数来控制,这方面的问题比较难以发现,因为输出结果出错,我一般对算法函数进行排查,忽略了输出控制函数。

1、一开始如果命中我是用空格来代替,发现并不直观。

于是我将空格改为|*|,这样既和数据集合统一了,观察也更加直观。

还有就是物理块未被全部占用时,页面集合会有-1产生,虽说是正确的,但我觉得不太美观,于是我加了一段代码,把-1用||代替,这样看上去就能知道物理块未被全部占用。

2、当页面号数过大时,输出的页面集合缺失,经过查找错误,发现是换行控制条件有问题,经过增加换行的列数解决了这个问题。

七、参考文献和查阅的资料

1、(C语言中文网)

2、《操作系统教程》人民邮电出版社

八、程序设计总结

这个程序的主要思想就是要实现换页、怎么样输出淘汰的序列、计算缺页次数和缺页率。

在程序中主要就是将在访问串中将来再也不出现的或是在离当前最远的位置上出现的页淘汰掉。

当距离相等的时候就比较使用的次数,淘汰使用次数较少的那页。

该过程共有四个页面置换算法函数及输出格式控制的函数,当主函数调用任意其中函数时来实现其算法。

通过这次课程设计的实践,我能够熟练的掌握一些关于内存分配管理的一些算法。

而在实现FIFO算法后,由于没能掌握LRU算法的过程导致实现时花了很多时间。

在调试的过程中也出现的大多是关于内存分配和数组地址越界的问题,比如关于循环时各个数的递增,还有就是显示给个数组的内容等问题。

就因为这些问题,多次造成了淘汰序列出错。

在以后的实验中我会注意的。

本次实验我也更加体会到模块化的重要性,当输出出错时,逐模块排查不仅提高了效率,也节省了精力。

九、源代码附录

#include

#include

intmSIZE;/*物理块数*/

intpSIZE;/*页面号引用串个数*/

staticintmemery[10]={0};/*物理块中的页号*/

staticintpage[100]={0};/*页面号引用串*/

staticinttemp[100][10]={0};/*辅助数组*/

/*置换算法函数*/

voidFIFO();

voidLRU();

voidOPT();

voidLFU();

/*输出格式控制函数*/

voidprint(unsignedintt);

voidmain()

{

inti,k;

system("color0E");

printf("请输入物理块数(M<=10):

");

scanf("%d",&mSIZE);

printf("请输入页面号数(P<=100):

");

scanf("%d",&pSIZE);

puts("请依次输入页面号引用串(连续输入,无需隔开):

");

for(i=0;i

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

system("cls");

system("color0F");

FIFO();

LRU();

OPT();

LFU();

}

voidprint(unsignedintt)

{

inti,j,k,l;

intflag;

for(k=0;k<=(pSIZE-1)/30;k++)//k为行数

{

for(i=30*k;(i

{

if(((i+1)%30==0)||(((i+1)%30)&&(i==pSIZE-1)))

printf("%d\n",page[i]);

else

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

}

for(j=0;j

{

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

{

if(i>=j)//物理块未占满的情况

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

else

printf("||");

}

for(i=2+30*k;(i

{

for(flag=0,l=0;l

if(temp[i][l]==temp[i-1][l])

flag++;

}

if(flag==mSIZE)/*页面在物理块中*/

printf("|*|");

else

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

}

if(i%30==0)

continue;

printf("\n");

}

}

printf("----------------------------------------\n");

printf("缺页次数:

%d\t\t",t);

printf("缺页率:

%.2f%%\n",(float)t/pSIZE*100);

printf("----------------------------------------\n");

}

/*先进先出页面置换算法*/

voidFIFO()

{

intmemery[10]={-1,-1,-1,-1,-1};

inti,j,k,m;

intmax=0;/*记录换出页*/

intcount=0;/*记录置换次数*/

for(i=0;i

{

/*判断新页面号是否在物理块中*/

for(j=0,k=0;j

{

if(memery[j]!

=page[i])

k++;

}

if(k==mSIZE)/*如果不在物理块中*/

{

count++;

/*计算换出页*/

memery[max]=page[i];

max++;

if(max==mSIZE)

{

max=0;

}

}

for(j=0;j

temp[i][j]=memery[j];

}

printf("FIFO算法:

");

print(count);

}

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

voidLRU()

{

intmemery[10]={-1,-1,-1,-1,-1};

intflag[10]={0};/*记录页面的访问时间*/

inti,j,k,m,c=0;

intmax=0;/*记录换出页*/

intcount=0;/*记录置换次数*/

for(i=0;i

{

/*判断新页面号是否在物理块中*/

for(j=0,k=0;j

{

if(memery[j]!

=page[i])

k++;

else

flag[j]=i;/*刷新该页的访问时间*/

}

if(k==mSIZE)/*如果不在物理块中*/

{

count++;

/*计算换出页*/

if(memery[mSIZE-1]==-1)

{

memery[c]=page[i];

flag[c]=i;

c++;

}

else

{

max=flag[0]

0:

1;

for(m=2;m

{

if(flag[m]

max=m;

memery[max]=page[i];

flag[max]=i;/*记录该页的访问时间*/

}

}

}

for(j=0;j

temp[i][j]=memery[j];

}

printf("LRU算法:

");

print(count);

}

voidOPT()

{

intmemery[10]={-1,-1,-1,-1,-1};

intnext[10]={0};/*记录下一次访问时间*/

inti,j,k,l,m,c=0;

intmax;/*记录换出页*/

intcount=0;/*记录置换次数*/

for(i=0;i

{

/*判断新页面号是否在物理块中*/

for(j=0,k=0;j

{

if(memery[j]!

=page[i])

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

当前位置:首页 > 表格模板 > 合同协议

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

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