实验 模拟页式虚拟存储管理中硬件的地址转换和用
先进先出调度算法处理缺页中断
1、实验目的
1)理解页式虚拟存储管理中的地址转换。
2)理解用先进先出调度算法如何处理缺页中断。
2、实验原理
在页式虚拟存储管理中,如果访问的页面在内存,计算出相应的物理地址,如果访问的页面不在内存,产生缺页中断,将所缺页从外存调入,如果内存没有空间需要将内存的一页淘汰,再将所缺页调入,然后计算出相应的物理地址。
3、实验仪器设备
微型计算机、C或Visual C++开发软件
4、实验内容与步骤
编写程序,模拟页式虚拟存储管理中硬件的地址转换和用先进先出调度算法处理缺页中断。
假定主存的每块长度为1024个字节,现有一个共7页的作业,其副本已在磁盘上。系统为该作业分配了4个主存块,且该作业的第0页至第3页已经装入主存,其余3页尚未装入主存,该作业的页表见下表。
页号
标志
主存块号
修改标志
在磁盘上的位置
0
1
5
0
010
1
1
8
0
012
2
1
9
0
013
3
1
1
0
021
4
0
0
022
5
0
0
023
6
0
0
125
实验步骤
1)输入程序
2)如果该作业执行的指令序列如下表所示:
操作
页号
页内地址
操作
页号
页内地址
+
0
072
+
4
056
5+
1
050
—
5
023
╳
2
015
存(save)
1
037
存(save)
3
026
+
2
078
取(load)
0
056
—
4
001
—
6
040
存(save)
6
086
执行上述的指令序列来调试你所
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
的程序(仅模拟指令的执行,不必考虑指令序列中具体操作的执行)
5、预习及实验
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
要求
预习页式虚拟存储管理中地址转换和页面置换算法的有关内容。实验报告要求写出程序的源代码及运行结果。
分析:主存块有4个,物理地址=块号*块长(这里是1024)+块内地址(块内地址=页内地址),若页号不在主存中,则产生缺页中断,根据先进先出原则,今要执行的页号置换最先进入主存的页号,计算得到如下值:
5192,8242,9231,1050,5176,5160,8248,9239,1061,5198,8193,8278
012306451246
000006666222
111111444446
222222255555
333333331111
英文版
#define size 1024//定义块的大小,本次模拟设为1024个字节。
#include "stdio.h"
#include "string.h"
#include
struct plist
{
int number; //页号
int flag; //标志,如为1表示该页已调入主存,如为0则还没调入。
int block; //主存块号,表示该页在主存中的位置。
int modify; //修改标志,如在主存中修改过该页的内容则设为1,反之设为0
int location; //在磁盘上的位置
};
//模拟之前初始化一个页表。
struct plist p1[7]={{0,1,5,0,010},{1,1,8,0,012},{2,1,9,0,013},{3,1,1,0,021},{4,0,-1,0,022},{5,0,-1,0,023},{6,0,-1,0,125}};
//命令结构,包括操作符,页号,页内偏移地址。
struct ilist
{
char operation[10];
int pagenumber;
int address;
};
//在模拟之前初始化一个命令表,通过程序可以让其顺序执行。
struct ilist p2[12]={{"+",0,72},{"5+",1,50},{"*",2,15},{"save",3,26},
{"load",0,56},{"-",6,40},{"+",4,56},{"-",5,23},
{"save",1,37},{"+",2,78},{"-",4,1},{"save",6,86}};
main()
{
printf(" 模拟页式虚拟存储管理中硬件的地址转换和用先进先出调度算法处理缺页中断\n");
int i,lpage,pflage,replacedpage,pmodify;
int p[4]={0,1,2,3};
int k=0;
int m=4;
long memaddress;
for(i=0;i<12;i++)//作业执行指令序列,12个
{
lpage=p2[i].pagenumber;//获取页号
pflage=p1[lpage].flag;//标志,是否在内存中
printf("%s,%d,%d",p2[i].operation,p2[i].pagenumber,p2[i].address);
printf(" in...%d ",lpage);
if(pflage==0)//如果页面不在内存中
{
printf("replace page %d",lpage);//置换
replacedpage=p[k];
pmodify=p1[replacedpage].modify;
if(pmodify==1)
printf(" ***out...%d",replacedpage);
else
printf(" out...%d",replacedpage);
p[k]=lpage;
k=(k+1)%m;
p1[lpage].flag=1;//标志位改为1
p1[lpage].block=p1[replacedpage].block;
p1[replacedpage].block=-1;
p1[replacedpage].flag=0;
p1[replacedpage].modify=0;
}
memaddress=p1[lpage].block*size+p2[i].address;
if(p2[i].operation=="save")
p1[lpage].modify=1;
printf("\n memaddress is %ld\n",memaddress);
}
}
中文版
#define size 1024//定义块的大小,本次模拟设为1024个字节。
#include "stdio.h"
#include "string.h"
#include
struct plist
{
int number; //页号
int flag; //标志,如为1表示该页已调入主存,如为0则还没调入。
int block; //主存块号,表示该页在主存中的位置。
int modify; //修改标志,如在主存中修改过该页的内容则设为1,反之设为0
int location; //在磁盘上的位置
};
//模拟之前初始化一个页表。
struct plist p1[7]={{0,1,5,0,010},{1,1,8,0,012},{2,1,9,0,013},{3,1,1,0,021},{4,0,-1,0,022},{5,0,-1,0,023},{6,0,-1,0,125}};
//命令结构,包括操作符,页号,页内偏移地址。
struct ilist
{
char operation[10];
int pagenumber;
int address;
};
//在模拟之前初始化一个命令表,通过程序可以让其顺序执行。
struct ilist p2[12]={{"+",0,72},{"5+",1,50},{"*",2,15},{"save",3,26},
{"load",0,56},{"-",6,40},{"+",4,56},{"-",5,23},
{"save",1,37},{"+",2,78},{"-",4,1},{"save",6,86}};
main()
{
printf(" 模拟页式虚拟存储管理中硬件的地址转换和用先进先出调度算法处理缺页中断\n");
int i,lpage,pflage,replacedpage,pmodify;
int p[4]={0,1,2,3};
int k=0;
int m=4;
long memaddress;
for(i=0;i<12;i++)//作业执行指令序列,12个
{
lpage=p2[i].pagenumber;//获取页号
pflage=p1[lpage].flag;//标志,是否在内存中
printf("%s,%d,%d",p2[i].operation,p2[i].pagenumber,p2[i].address);
printf(" 在主存块%d中执行 ",lpage);
if(pflage==0)//如果页面不在内存中
{
printf("把页号%d",lpage);//置换
replacedpage=p[k];
pmodify=p1[replacedpage].modify;
if(pmodify==1)
printf("***放在页号%d的位置",replacedpage);
else
printf("放在页号%d的位置执行",replacedpage);
p[k]=lpage;
k=(k+1)%m;
p1[lpage].flag=1;//标志位改为1
p1[lpage].block=p1[replacedpage].block;
p1[replacedpage].block=-1;
p1[replacedpage].flag=0;
p1[replacedpage].modify=0;
}
memaddress=p1[lpage].block*size+p2[i].address;
if(p2[i].operation=="save")
p1[lpage].modify=1;
printf("\n 物理地址为 %ld\n",memaddress);
}
}