页面置换Word下载.docx

上传人:b****5 文档编号:19062777 上传时间:2023-01-03 格式:DOCX 页数:12 大小:97.76KB
下载 相关 举报
页面置换Word下载.docx_第1页
第1页 / 共12页
页面置换Word下载.docx_第2页
第2页 / 共12页
页面置换Word下载.docx_第3页
第3页 / 共12页
页面置换Word下载.docx_第4页
第4页 / 共12页
页面置换Word下载.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

页面置换Word下载.docx

《页面置换Word下载.docx》由会员分享,可在线阅读,更多相关《页面置换Word下载.docx(12页珍藏版)》请在冰豆网上搜索。

页面置换Word下载.docx

本设计利用C语言的结构体来描述虚页和实页的结构。

pn

pfn

time

next

虚页结构实页结构

在虚页结构中,pn代表虚页号,因为共10个虚页,所以pn的取值范围是0—9。

pfn代表实页号,当一虚页未装入实页时,此项值为-1;

当该虚页已装入某一实页时,此项值为所装入的实页的实页号pfn。

time项在FIFO算法中不使用,在LRU中用来存放对该虚页的最近访问时间。

在实页结构中中,pn代表虚页号,表示pn所代表的虚页目前正放在此实页中。

pfn代表实页号,取值范围(0—n-1)由动态指派的实页数n所决定。

next是一个指向实页结构体的指针,用于多个实页以链表形式组织起来,关于实页链表的组织详见下面第4点。

2.关于缺页次数的统计

为计算命中率,需要统计在20次的虚页访问中命中的次数。

为此,程序应设置一个计数器count,来统计虚页命中发生的次数。

每当所访问的虚页的pfn项值不为-1,表示此虚页已被装入某实页内,此虚页被命中,count加1。

最终命中率=count/20*100%。

3.LRU算法中“最近最久未用”页面的确定

为了能找到“最近最久未用”的虚页面,程序中可引入一个时间计数器countime,每当要访问一个虚页面时,countime的值加1,然后将所要访问的虚页的time项值设置为增值后的当前countime值,表示该虚页的最后一次被访问时间。

当LRU算法需要置换时,从所有已分配实页的虚页中找出time值为最小的虚页就是“最近最久未用”的虚页面,应该将它置换出去。

4.算法中实页的组织

因为能分配的实页数n是在程序运行时由用户动态指派的,所以应使用链表组织动态产生的多个实页。

为了调度算法实现的方便,可以考虑引入free和busy两个链表:

free链表用于组织未分配出去的实页,首指针为free_head,初始时n个实页都处于free链表中;

busy链表用于组织已分配出去的实页,首指针为busy_head,尾指针为busy_tail,初始值都为null。

当所要访问的一个虚页不在实页中时,将产生缺页中断。

此时若free链表不为空,就取下链表首指针所指的实页,并分配给该虚页。

若free链表为空,则说明n个实页已全部分配出去,此时应进行页面置换:

对于FIFO算法要将busy_head所指的实页从busy链表中取下,分配给该虚页,然后再将该实页插入到busy链表尾部;

对于LRU算法则要从所有已分配实页的虚页中找出time值为最小的虚页,将该虚页从装载它的那个实页中置换出去,并在该实页中装入当前正要访问的虚页。

三、主要程序清单

#include<

iostream>

#include<

cmath>

usingnamespacestd;

#defineM20

structVP//虚页数据结构

{

intpn;

//虚页号

intpfn;

//实页号

inttime;

//对虚页最近访问时间

}VP[10];

structRP//实页数据结构

structRP*next;

//

}RP[10];

inta[M];

intcount=0;

intcounttime=0;

intMemoryStatus[10][M];

intNotInMemory[M];

structRP*Free,*Free_head,*Busy,*Busy_tail,*Busy_head,*temp;

voidinit(intn)

inti,j;

for(i=0;

i<

10;

i++)//虚页初始化

