实验四 页式虚拟存储管理中地址转换和页式中断 FIFO LRU OPT C 版本
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void page_interrupt(int); //缺页中断处理函数
void command(unsigned, int); //命令处理函数
void main()
{
int lnumber,pnumber,write,dnumber;
unsigned laddress;
int i;
cout<<"输入页表的信息,创建页表(页号从 0 开始,若页号为-1,则结束
行地址转换,若访问的页面不在主存中,则产生一个“缺页中断”,由操作系统 把当前所需要的页面装入主存储器后,再次执行时才可以按上述方法进行地址转 换。
模拟地址转换流程度 3) 缺页中断处理算法的实现 缺页处理过程简单阐述如下: a) 根据当前执行指令中逻辑地址的页号查找页表,判断该页是否在主存储 器中,若该页标志为“0”,形成缺页中断。中断装置通过交换 PSW 让操作系统 的中断处理程序占用处理器。 b) 操作系统处理缺页中断的方法及时查主存分配表,找一个空闲主存块; 若无空闲块,查页表,选择一个已在主存的页面,把它暂时调出主存。若在执行 过程中该页被修改过,则需将该页信息写回磁盘,否则不比写回; c) 找出该页的位置,启动磁盘读出该页的信息,把磁盘上读出的信息装入第 2 不找到的主存块,修改页表中该页的标志为“1”; d) 由于产生缺页中断的那条指令还没有执行完,所以页面装入后应该重新 执行被中断的指令。当重新执行该指令时,由于要访问的页面已在主存中,所以 可以正常执行。 关于第二步的查找装入新页面的主存块处理方式,不同系统采用的策略可能 有所不同,这里采用局部置换算法,就是每个作业分得一定的主存块,只能在分 得的主存块内查找空闲块,若无空闲主存块,则从该作业中选择一个页面淘汰出 主存。实验中采用局部置换算法。 使用局部置换算法时,存在这样一个问题:就是在分配给作业主存空间时, 装入哪些页?有的系统采取不装入任何一页,当执行过程中需要时才将其调入。 有点系统采用页面预置的方法,事先估计可能某些页面会先用到,在分配主存块 后将这些页面装入。在本实验中采用第二种方法,分配主存空间时将前几页调入 主存,假定系统中每个作业分得主存块 m 块,则将第 0~m-1 页装入主存。 因为是模拟硬件工作,所有在实验中如果访问的页不再主存中时,则输入该 页页号,表示硬件产生缺页中断,然后直接转去缺页中断处理;由于采用页面预 置方法,在给定的主存块中一定无空闲块,只能淘汰已在主存的一页;没有启动 磁盘的工作,淘汰的页面需要写回磁盘时,用输入页号表示,调入新的一页时, 将该页在页表中的存在标志置为“1”,输出页号表示将该页调入主存。 当主存中无空闲块时,为装入一个页面,必须按照某种算法从已在主存的页 中选择一页,将它暂时调出主存,让出主存空间,用来存放装入的页面,这个工 作称为“页面调度”。常用的页面调度算法有:先进现出、最近最少用算法、和 最近最不常用算法。在本实验中采用先进现出调度算法。先进现出算法总是选择 驻留在主存时间最长的一页调出。实验中把主存储器的页的页号按照进入主存的 先后次序拍成队列,每次总是调出对首的页,当装入一个新页后,把新页的页号 排入对尾。实验中,用一个数组存放页号的队列。假定分配给作业的主存块数为 m,数组可由 m 个元素组成,p[0],p[1],p[2]……p[m-1];对首指针 head;采用页面预 置的方法,页号队列的长度总是 m,tail 等于(head+1)%m。因此可以使用一个指
输入)\n";
cout<<"请输入页号和辅存地址:";
cin>>lnumber>>dnumber;
cin.ignore ();
i=0;
while(lnumber!=-1)
{
page[i].lnumber=lnumber;
page[i].flag=0;
page[i].write=0;
page[i].dnumber=dnumber;
针,只用 head 即可。在装入一个新的页时,装入页和淘汰页同时执行,当装入
一个新的页时,将其页号存入数组:
淘汰页的页号=p[head];
p[head]=新装入页的页号;
head=(head+1)%m;
实验执行一条指令时,不模拟指令的执行,只是考虑指令执行是否修改页面,
若修改页面,则将该页的页表中的修改标志位置“1”,然后输出转换后的物理
页式虚拟存储管理方式中页表除了页号和该页对应的主存块号外,至少还要
包括存在标志(该页是否在主存),磁盘位置(该页的副本在磁盘上的位置)和
Hale Waihona Puke Baidu
修改标志(该页是否修改过)。在实验中页表用数组模拟,其数据结构定义如下:
struct{
int lnumber; //页号
int flag; //表示页是否在主存中,“1”表示在,“0”表示不在
断处理,然后再进行地址转换;最后编写主函数对所做工作进行测试。
假定主存 64KB,每个主存块 1024 字节,作业最大支持到 64KB,系统中每
个作业分得主存块 4 块。
三、实验原理
1)地址转换过程:
首先从逻辑地址中的高位取得页号,然后根据页号查页表,得到块号;然后
从逻辑地址中的低位取得页内地址,将块号和页内地址合并即得到物理地址。
实验四 页式虚拟存储管理中地址转换和页式中断
FIFO
一、实验目的
深入了解页式存储管理如何实现地址转换;进一步认识页式虚拟存储管理中
如何处理缺页中断以及页面置换算法。
二、实验主要内容
编写程序完成页式虚拟存储管理中地址转换过程和模拟缺页中断的处理。实
验具体内容包括:首先对给定的地址进行转换工作,若发现缺页则先进行缺页中
验中,每个主存块 1024 字节,则块内地址占 10 位;主存 64KB,则主存共 64 块,即块号占 6 位;物理地址共占 16 位;作业最大 64KB,则作业最大占 64 块, 即页号占 6 位,逻辑地址共占 16 位。(用主存的大小计算物理地址位数,用最 大作业大小计算逻辑地址位数)。
在页式虚拟存储管理方式中,作业信息作为副本放在磁盘上,作业执行时仅 把作业信息的部分页面装入主存储器,作业执行时若访问的页面在主存中,则进
int pnumber; // 该页所在主存块的块号
int write; //该页是否被修改过,“1”表示修改过,“0“表示没有修改
过
int dnumber; //该页存放在磁盘上的位置,即磁盘块号
}page[n];
//页表定义
2)地址转换算法的实现 地址转换是由硬件完成的,实验中使用软件程序模拟地址转换过程。在实
2)缺页中断处理
根据页号查找页表,判断该页是否在主存储器中,若该页标志位“0”,形
成缺页中断。操作系统让调出中断处理程序处理中断。
四、实验方法与步骤
实现地址转换与缺页中断处理,主要考虑三个问题:第一,设计页式虚拟存
储管理方式中页表的数据结构;第二,地址转换算法的实现;第三,缺页中断处
理算法的实现。
1) 设计页表的数据结构
源代码
#include<iostream.h>
#define n 64
//页表的最大长度
#define length 4 //系统为每个作业分配的主存块数
struct{
int lnumber; //页号
int flag; //表示页是否在主存中,“1”表示在,“0”表示不在
int pnumber; // 该页所在主存块的块号
cin.ignore (); if(write!=0&&write!=1) break; cout<<"输入逻辑地址:"; cin>>laddress; cin.ignore (); }//while }//main /*中断处理函数,采用先进先出的页面调度算法*/ void page_interrupt(int lnumber) { int j; cout<<"发生缺页中断"<<lnumber<<endl; j=p[head]; p[head]=lnumber; head=(head+1)%m; if(page[j].write==1) cout<<"将页 "<<j<<" 写回磁盘第 "<<page[j].dnumber<<" 块!\n"; page[j].flag=0; page[lnumber].pnumber=page[j].pnumber; page[lnumber].flag=1; page[lnumber].write=0; cout<<"淘汰主存块 "<<page[j].pnumber<<" 中的页 "<<j<<" ,从磁盘第 " <<page[lnumber].dnumber<<" 块中调入页 "<<lnumber<<endl; } /*地址转换函数,将逻辑地址转换成物理地址,如果要查找的页不在主存当中则 产生缺页中断*/ void command(unsigned laddress,int write) { unsigned paddress,ad,pnumber; int lnumber; kk: lnumber=laddress>>10; //取逻辑地址高 6 位,页号 ad=laddress&0x3ff; //页内地址 cout<<"该逻辑地址的页号为:"<<lnumber<<" 页内地址为:"<<ad<<endl; if(lnumber>=page_length) { //页号大于页表的长度,则无效页号 cout<<"该页不存在!\n"; return; } if(page[lnumber].flag==1){ //页号为 lnumber 在内存当中 pnumber=page[lnumber].pnumber; paddress=pnumber<<10|ad; cout<<"逻辑地址是:"<<laddress<<" 对应物理地址是: "<<paddress<<endl;
if(write==1)
//该页被修改过
page[lnumber].write=1;
}
else
{ //页号为 lnumber 不在内存当中,则产生缺页中断
i++;
cout<<"请输入页号和辅存地址:";
cin>>lnumber>>dnumber;
}
//预先将输入的页调入主存块中
page_length=i;
cout<<"输入主存块号(输入少于或者等于"<<i<<"个数据,若块号数为-1,
则结束输入):";
cin>>pnumber;
cin.ignore ();
m=0;
head=0;
while(m<length&&pnumber!=-1)
{
if(m<i)
{
page[m].pnumber=pnumber;
page[m].flag=1;//调入主存后,标志为置 1
p[m]=m;
//记录主存中的页号
m++;
}
cout<<"输入主存块号(输入少于或者等于"<<i<<"个数据,若块号数为-
int write; //该页是否被修改过,“1”表示修改过,“0“表示没有修改过
int dnumber; //该页存放在磁盘上的位置,即磁盘块号
}page[n];
//页表定义
int m;
int page_length; //页表的实际长度
int p[length]; //用向量模拟主存
int head;
1,则结束输入):";
cin>>pnumber;
cin.ignore ();
}//while
cout<<"输入指令性质(1-修改,0-不需要,其他-结束程序运行)和逻辑
地址\n"
<<"逻辑地址最大能支持 2 的 16 次方-1=65535。\n";
cout<<"输入指令性质:";
cin>>write;
地址,并输出物理地址来表示一条指令执行完成;如果访问的页不在主存时,则
产生缺页中断,然后直接转去缺页中断处理,最后模拟中断返回,就是返回冲进
进行地址转换。
因为没有实际主存,所有在模拟程序中首先手工输入页表信息,创建该作业
的页表;然后循环执行假定的指令,观察地址转换情况。
五、练习题
采用 LRU 页面调度算法编程实现上述虚拟页式存储管理的地址转换。
cin.ignore ();
cout<<"输入逻辑地址:";
cin>>laddress;
cin.ignore ();
while(write==0||write==1)
{
command(laddress,write); //将输入的逻辑地址转换成物理地址
cout<<"输入指令性质:";
cin>>write;