模拟请求页式存储管理中硬件的地址转换和缺页中断处理
模拟页式虚拟存储管理中硬件的地址转心得体会

模拟页式虚拟存储管理中硬件的地址转心得体会
页式虚拟存储管理中,硬件的地址转换过程是非常复杂的,需要多个硬件组件的协同工作来完成。
在我的学习中,我有一些体会和心得体会:
首先,在页式虚拟存储管理中,硬件的地址转换是通过页表实现的。
每个进程都有自己的页表,其中包含了虚拟页与物理页之间的对应关系。
当进程需要访问内存时,其虚拟地址会被分为页号和页内偏移量两部分,而页号就是用来查找页表中对应的物理页号的。
其次,在硬件地址转换的过程中,还需要使用到一个称为MMU(内存管理单元)的硬件组件。
MMU的作用就是将虚拟地址转换为物理地址。
它会在页表中查找想要访问的虚拟页号对应的物理页号,并使用物理页号和页内偏移量重新构造出物理地址。
最后,在使用页式虚拟存储管理时,还需要注意物理页的分配和清除。
物理页可以被多个进程共享使用,但是在进程结束时,需要及时清除对应的物理页帧,以确保不会引起内存泄漏和资源浪费。
总之,页式虚拟存储管理中硬件的地址转换过程非常复杂,需要多个硬件组件的协同工作来完成。
正确理解这个过程,并且合理地进行管理和分配物理页,才能保证进程的正常运行。
页式虚拟存储管理中地址转换和缺页中断实验报告

