资源描述:
《24李后浪 实验五虚拟页式管理》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验报告实验项目名称:虚拟页式管理实验时间:2014.5.12实验室:K4-406指导老师:李芳一、实验目的了解通过利用操作系统调用实现用户程序分配内存以及回收所用内存的程序过程,加深对操作系统存储管理机制的理解二、实验内容通过阅读和分析实验程序,学习Windows程序设计、调试和运行的方法。三、实验过程程序修改前,高6位为页号,低10位为页内偏移:源程序为:#include"stdio.h"#include"iostream.h"#definen64/*模拟实验中假定的页表长度*/#definelength10
2、struct{intlnumber;/*页号*/intflag;/*表示该页是否在主存,"1"表示在主存中,"0"表示不在*/intpnumber;/*该页所在主存块的块号*/intwrite;/*该页是否被修改过,"1"表示修改过,"0"表示没有修改过*/intdnumber;/*该页存放在磁盘上的位置,即磁盘块号*/}page[n];/*页表定义*/intm;/*m为该作业在主存中的主存块块数*/intpage_length;/*页表实际长度*/intp[length];/*存放在主存中页的页号*/inthe
3、ad;/*主存中页号队列*/voidpage_interrupt(intlnumber){intj;printf("发生缺页中断*%d",lnumber);/*淘汰页*/j=p[head];p[head]=lnumber;head=(head+1)%m;if(page[j].write==1)printf("将页%d写回磁盘第%d块",j,page[j].dnumber);page[j].flag=0;/*第j页存在标志改为"0"*/page[lnumber].pnumber=page[j].pnumbe
4、r;page[lnumber].flag=1;/*第lnumber页存在标志改为"1"*/page[lnumber].write=0;/*第lunmber页修改标志改为"0"*/printf("淘汰主存块%2d中的页%2d,从磁盘第%d块中调入页%2d",page[j].pnumber,j,page[lnumber].dnumber,lnumber);}/*缺页中断处理函数结束*/voidcommand(unsignedladdress,intwrite){unsignedpaddress,ad,pnumbe
5、r,lnumber;kk:/*取出逻辑地址laddress的页号lnumber(高6位)和页内地址ad*/lnumber=laddress>>10;ad=laddress&0x3ff;if(lnumber>=page_length){printf("不存在该页");return;}if(page[lnumber].flag==1)/*页在主存*/{pnumber=page[lnumber].pnumber;/*从页表中取得块号*/paddress=pnumber<<10
6、ad;/*合并块号和块内地址形成物理地
7、址paddress*/printf("逻辑地址是:%x对应物理地址是:%x",laddress,paddress);if(write==1)/*如果需要写,修改页的修改标志位*/page[lnumber].write=1;}else{page_interrupt(lnumber);/*缺页中断*/gotokk;}}/*命令处理函数结束*/main(){intlnumber,flag,pnumber,write,dnumber;unsignedladdress;inti;/*输入页表的信息,页号从0开始,依次编
8、号,创建页表page*/printf("输入页表的信息,创建页表(若页号为-1,则结束输入))");printf("输入页号和辅存地址:");scanf("%d%d",&lnumber,&dnumber);i=0;while(lnumber!=-1){page[i].lnumber=lnumber;page[i].flag=0;page[i].write=0;page[i].dnumber=dnumber;i++;printf("输入页号和辅存地址:");scanf("%d%d",&lnumber,&dnum
9、ber);}page_length=i;printf("输入主存块号,主存块数要小于%d,(以-1结束):",i);scanf("%d",&pnumber);m=0;head=0;while(pnumber!=-1){if(m<=i){page[m].pnumber=pnumber;page[m].flag=1;p[m]=m;m++;}scanf("%d",&pnumbe