操作系统实验报告三虚拟存储器.doc

约5页DOC格式手机打开展开

操作系统实验报告三虚拟存储器,操作系统实验报告三 全文5页776字图文并茂 时间:2005.4.30实验题目:虚拟存储器实验要求:模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断。在计算机系统中,为了提高主存利用率,往往把辅助存储器(如磁盘)作为主存储器的扩充,使多道运行的作业的全部逻辑地址空间总和可以超出主存的绝...
编号:5-32969大小:64.50K
分类: 论文>数学/物理论文

内容介绍

此文档由会员 黄药师 发布

操作系统实验报告三
全文5页776字 图文并茂
时间:2005.4.30
实验题目:虚拟存储器
实验要求:
模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断。
在计算机系统中,为了提高主存利用率,往往把辅助存储器(如磁盘)作为主存储器的扩充,使多道运行的作业的全部逻辑地址空间总和可以超出主存的绝对地址空间。用这种办法扩充的主存储器称为虚拟存储器。通过本实验帮助同学理解在分页式存储管理中怎样实现虚拟存储器。
解题思路(流程图):

























图2-1 地址转换模拟算法










































(接下页)






(接上页)









实验结果(部分源码):
#include "iostream.h"
#include "math.h"
#include "stdio.h"
//页面表结构
struct Cpageform {
int pagenumber; //页面号
int biaozhi; //标志
int kuaihao; //块号
int xgbz; //修改标志
int cpwz; //磁盘位置
};
//操作结构
struct Cwork {
char caozuo; //操作名
int pagenumber; //页号
int pageaddress; //页面地址
};
//页面表初值
Cpageform pageform[]={ {0,1,5,0,0x11},
{1,1,8,0,0x12},
{2,1,9,0,0x13},
{3,1,1,0,0x21},
{4,0,0,0,0x22},
{5,0,0,0,0x23},
{6,0,0,0,0x12},
};
//操作序列初值共12条操作
Cwork work[]={ {'+',0,0x70},{'+',1,0x50},
{'*',2,0x15},{'s',3,0x21},
{'f',0,0x56},{'-',6,0x40},
{'m',4,0x53},{'+',5,0x23},
{'s',1,0x37},{'f',2,0x78},
{'+',4,0x01},{'s',6,0x84}
};
//已装入主存的页面数
const int m=4;
//页号队列
int p[]={0,1,2,3};
//声明FIFO页面调度函数
void fifo1(int p[],int,int&,int);
//主函数
void main()
{//输出“start”
cout< //
int k=0; //要装入新页面是应调出的页的位置,初值为0
int l;
int j=0;
int i;
for( i=0;i<12;i++) //顺序执行操作队列
{ //取指令中访问的页号
l=work[i].pagenumber;
cout<//查页面表中页号为l的页面
L1: j=0;
while ( l != pageform[j].pagenumber && j<7 )
{j=j+1;}
//如果页面的标志不为1,即页面已修改过则产生缺页中断
if (pageform[j].biaozhi!=1)
{ //输出中断页号
cout<<"interrupt:"<<" * "<//调用FIFO页面调度函数.
fifo1( p,l,k,j);
//重新查询页面表
goto L1;
}
//页面未被修改时进行的操作
long int address; // 绝对地址=页面地址+1024×块号
address=1024*pageform[j].kuaihao;
address=address+work[i].pageaddress;
//如果操作是“保存”,则修改页面修改标志
if (work[i].caozuo=='s')
{pageform[j].biaozhi=1;}
输出页号和绝对地址
cout<<"pagenumber:"< cout<<"absolute address="< }
}
//FIFO页面调度函数,int p[] :页面队列,int l:操作页号,int& k:要装入新页面时应调出的页的位置,
//int j:中断页
void fifo1(int p[] ,int l,int& k,int j)
{ int pp;
//获得应调出的页的页号
pp=p[k];
//如果J页已修改,则输出J页
if (pageform[j].xgbz==1)
{cout<<"out:"<//如果未被修改则调入操作页
cout<<"in:"<//修改主存中页面指向的页号
p[k]=l;
//修改要装入新页面时应调出的页的位置
k=int(fmod((k+1),m));
//修改页面表
pageform[pp].biaozhi=0;
pageform[l].biaozhi=1;
}