存储管理模拟实现Word格式.docx
《存储管理模拟实现Word格式.docx》由会员分享,可在线阅读,更多相关《存储管理模拟实现Word格式.docx(24页珍藏版)》请在冰豆网上搜索。
F.重复A—E,直到执行320次指令。
2.指令序列变换成页地址流
设:
(1)页面大小为1K;
(2)用户内存容量为4页到32页;
(3)用户虚存容量为32K。
在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:
第0条—第9条指令为第0页(对应虚存地址为[0,9]);
第10条—第19条指令为第1页(对应虚存地址为[10,19]);
。
。
第310条—第319条指令为第31页(对应虚存地址为[310,319]);
按以上方式,用户指令可组成32页。
3.计算并输出下述各种算法在不同内存容量下的命中率。
A.FIFO先进先出的算法
B.LRU最近最少使用算法
C.LFU最少访问页面算法
三、实验要求
1、需写出设计说明;
2、设计实现代码及说明
3、运行结果;
四、主要实验步骤
1、分析算法结构;
画出算法的流程图,即设计说明;
根据画出的流程图使用C语言编写相应的代码(代码过长,放到最后);
程序主要由main函数和以下几个函数组成:
voidinitialization();
初始化内存数据
voidFIFO();
FIFO先进先出算法;
voidLRU();
LRU最久未使用算法;
voidLFU();
LFU最近最久未使用算法:
流程图如下:
页面置换算法整体结构
FIFO页面置换算法
LRU页面置换算法
LFU页面置换算法
2、设计说明及源代码
FIFO算法设计说明:
按照所要求的产生随机指令序列,存放在order[320]这个数组中。
通过循环产生这些随机指令,每产生一条都要进行下列判断:
是否和内存中即mem
_volume[4]中存放的页面相同,如果相同则不做任何操作,如果不相同,则产生缺页,相应的缺页次数加一,按照fcfs将最先进入内存的页数淘汰,并将该页写到内存中去。
重复上面的操作直到完成这320条指令。
源代码:
//储存管理.cpp:
定义控制台应用程序的入口点。
//
#include"
stdafx.h"
int_tmain(intargc,_TCHAR*argv[])
{
return0;
}
#include<
stdio.h>
stdlib.h>
time.h>
#defineN5//总共运行的次数
voidmain()
intorder[320],mem_volume[4]={100,100,100,100};
//使得mem_volume[]的值大于100>
32,这样我们便可使其在开始就产生缺页
//定义add为缺页次数sign作为标识符判断所调页数是否在内存中
intl=0,i=0,j,num=0,cx,sign=0,add=0;
floatvalue=0,sum=0;
//定义sum为缺页率
srand(time(NULL));
for(cx=0;
cx<
N;
cx++)//总共运行N次
{
while(i<
320)
order[i]=rand()%320;
//产生随机数放order中
for(j=0;
j<
4;
j++)
if((order[i]+1)/10==mem_volume[j])
sign=1;
//通过sign标识判断所调页数是否在内存块中
if(sign)
sign=0;
else
{
l++;
if(mem_volume[3]==100)
mem_volume[3]=(order[i]+1)/10;
//保证第一次调入的页面都产生缺页
else
{
mem_volume[num]=(order[i]+1)/10;
//将所缺页调入到内存块中
num=(num+1)%4;
//num值为下次所要置换出去的内存块中对应的页数
}
}
i++;
order[i]=rand()%(order[i-1]+2);
if(order[i]/10==mem_volume[j])
else
if(mem_volume[2]==100)
mem_volume[2]=order[i]/10;
mem_volume[num]=order[i]/10;
order[i]=order[i-1]+1;
if(mem_volume[1]==100)
mem_volume[1]=order[i]/10;
}
order[i]=rand()%(319-order[i-1]-2)+(order[i-1]+2);
if(order[i]/10==mem_volume[0])
if(mem_volume[0]==100)
mem_volume[0]=(order[i]+1)/10;
}
value=l/320.0*100;
add=add+l;
sum=sum+value;
printf("
*******************FIFO页面置换算法*******************\n"
);
*******************最后一次指令序列*******************"
for(i=0;
i<
320;
i++)
if(i%10==0)
printf("
\n"
printf("
%5d"
order[i]);
************************************************************\n"
\t\t%d次的平均缺页数为%d\n\t\t%d次的平均缺页率为%.3f%%\n"
N,add/N,N,sum/N);
LRU页面置换算法设计说明:
这个算法同FCFS算法的不同之处在于,每产生一条随机指令,如果和4个内存块中的某一个页数相同的话,就要对这4个内存块中的页数重新排序,将每次要置换出去的页数放在mem_volume[3]中,这样,在每次产生缺页的时候,都先将所缺页数写入到该内存块,然后再排序,将其放到mem_volume[0]中去。
#defineN5
intmain(void)
intl=0,i=0,j,cx;
intnum,temp=0,ex_chan=0,add=0;
cx++){
320){
if((order[i]+1)/10==mem_volume[0])
;
//如果所调页数同第一个内存块中页数相同,则执行空操作
elseif((order[i]+1)/10==mem_volume[1]){
temp=mem_volume[1];
mem_volume[1]=mem_volume[0];
mem_volume[0]=temp;
//如果所调页数同第二个内存块相同,则排序只需交换一次
elseif((order[i]+1)/10==mem_volume[2]){
for(j=2;
j>
0;
j--){
temp=mem_volume[j];
mem_volume[j]=mem_volume[j-1];
mem_volume[j-1]=temp;
}
elseif((order[i]+1)/10==mem_volume[3]){
for(j=3;
}
}//如果所调页数同第3、4个内存块中页数相同,则通过循环进行排序
else{
//保证刚开始调入内存块中就产生缺页
else{
for(num=3;
num>
num--){
ex_chan=mem_volume[num];
mem_volume[num]=mem_volume[num-1];