您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > 计算机操作系统实验-存储器管理
哈尔滨工业大学计算机科学与技术学院实验报告课程名称:操作系统课程类型:必修实验项目名称:存储器管理实验题目:模拟分页式存储管理中硬件的地址转换和产生缺页中断。用先进先出(FIFO)页面调度算法处理缺页中断班级:实验学院一班学号:6040310110姓名:张元竞设计成绩报告成绩指导老师一、实验目的在计算机系统中,为了提高主存利用率,往往把辅助存储器(如磁盘)作为主存储器的扩充,使多道运行的作业的全部逻辑地址空间总和可以超出主存的绝对地址空间。用这种办法扩充的主存储器称为虚拟存储器。通过本实验帮助同学理解在分页式存储管理中怎样实现虚拟存储器。二、实验要求及实验环境第一题:模拟分页式存储管理中硬件的地址转换和产生缺页中断。分页式虚拟存储系统是把作业信息的副本存放在磁盘上,当作业被选中时,可把作业的开始几页先装入主存且启动执行。为此,在为作业建立页表时,应说明哪些页已在主存,哪些页尚未装入主存。作业执行时,指令中的逻辑地址指出了参加运算的操作存放的页号和单元号,硬件的地址转换机构按页号查页表,若该页对应标志为“1”,则表示该页已在主存,这时根据关系式“绝对地址=块号×块长+单元号”计算出欲访问的主存单元地址。如果块长为2的幂次,则可把块号作为高地址部分,把单元号作为低地址部分,两者拼接而成绝对地址。若访问的页对应标志为“0”,则表示该页不在主存,这时硬件发“缺页中断”信号,有操作系统按该页在磁盘上的位置,把该页信息从磁盘读出装入主存后再重新执行这条指令。设计一个“地址转换”程序来模拟硬件的地址转换工作。当访问的页在主存时,则形成绝对地址,但不去模拟指令的执行,而用输出转换后的地址来代替一条指令的执行。当访问的页不在主存时,则输出“*该页页号”,表示产生了一次缺页中断。第二题:用先进先出(FIFO)页面调度算法处理缺页中断。在分页式虚拟存储系统中,当硬件发出“缺页中断”后,引出操作系统来处理这个中断事件。如果主存中已经没有空闲块,则可用FIFO页面调度算法把该作业中昀先进入主存的一页调出,存放到磁盘上,然后再把当前要访问的页装入该块。调出和装入后都要修改页表页表中对应页的标志。FIFO页面调度算法总是淘汰该作业中昀先进入主存的那一页,因此可以用一个数组来表示该作业已在主存的页面。假定作业被选中时,把开始的m个页面装入主存,则数组的元素可定为m个。编制一个FIFO页面调度程序,为了提高系统效率,如果应淘汰的页在执行中没有修改过,则可不必把该页调出(因在磁盘上已有副本)而直接装入一个新页将其覆盖。由于是模拟调度算法,所以,不实际启动输出一页和装入一页的程序,而用输出调出的页号和装入的页号来代替一次调出和装入的过程。三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)1.程序流程图以下为FIFO算法流程:取一条指令开始取指令中访问的页号查页表输出“*”页号表示发生缺页中断形成绝对地址输出绝对地址有后继指令?结束取下一条指令否是该页标志=1?2.逻辑设计使用线性表保存页表。每个节点信息包括调入主存的标志,主是否否是是模拟FIFO页面调度模拟硬件地址转换开始该页标志=1?取指令中访问的页号→L查页表形成绝对地址输出绝对地址有后继指令?取下一条指令是存指置L页修改标志为“1”结束j:=P[k]j页修改标志为1输出“outj”输出“inL”图4-2FIFO页面调度模拟算法取一条指令P[k]:=L,k:=(k+1)modm修改页表否(产生缺页中断)存块号,在磁盘上的位置,修改标志等。使用线性表保存FIFO算法使用的对应关系数组P,用数组模拟实现调度的队列。该队列需支持查找,插入和删除操作(即替换操作)。3、物理设计全局定义如下:structinfo//页表{boolflag;//标志longblock;//块号longdisk;//在磁盘上的位置booldirty;//修改标志}pagelist[SizeOfPage];longpo;//队列标记longP[M];使用函数init()进行初始化,使用循环结构读入各条指令。四、测试结果实际运行的结果如下:请选择题号(1/2):1请输入指令的页号和单元号:070绝对地址=710请输入指令的页号和单元号:4053*4请输入指令的页号和单元号:150绝对地址=1074请输入指令的页号和单元号:5023*5请输入指令的页号和单元号:215绝对地址=1167请输入指令的页号和单元号:1037绝对地址=1061请输入指令的页号和单元号:exit请选择题号(1/2):2请输入指令的页号、单元号,以及是否为存指令:070N绝对地址=710请输入指令的页号、单元号,以及是否为存指令:4053Nout0in4请输入指令的页号、单元号,以及是否为存指令:150N绝对地址=1074请输入指令的页号、单元号,以及是否为存指令:5023Nout1in5请输入指令的页号、单元号,以及是否为存指令:215N绝对地址=1167请输入指令的页号、单元号,以及是否为存指令:1037yout2in1请输入指令的页号、单元号,以及是否为存指令:321Y绝对地址=149请输入指令的页号、单元号,以及是否为存指令:2078Nout3in2请输入指令的页号、单元号,以及是否为存指令:056Nout4in0请输入指令的页号、单元号,以及是否为存指令:4001Nout5in4请输入指令的页号、单元号,以及是否为存指令:640Nout1in6请输入指令的页号、单元号,以及是否为存指令:6084Y绝对地址=1236请输入指令的页号、单元号,以及是否为存指令:exit数组P的值为:P[0]=0P[1]=4P[2]=6P[3]=2五、系统不足与经验体会系统的不足包括健壮性尚不够好,界面比较简单,对页表的初始化需要修改程序。经验体会:注意体会算法的精神,程序前后逻辑要一致。注意测试时数据的全面性。六、附录:源代码(带注释)#includecstdio#includecstring#defineSizeOfPage100#defineSizeOfBlock128#defineM4structinfo//页表{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){printf(绝对地址=%ld\n,pagelist[p].block*SizeOfBlock+q);}else{printf(*%ld\n,p);}}}while(!stop);}voidinit_ex2(){po=0;P[0]=0;P[1]=1;P[2]=2;P[3]=3;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_ex2(){longp,q,i;chars[100];boolstop=0;do{printf(请输入指令的页号、单元号,以及是否为存指令:\n);if(scanf(%ld%ld,&p,&q)!=2){scanf(%s,s);if(strcmp(s,exit)==0){stop=1;}}else{scanf(%s,s);if(pagelist[p].flag){printf(绝对地址=%ld\n,pagelist[p].block*SizeOfBlock+q);if(s[0]=='Y'||s[0]=='y'){pagelist[p].dirty=1;}}else{if(pagelist[P[po]].dirty){//将更新后的内容写回外存pagelist[P[po]].dirty=0;}pagelist[P[po]].flag=0;printf(out%ld\n,P[po]);printf(in%ld\n,p);pagelist[p].block=pagelist[P[po]].block;pagelist[p].flag=1;P[po]=p;po=(po+1)%M;}}}while(!stop);printf(数组P的值为:\n);for(i=0;iM;i++){printf(P[%ld]=%ld\n,i,P[i]);}}voidselect(){longse;chars[128];do{printf(请选择题号(1/2):);if(scanf(%ld,&se)!=1){scanf(%s,s);if(strcmp(s,exit)==0){return;}}else{if(se==1){init_ex1();work_ex1();}if(se==2){init_ex2();work_ex2();}}}while(1);}intmain(){select();return0;}
本文标题:计算机操作系统实验-存储器管理
链接地址:https://www.777doc.com/doc-6521942 .html