页式虚拟存储管理中地址转换和缺页中断实验报告一.实验目的1.深入了解页式存储管理如何实现地址转换;2.进一步认识页式虚拟存储管理中如何处理缺页中断。
二.实验仪器PC、windows操作系统、Visual C++6.0三.实验原理编写程序完成页式存储管理中地址转换过程和模拟缺页中断的处理。
实验具体包括:首先对给定的地址进行地址转换工作,若发生缺页则先进行缺页中断处理,然后再进行地址转换;最后编写主函数对所做工作进行测试。
四.实验步骤代码一#include <stdio.h>#include <string.h>#define n 64 //模拟实验中假定的页表长度#define length 10struct{int lnumber;//页号int flag;//表示页是否在主存,"1"表示在,"0"表示不在int pnumber;//该页所在主存块的块号int write; //该页是否被修改过,"1"表示修改过,"0"表示没有被修改过int dnumber;//该页存放在磁盘上的位置,即磁盘块号}page[n];//页表定义int m; //作业在主存中的主存块块数int page_length;//页表实际长度int p[length];//存放在主存中页的页号int head;//主存中页号队列头指针page_interrupt(lnumber) //缺页中断int lnumber;{int j;printf("发生缺页中断* %d\n",lnumber);j=p[head];//淘汰页的页号p[head]=lnumber; //新装入的页号head=(head+1) %m;if (page[j].write==1) //如果该页被修改过printf("将页%d写回磁盘第%d块\n",j,page[j].dnumber);//输出页号page[j].flag=0; //该页不在主存,执行缺页中断,将标志改为不在主存page[lnumber].pnumber=page[j].pnumber; //使j转去执行缺页中断page[lnumber].flag=1;//将所需页重新调入内存page[lnumber].write=0;//将标志改为未被修改过printf("淘汰主存%2d 中的页数%2d,从磁盘第%d 块中调入页%2d\n",page[j].pnumber,j,page[lnumber].dnumber,lnumber);}command(laddress,write)unsigned laddress;int write;{unsigned paddress,ad,pnumber,lnumber;kk:lnumber=laddress >> 10;ad=laddress &0x3ff;if(lnumber >= page_length)//如果页号大于页表长度,则该页不存在{printf("不存在该页\n");return;}if(page[lnumber].flag==1)//如果页表在主存内{pnumber=page[lnumber].pnumber;//从页表中取得块号paddress=pnumber<<10|ad;//合并块号和块内地址形成物理地址paddress;printf("逻辑地址是: %x 对应物理地址是:%x\n",laddress,paddress);if(write==1)//如果需要写,修改页的修改标志位page[lnumber].write=1;}else{page_interrupt(lnumber);//执行缺页中断goto kk;}}//命令处理函数结束void main(){int lnumber,flag,pnumber,write,dnumber;unsigned laddress;int i;printf("输入页表的信息,创建页表(若页号为-1,则结束输入)\n");printf("输入页号和辅存地址:");scanf("%d %d",&lnumber,&dnumber);//读入页号和辅存地址i=0;while(lnumber!=-1)//当页号不存在时,修改页表的信息,将各种标志位置0 {page[i].lnumber=lnumber;page[i].flag=0;page[i].write=0;page[i].dnumber=dnumber;i++;printf("输入页号和辅存地址:");scanf("%d%d",&lnumber,&dnumber);//重新读入新的页号和辅存地址}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",&pnumber);}printf("输入指令性质(1-修改,0-不需要,其他一结束程序运行)和逻辑地址:");scanf("%d%x",&write,&laddress);while(write==0||write==1){command(laddress,write);//执行相应的指令printf("输入指令性质(1-修改,0-不需要,其他一结束程序运行)和逻辑地址:");scanf("%d%x",&write,&laddress);}}//main()结束代码二#include<iostream>#include<iomanip>#include<list>using namespace std;char useSign[12][5]={{'+'},{'-'},{'*'},{"存"},{"取"},{'-'},{"移位"},{'+'},{"存"},{"取"},{'+'},{"存"}}; int PageAddress[12]={70,50,15,21,56,40,53,23,37,78,01,84};int PageNum[12]={0,1,2,3,0,6,4,5,1,2,4,6};int S_Station;int pPageNum[7];//页号pPageint pSign[7];int pStool[7];//页架号int pModify[7];//修改标志int pStation[7];//磁盘位置static int z=0;void Store(){for(int i=0;i<7;i++){if(i<4){pSign[i]=1;}elsepSign[i]=0;pPageNum[i]=i;pModify[i]=0;}int p1=1,p2=2,p3=3;for(i=0;i<7;i++){if(i<3){pStation[i]=p1;p1++;}elseif(i<6){pStation[i]=p2;p2++;}elsepStation[i]=p3;}pStool[0]=5;pStool[1]=8;pStool[2]=9;pStool[3]=1;}void CShow(){cout<<"操作";cout<<"页号";cout<<"页内地址";cout<<"标志";cout<<"绝对地址";cout<<"修改页号";cout<<"页架号";cout<<endl;}void Find(){int m_Pagenum;int m_Station;int Y_Station;//绝对地址int m_Stool;cout<<"输入页号及页内地址查询操作:";cin>>m_Pagenum>>m_Station;CShow();int i,j=0;//string m_Modify;for(i=0;i<12;i++){if(PageAddress[i]==m_Station){break;}}Y_Station=pStool[m_Pagenum]*1024+m_Station; if(pSign[m_Pagenum]==1) {if(strcpy(useSign[i],"存")!=0){pModify[m_Pagenum]=1;}}cout<<useSign[i]<<"\t";cout<<m_Pagenum<<"\t";cout<<m_Station<<"\t ";cout<<pSign[m_Pagenum]<<"\t";if(Y_Station!=m_Station){cout<<Y_Station<<"\t";cout<<pStool[m_Pagenum]<<"\t";cout<<Y_Station<<endl;}else{cout<<"*"<<m_Pagenum<<" "; for(j=z;j<7;j++){if(pSign[j]==1){z++;break;}}cout<<m_Pagenum<<"->"<<j<<"\t";pStool[m_Pagenum]=pStool[j];pSign[j]=0;pStool[j]=0;cout<<pStool[m_Pagenum]<<"\t";cout<<pStool[m_Pagenum]*1024+m_Station<<endl; }}int main(void){Store();char judge='Y';while(judge=='Y'){Find();cout<<"是否继续输入(请输入大写字母)?Y = 是N=否"<<endl;judge='N';cin>>judge;}return 0;}五.实验现象、结果记录及整理代码一代码二。
模拟请求页式存储管理中硬件的地址转换和缺页中断处理

