虚拟存储器管理实验报告Word格式.doc
- 文档编号:13269056
- 上传时间:2022-10-09
- 格式:DOC
- 页数:10
- 大小:78.50KB
虚拟存储器管理实验报告Word格式.doc
《虚拟存储器管理实验报告Word格式.doc》由会员分享,可在线阅读,更多相关《虚拟存储器管理实验报告Word格式.doc(10页珍藏版)》请在冰豆网上搜索。
实验过程:
1.实验设计
(1)模拟分页式存储管理中硬件的地址转换和产生缺页中断。
分页式虚拟存储系统是把作业信息的副本存放在磁盘上,当作业被选中时,可把作业的开始几页先装入主存且启动执行。
为此,在为作业建立页表时,应说明哪些页已在主存,哪些页尚未装入主存。
作业执行时,指令中的逻辑地址指出了参加运算的操作存放的页
号和单元号,硬件的地址转换机构按页号查页表,若该页对应标志为“1”,则表示该页已在主存,这时根据关系式“绝对地址=块号×
块长+单元号”计算出欲访问的主存单元地址。
如果块长为2的幂次,则可把块号作为高地址部分,把单元号作为低地址部分,两者拼接而
成绝对地址。
若访问的页对应标志为“0”,则表示该页不在主存,这时硬件发“缺页中断”信号,有操作系统按该页在磁盘上的位置,把该页信息从磁盘读出装入主存后再重新执行这条指令。
设计一个“地址转换”程序来模拟硬件的地址转换工作。
当访问的页在主存时,则
形成绝对地址,但不去模拟指令的执行,而用输出转换后的地址来代替一条指令的执行。
当访问的页不在主存时,则输出“*该页页号”,表示产生了一次缺页中断。
(2)用先进先出(FIFO)页面调度算法处理缺页中断。
FIFO页面调度算法总是淘汰该作业中最先进入主存的那一页,因此可以用一个数组来表示该作业已在主存的页面。
假定作业被选中时,把开始的m个页面装入主存,则数组的元素可定为m个。
2.程序代码:
(1)模拟分页式存储管理中硬件的地址转换和产生缺页中断。
#include<
cstdio>
cstring>
#defineSizeOfPage100
#defineSizeOfBlock128
#defineM4
structinfo//页表
{
boolflag;
//标志
longblock;
//块号
longdisk;
//在磁盘上的位置
booldirty;
//修改标志
}pagelist[SizeOfPage];
longpo;
//队列标记
longP[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)
绝对地址=%ld\n"
pagelist[p].block*SizeOfBlock+q);
*%ld\n"
p);
}while(!
stop);
voidinit_ex2()
po=0;
P[0]=0;
P[1]=1;
P[2]=2;
P[3]=3;
voidwork_ex2()
longp,q,i;
chars[100];
请输入指令的页号、单元号,以及是否为存指令:
if(s[0]=='
Y'
||s[0]=='
y'
)
pagelist[p].dirty=1;
if(pagelist[P[po]].dirty)
//将更新后的内容写回外存
pagelist[P[po]].dirty=0;
pagelist[P[po]].flag=0;
out%ld\n"
P[po]);
in%ld\n"
pagelist[p].block=pagelist[P[po]].block;
pagelist[p].flag=1;
P[po]=p;
po=(po+1)%M;
数组P的值为:
for(i=0;
i<
M;
i++)
P[%ld]=%ld\n"
i,P[i]);
voidselect()
longse;
请选择题号(1/2):
"
%ld"
se)!
=1)
return;
if(se==1)
init_ex1();
work_ex1();
if(se==2)
init_ex2();
work_ex2();
}while
(1);
intmain()
select();
return0;
(2)用先进先出(FIFO)页面调度算法处理缺页中断。
iostream.h>
iomanip.h>
ctype.h>
//页表用数组模拟,在实验中页表数据结构定义为:
#defineN32//实验中假定的页表长度,页表的长度实际上是由系统按照作业长度决定的
#defineM4//实验中用,用固定局部置换算法给每个进程分配的主存物理块数
struct
{intlnumber;
//页号
intflag;
//表示该页是否在主存,"
1"
表示在主存,"
0"
表示不在主存
intpnumber;
//该页所在主存块的块号
intwrite;
//该页是否被修改过,"
表示修改过,"
表示没有修改过
intdnumber;
//该页存放在磁盘上的位置,即磁盘块号
}page[N];
//页表定义
intp[M];
//用数组模拟]FIFO算法中的队列(使用循环队列)
inthead;
voidinitial(void);
//初始化
intdo_mmap(int);
//模拟地址转换
voiddo_page_fault(int);
//缺页中断处理程序
voidrun_first_instructon(int);
//执行进程的第一条指令
voidrun_a_instruction(int);
//CPU执行一条指令
voidprint_page_and_fifoqueue(void);
//输出页表和FIFO队列
main()
{
intladdress,paddress;
//逻辑地址,物理地址
intlnumber,ad,pnumber;
//页号,页内地址和物理块号
initial();
//手工初始化页表
print_page_and_fifoqueue();
run_first_instructon(0x0000);
//运行进程的第一条指令的地址
//输入下一条指令的地址
cout<
<
输入下一条指令的逻辑地址(0~32767)(-1toend)"
endl;
cin>
>
laddress;
while(laddress>
32767){//输入正确性检测
EnterERORR!
请重新输入下一条指令的逻辑地址(0~32767)(-1toend)"
}
while(laddress!
=-1){//还有指令要执行
lnumber=laddress>
10;
//取逻辑地址的页号lnumber
if(page[lnumber].flag==1){//指令所在的页面已装入在内存中
paddress=do_mmap(laddress);
//形成物理地址
paddress<
输出转换后的物理地址"
run_a_instruction(paddress);
//CPU根据得到的物理地址去执行指令
此指令执行是否修改所在页面lnumber="
lnumber<
(y/n?
)"
;
charchange;
change;
if(tolower(change)=='
){
page[lnumber].write=1;
//若页面要已修改,则将此页面修改位置1
else{//缺页中断
输出该页的页号--表示硬件产生缺页中断"
do_page_fault(lnumber);
//直接转去缺页中断处理
continue;
//本循环结束,重新执行指令
输入下一条指令的逻辑地址((0~32767)),-1toend.\n"
ladd
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 虚拟 存储器 管理 实验 报告