页面置换算法模拟实验报告Word文件下载.docx

上传人:b****5 文档编号:16702504 上传时间:2022-11-25 格式:DOCX 页数:10 大小:153.48KB
下载 相关 举报
页面置换算法模拟实验报告Word文件下载.docx_第1页
第1页 / 共10页
页面置换算法模拟实验报告Word文件下载.docx_第2页
第2页 / 共10页
页面置换算法模拟实验报告Word文件下载.docx_第3页
第3页 / 共10页
页面置换算法模拟实验报告Word文件下载.docx_第4页
第4页 / 共10页
页面置换算法模拟实验报告Word文件下载.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

页面置换算法模拟实验报告Word文件下载.docx

《页面置换算法模拟实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《页面置换算法模拟实验报告Word文件下载.docx(10页珍藏版)》请在冰豆网上搜索。

页面置换算法模拟实验报告Word文件下载.docx

#definetotal_vp32//虚存页共32页

#defineclear_period50//访问次数清零周期

typedefstruct{//定义页表结构类型(页面映射表PMT)

intpn,pfn,counter,time;

//页号、页框号(块号)、一个周期内访问该页面的次数、访问时间

}PMT;

PMTpmt[32];

typedefstructpfc_struct{//页面控制结构

intpn,pfn;

structpfc_struct*next;

}pfc_type;

pfc_typepfc[32];

pfc_type*freepf_head,*busypf_head,*busypf_tail;

//空闲页头指针,忙页头指针,忙页尾指针

intNoPageCount;

//缺页次数

inta[total_instruction];

//指令流数组

intpage[total_instruction],offset[total_instruction];

//每条指令的页和页内偏移

voidinitialize(int);

voidFIFO(int);

//先进先出

voidLRU(int);

//最近最久未使用

voidNRU(int);

//最近最不经常使用

/****************************************************************************

main()

*****************************************************************************/

voidmain(){

inti,s;

//srand(10*getpid());

//用进程号作为初始化随机数队列的种子//Linux版

srand(10*GetCurrentProcessId());

//用进程号作为初始化随机数的种子//Windows版

s=rand()%320;

//在[0,319]的指令地址之间随机选取一起点m

for(i=0;

i<

total_instruction;

i+=4){//产生指令队列

if(s<

0||s>

319){

printf("

wheni==%d,error,s==%d\n"

i,s);

exit(0);

}

a[i]=s;

//任意选一指令访问点m。

(将随机数作为指令地址m)

a[i+1]=a[i]+1;

//顺序执行下一条指令

a[i+2]=rand()%(s+2);

//在[0,m+1]的前地址之间随机选取一地址,记为m'

a[i+3]=a[i+2]+1;

//顺序执行一条指令

s=a[i+2]+(int)rand()%(320-a[i+2]);

//在[m'

,319]的指令地址之间随机选取一起点m

if((a[i+2]>

318)||(s>

319))printf("

a[%d+2,anumberwhichis:

%dands=%d\n"

i,a[i+2],s);

}

i++){//将指令序列变成页地址流

page[i]=a[i]/10;

offset[i]=a[i]%10;

for(i=4;

=32;

i++){//内存块分别为4块、5块、...32块时的命中率

printf("

%2dpageframes"

i);

FIFO(i);

//计算用FIFO置换时,有i个内存块时的命中率

LRU(i);

NRU(i);

\n"

);

}

