实验五 存储管理.docx
《实验五 存储管理.docx》由会员分享,可在线阅读,更多相关《实验五 存储管理.docx(11页珍藏版)》请在冰豆网上搜索。
实验五存储管理
实验五存储管理
1.实验目的:
存储管理的主要功能之一是合理地分配空间。
请求页式管理是一种常用的虚拟存储管理技术。
本实验的目的是通过请求页式存储管理中页面置换算法的模拟设计,了解虚拟存储技术的特点,掌握请求页式管理的页面置换算法
2.实验内容:
设计程序实现下述三个算法,并计算下述算法的命中率。
A.OPTIMAL:
最佳置换算法
B.FIFO:
先进先出置换算法
C.LRU:
最近最久未使用置换算法
[预备内容]
地址映射过程中,若发现所要访问的页面不再内存中,则产生缺页中断。
当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。
而用来选择淘汰哪一页的规则叫做页面置换算法。
以下分别是三个算法的设计思想。
OPTIMAL:
最佳置换算法。
其所选择的被淘汰页面,将是以后永不使用的,或是在未来最长时间内不再被访问的页面。
FIFO:
先进先出置换算法。
该算法总是淘汰最先进入内存的页面,既选择在内存中驻留时间最久的页面予以淘汰。
LRU:
最近最久未使用置换算法。
该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的的时间T,当须淘汰一个页面时,选择现有页面中其T值最大的给予淘汰。
在该实现中是选择Timer值最大的淘汰。
2)举例即将被访问的页面如下
page
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
内存情况
FIFO
Block
-1
-1
-1
7
-1
-1
7
0
-1
7
0
1
2
3
1
……
2
3
0
OPT
……
2
0
1
2
0
1
2
0
3
2
4
3
……
LRU
LRU
2
0
1
……
4
0
3
2
0
3
具体实现:
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
FIFO
Block
-1
-1
-1
7
-1
-1
7
0
-1
7
0
1
OPT
Block
-1
-1
-1
7
-1
-1
7
0
-1
7
0
1
Block
-1
-1
-1
7
-1
-1
7
0
-1
7
0
1
LRU
参考程序如下:
#include
#defineBsize3
#definePsize20
typedefstructpage
{
intcontent;//页面号
inttimer;//被访问标记
}page;
pageblock[Bsize];//物理块
pagepage[Psize];//页面号串
voidInit(void)
{//初始化
intQString[20]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};
for(inti=0;i{
block[i].content=-1;
block[i].timer=0;
}
for(i=0;i{
page[i].content=QString[i];
page[i].timer=0;
}
}
intfindSpace(void)
{//查找是否有空闲内存
for(inti=0;iif(block[i].content==-1)
returni;//找到空闲内存,返回BLOCK中位置
return-1;
}
intfindExist(intcurpage)
{//查找内存中是否有该页面
for(inti=0;iif(block[i].content==page[curpage].content)
returni;//找到内存中有该页面,返回BLOCK中位置
return-1;
}
intfindReplace(void)
{//查找应予置换的页面,被置换的页面的Timer值最大
intpos=0;
for(inti=0;iif(block[i].timer>=block[pos].timer)
pos=i;//找到应予置换页面,返回BLOCK中位置
returnpos;
}
voiddisplay(void)
{//显示
for(inti=0;iif(block[i].content!
=-1)
cout<cout<}
voidOptimal(void)
{//OPTIMAL算法
intexist,space,position;
for(inti=0;i{
exist=findExist(i);
if(exist!
=-1)
{cout<<"不缺页"<else
{
space=findSpace();
if(space!
=-1)
{block[space]=page[i];//block[space].content=page[i].content,block[space].timer=page[i].timer
display();
}
else
{//没有找到空闲分区,需找一个页面进行置换
for(intk=0;kfor(intj=i;j{
if(block[k].content!
=page[j].content)
{block[k].timer=1000;}//将来不会用,设置TIMER为一个很大数
else
{
block[k].timer=j;
break;
}
}
position=findReplace();
block[position]=page[i];
display();
}
}
}
}
voidLRU(void)
{//
}
voidFIFO(void)
{//
}
voidBlockClear(void)
{
for(inti=0;i{
block[i].content=-1;
block[i].timer=0;
}
}
voidmain(void){
Init();
cout<<"|----------页面置换算法----------|"<cout<<"页面号引用串:
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1"<cout<<"----------------------------------------------------"<cout<<"选择<1>应用Optimal算法"<cout<<"选择<2>应用FIFO算法"<cout<<"选择<3>应用LRU算法"<cout<<"选择<0>退出"<intselect;
while(select)
{
cin>>select;
switch(select)
{
case0:
break;
case1:
cout<<"Optimal算法结果如下:
"<Optimal();
BlockClear();
cout<<"----------------------"<break;
case2:
cout<<"FIFO算法结果如下:
"<FIFO();
BlockClear();
cout<<"----------------------"<break;
case3:
cout<<"LRU算法结果如下:
"<LRU();
BlockClear();
cout<<"----------------------"<break;
default:
cout<<"请输入正确功能号"<break;
}
}
}