一.实验内容模拟请求页式存储管理中硬件的地址转换和缺页中断处理 二.实验原理装入新页置换旧页时,若旧页在执行中没有被修改过,则不必将该页重写磁盘。
因此,页表中增加是否修改过的标志,执行“存”指令和“写”指令时将对应的修改标志置成“1”三.要求及方法:① 设计一个地址转换程序来模拟硬件的地址转换和缺页中断。
当访问的页在主存时则形成绝对地址,但不去模拟指令的执行,可以输出转换后的绝对地址来表示一条指令已执行完成。
当访问的页不在主存中时,则输出“*页号”来表示硬件产生了一次缺页中断。
模拟地址转换流程见图1。
② 编制一个FIFO 页面调度程序;FIFO 页面调度算法总是先调出作业中最先进入主存中的哪一页。
因此可以用一个数组来表示(或构成)页号队列。
数组中每个元素是该作业已在主存中的页面号,假定分配给作业的页架数为m ,且该作业开始的m 页已装入主存,则数组可由m 个元素构成。
P[0],P[1],P[2],…,P[m-1]它们的初值为P[0]:=0,P[1]:=1,P[2]:=2,…,P[m-1]:=m-1用一指针K 指示当要调入新页时应调出的页在数组中的位置,K 的初值为“0”,当产生缺页中断后,操作系统总是选择P[K]所指出的页面调出,然后执行:P[K]:=要装入的新页页号 K :=(k+1)mod m在实验中不必实际地启动磁盘执行调出一页和装入一页的工作,而用输出“OUT 调出的页号”和“IN 要装入的新页页号”来模拟一次调出和装入过程,模拟程序的流程图见附图1。
按流程控制过程如下:提示:输入指令的页号和页内偏移和是否存指令⎩⎨⎧ 0 1非存指令存指令,若d 为-1则结束,否则进入流程控制过程,得P1和d,查表在主存时,绝对地址=P1×1024+d③假定主存中页架大小为1024个字节,现有一个共7页的作业,其副本已在磁盘上。
系统为该作业分配了4个页架,且该作业的第0页至第3页已装入内存,其余3页未装入主四.主要代码及其说明#include <stdio.h>#include <string.h>#include <stdlib.h>#define M 1024#define R 4typedef struct _PTable{int Number; //页号int Flag; //标志int Fnum; //页架号int Mflag; //修改标志int Position; //该页存放在磁盘上的位置}PTable;//初始化PTable ptable[]={{0, 1, 5, 0, 11},{1, 1, 8, 0, 12},{2, 1, 9, 0, 13},{3, 1, 1, 0, 21},{4, 0, -1, 0, 22},{5, 0, -1, 0, 23},{6, 0, -1, 0, 121},};void menu();int change(char op,int number,int add);void display();int p[]={0,1,2,3},k=0;void main(void){int number,add,n;char op;while(n){display();fflush( stdin );printf("输入:操作页号页内地址(存指令用\"c\"代表)\n");scanf("%c %d %d",&op,&number,&add);change(op,number,add);printf("\"是否继续! (按1 继续按任意键结束)\"\n");scanf("%d",&n);system( "cls ");if(n==1)continue;elsebreak;}}void menu(){printf("操作码\t页号\t页内地址页架标志修改标志出入状态绝对地址(L)\n");}int change(char op,int number,int add){bool flag1=false;bool flag2=false;int i,address,cout,temp;;for(i=0;i<7;i++){if(op=='c'){ptable[number].Mflag=1;}if(ptable[i].Number==number && ptable[i].Flag==1){address=ptable[i].Fnum*M+add;flag1=true;}if(ptable[i].Number==number && ptable[i].Flag==0){cout=i;temp = p[k]; //将要出的页if(ptable[temp].Mflag==1){flag2=true;}//修改页表ptable[number].Flag=1; //修改新页标志ptable[number].Fnum=ptable[temp].Fnum; //修改新页页架address=ptable[number].Fnum*M+add;ptable[temp].Flag=0; //修改旧页ptable[temp].Fnum=-1; //修改页架ptable[temp].Mflag=0; //修改修改标志p[k]=number; //新页k=(k+1)%R;}}menu();if(flag1)printf("%c\t %d\t %d\t %d\t %d\t %d\t 无出入\t%d\n",op,number,add,ptable[number].Fnum,ptable[number].Flag,ptable[number].Mflag,address);else if(flag2)printf("%c\t *%d\t %d\t %d\t %d\t%d OUT:%d,IN:%d %d\n",op,number,add,number,ptable[number].Fnum,ptable[number].Flag,ptable[number].Mflag,temp,number,address);elseprintf("%c\t *%d\t %d\t %d\t %d\t %d\t IN%d\t %d\n",op,number,add,ptable[number].Fnum,ptable[number].Flag,ptable[number].Mflag,number,address);return 0;}void display(){int i;printf("********当前页表中的状态*********\n");printf("页号标志页架修标志\n");for(i=0;i<7;i++){printf("%d\t%d\t%d\t%d\n",ptable[i].Number,ptable[i].Flag,ptable[i].Fnum,ptable[i]. Mflag);}printf("当前主存中的页号为: ");for(i=0;i<4;i++){printf("%d ",p[i]);}printf("\n*********************************\n");}五,实验截图。
实验四页式虚拟存储管理中地址转换和页式中断FIFOLRUOPTC++版本