/***************************************************************************

initialize()

形参:

内存块数

功能:

初始化

voidinitialize(inttotal_pf)//初始化相关数据结构,形参total_pf是用户进程的内存页面数

{

inti;

NoPageCount=0;

//缺页次数,初始化为0

total_vp;

i++){

pmt[i].pn=i;

//填逻辑页号

pmt[i].pfn=INVALID;

//物理页面号为-1

pmt[i].counter=0;

//置页面控制结构中的访问次数为0

pmt[i].time=-1;

//置页面控制结构中的时间为-1

total_pf-1;

i++){//建立pfc[i-1]和pfc[i]之间的连接

pfc[i].next=&

pfc[i+1];

pfc[i].pfn=i;

pfc[total_pf-1].next=NULL;

pfc[total_pf-1].pfn=total_pf-1;

freepf_head=&

pfc[0];

//页面队列的头指针为pfc[0]

/*****************************************************************************

FIFO算法

输出:

命中率

voidFIFO(inttotal_pf)//形参total_pf是用户进程的内存页面数

pfc_type*p;

initialize(total_pf);

//初始化相关数据结构

busypf_head=busypf_tail=NULL;

i++){//访问每条指令

if(pmt[page[i]].pfn==INVALID){//缺页

NoPageCount+=1;

//失效(缺页)次数增1

if(freepf_head==NULL){//无空闲页面

p=busypf_head->

next;

pmt[busypf_head->

pn].pfn=INVALID;

freepf_head=busypf_head;

//释放忙页面队列的第一个页面

freepf_head->

next=NULL;

busypf_head=p;

}

p=freepf_head->

//按FIFO方式调新页面入内存

freepf_head->

pn=page[i];

pmt[page[i]].pfn=freepf_head->

pfn;

if(busypf_tail==NULL)busypf_head=busypf_tail=freepf_head;

else{

busypf_tail->

next=freepf_head;

//free页面减少一个

busypf_tail=freepf_head;

freepf_head=p;

}

printf("

FIFO:

%6.4f"

1-(float)NoPageCount/320);

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

voidLRU(inttotal_pf)//形参total_pf是给用户进程的内存块数

intmin,minj,i,j,present_time;

present_time=0;

if(pmt[page[i]].pfn==INVALID){//页面失效

NoPageCount++;

min=32767;

for(j=0;

j<

j++)//找出time的最小值

if(min>

pmt[j].time&

&

pmt[j].pfn!

=INVALID){

min=pmt[j].time;

minj=j;

}

freepf_head=&

pfc[pmt[minj].pfn];

//腾出一个单元

pmt[minj].pfn=INVALID;

pmt[minj].time=-1;

//有空闲页面,改为有效

pmt[page[i]].time=present_time;

freepf_head=freepf_head->

//减少一个free页面

elsepmt[page[i]].time=present_time;

//更新该页面的访问时间(并非真的时间,而是循环次数,每执行一条指令,时间加1)

present_time++;

//当前时间加1

LRU:

NRU算法(最近最不经常使用)

voidNRU(inttotal_pf)

inti,j,dp,cont_flag,old_dp;

dp=0;

if(freepf_head==NULL){//无空闲页面

cont_flag=TRUE;

old_dp=dp;

while(cont_flag)

if(pmt[dp].counter==0&

pmt[dp].pfn!

=INVALID)

cont_flag=FALSE;

else{

dp++;

if(dp==total_vp)

dp=0;

if(dp==old_dp)

for(j=0;

j++)

pmt[j].counter=0;

pfc[pmt[dp].pfn];

pmt[dp].pfn=INVALID;

else

pmt[page[i]].counter=1;

if(i%clear_period==0)

for(j=0;

pmt[j].counter=0;

NUR:

实验结果(写出结果,截图也可)

总结(收获,未实现的步骤)

这次操作系统课程设计,让我们对操作系统有了更深的认识,首先操作系统是一管理电脑硬件与软件资源的程序,同时也是计算机系统内核与基石。

操作系统是一个庞大的管理控制程序,大致包括5个方面的管理功能:

进程与处理机管

理、作业管理、存储管理、设备管理、文件管理。

我们这次课程设计的题目是页面置换算法,是属于存储器管理。

在进程运行过程中,若其访问的页面不在内存而需把它们调入内存,但内存以无空闲空间时,为了保证该进程能正常的运行,系统必须从内存中调出一页程序或数据送磁盘的兑换区中,但应将哪个页面调出,需根据一定的算法来确定。

通常,把选择换成页面的算法称为页面置换算法。

通过本次课程设计,我们对页面置换算法的了解更加的深刻。

主要有以下置换算法:

OPT(最佳置换算法)、FIFO(先进先出置换算法)、LRU(最近最久未使用算法)。

每种算法都有各自的优缺点,OPT算法是实际中不能实现的,但是可以利用该算法去评价其它算法;

FIFO算法与进程实际运行的规律不相适用,因为在进程中,有些页面经常被访问;

LRU算法是根据页面调入内存后的使用情况进行决策的。

在这次课程设计中,遇到了一些困难,例如怎么实现各种算法,如何进行函数调用及对数据的限制操作等,在遇到这些困难的时候,我们会去查阅资料,仔细看书,尝试用不同的方法解决,在各种方法中选择一种最好的方法,有的时候会碰到不知道如何实现的函数,我们会查看MSDN,这次是用的C++语言做的,每一步都是自己独立完成的,这次课程设计我最大的收获是学以致用,通过这次设计我们看到了自己学习的能力,我们相信在以后的学习中,会更加的努力上进。

最后,还非常感谢辛苦的操作系统老师,首先,因为他辛苦的为我们讲解操作系统这门课,让我们对操作系统有了一定的了解,为这次课程设计奠定了良好的基础,其次,还要感谢他认真指导我们的这次课程设计,给了我们这次总体运用自己能力的机会,我们坚信:

只要功夫深,铁杵磨成针。

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

当前位置:首页 > 小学教育 > 语文

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

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