OS实验三虚拟存储器的管理

更新时间:2023-07-22 04:08:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

虚拟存储器 管理

南京理工大学泰州科技学院

实验报告书

课程名称: 《计算机操作系统》 实验题目: 实验三

班 级: 08计算机2班 学 号:姓 名: 叶萌 指导教师: 袁宝华

虚拟存储器 管理

一 实验目的

1. 理解虚拟存储器概念;

2. 掌握分页式存储管理地址转换和缺页中断。

二 实验内容

1.模拟分页式存储管理中硬件的地址转换和产生缺页中断

分页式虚拟存储系统是把作业信息的副本存放在磁盘上,当作业被选中时,可把作业的开始几页先装入主存且启动执行。为此,在为作业建立页表时,应说明哪些页已在主存,哪些页尚未装入主存。

作业执行时,指令中的逻辑地址指出了参加运算的操作存放的页号和单元号,硬件的地址转换机构按页号查页表,若该页对应标志为“1”,则表示该页已在主存,这时根据关系式“绝对地址=块号×块长+单元号”计算出欲访问的主存单元地址。如果块长为2的幂次,则可把块号作为高地址部分,把单元号作为低地址部分,两者拼接而成绝对地址。若访问的页对应标志为“0”,则表示该页不在主存,这时硬件发“缺页中断”信号,有操作系统按该页在磁盘上的位置,把该页信息从磁盘读出装入主存后再重新执行这条指令。

2. 用先进先出(FIFO)页面调度算法处理缺页中断

在分页式虚拟存储系统中,当硬件发出“缺页中断”后,引出操作系统来处理这个中断事件。如果主存中已经没有空闲块,则可用FIFO页面调度算法把该作业中最先进入主存的一页调出,存放到磁盘上,然后再把当前要访问的页装入该块。调出和装入后都要修改页表中对应页的标志。

FIFO页面调度算法总是淘汰该作业中最先进入主存的那一页,因此可以用一个数组来表示该作业已在主存的页面。假定作业被选中时,把开始的m个页面装入主存,则数组的元素可定为m个。

三 实验准备

1. 设计一个“地址转换”程序来模拟硬件的地址转换工作

当访问的页在主存时,则形成绝对地址,但不去模拟指令的执行,而用输出转换后的地址来代替一条指令的执行。当访问的页不在主存时,则输出“* 该页页号”,表示产生了一次缺页中断,程序流程图如图4-1所示。

虚拟存储器 管理

图4-1 地址转换程序流程图

2. FIFO页面调度程序

为了提高系统效率,如果应淘汰的页在执行中没有修改过,则可不必把该页调出(因在磁盘上已有副本)而直接装入一个新页将其覆盖。由于是模拟调度算法,所以,不实际启动输出一页和装入一页的程序,而用输出调出的页号和装入的页号来代替一次调出和装入的过程,程序流程图如图4-2所示。

图4-2 FIFO页面置换算法程序流程图

四 实验步骤

void work_ex1() {bool stop=0; long p,q; char s[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); } else{ printf("*%ld\n",p);} }}while(!stop);} void work_ex2() {long p,q,i; char s[100]; bool stop=0;

do{printf("请输入指令的页号、单元号,以及是否为内存指令:\n"); if(scanf("%ld%ld",&p,&q)!=2) { scanf("%s",s);

if(strcmp(s,"exit")==0)

虚拟存储器 管理

{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<M;i++)

{ printf("P[%ld]=%ld\n",i,P[i]);}}

五 实验结果

1. 地址转换和产生缺页中断界面如图所示:

初始块长度是128,所以当输入页号为0时,查询得到该页在主存中,页号块为5,,根据输入的单元号是10,得到绝对地址=5*128+10=650。同理,页号为1,单元号为20的页面的绝对地址是1044,页号为4,单元号是30 时产生缺页中断的原因是只有0~3号页面在主存中。

2.当前存在的页面信息如图:

虚拟存储器 管理

3.用FIFO页面调度算法处理缺页中断界面如图:

五 结果分析

1.对存储器有了进一步认识。

2.只有在主存中的页面才能根据块号得到和单元号得到绝对地址。否则产生中断。

3.在输入操作的时候产生了许多错误,C++在输入的时候是要考虑大小写的,否则也会出现错误。 4. 在建立页表时要说明哪些在主存哪些不在主存。

本文来源:https://www.bwwdw.com/article/hy9m.html

Top