请求页式虚拟存储管理(FIFO算法)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
cout<<page_table[j].no<<’'<<page_table[j].state<<' '<<page_table[j].block_no<<endl<<endl;
}
}
}
}
实验内容
设计一个请求页式虚拟存储管理方案。并编写模拟程序实现之。产生一个需要访问的指令地址流(逻辑地址)。它是一系列需要访问的指令的地址。为不失一般性,可以适当地(用人工指定地方法或用随机数产生器)生成这个地址序列,使得 50%的指令是顺序执行的。25%的指令均匀地散布在前地址部分,25%的地址是均匀地散布在后地址部分。
{
bno.Traverse(Write); //输出队列里的页面
cout<<endl;
cout<<page_table[j].no<<' '<<page_table[j].state<<' '<<page_table[j].block_no<<endl<<endl; //输出页表信息
}
//该页不在内存,FIFO算法
coutwenku.baidu.com<endl;
cout<<page_table[j].no<<''<<page_table[j].state<<' '<<page_table[j].block_no<<endl<<endl;
}
//内存没有空闲
else if(bno.Length()==5)
{
bno.OutQueue(e);
存储管理算法的流程图如下:
本人写的C++代码:
#include "utility.h"
#include "lk_queue.h"
//定义页表结构
struct table
{
int no; //页号
int state; //状态位(1表示在内存,0表示不在内存)
int block_no; //块号
};
void main()
cout<<loc[i]<<" ";
}
cout<<endl<<endl;
//初始化页表
for( i=0;i<64;i++)
{
page_table[i].no=i;
page_table[i].state=0;
page_table[i].block_no=-1;
}
int a[2];
for( i=0;i<10;i++)
{
int loc[10]; //直接用的是十进制的逻辑地址
int i,j,e;
table page_table[64];
LinkQueue <int> bno;
//随机逻辑地址并显示出来
cout<<"十进制的逻辑地址:";
for( i=0;i<10;i++)
{
loc[i]=rand()%640000;
{
a[0]=loc[i]/1024; //计算出的页号
a[1]=loc[i]%1024; //计算出的页内偏移量
//找到页表中的该页
for( j=0;j<64;j++)
{
if(page_table[j].no==a[0]) break;
}
//该页在内存
if(page_table[j].state==1)
为简单起见。页面淘汰算法采用 FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中抹去。而不再判断它是否被改写过,也不将它写回到外存。
具体的做法可以是:
产生一个需要访问的指令地址流,取出当前要访问的逻辑地址(本实验采用16位地址空间,例如当前访问的逻辑地址为12AF,需要转换成10进制以便求页号和页内偏移量);
指定合适的页面尺寸(本实验以 1KB为1页);
指定内存页表的最大长度,并对页表进行初始化(最大5页);
每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页表未满,则调入一页并打印页表情况;如果该页不足主存且页表已满,则按 FIFO页面淘汰算法淘汰一页后调入所需的页,打印页表情况;逐个地址访问,直到所有地址访问完毕。
page_table[e].state=0;
page_table[j].state=1;
page_table[j].block_no=page_table[e].block_no;
bno.InQueue(page_table[j].no);
bno.Traverse(Write);
cout<<endl;
if(page_table[j].state==0)
{
//内存有空闲
if(bno.Length()<5)
{
page_table[j].state=1;
page_table[j].block_no=i+10;
bno.InQueue(page_table[j].no);
bno.Traverse(Write);
}
}
}
}
实验内容
设计一个请求页式虚拟存储管理方案。并编写模拟程序实现之。产生一个需要访问的指令地址流(逻辑地址)。它是一系列需要访问的指令的地址。为不失一般性,可以适当地(用人工指定地方法或用随机数产生器)生成这个地址序列,使得 50%的指令是顺序执行的。25%的指令均匀地散布在前地址部分,25%的地址是均匀地散布在后地址部分。
{
bno.Traverse(Write); //输出队列里的页面
cout<<endl;
cout<<page_table[j].no<<' '<<page_table[j].state<<' '<<page_table[j].block_no<<endl<<endl; //输出页表信息
}
//该页不在内存,FIFO算法
coutwenku.baidu.com<endl;
cout<<page_table[j].no<<''<<page_table[j].state<<' '<<page_table[j].block_no<<endl<<endl;
}
//内存没有空闲
else if(bno.Length()==5)
{
bno.OutQueue(e);
存储管理算法的流程图如下:
本人写的C++代码:
#include "utility.h"
#include "lk_queue.h"
//定义页表结构
struct table
{
int no; //页号
int state; //状态位(1表示在内存,0表示不在内存)
int block_no; //块号
};
void main()
cout<<loc[i]<<" ";
}
cout<<endl<<endl;
//初始化页表
for( i=0;i<64;i++)
{
page_table[i].no=i;
page_table[i].state=0;
page_table[i].block_no=-1;
}
int a[2];
for( i=0;i<10;i++)
{
int loc[10]; //直接用的是十进制的逻辑地址
int i,j,e;
table page_table[64];
LinkQueue <int> bno;
//随机逻辑地址并显示出来
cout<<"十进制的逻辑地址:";
for( i=0;i<10;i++)
{
loc[i]=rand()%640000;
{
a[0]=loc[i]/1024; //计算出的页号
a[1]=loc[i]%1024; //计算出的页内偏移量
//找到页表中的该页
for( j=0;j<64;j++)
{
if(page_table[j].no==a[0]) break;
}
//该页在内存
if(page_table[j].state==1)
为简单起见。页面淘汰算法采用 FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中抹去。而不再判断它是否被改写过,也不将它写回到外存。
具体的做法可以是:
产生一个需要访问的指令地址流,取出当前要访问的逻辑地址(本实验采用16位地址空间,例如当前访问的逻辑地址为12AF,需要转换成10进制以便求页号和页内偏移量);
指定合适的页面尺寸(本实验以 1KB为1页);
指定内存页表的最大长度,并对页表进行初始化(最大5页);
每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页表未满,则调入一页并打印页表情况;如果该页不足主存且页表已满,则按 FIFO页面淘汰算法淘汰一页后调入所需的页,打印页表情况;逐个地址访问,直到所有地址访问完毕。
page_table[e].state=0;
page_table[j].state=1;
page_table[j].block_no=page_table[e].block_no;
bno.InQueue(page_table[j].no);
bno.Traverse(Write);
cout<<endl;
if(page_table[j].state==0)
{
//内存有空闲
if(bno.Length()<5)
{
page_table[j].state=1;
page_table[j].block_no=i+10;
bno.InQueue(page_table[j].no);
bno.Traverse(Write);