{

VP[i].pn=i;

VP[i].pfn=-1;

VP[i].time=0;

}

n;

i++)

RP[i].pfn=i;

RP[i].pn=-1;

RP[i].next=NULL;

}

Free=&

RP[0];

Free->

next=&

RP[1];

for(i=1;

n-1;

RP[i].next=&

RP[i+1];

RP[n-1].next=NULL;

Free_head=Free;

Busy=NULL;

Busy_head=NULL;

Busy_tail=NULL;

for(j=0;

j<

M;

j++)

{

MemoryStatus[i][j]=-1;

}

NotInMemory[i]=1;

}

voidfifo(intn)

inti,j,k,currentpage;

i++)

currentpage=a[i];

if(VP[currentpage].pfn!

=-1)

for(j=0;

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

}

NotInMemory[i]=0;

else

count=count+1;

if(Free!

=NULL)

{

temp=Free_head;

Free_head=Free_head->

next;

Free=Free_head;

VP[currentpage].pfn=temp->

pfn;

temp->

pn=currentpage;

next=NULL;

if(Busy==NULL)

{

Busy=temp;

Busy_head=Busy;

Busy_tail=Busy;

}

else

Busy_tail->

next=temp;

Busy_tail=temp;

for(k=0;

k<

k++)

MemoryStatus[k][i]=MemoryStatus[k][i-1];

MemoryStatus[temp->

pfn][i]=currentpage;

else

temp=Busy;

Busy_head=Busy->

Busy=Busy_head;

VP[temp->

pn].pfn=-1;

Busy_tail->

Busy_tail=temp;

voidlru(intn)

count=0;

intmin,y;

intcounttime=0;

{

counttime++;

VP[currentpage].time=counttime;

=-1)

VP[currentpage].time=counttime;

else

count++;

=NULL)

}

else

min=30;

for(j=0;

j++)

if(VP[j].pfn!

=-1&

&

min>

VP[j].time)

{

min=VP[j].time;

y=j;

}

Free_head=&

RP[VP[y].pfn];

VP[y].pfn=-1;

Free_head->

VP[currentpage].pfn=Free_head->

VP[currentpage].time=counttime;

Free=Free_head->

for(k=0;

{

MemoryStatus[k][i]=MemoryStatus[k][i-1];

}

MemoryStatus[Free_head->

voidprint(intn)

{

doublef;

if(NotInMemory[j]==1)

printf("

|%3d"

MemoryStatus[i][j]);

|%3c"

32);

printf("

\n缺页数为:

%3d"

count);

f=count/20.0*100;

cout<

<

endl;

"

缺页率:

f<

%"

voidmain()

intn,i;

请输入实页数:

;

cin>

>

a[i]=rand()%10;

cout<

|"

a[i];

init(n);

FIFO置换算法:

fifo(n);

print(n);

LRU置换算法:

lru(n);

四、程序运行结果

五、实验体会

本次实验原理很容易理解,但是编码实现有点难度,先进先出算法实现比较简单,之前编好了。

但是,和老师给的输出示例有点不同,然后有改了一下。

在实现了先进先出算法后,编写最近最久为使用算法感觉比较简单,但是实现的时候比较纠结。

counttime变量我把他放到lru(intn)函数的if(Free==NULL)条件中了,结果置换的时候老是错位,纠结了好久。

没办发用挑食才找出这个问题。

总的来说,这次遇到的问题在一次体醒了我,写代码时逻辑要足够的清晰。

还有在将两种算法封装后在主函数中调用时lru算法总是不能输出想要的结果。

但是,单独运行lru算法输出的结果又是正确的。

经过反复测试,发现在调用lru时,NotInMemory[],MemoryStatus[][]以及count的值都因为之前调用过fifo算法而改变了。

所以在调用fifo算法之后调用lru算法,输出的结果有错误。

因此,我在调用fifo算法和调用lru算法之间加了初始化函数,这样运行结果就OK了。

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

当前位置:首页 > 初中教育 > 学科竞赛

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

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