1、实验5虚拟存储器操作系统实验实验五 虚拟存储器管理学号 姓名 班级 华侨大学电子工程系实验目的 1、 理解虚拟存储器概念。2、 掌握分页式存储管理地址转换盒缺页中断。 实验内容与基本要求 1、 模拟分页式存储管理中硬件的地址转换和产生缺页中断。2、 用先进先出页面调度算法处理缺页中断。实验报告内容 1、 分页式存储管理和先进先出页面调度算法原理。1.1分页式存储管理原理采用分页存储器允许把一个作业存放到若干不相邻的分区中,既可免去移动信息的工作,又可尽量减少主存的碎片。分页式存储管理的基本原理如下:A、 页框:物理地址分成大小相等的许多区,每个区称为一块; B、址分成大小相等的区,区的大小与块
2、的大小相等,每个称一个页面。C、 逻辑地址形式:与此对应,分页存储器的逻辑地址由两部分组成,页号和单元号。逻辑地址格式为 页号 单元号(页内地址) 采用分页式存储管理时,逻辑地址是连续的。所 以,用户在编制程序时仍只须使用顺序的地址,而不必考虑如何去分页。 D、页表和地址转换:如何保证程序正确执行呢? 采用的办法是动态重定位技术,让程序的指令执行时作地址变换,由于程序段以页为单位,所以,我们给每个页设立一个重定位寄存器,这些重定位寄存器的集合便称页表。页表是操作系统为每个用户作业建立的,用来记录程序页面和主存对应页框的对照表,页表中的每一栏指明了程序中的一个页面和分得的页框的对应关系。绝对地址
3、=块号*块长+单元号程序流程图。1.2先进先出页面调度算法原理先进先出调度算法根据页面进入内存的时间先后选择淘汰页面,先进入内存的页面先淘汰,后进入内存的后淘汰。本算法实现时需要将页面按进入内存的时间先后组成一个队列,每次调度队首页面予以淘汰。2 程序流程图a虚拟管理主流程图 b 先进先出调度流程图3 程序及注释#include malloc.h#include stdio.h#include iostream.h#include stdlib.h#define n 10 /假定系统允许的最大作业为,假定模拟实验中n值为10 #define m 10 /假定系统允许的空闲区表最大为m,假定模拟
4、实验中m值为10#define minisize 100typedef structfloat address; /已分分区起始地址float length; /已分分区长度,单位为字节int flag; /已分配区表登记栏标志,用0表示空栏目,实验中只支持一个字符的作业名 used_tablen;/已分配区表typedef structfloat address; /空闲区起始地址float length; /空闲区长度,单位为字节int flag; /空闲区表登记栏标志,用0表示空栏目,用1表示未分配 free_tablem; /空闲区表/采用最优分配算法分配xk大小的空间allocate
5、(char J,float xk)int i,k;float ad;k=-1;for(i=0;i=xk&free_tablei.flag=1)if(k=-1|free_tablei.lengthfree_tablek.length)k=i;if(k=-1)/未找到可用空闲区,返回printf( 无可用空闲区 n);return;/找到可用空闲区,开始分配:若空闲区大小与要求分配的空间差小于msize大小,则空闲区全部分配;若空闲区大小与要求分配的空间差大于minisize大小,则从空闲区划出一部分分配if(free_tablek.length-xk=minisize)free_tablek.f
6、lag=0; /该空闲区被分配ad=free_tablek.address;xk=free_tablek.length;elsefree_tablek.length=free_tablek.length-xk; ad=free_tablek.address+free_tablek.length; /修改已分配区表i=0;/寻找空表目while(used_tablei.flag!=0&i=n)printf( 无表目填写已分区,错误 /修正空闲区表if(free_tablek.flag=0)free_tablek.flag=1;/前面找到的是某个空闲分区的一部分 elsefree_tablek.l
7、ength=free_tablek.length+xk; return; n);/修改已分配表elseused_tablei.address=ad;used_tablei.length=xk;used_tablei.flag=J;return;/回收作业名为J的作业所占主存空间reclaim(char J)int i,k,j,s,t;float S,L;/寻找已分配表中对应登记项s=0;while(used_tables.flag!=J|used_tables.flag=0)&s=n)printf(找不到作业 n);return;/修改已分配表used_tables.flag=0;/取得归还分
8、区的起始地址S和长度LS=used_tables.address;L=used_tables.length;j=-1;k=-1;/寻找回收分区的空闲上下邻,上邻表目k,下邻表目j i=0;while(im&(j=-1|k=-1)if(free_tablei.flag=1)if(free_tablei.address+free_tablei.length=S) k=i;/找到上邻 if(free_tablei.address=S+L) j=i;/找到下邻i+;if(k!=-1)if(j!=-1) /上邻空闲区,下邻空闲区,三项合并free_tablek.length=free_tablej.le
9、ngth+free_tablek.length+L;free_tablej.flag=0;else /上邻空闲区,下邻非空闲区,与上邻合并free_tablek.length=free_tablek.length+L;elseif(j!=-1) /上邻非空闲区,下邻为空闲区,与下邻合并free_tablej.address=S;free_tablej.length=free_tablej.length+L;else /上下邻均为非空闲区,回收区域直接填入 /在空闲区表中寻找空栏目t=0;while(free_tablet.flag=1&t=m)/空闲区表满,回收空间失败,将已分配表复原out主
10、存空闲表没有空间,回收空间失败endl;第7/11页used_tables.flag=J;return;free_tablet.address=S;free_tablet.length=L;free_tablet.flag=1;return;/主函数void main( )int i,a;float xk;char s;ifstream in(input.txt);/空闲分区表初始化free_table0.address=10240;free_table0.length=102400;free_table0.flag=1;for(i=1;im;i+)第8/11页free_tablei.flag
11、=0;/已分配表初始化for(i=0;in;i+)used_tablei.flag=0;while(1)printf( 选择功能象(0-退出,1-分配主存,2-回收主存,3-显示主存) n);printf( 选择功能象(03): n);scanf(%d,&a);switch(a)case 0:exit(0);case 1:printf( 输入作业名J和作业名所需长度xk n);scanf(%c%c%f,&J,&xk); allocate(J,xk); break;case 2:printf( 输入要回收分区的作业名 );scanf(%c%c,&J);第9/11页reclaim(J); brea
12、k;case 3:);for(i=0;im;i+) printf( 输出空闲区表 :n起使地址 分区长度 标志printf(%6.0f%9.0f%6dn,free_tablei.address,free_tablei.length,free_tablei.flag);printf( 按任意键,输出已分配区表 n);getchar(); printf( 输出已分配表:n起使地址 分区长度 标志 n);for(i=0;in;i+) if(used_tablei.flag!=0)printf(%6.0f%9.0f%6cn,used_tablei.address,used_tablei.length,used_tablei.flag);elseprintf(%6.0f%9.0f%6dn,used_tablei.address,used_tablei.length,use第10/11页d_tablei.flag);break;default:defult:printf(没有该选项 n); 4. 运行结果以及结论。建立页表指令执行
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1