一、【实验目的】
①掌握分页式存储管理地址转换和缺页中断。
②理解虚拟存储器概念。
二、【实验内容】
1.模拟分页式存储管理中硬件的地址转换和产生缺页中断
分页式虚拟存储系统是把作业信息的副本存放在磁盘上,当作业被选中时,可把作业的开始几页先装入主存且启动执行。为此,在为作业建立页表时,应说明哪些页已在主存,哪些页尚未装入主存。
作业执行时,指令中的逻辑地址指出了参加运算的操作存放的页号和单元号,硬件的地址转换机构按页号查页表,若该页对应标志为“1”,则表示该页已在主存,这时根据关系式“绝对地址=块号×块长+单元号”计算出欲访问的主存单元地址。如果块长为2的幕次,则可把块号作为高地址部分,把单元号作为低地址部分,两者拼接而成绝对地址。若访问的页对应标志为“0”,则表示该页不在主存,这时硬件发“缺页中断”信号,由操作系统按该页在磁盘上的位置,把该页信息从磁盘读出装入主存后再重新执行这条指令。
2.用先进先出(FIFO)页面调度算法处理缺页中断
在分页式虚拟存储系统中,当硬件发出“缺页中断”后,引出操作系统来处理这个中断事件。如果主存中已经没有空闲块,则可用FIFO页面调度算法把该作业中最先进入主存的一页调出,存放到磁盘上,然后再把当前要访问的页装入该块。调出和装入后都要修改页表中对应页的标志。
FIFO页面调度算法总是淘汰该作业中最先进入主存的那一页,因此可以用一个数组来
表示该作业已在主存的页面。假定作业被选中时,把开始的m个页面装入主存,则数组的元素可定为m个。
三、【实验步骤】
数据结构
struct pageTable//页表信息结构体
{
int cunzai;//页标志,1表示该页已在内存,0表示该页不在内存
long block;//块号
long weizhi;//在磁盘上的位置
int gengxin;//更新标志
}pageList[PAGENUM];
define PAGENUM 100//定义页数大小为100
define BLOCKSIZE 128//定义块大小为128
define BLOCKNUM 4//定义块数量为4
P[BLOCKNUM];//假设内存中最多允许BLOCKNUM个页面
实验代码
#include <stdio.h>
#include <string.h>
#define PAGENUM 100//页大小为100
#define BLOCKSIZE 128//块大小为128
#define BLOCKNUM 4//块数量为4
struct PageTable//页表信息结构体
{
int cunzai;//页标志,1表示该页已在内存,0表示该页不在内存
long block;//块号
long weizhi;//在磁盘上的位置
int gengxin;//更新标志
}pageList[PAGENUM];
long po;//队列标记
long P[BLOCKNUM];//假设内存中最多允许BLOCKNUM个页面
void InitVirtual()//内存空间初始化。
{
memset(pageList, 0, sizeof(pageList));//内存空间初始化
/*分页式虚拟存储系统初始化*/
pageList[0].cunzai = 1;
pageList[0].block = 5;
pageList[0].weizhi = 011;
pageList[1].cunzai = 1;
pageList[1].block = 8;
pageList[1].weizhi = 012;
pageList[2].cunzai = 1;
pageList[2].block = 9;
pageList[2].weizhi = 013;
pageList[3].cunzai = 1;
pageList[3].block = 1;
pageList[<