页式存储管理地址转换和缺页中断.docx
- 文档编号:17937648
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:12
- 大小:86.88KB
页式存储管理地址转换和缺页中断.docx
《页式存储管理地址转换和缺页中断.docx》由会员分享,可在线阅读,更多相关《页式存储管理地址转换和缺页中断.docx(12页珍藏版)》请在冰点文库上搜索。
页式存储管理地址转换和缺页中断
《操作系统》实验(五)
一、实验目的
1.理解虚拟存储器概念。
2.掌握分页式存储管理地址转换和缺页中断。
二、实验内容
1.模拟分页式存储管理中硬件的地址转换和产生缺页中断
分页式虚拟存储系统是把作业信息的副本存放在磁盘上,当作业被选中时,可把作业的开始几页先装入主存且启动执行。
为此,在作业建立页表时,应说明哪些页已在主存,哪些页尚未装入主存。
作业执行时,指令中的逻辑地址指出了参考运算的操作存放的页号和单元号,硬件的地址转换机构按页号查页表,若该页对应标志为“1”,则表示该页已在主存,这时根据关系式“绝对地址=块号×块长+单元号”计算出欲访问的主存单元地址。
如果块长为2的幂次,则可把块号作为高地址部分,把单元号作为低地址部分,两者拼接而成绝对地址。
若访问的页对应标志为“0”,则表示该页不在主存,这时硬件发“缺页中断”信号,由操作系统按该页在磁盘上的位置,把该页信息从磁盘读出装入主存后再重新执行这条指令。
2.用先进先出(FIFO)页面调度算法处理缺页中断
在分页式虚拟存储系统中,当硬件发出“缺页中断”后,引出操作系统来处理这个中断事件。
如果主存中已经没有空闲块,则可用FIFO页面调度算法把该作业中最先进入主存的一页调出,存放到磁盘上,然后再把当前要访问的页装入该块。
调出和装入后都要修改页表中对应页的标志。
FIFO页面调度算法总是淘汰该作业中最先进入主存的那一页,因此可以用一个数组来表示该作业已在主存的页面。
假定作业被选中时,把开始的m个页面装入主存,则数组的元素可定为m个。
三、实验准备
1.设计一个“地址转换‘程序来模拟硬件的地址转换工作
当访问的页在主存时,则形成绝对地址,但不去模拟指令的执行,而用输出转换后的地址来代替一条指令的执行。
当访问的页不在主存时,则输出“*页号”,表示产生了一次缺页中断,地址转换程序流程图如图4—1所示。
是否
是
否
图1地址转换程序流程图
2.FIFO页面调度程序
为了提高系统效率,如果应淘汰的页在执行中没有修改过,则不必把该页调出(因在磁盘上已有副本),而应直接装入一个新页将其覆盖。
由于是模拟调度算法,所以,不实际启动输出一页和装入一页的程序,而用输出调出的页号和装入的页号来代替一次调出和装入的过程,FIFO页面置换算法程序流程图如图2所示。
是否
是
否模拟硬件
地址转换
模拟FIFO
否是页面调度
是否
图2FIFO页面置换算法程序流程图
四、程序示例
#include
#include
#defineSizeOfPage100
#defineSizeOfBlock128
#defineM4//主存中放4个页面
structinfo//页表信息结构体
{
boolflag;//页标志,1表示该页已在主存,0表示该页不在主存
longblock;//块号
longdisk;//在磁盘上的位置
booldirty;//更新标志
}pagelist[SizeOfPage];
longpo;//队列标记
longP[M];//假设内存中最多允许M个页面
voidinit_ex1()
{
memset(pagelist,0,sizeof(pagelist));//内存空间初始化
/*分页式虚拟存储系统初始化*/
pagelist[0].flag=1;
pagelist[0].block=5;
pagelist[0].disk=011;
pagelist[1].flag=1;
pagelist[1].block=8;
pagelist[1].disk=012;
pagelist[2].flag=1;
pagelist[2].block=9;
pagelist[2].disk=013;
pagelist[3].flag=1;
pagelist[3].block=1;
pagelist[3].disk=021;
}
voidwork_ex1()
{
boolstop=0;
longp,q;
chars[128];
do
{
printf("请输入指令的页号和单元号:
\n");
if(scanf("%ld%ld",&p,&q)!
=2)
{
scanf("%s",s);
if(strcmp(s,"exit")==0)
{
stop=1;
}
}
else
{
if(pagelist[p].flag)
{
printf("绝对地址=%ld\n",pagelist[p].block*SizeOfBlock+q);//计算出绝对地址,绝对地址=块号x块长(默认128)+单元号
}
else
{
printf("*%ld\n",p);
}
}
}while(!
stop);
}
voidinit_ex2()
{
po=0;
P[0]=0;P[1]=1;P[2]=2;P[3]=3;
memset(pagelist,0,sizeof(pagelist));
pagelist[0].flag=1;
pagelist[0].block=5;
pagelist[0].disk=011;
pagelist[1].flag=1;
pagelist[1].block=8;
pagelist[1].disk=012;
pagelist[2].flag=1;
pagelist[2].block=9;
pagelist[2].disk=013;
pagelist[3].flag=1;
pagelist[3].block=1;
pagelist[3].disk=021;
}
voidwork_ex2()
{
longp,q,i;
chars[100];
boolstop=0;
do
{
printf("请输入指令的页号、单元号,以及是否为内存指令:
\n");
if(scanf("%ld%ld",&p,&q)!
=2)
{
scanf("%s",s);
if(strcmp(s,"exit")==0)//如果输入的为"exit"就退出,进入重选界面
{
stop=1;
}
}
else
{
scanf("%s",s);
if(pagelist[p].flag)
{
printf("绝对地址=%ld\n",pagelist[p].block*SizeOfBlock+q);
if(s[0]=='Y'||s[0]=='y')
{
pagelist[p].dirty=1;
}
}
else
{
if(pagelist[P[po]].dirty)
{
pagelist[P[po]].dirty=0;
}
pagelist[P[po]].flag=0;
printf("out%ld\n",P[po]);
printf("in%ld\n",p);
pagelist[p].block=pagelist[P[po]].block;
pagelist[p].flag=1;
P[po]=p;
po=(po+1)%M;
}
}
}while(!
stop);
printf("数组P的值为:
\n");
for(i=0;i { printf("P[%ld]=%ld\n",i,P[i]); } } voidselect() { longse; chars[128]; do { printf("请选择题号(1/2): "); if(scanf("%ld",&se)! =1) { scanf("%s",&s); if(strcmp(s,"exit")==0)//如果输入为exit则退出整个程序 { return; } } else { if(se==1) { init_ex1(); work_ex1(); } if(se==2) { init_ex2(); work_ex2(); } } }while (1); } intmain() { select(); return0; } 五、实验结果分析 地址转换和产生缺页中断界面截图1 截图1地址转换和产生缺页中断界面 如截图1示,由于始边长为128,所以当输入页号为0时,查询得到该页在主存中,并且块号为5,同时根据我们输入的单元号10,因此就可得到绝对地址= 同理输入120时操作过程与上类似。 由于只有0~3号页面在主存中,因此当输入页号为4以上时,就会产生。 程序运行界面显示了当前存在于内存中的信息,并调入当前不存在内存中的页面进入内存。 截图2 截图2当前存在于内存中的信息 截图3FIFO页面调度算法处理缺页中断界面,可以发现数组的数值变化了,原来为P[0]=0,P[1]=1,P[2]=2,P[3]=3;目前为,并且顺序也从0~3号开始置换,因此实现了置换的功能。 截图3FIFO页面调度算法处理缺页中断界面
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 存储 管理 地址 转换 中断
![提示](https://static.bingdoc.com/images/bang_tan.gif)