实验五存储管理.docx
- 文档编号:150383
- 上传时间:2022-10-04
- 格式:DOCX
- 页数:7
- 大小:17.98KB
实验五存储管理.docx
《实验五存储管理.docx》由会员分享,可在线阅读,更多相关《实验五存储管理.docx(7页珍藏版)》请在冰豆网上搜索。
实验五 存储管理
一、实验目的
存储管理的主要功能之一是合理地分配空间。
请求页式管理是一种常用的虚拟存储管理技术。
本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的技术特点,掌握请求页式存储管理的页面置换算法。
二、实验学时
2学时
三、实验内容
(1)通过随机数产生一个指令序列,共320条指令。
指令的地址按下述原则生成:
①50%的指令是顺序执行的;
②50%的指令是均匀分布在前地址部分;
③50%的指令是均匀分布在后地址部分。
具体的实施方法是:
①在[0,319]的指令之间随即选取一起点m;
②顺序执行一条指令,即执行地址为m+1的指令;
③在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为
m′;④顺序执行一条指令,其地址为m′+1;
⑤在后地址[m′+2,319]中随机选取一条指令并执行;
⑥重复上述步骤①-⑤,直到执行320次指令。
(2)将指令序列变换为页地址流设:
①页面大小为1k;
②用户内存容量为4页到32页;
③用户虚存容量为32k。
在用户虚存中,按每k存放10条指令排在虚存地址,即320条指令在虚存中的存放方式为:
第0条-第9条指令为第0页(对应虚存地址为[0,9]);
第10条-第19条指令为第一页(对应虚存地址为[10,19]);
……
第310条~第319条指令为第31页(对应虚地址为[310,319])。
按以上方式,用户指令可组成32页。
(3)基于一个虚拟存储区和内存工作区,设计下述算法并计算访问命中率。
1、最佳淘汰算法(OPT)
2、先进先出的算法(FIFO)
3、最近最久未使用算法(LRU)
4、简单时钟(钟表)算法(CLOCK)
命中率=1-页面失效次数/页地址流(序列)长度
在本实验中,页地址流长度为320,页面失效次数为每次访问相应指令时,该指令所对应的页不在内存的次数。
随机数产生办法
Linux或UNIX系统提供函数srand()和rand(),分别进行初始化和产生随机数。
例如:
srand();
语句可初始化一个随机数;
a[0]=10*rand()/65535*319+1;
a[1]=10*rand()/65535*a[0];
语句可用来产生a[0]与a[1]中的随机数。
四、实验步骤
<程序设计〉
本实验的程序设计基本上按照实验内容进行。
即首先用srand()和rand()函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的命中率。
相关定义如下:
1数据结构
(1)页面类型typedefstruct{
intpn,pfn,counter,time;
}pl-type;
其中pn为页号,pfn为面号,counter为一个周期内访问该页面的次数,
time为访问时间.
(2)页面控制结构
pfc-struct{intpn,pfn;
structpfc_struct*next;
}
typedefstructpfc_structpfc_type;
pfc_typepfc_struct[total_vp],*freepf_head,*busypf_head;pfc_type*busypf_tail;
其中pfc[total_vp]定义用户进程虚页控制结构,
*freepf_head为空页面头的指针,
*busypf_head为忙页面头的指针,
*busypf_tail为忙页面尾的指针.2.函数定义
(1)Voidinitialize():
初始化函数,给每个相关的页面赋值.
(2)VoidFIFO():
计算使用FIFO算法时的命中率.
(3)VoidLRU():
计算使用LRU算法时的命中率.
(4)VoidOPT():
计算使用OPT算法时的命中率.
(6)VoidCLOCK():
计算使用clock算法时的命中率.
3.变量定义
(1)inta[total_instruction]:
指令流数据组.
(2)intpage[total_instruction]:
每条指令所属的页号.
(3)intoffset[total_instruction]:
每页装入10条指令后取模运算页号偏移值.
(4)inttotal_pf:
用户进程的内存页面数.(5)intdisaffect:
页面失效次数.
4.程序参考源码及结果
<程序>
#include
#defineTRUE1
#defineFALSE0
#defineINVALID-1
#definetotal_instruction320 //指令流长#definetotal_vp32 //虚页长
#defineclear_period50 //清周期
typedefstruct //页面结构
{
intpn, //页面序号
pfn, //页面所在内存区的帧号
counter, //单位时间内访问次数time; //上次访问的时间
}pl_type;
pl_typepl[total_vp]; //页面结构数组
structpfc_struct{ //页面控制结构intpn, //页面号
pfn; //内存区页面的帧号
structpfc_struct*next; //页面指针,用于维护内存缓冲区的链式结构
};
typedefstructpfc_structpfc_type;//主存区页面控制结构别名pfc_typepfc[total_vp], //主存区页面控制结构数组
*freepf_head, //主存区页面控制结构的空闲页面头指针
*busypf_head, //主存区页面控制结构的忙页面头指针
*busypf_tail; //主存区页面控制结构的忙页面尾指针
intdiseffect; //页错误计数器,初次把页面载入主存时也当做页错误inta[total_instruction]; //随即指令流数组
intpage[total_instruction]; //指令对应的页面号
intoffset[total_instruction]; //指令所在页面中的偏移量
int
initialize(int);
//初始化页面结构数组和页面控制结构数组
int
FIFO(int);
//先进先出算法
int
LRU(int);
//最近最久未使用算法
int
OPT(int);
//最佳置换算法
int
CLOCK(int);
//简单时钟(钟表)算法
intmain()
{
ints; //随机数inti;
srand(10*getpid());/*每次运行时进程号不同,用来作为初始化随机数队列的"种子"*/s=(int)((float)(total_instruction-1)*(rand()/(RAND_MAX+1.0)));
printf("\n------------随机产生指令流 \n");
for(i=0;i { a[i]=s;//任选一指令访问点ma[i+1]=a[i]+1;//顺序执行一条指令 a[i+2]=(int)((float)a[i]*(rand()/(RAND_MAX+1.0)));//执行前地址指令m'a[i+3]=a[i+2]+1;//顺序执行一条指令 printf("%6d%6d%6d%6d\n",a[i],a[i+1],a[i+2],a[i+3]); s=(int)((float)((total_instruction-1)-a[i+2])*(rand()/(RAND_MAX+1.0)))+a[i+2]; } printf(" \n"); for(i=0;i { page[i]=a[i]/10;offset[i]=a[i]%10; } printf("\n--不同页面工作区各种替换策略的命中率表--\n");printf("Page\tFIFO\tLRU\tOPT\tCLOCK\n");for(i=4;i<=32;i++) //用户内存工作区从个页面到个页面 { printf("%2d\t",i);FIFO(i); LRU(i); OPT(i); CLOCK(i); printf("\n"); } return0; } //初始化页面结构数组和页面控制结构数组 //total_pf;用户进程的内存页面数 intinitialize(inttotal_pf) { inti;diseffect=0; for(i=0;i { pl[i].pn=i; pl[i].pfn=INVALID; //置页面所在主存区的帧号为-1.表示该页不在主存中pl[i].counter=0; //置页面结构中的访问次数为 pl[i].time=-1; //置页面结构中的上次访问的时间为-1 } for(i=0;i { pfc[i].next=&pfc[i+1]; //建立pfc[i-1]和pfc[i]之间的链接pfc[i].pfn=i; //初始化主存区页面的帧号 } pfc[total_pf-1].next=NULL;pfc[total_pf-1].pfn=total_pf-1; freepf_head=&pfc[0]; //主存区页面控制结构的空闲页面头指针指向pfc[0]return0; } //最近最久未使用算法 //inttotal_pf; 用户进程的内存页面数 intLRU(inttotal_pf) { intMinT; //最小的访问时间,即很久没被访问过 intMinPn; //拥有最小的访问时间的页的页号inti,j; intCurrentTime; //系统当前时间 initialize(total_pf); //初始化页面结构数组和页面控制结构数组CurrentTime=0; diseffect=0;for(i=0;i { if(pl[page[i]].pfn==INVALID) //页面失效 { diseffect++; //页错误次数加 if(freepf_head==NULL) //无空闲页面 { MinT=100000; for(j=0;j 问过 if(MinT>pl[j].time&&pl[j].pfn! =INVALID) { MinT=pl[j].time;MinPn=j; } } freepf_head=&pfc[pl[MinPn].pfn]; //最久没被访问过的页被释放pl[MinPn].pfn=INVALID; //最久没
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 存储 管理