实验四页式虚拟存储管理中地址转换和页式中断FIFO一、实验目的深入了解页式存储管理如何实现地址转换;进一步认识页式虚拟存储管理中如何处理缺页中断以及页面置换算法。
二、实验主要内容编写程序完成页式虚拟存储管理中地址转换过程和模拟缺页中断的处理。
实验具体内容包括:首先对给定的地址进行转换工作,若发现缺页则先进行缺页中断处理,然后再进行地址转换;最后编写主函数对所做工作进行测试。
假定主存64KB,每个主存块1024字节,作业最大支持到64KB,系统中每个作业分得主存块4块。
三、实验原理1)地址转换过程:首先从逻辑地址中的高位取得页号,然后根据页号查页表,得到块号;然后从逻辑地址中的低位取得页内地址,将块号和页内地址合并即得到物理地址。
2)缺页中断处理根据页号查找页表,判断该页是否在主存储器中,若该页标志位“0”,形成缺页中断。
操作系统让调出中断处理程序处理中断。
四、实验方法与步骤实现地址转换与缺页中断处理,主要考虑三个问题:第一,设计页式虚拟存储管理方式中页表的数据结构;第二,地址转换算法的实现;第三,缺页中断处理算法的实现。
1)设计页表的数据结构页式虚拟存储管理方式中页表除了页号和该页对应的主存块号外,至少还要包括存在标志(该页是否在主存),磁盘位置(该页的副本在磁盘上的位置)和修改标志(该页是否修改过)。
在实验中页表用数组模拟,其数据结构定义如下:struct{int lnumber; //页号int flag; //表示页是否在主存中,“1”表示在,“0”表示不在int pnumber; // 该页所在主存块的块号int write; //该页是否被修改过,“1”表示修改过,“0“表示没有修改过int dnumber; //该页存放在磁盘上的位置,即磁盘块号}page[n]; //页表定义2)地址转换算法的实现地址转换是由硬件完成的,实验中使用软件程序模拟地址转换过程。
在实验中,每个主存块1024字节,则块内地址占10位;主存64KB,则主存共64块,即块号占6位;物理地址共占16位;作业最大64KB,则作业最大占64块,即页号占6位,逻辑地址共占16位。
缺页中断算法实验报告

一、实验目的1. 理解缺页中断的概念及其在操作系统中的作用。
2. 掌握常见的页面置换算法,如先进先出(FIFO)、最近最少使用(LRU)等。
3. 通过模拟实验,验证不同页面置换算法对缺页中断次数的影响。
4. 深入了解页式虚拟存储管理中地址转换的过程。
二、实验环境1. 操作系统:Windows 102. 编程语言:C/C++3. 实验工具:Visual Studio三、实验内容1. 模拟缺页中断的产生2. 实现不同的页面置换算法3. 分析页面置换算法对缺页中断次数的影响4. 模拟地址转换过程四、实验步骤1. 模拟缺页中断的产生(1)定义一个模拟指令序列,包含多个页面号。
(2)创建一个模拟的页表,用于记录每个页面是否在内存中。
(3)根据指令序列,遍历页表,判断访问的页面是否在内存中。
(4)如果页面不在内存中,则产生缺页中断。
2. 实现不同的页面置换算法(1)先进先出(FIFO)算法:- 定义一个队列,用于存储内存中的页面号。
- 当发生缺页中断时,将新页面号入队,同时判断队列长度是否超过内存块数。
- 如果队列长度超过内存块数,则将队首元素出队,模拟页面置换过程。
(2)最近最少使用(LRU)算法:- 定义一个链表,用于存储内存中的页面号。
- 当发生缺页中断时,将新页面号插入链表尾部。
- 如果链表长度超过内存块数,则从链表头部删除元素,模拟页面置换过程。
3. 分析页面置换算法对缺页中断次数的影响(1)定义一个变量,用于记录缺页中断次数。
(2)遍历模拟指令序列,根据不同的页面置换算法处理缺页中断。
(3)统计不同算法下的缺页中断次数,并进行比较。
4. 模拟地址转换过程(1)根据指令中的逻辑地址,计算页号和偏移量。
(2)根据页号,查找页表,判断页面是否在内存中。
(3)如果页面在内存中,则根据偏移量计算物理地址。
(4)如果页面不在内存中,则产生缺页中断。
五、实验结果与分析1. 模拟缺页中断的产生通过模拟指令序列,成功产生了缺页中断。
页式虚拟FIFO存储管理缺页中断的模拟算法

页式虚拟FIFO存储管理缺页中断的模拟算法FIFO一课程设计目的与功能1目的通过分析、设计和实现页式虚拟存储管理缺页中断的模拟系统,熟悉和掌握请求分页式存储管理的实现过程,重点掌握当请求页面不在内存而内存块已经全部被占用时的替换算法,熟悉常见替换算法的原理和实现过程,并利用替换算法的评价指标——缺页次数和缺页率,来对各种替换算法进行评价比较。
设计并实现出的结果程序要能够很好地显示页面调入和替换详细信息。
2初始条件(1)预备内容:阅读操作系统的内存管理章节内容,了解有关虚拟存储器、页式存储管理等概念,并体会和了解缺页和页面置换的具体实施方法。
(2)实践准备:掌握一种计算机高级语言的使用3 开发环境(1)使用系统:Windows XP(2)使用语言:C++(3)开发工具:Visual C++ 6.04功能设计的结果程序能实现OPT、FIFO、随机淘汰算法模拟页式存储管理缺页中断,主要能够处理以下的情形:(1) 用户能够输入给作业分配的内存块数;(2) 用户能够输入给定的页面,并计算发生缺页的次数以及缺页率;(3) 程序可随机生成页面序列,替代用户输入;(4) 缺页时,如果发生页面置换,输出淘汰的页号。
二需求分析,整体功能及设计数据结构或模块说明1 需求分析在纯页式存储管理提高了内存的利用效率,但并不为用户提供虚存,换句话说,当一个用户程序的页数大于当前总空闲内存块数时,系统就不能将该程序装入运行。
即用户程序将受到物理内存大小的限制。
为了解决这个问题,人们提出了能提供虚存的存储管理技术——请求分页存储管理技术和请求分段技术。
本设计实现请求分页管理技术。
请求分页系统是在分页系统的基础上,增加了请求调页功能和页面置换功能所形成的页式虚拟存储系统。
它允许只装入部分页面的程序和数据,便启动运行。
以后,再通过调页功能和页面置换功能,陆续把即将要运行的页面调入内存,同时把暂时不运行的页面换出到外存上。
置换时以页面为单位,为了能实现请求调页和置换功能,系统必须提供必要的硬件支持和相应的软件。
请求页式管理缺页中断模拟设计--FIFO、OPT
课程设计题目请求页式管理缺页中断模拟设计--FIFO、OPT学院计算机科学与技术专业班级姓名指导教师吴利军2013 年 1 月16 日课程设计任务书学生姓名:指导教师:吴利军_ 工作单位:计算机科学与技术学院题目: 请求页式管理缺页中断模拟设计--FIFO、OPT初始条件:1.预备内容:阅读操作系统的内存管理章节内容,了解有关虚拟存储器、页式存储管理等概念,并体会和了解缺页和页面置换的具体实施方法。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.实现指定淘汰算法。
能够处理以下的情形:⑴能够输入给作业分配的内存块数;⑵能够输入给定的页面,并计算发生缺页的次数以及缺页率;⑶缺页时,如果发生页面置换,输出淘汰的页号。
2.设计报告内容应说明:⑴需求分析;⑵功能设计(数据结构及模块说明);⑶开发平台及源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他方法(如果有,简要说明该方法);时间安排:设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。
周4、周5:验收、撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日请求页式管理缺页中断模拟设计——FIFO、OPT1课程设计目的与功能1.1设计目的结合《操作系统》所学内存页式管理章节,掌握虚拟内存设计的重要性,熟悉和掌握请求分页式存储管理的实现原理,通过分析、设计和实现页式虚拟存储管理缺页中断的模拟系统,重点掌握当请求页面不在内存而内存块已经全部被占用时的替换算法(主要通过FIFO和OPT实现),并考察替换算法的评价指标——缺页次数和缺页率,得到淘汰的页面次序。
模拟分页式虚拟存储管理中硬件的地址转换和缺页中断--选择页面调度算法处理缺页中断
操作系统实验二〔第一题〕一.实验内容模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断。
二.实验目的在电脑系统总,为了提高主存利用率,往往把辅助存储器作为主存储器的扩充,使多道运行的作业的全部逻辑地址空间综合可以超出主存的绝对地址空间。
用这种方法扩充的主存储区成为虚拟存储器。
三.实验题目模拟分页式存储管理中硬件的地址转换和产生缺页中断。
四.程序清单//// 操作实验二.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"#include<iostream>#include<string>#include<fstream>using namespace std;class ins{private:string ope;long int page;long int unit;public:ins(){ }ins(string o,long int p,long int u):ope(o),page(p),unit(u){}void setope(string o){ ope=o;}void setpage(long int p){ page=p;}void setunit(long int u){ unit=u;}string getope(){return ope;}long int getpage(){return page;}long int getunit(){return unit;}};class work{private:long int Page;int sym;long int inum;long int onum;public:work(){}work(long int P, int s,long int i,long int o):Page(P),sym(s),inum(i),onum(o){} void setPage(long int P){ Page=P;}void setsym( int s){ sym=s;}void setinum(long int i){ inum=i;}void setonum(long int o){ onum=o;}long int getPage(){return Page;}int getsym(){return sym;}long int getinum(){return inum;}long int getonum(){return onum;}};void diaodu(work *w,ins * i,int numofins){ for(int j=0;j<numofins;j++){long int tempofk;long int a =i[j].getpage();for(int k=0;k<7;k++) //7是页表的页数if(w[k].getPage()!=a)continue;else{tempofk=k;break;}if(w[tempofk].getsym()==1)cout<<"绝对地址:"<<w[tempofk].getinum()*128+i[j].getunit()<<" "<<"磁盘地址为:"<<w[tempofk].getonum()<<" "<<"操作为:"<<i[j].getope()<<endl;else cout<<"*"<<"发生缺页中断"<<endl;}}int main(){ins*INS=new ins[12];INS[0].setope ("+");INS[0].setpage(0);INS[0].setunit(70);INS[1].setope ("+");INS[1].setpage(1);INS[1].setunit(50);INS[2].setope ("×");INS[2].setpage(2);INS[2].setunit(15);INS[3].setope ("存"); INS[3].setpage(3);INS[3].setunit(21);INS[4].setope ("取"); INS[4].setpage(0);INS[4].setunit(56);INS[5].setope ("-");INS[5].setpage(6);INS[5].setunit(40);INS[6].setope ("移位"); INS[6].setpage(4);INS[6].setunit(53);INS[7].setope ("+");INS[7].setpage(5);INS[7].setunit(23);INS[8].setope ("存"); INS[8].setpage(1);INS[8].setunit(37);INS[9].setope ("取"); INS[9].setpage(2);INS[9].setunit(78);INS[10].setope ("+"); INS[10].setpage(4);INS[10].setunit(1);INS[11].setope ("存"); INS[11].setpage(6);INS[11].setunit(84);work*W =new work[7]; ifstream in("g://operate1.txt");long int p;int s;long int i;long int o;for(int jj=0;jj<7 ;jj++){in>>p;in>>s;in>>i;in>>o ;W[jj].setPage(p);W[jj].setsym(s);W[jj].setinum(i);W[jj].setonum(o);}diaodu(W,INS,12);}五.结果显示操作系统实验二〔第二题〕一.用先进先出〔FIFO〕九.程序清单/ 操作系统实验二.cpp : 定义控制台应用程序的入口点。
《操作系统)(中国铁道出版社)习题答案第四章
⒈计算机系统中存储器一般分为哪两级?各有什么特点?答:计算机系统中存储器一般分为主存储器和辅助存储器两级。
主存储器简称主存,又称为内存,它由自然数顺序编址的单元(通常为字或字节)所组成,是处理机直接存取指令和数据的存储器,它速度快,但容量有限。
辅助存储器简称辅存,又称为外存,它由顺序编址的“块”所组成,每块包含若干个单元,寻址与交换以块为单位进行,处理机不能直接访问它,它须经过专门的启动入出过程与内存交换信息,它存取速度较慢,但容量远大于内存,实际上,现代计算机系统中用户的数据(或信息)都是保存在外存中。
⒉存储管理的目的是什么?答:存储管理要实现的目的是:为用户提供方便、安全和充分大的存储空间。
所谓方便是指将逻辑地址和物理地址分开,用户只在各自逻辑地址空间编写程序,不必过问物理空间和物理地址的细节,地址的转换由操作系统自动完成;安全则是指同时驻留在内存的多道用户程序相互之间不会发生干扰,也不会访问操作系统所占有的空间。
充分大的存储空间是指利用虚拟存储技术,从逻辑上对内存空间进行扩充,从而可以使用户在较小内存里运行较大程序。
⒊存储管理的任务是什么?答:存储管理是计算机操作系统软件的一部分,它负责完成对主存储器的地址转换,对主存储器进行分配与去配,解决多用户对主存储器的共享和保护,通过软件手段,实现对主存储器容量的扩充。
⒋地址转换可分为哪三种方式?比较这三种方式的优缺点。
答:由逻辑地址转化为物理地址的地址转换过程,按照转换的时间不同,可以分为3种方式:①绝对装入方式②静态重定位方式③动态重定位方式(第二问略)⒌可变分区常用的分区算法有哪几种?它们各自的特点是什么?答:首次适应算法、循环首次适应算法、最佳适应算法、最差适应算法(第二问略)⒍试用类C语言写首次适应算法的分配过程。
答:firstmatch(n){p=Free;while(p!=NULL){if(p->size>=n){if(p->size-n>=size)p->size=p->size-n;a=p;p=p+n;elsea=p;remove(Free,p);}elsep=p->next}return a}⒎什么叫紧凑?为什么要进行紧凑?答:为了解决碎片问题,可采用的一种方法是,将内存中的所有作业进行移动,使它们相邻接。
请求页式管理缺页中断模拟设计--LRU、OPT
课程设计题目请求页式管理缺页中断模拟设计--LRU、OPT 学院计算机科学与技术学院专业班级姓名指导教师吴利军2013 年 1 月16 日课程设计任务书学生姓名:指导教师:吴利军工作单位:计算机科学与技术学院题目: 请求页式管理缺页中断模拟设计--LRU、OPT初始条件:1.预备内容:阅读操作系统的内存管理章节内容,了解有关虚拟存储器、页式存储管理等概念,并体会和了解缺页和页面置换的具体实施方法。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.实现指定淘汰算法。
能够处理以下的情形:⑴能够输入给作业分配的内存块数;⑵能够输入给定的页面,并计算发生缺页的次数以及缺页率;⑶缺页时,如果发生页面置换,输出淘汰的页号。
2.设计报告内容应说明:⑴需求分析;⑵功能设计(数据结构及模块说明);⑶开发平台及源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他方法(如果有,简要说明该方法);时间安排:设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。
周4、周5:验收、撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日请求页式管理缺页中断模拟设计----LRU、OPT1 设计目的与功能1.1 设计目的巩固并加深对虚拟存储器、请求页式存储管理等概念的理解,掌握请求页式管理中的置换算法的基本思想。
并针对LRU(最近最久未使用页面置换算法),以及OPT(理想型淘汰算法)两种算法,利用高级语言,设计出相应的模拟程序。
结合设计的程序,在理论联系实际的基础上,分析各个页面置换算法的优缺点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一.实验内容
模拟请求页式存储管理中硬件的地址转换和缺页中断处理 二.实验原理
装入新页置换旧页时,若旧页在执行中没有被修改过,则不必将该页重写磁盘。
因此,页表中增加是否修改过的标志,执行“存”指令和“写”指令时将对应的修改标志置成“1”
三.要求及方法:
① 设计一个地址转换程序来模拟硬件的地址转换和缺页中断。
当访问的页在主存时则形成绝对地址,但不去模拟指令的执行,可以输出转换后的绝对地址来表示一条指令已执行完成。
当访问的页不在主存中时,则输出“*页号”来表示硬件产生了一次缺页中断。
模拟地址转换流程见图1。
② 编制一个FIFO 页面调度程序;FIFO 页面调度算法总是先调出作业中最先进入主存中的哪一页。
因此可以用一个数组来表示(或构成)页号队列。
数组中每个元素是该作业已在主存中的页面号,假定分配给作业的页架数为m ,且该作业开始的m 页已装入主存,则数组可由m 个元素构成。
P[0],P[1],P[2],…,P[m-1]
它们的初值为P[0]:=0,P[1]:=1,P[2]:=2,…,P[m-1]:=m-1
用一指针K 指示当要调入新页时应调出的页在数组中的位置,K 的初值为“0”,当产生缺页中断后,操作系统总是选择P[K]所指出的页面调出,然后执行:
P[K]:=要装入的新页页号 K :=(k+1)mod m
在实验中不必实际地启动磁盘执行调出一页和装入一页的工作,而用输出“OUT 调出的页号”和“IN 要装入的新页页号”来模拟一次调出和装入过程,模拟程序的流程图见附图1。
按流程控制过程如下:
提示:输入指令的页号和页内偏移和是否存指令⎩
⎨⎧ 0 1非存指令存指令,若d 为-1则结束,否则进
入流程控制过程,得P1和d,查表在主存时,绝对地址=P1×1024+d
③假定主存中页架大小为1024个字节,现有一个共7页的作业,其副本已在磁盘上。
系统为该作业分配了4个页架,且该作业的第0页至第3页已装入内存,其余3页未装入主
四.主要代码及其说明
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define M 1024
#define R 4
typedef struct _PTable
{
int Number; //页号
int Flag; //标志
int Fnum; //页架号
int Mflag; //修改标志
int Position; //该页存放在磁盘上的位置
}PTable;
//初始化
PTable ptable[]=
{
{0, 1, 5, 0, 11},{1, 1, 8, 0, 12},
{2, 1, 9, 0, 13},{3, 1, 1, 0, 21},
{4, 0, -1, 0, 22},{5, 0, -1, 0, 23},
{6, 0, -1, 0, 121},};
void menu();
int change(char op,int number,int add);
void display();
int p[]={0,1,2,3},k=0;
void main(void)
{
int number,add,n;
char op;
while(n)
{
display();
fflush( stdin );
printf("输入:操作页号页内地址(存指令用\"c\"代表)\n");
scanf("%c %d %d",&op,&number,&add);
change(op,number,add);
printf("\"是否继续! (按1 继续按任意键结束)\"\n");
scanf("%d",&n);
system( "cls ");
if(n==1)
continue;
else
break;
}
}
void menu()
{
printf("操作码\t页号\t页内地址页架标志修改标志出入状态绝对地址(L)\n");
}
int change(char op,int number,int add)
{
bool flag1=false;
bool flag2=false;
int i,address,cout,temp;;
for(i=0;i<7;i++)
{
if(op=='c')
{
ptable[number].Mflag=1;
}
if(ptable[i].Number==number && ptable[i].Flag==1)
{
address=ptable[i].Fnum*M+add;
flag1=true;
}
if(ptable[i].Number==number && ptable[i].Flag==0)
{
cout=i;
temp = p[k]; //将要出的页
if(ptable[temp].Mflag==1)
{
flag2=true;
}
//修改页表
ptable[number].Flag=1; //修改新页标志
ptable[number].Fnum=ptable[temp].Fnum; //修改新页页架
address=ptable[number].Fnum*M+add;
ptable[temp].Flag=0; //修改旧页
ptable[temp].Fnum=-1; //修改页架
ptable[temp].Mflag=0; //修改修改标志
p[k]=number; //新页
k=(k+1)%R;
}
}
menu();
if(flag1)
printf("%c\t %d\t %d\t %d\t %d\t %d\t 无出入\t%d\n",op,number,add,ptable[number].Fnum,
ptable[number].Flag,ptable[number].Mflag,address);
else if(flag2)
printf("%c\t *%d\t %d\t %d\t %d\t%d OUT:%d,IN:%d %d\n",op,number,add,number,
ptable[number].Fnum,ptable[number].Flag,ptable[number].Mflag,temp,number,addres
s);
else
printf("%c\t *%d\t %d\t %d\t %d\t %d\t IN%d\t %d\n",op,number,add,ptable[number].Fnum,
ptable[number].Flag,ptable[number].Mflag,number,address);
return 0;
}
void display()
{
int i;
printf("********当前页表中的状态*********\n");
printf("页号标志页架修标志\n");
for(i=0;i<7;i++)
{
printf("%d\t%d\t%d\t%d\n",ptable[i].Number,ptable[i].Flag,ptable[i].Fnum,ptable[i]. Mflag);
}
printf("当前主存中的页号为: ");
for(i=0;i<4;i++)
{
printf("%d ",p[i]);
}
printf("\n*********************************\n");
}
五,实验截图。