请求分页管理实验报告

合集下载

请求分页存储管理

请求分页存储管理

实验3 请求分页存储管理实验目的(1)熟悉主存的分配与回收;(2)了解虚拟存储技术的特点;(3)掌握请求页式存储管理的页面置换算法;实验内容与步骤1、实验准备知识(1) 通过随机数产生一个指令序列(2) 将指令序列变换成为页地址流设:(3) 计算并输出下述各种算法在不同内存容量下的命中率a) 先进先出的算法(FIFO);b) 最近最少使用算法(LRU);c) 最佳淘汰算法(OPT);(4)所涉及的算法1)FIFO算法定义变量ptr。

一开始先预调页填满内存。

在这一部分,ptr指向下一个要存放的位置。

之后继续执行剩下的指令。

此时,ptr表示队列最前面的位置,即最先进来的位置,也就是下一个要被替换的位置。

ptr用循环加,即模拟循环队列。

2)LRU算法定义数组ltu[],即last_time_use来记录该页最近被使用的时间。

定义变量ti模拟时间的变化,每执行一次加一。

这个算法,我没有预调页,而是直接执行所有指令。

若当前需要的页没在内存里,就寻找最近最少使用的页,也就是ltu[]最小的页,即最近一次使用时间离现在最久的页,然后替换掉它。

或者在内存还未满时,直接写入,这个我以初始化内存里所有页为-1来实现。

若已经在内存里了,则只遍历内存内的页,把当前页的最近使用时间改一下即可。

3)OPT算法定义数组ntu[], 即next_time_use来记录下一次被使用的时间,即将来最快使用时间。

初始化为-1.开始时预调页填满内存里的页。

同样利用变量ptr来表示下一个要存放的位置从而控制预调页的过程。

接着初始化ntu数组为-1。

然后求出每一页下一次被使用的指令号,以此代替使用时间。

如果所有剩下的序列都没有用该页时,则还是-1.这种值为-1的页显然是最佳替换对象。

然后执行所有剩下的指令。

当该页不在内存里时,遍历ntu数组,遇到-1的直接使用该页,没有则用ntu[]值最大的,也就是最晚使用的。

无论该页在不在内存里,因为这一次已经被使用了,所以都应该更新这个页的ntu[],只需往前看要执行的页流,记录下第一个遇到的该页即可。

实验6请求分页存储管理.doc

实验6请求分页存储管理.doc

实验6请求分页存储管理实验6:请求分页存储管理1。

实验的目的是深入理解请求分页存储管理的基本概念和实现方法,重点是地址转换、分页、替换算法等的实现思路。

2.实验属性本实验是综合性和设计性的。

3.实验仪器和设备通用PC386或以上微机4。

这个实验需要两个小时才能完成。

该实验需要以下任务:(1)建立相关数据结构:页表、页表寄存器、存储块表等。

(2)指定分配给进程的物理内存块的数量,并设置进程的页面访问顺序;(3)设计页面替换算法,可以选择OPT、FIFO、LRU等。

并计算相应的缺页率来比较它们的优缺点;(4)编写地址转换函数,通过查找页表完成从逻辑地址到物理地址的转换;如果页面丢失,选择一些替换算法(选择,先进先出,LRU等)。

)来完成页面交换;(5)可视化整个过程。

实验前应复习实验涉及的理论知识和算法,根据实验要求完成基本代码编译和预览报告,在实验中认真调试编译好的代码并进行必要的测试,记录和分析实验结果。

实验结束后,认真编写符合标准格式的实验报告(见附件一),并要求正式的实验报告纸和封面装订整齐,按时提交。

三、设计过程3.1算法原理分析OPT算法是未来最远的,当当前内存中没有页面即将访问时,替换当前页面在未来访问页面中最远的页面或者永远不出现。

先进先出算法是先进先出。

当当前内存中没有要访问的页面时,将替换最高级的页面。

LRU算法是最近最长的未使用页面。

当当前存储器中没有将要被访问的页面时,当前页面中最近且最长时间未被使用的页面被替换。

3.2数据定义int长度、num_page、计数、种子;//长度记录访问字符串的长度,页数,计算[20] [30],[30],[10]中丢失的页数;//result记录结果,order存储访问字符串,a存储当前页中的值int pos1、flag1、flag2、flag3//pos1位置变量、标志1等。

标志变量是字符结果1[30];//记录缺失的页面数组void opt() //best void fifo() //先进先出bool search(int n) //找出当前内存中是否已经存在页面3.3流程图和操作截图,执行的指令是否启动,指令是否首先存储在内存中,指令是否被删除,是否有任何指令结束以获得命中率图6.1 FIFO()函数流程图;开始在内存中输入分发页的数据时,第一个访问页初始化第一列值并请求访问页?内存中是否已经存在前一列的直接副本?内存中有空闲页面吗?直接插入到替换内存中,输出所有将来不会发生或离当前页面最远的页面更改。

实验二--请求分页存储管理模拟实验

实验二--请求分页存储管理模拟实验

实验二请求分页存储管理模拟实验一、实验目的:通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。

熟悉虚存管理的各种页面淘汰算法。

通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。

二、实验要求:设计一个请求页式存储管理方案。

并编写模拟程序实现。

(1)产生一个需要访问的指令地址流。

它是一系列需要访问的指令的地址。

为不失一般性,你可以适当地(用人工指定地方法或用随机数产生器)生成这个序列。

(2)简单起见,页面淘汰算法采用LRU页面淘汰算法,并且在淘汰一页时,只将该页在页表中抹去。

而不再判断它是否被改写过,也不将它写回到辅存。

#include<iostream>#include<stdio.h>#include<stdlib.h>#include<string.h>using namespace std;struct pagetable{int pagenumber;//页号int phnumber;//物理块号int state;//状态位int visit;//访问字段int modify;//修改位int address;//外存地址};struct logicA{int pagenumber;int pagedaddress;};pagetable p[10];int ph[4]={1,2,3,4};//4个物理块int j=0;bool boolph[4]={true,true,false,true};void show(){for(int i=0;i<5;i++){cout<<"页号\t"<<"物理块号\t"<<"状态位\t"<<"访问字段"<<endl;cout<<p[i].pagenumber<<"\t"<<p[i].phnumber<<"\t\t"<<p[i].state<<"\t"<<p[i].visit<<endl;}}int phaddress;void disp(int i,logicA log[]){int page;page=log[i].pagenumber;if(page>5)cout<<"越界"<<endl;else{if(p[page].state==1){p[page].visit++;phaddress=log[i].pagedaddress+4096*p[page].phnumber;cout<<"在内存中---------------------------------"<<endl;show();cout<<"物理地址为:"<<phaddress<<endl;}else{int sum=0;for(int i=0;i<5;i++)sum+=p[i].state;if(sum==4)//内存满{int temp=1000,j,x;for( j=0;j<5;j++){if(p[j].state==1&&p[j].visit<temp){temp=p[j].visit;x=j;}}p[page].phnumber=p[x].phnumber;p[page].state=1;p[x].state=0;p[x].phnumber=0;cout<<"内存已经满,替换第"<<x+1<<"块"<<endl;show();}else //内存未满{cout<<"内存未满,调入页面进内存----------------------"<<endl;if(p[page].modify==0){for(int j=0;j<4;j++){if(!boolph[j]){p[page].phnumber=ph[j];boolph[j]=true;}}p[page].state=1;show();}else{cout<<"先写回外存"<<endl;cout<<"外存换回内存"<<endl;for(int j=0;j<4;j++){if(!boolph[j]){p[page].phnumber=ph[j];boolph[j]=true;}}p[page].state=1;show();}}}}}void init(){p[0].pagenumber=0;p[0].phnumber=1;p[0].state=0;p[0].visit=1;p[0].modify=0;//1 p[1].pagenumber=1;p[1].phnumber=0;p[1].state=0;p[1].visit=0;p[1].modify=0;//2 p[2].pagenumber=2;p[2].phnumber=2;p[2].state=0;p[2].visit=2;p[2].modify=1;//3 p[3].pagenumber=3;p[3].phnumber=0;p[3].state=0;p[3].visit=0;p[3].modify=0;//4 p[4].pagenumber=4;p[4].phnumber=4;p[4].state=0;p[4].visit=1;p[4].modify=0;//5 }void logic(){int logicAddress;//31——12 为页号(0-4),11-0为页内地址(5-7)212=4KB int sum;init();while(1){printf("输入逻辑地址快数:");scanf("%d",&sum);logicA log[sum];for(int i=0;i<sum;i++){printf("输入第%d个逻辑地址:",i+1);scanf("%d",&logicAddress);//show();log[i].pagenumber=logicAddress/4096; //4kBlog[i].pagedaddress=logicAddress%4096;disp(i,log);}}}int main(){logic();//show();return 0;}。

请求分页实验报告

请求分页实验报告

一、实验目的1. 理解请求分页的基本原理和实现方法。

2. 掌握操作系统内存管理的基本知识。

3. 提高编程能力和系统设计能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:C/C++3. 开发环境:Visual Studio 2019三、实验原理请求分页是一种内存管理策略,其基本思想是当进程访问内存中的某页时,如果该页不在内存中,则从磁盘读取该页到内存,并将内存中的一部分页调出磁盘。

请求分页可以提高内存的利用率,避免内存碎片。

四、实验内容1. 设计请求分页系统2. 实现请求分页算法3. 测试请求分页系统的性能五、实验步骤1. 设计请求分页系统(1)定义数据结构定义进程结构体、内存块结构体、页面表结构体等。

(2)初始化系统初始化内存块、页面表、进程队列等。

(3)请求分页算法实现实现FIFO、LRU、LFU等请求分页算法。

2. 实现请求分页算法(1)FIFO算法FIFO(先进先出)算法是最简单的请求分页算法,当请求分页时,总是选择最先进入内存的页面调出。

(2)LRU算法LRU(最近最少使用)算法选择最近最少被访问的页面调出,可以有效减少缺页中断。

(3)LFU算法LFU(最少使用频率)算法选择使用频率最低的页面调出,适用于页面使用频率不均匀的情况。

3. 测试请求分页系统的性能(1)定义测试用例设计一系列测试用例,包括不同大小的进程、不同类型的页面访问模式等。

(2)运行测试用例运行测试用例,记录缺页中断次数、页面命中率等性能指标。

(3)分析结果分析测试结果,比较不同请求分页算法的性能。

六、实验结果与分析1. 实验结果通过实验,我们得到了以下结果:(1)FIFO算法:缺页中断次数为50,页面命中率为90%。

(2)LRU算法:缺页中断次数为30,页面命中率为95%。

(3)LFU算法:缺页中断次数为35,页面命中率为92%。

2. 分析结果从实验结果可以看出,LRU算法在三种算法中性能最好,其次是LFU算法,FIFO算法性能最差。

分页管理系统实验报告材料

分页管理系统实验报告材料

2015-2016学年第二学期操作系统课程实验设计报告班级网络2班学号 7金铖成绩指导教师于复兴1、实验题目:(1)模拟请求分页存储管理中的硬件地址转换和产生却页中断的过程。

(2)采用先进先出(或LRU)算法实现分页管理的缺页调度。

2、实验目的:(1)通过实验模拟请求分页存储管理中的硬件地址转换和产生却页中断帮助理解在分页式存储管理中怎样虚拟存储器。

(2)通过采用先进先出(或LRU)算法实现分页管理的缺页调度帮助理解和掌握模拟分页式虚拟存储管理的缺页中断,帮助自己对请求分页管理的概念有一个清楚的理解。

3、程序设计及实现过程:(1)请求分页储存管理是把作业的全部信息存在磁盘上,当作业被选中时,可把作业的开始几页先装入主存并启动运行。

为此,在为作业建立页表时,应说明哪些页已在主存,哪些页尚未装入主存,页表格式为:其中,标志表示对应页是否已经装入主存,“标志 = 0”表示该页尚未装入主存,“标志= 1”表示该页已在主存。

主存块号表示已装入主存的页所占用的块号。

外存地址表示该页在外存的地址。

(2)作业执行完时,指令中的逻辑地址指出了参加运算的操作数存放的页号和单元号,硬件地址转换机构按页号查页表,若该页对应的标志为“1”,则表示该页已在主存。

根据关系式:绝对地址=块号*块长+单元号。

计算出欲访问的主存单元地址,将块长设成2的整次幂,可把块号作为地址寄存器的高位部分,单元号作为低位部分。

两个拼接形成绝对地址。

按计算出的绝对地址取操作数,完成一条指令的执行。

若访问的页对应标志为“0”,则表示不在主存,这时硬件发缺页中断信号,由操作系统按页表中的该页对应的外存地址把该页装入主存后,执行该指令。

(3)设计一个“地址变换”程序来模拟硬件的地址转换工作。

当访问的页不在主存时,则形成绝对地址后不去模拟指令的执行,而用输出转换后的地址来代替一条指令的执行,当访问的页不在主存时,则输出“*”,表示产生了一次缺页中断。

该算法框图如下:地址变换算法:假定主存的每块长度为126个字节;现有一个共7页的作业,其中第0页至第3页已装入,其余三页尚未装入主存,该作业的页表为:标志主存块号外存地址页号0 1 5 0111 1 8 0122 1 9 0133 1 1 0214 0 0225 0 0236 0 121运行设计的地址变换机构程序,显示或打印运行结果。

操作系统实验4-请求分页存储管理模拟实验

操作系统实验4-请求分页存储管理模拟实验

实验四请求分页存储管理模拟实验一:实验目得通过对页面、页表、地址转换与页面置换过程得模拟,加深对请求分页存储管理系统得原理与实现技术得理解.二:实验内容假设每个页面可以存放10条指令,分配给进程得存储块数为4。

用C语言或Pascal语言模拟一进程得执行过程。

设该进程共有320条指令,地址空间为32个页面,运行前所有页面均没有调入内存。

模拟运行时,如果所访问得指令已经在内存,则显示其物理地址,并转下一条指令;如果所访问得指令还未装入内存,则发生缺页,此时需要记录缺页产生次数,并将相应页面调入内存,如果4个内存块已满,则需要进行页面置换。

最后显示其物理地址,并转下一条指令。

在所有指令执行完毕后,显示进程运行过程中得缺页次数与缺页率.页面置换算法:分别采用OPT、FIFO、LRU三种算法。

进程中得指令访问次序按如下原则生成:50%得指令就是顺序执行得。

25%得指令就是均匀分布在低地址部分.25%得指令就是均匀分布在高地址部分.三:实验类别分页存储管理四:实验类型模拟实验五:主要仪器计算机六:结果OPT:LRU:FIFO:七:程序# i nclude 〈stdio 、h 〉# incl ude 〈stdlib 、h 〉# include 〈conio 、h># def ine blockn um 4//页面尺寸大小int m; //程序计数器,用来记录按次序执行得指令对应得页号s ta ti c in t num [320]; //用来存储320条指令typedef s truct BLOCK //声明一种新类型—-物理块类型{ﻩint pagenum; //页号ﻩint acces sed; //访问量,其值表示多久未被访问}BLOCK ;BLOCK bl ock [bl ocknum ]; //定义一大小为8得物理块数组void init () //程序初始化函数,对bl ock 初始化{for (int i=0;i <blo cknum;i++)block[i]、pagenum=—1;block[i]、accessed=0;ﻩm=0;}}int pageExist(int curpage)//查找物理块中页面就是否存在,寻找该页面curpage就是否在内存块block中,若在,返回块号{ﻩfor(int i=0;i<blocknum; i++)ﻩ{ﻩﻩif(block[i]、pagenum == curpage )ﻩﻩreturn i; //在内存块block中,返回块号ﻩ}return -1;}int findSpace()//查找就是否有空闲物理块,寻找空闲块block,返回其块号{for(int i=0;i<blocknum;i++)ﻩ{if(block[i]、pagenum==-1)ﻩreturn i;//找到了空闲得block,返回块号}ﻩreturn -1;}int findReplace()//查找应予置换得页面{ﻩint pos = 0;ﻩfor(int i=0;i〈blocknum;i++){if(block[i]、accessed 〉block[pos]、accessed)ﻩpos = i; //找到应该置换页面,返回BLOCK中位置ﻩ}return pos;}void display()//显示物理块中得页面号{ﻩﻩfor(int i=0; i〈blocknum; i++)ﻩ{ﻩif(block[i]、pagenum != -1)ﻩ{ﻩﻩprintf(” %02d ",block[i]、pagenum);ﻩﻩﻩprintf("%p |”,&block[i]、pagenum);ﻩﻩ}printf("\n");}void randam()//产生320条随机数,显示并存储到num[320]{int flag=0;printf(”请为一进程输入起始执行指令得序号(0~320):\n”);ﻩscanf("%d",&m);//用户决定得起始执行指令printf("******进程中指令访问次序如下:(由随机数产生)*******\n");for(int i=0;i〈320;i++){//进程中得320条指令访问次序得生成ﻩﻩnum[i]=m;//当前执行得指令数,ﻩﻩif(flag%2==0)ﻩm=++m%320;//顺序执行下一条指令ﻩﻩif(flag==1)ﻩﻩm=rand()%(m-1);//通过随机数,跳转到低地址部分[0,m—1]得一条指令处,设其序号为m1if(flag==3)ﻩﻩm=m+1+(rand()%(320-(m+1)));//通过随机数,跳转到高地址部分[m1+2,319]得一条指令处,设其序号为m2ﻩﻩflag=++flag%4;ﻩprintf(” %03d”,num[i]);//输出格式:3位数ﻩﻩif((i+1)%10==0)//控制换行,每个页面可以存放10条指令,共32个页面ﻩprintf(”\n”);}}void pagestring() //显示调用得页面序列,求出此进程按次序执行得各指令所在得页面号并显示输出{for(int i=0;i〈320;i++)ﻩ{printf(”%02d",num[i]/10);//输出格式:2位数if((i+1)%10==0)//控制换行,每个页面可以存放10条指令,共32个页面ﻩﻩprintf("\n”);}}void OPT() //最佳替换算法{ﻩint n=0;//记录缺页次数int exist,space,position;ﻩintcurpage;//当前指令得页面号ﻩfor(int i=0;i<320;i++)ﻩ{ﻩm=num[i];ﻩcurpage=m/10;ﻩﻩexist=pageExist(curpage);ﻩif(exist==-1)ﻩﻩ{ //当前指令得页面号不在物理块中space=findSpace();ﻩﻩif(space != -1)ﻩﻩ{//当前存在空闲得物理块ﻩﻩblock[space]、pagenum= curpage;//将此页面调入内存ﻩﻩﻩdisplay();//显示物理块中得页面号ﻩﻩn++;//缺页次数+1ﻩ}ﻩﻩelseﻩﻩ{ //当前不存在空闲得物理块,需要进行页面置换for(intk=0;k<blocknum;k++)ﻩﻩﻩﻩ{for(int j=i;j〈320;j++)ﻩ{//找到在最长(未来)时间内不再被访问得页面ﻩﻩﻩﻩif(block[k]、pagenum!= num[j]/10)ﻩﻩﻩ{ﻩﻩblock[k]、accessed = 1000;ﻩﻩﻩ} //将来不会被访问,设置为一个很大数ﻩﻩﻩelseﻩﻩﻩ{ //将来会被访问,访问量设为jﻩﻩﻩblock[k]、accessed = j;ﻩﻩﻩﻩﻩbreak;ﻩﻩﻩﻩ}ﻩﻩﻩ}ﻩ}ﻩposition = findReplace();//找到被置换得页面,淘汰ﻩblock[position]、pagenum = curpage;// 将新页面调入display();ﻩﻩn++; //缺页次数+1ﻩ}}ﻩ}ﻩprintf(”缺页次数:%d\n",n);printf("缺页率:%f%%\n",(n/320、0)*100);}void LRU() //最近最久未使用算法{int n=0;//记录缺页次数ﻩint exist,space,position ;ﻩint curpage;//当前指令得页面号ﻩfor(int i=0;i<320;i++)ﻩ{ﻩm=num[i];ﻩﻩcurpage=m/10;ﻩexist = pageExist(curpage);ﻩif(exist==-1)ﻩﻩ{ //当前指令得页面号不在物理块中space = findSpace();ﻩﻩif(space!= —1)ﻩ{ //当前存在空闲得物理块ﻩﻩblock[space]、pagenum = curpage;//将此页面调入内存ﻩﻩdisplay();//显示物理块中得页面号ﻩn++;//缺页次数+1ﻩﻩ}else{ //当前不存在空闲得物理块,需要进行页面置换ﻩﻩposition= findReplace();ﻩblock[position]、pagenum = curpage;ﻩﻩdisplay();ﻩn++;//缺页次数+1ﻩ}ﻩﻩ}elseﻩﻩblock[exist]、accessed = -1;//恢复存在得并刚访问过得BLOCK中页面accessed为-1for(int j=0; j<blocknum; j++)ﻩﻩ{//其余得accessed++ﻩﻩblock[j]、accessed++;}ﻩ}printf("缺页次数:%d\n”,n);ﻩprintf("缺页率:%f%%\n",(n/320、0)*100);}void FIFO(){int n=0;//记录缺页次数int exist,space,position ;ﻩ int curpage;//当前指令得页面号int blockpointer=-1;for(int i=0;i<320;i++)ﻩ{ﻩ m=num[i];curpage=m/10;ﻩexist = pageExist(curpage);ﻩ if(exist==-1){//当前指令得页面号不在物理块中ﻩ space = findSpace();ﻩﻩif(space !=-1)ﻩ { //当前存在空闲得物理块ﻩﻩ blockpointer++;ﻩﻩﻩblock[space]、pagenum=curpage; //将此页面调入内存ﻩ n++;//缺页次数+1ﻩﻩﻩ display();//显示物理块中得页面号ﻩ}ﻩ elseﻩ { //没有空闲物理块,进行置换ﻩﻩﻩﻩposition = (++blockpointer)%4;ﻩ block[position]、pagenum = curpage;//将此页面调入内存ﻩﻩn++;ﻩﻩ display();ﻩ}ﻩ }}printf("缺页次数:%d\n",n);printf("缺页率:%f%%\n",(n/320、0)*100);}void main(){ﻩint choice;ﻩprintf("************请求分页存储管理模拟系统*************\n");ﻩrandam();printf("************此进程得页面调用序列如下**************\n”);pagestring();ﻩwhile(choice!= 4){ﻩﻩprintf("********1:OPT 2:LRU 3:FIFO 4:退出*********\n”);ﻩprintf("请选择一种页面置换算法:”);ﻩscanf("%d",&choice);ﻩinit();ﻩswitch(choice)ﻩ{ﻩcase 1:ﻩﻩﻩprintf(”最佳置换算法OPT:\n");ﻩprintf("页面号物理地址页面号物理地址页面号物理地址页面号物理地址\n");ﻩﻩﻩOPT();ﻩbreak;ﻩcase 2:ﻩﻩprintf("最近最久未使用置换算法LRU:\n");ﻩprintf("页面号物理地址页面号物理地址页面号物理地址页面号物理地址\n");ﻩLRU();ﻩﻩﻩbreak;ﻩﻩcase 3:ﻩprintf("先进先出置换算法FIFO:\n");ﻩprintf("页面号物理地址页面号物理地址页面号物理地址页面号物理地址\n");FIFO();ﻩﻩbreak;ﻩ}}}。

分页管理实验报告

分页管理实验报告

2015-2016学年第二学期操作系统课程实验设计报告班级网络2班学号 201414620207姓名韩金铖成绩指导教师于复兴1、实验题目:(1)模拟请求分页存储管理中的硬件地址转换和产生却页中断的过程。

(2)采用先进先出(或LRU)算法实现分页管理的缺页调度。

2、实验目的:(1)通过实验模拟请求分页存储管理中的硬件地址转换和产生却页中断帮助理解在分页式存储管理中怎样虚拟存储器。

(2)通过采用先进先出(或LRU)算法实现分页管理的缺页调度帮助理解和掌握模拟分页式虚拟存储管理的缺页中断,帮助自己对请求分页管理的概念有一个清楚的理解。

3、程序设计及实现过程:(1)请求分页储存管理是把作业的全部信息存在磁盘上,当作业被选中时,可把作业的开始几页先装入主存并启动运行。

为此,在为作业建立页表时,应说明哪些页已在主存,哪些页尚未装入主存,页表格式为:其中,标志表示对应页是否已经装入主存,“标志 = 0”表示该页尚未装入主存,“标志= 1”表示该页已在主存。

主存块号表示已装入主存的页所占用的块号。

外存地址表示该页在外存的地址。

(2)作业执行完时,指令中的逻辑地址指出了参加运算的操作数存放的页号和单元号,硬件地址转换机构按页号查页表,若该页对应的标志为“1”,则表示该页已在主存。

根据关系式:绝对地址=块号*块长+单元号。

计算出欲访问的主存单元地址,将块长设成2的整次幂,可把块号作为地址寄存器的高位部分,单元号作为低位部分。

两个拼接形成绝对地址。

按计算出的绝对地址取操作数,完成一条指令的执行。

若访问的页对应标志为“0”,则表示不在主存,这时硬件发缺页中断信号,由操作系统按页表中的该页对应的外存地址把该页装入主存后,执行该指令。

(3)设计一个“地址变换”程序来模拟硬件的地址转换工作。

当访问的页不在主存时,则形成绝对地址后不去模拟指令的执行,而用输出转换后的地址来代替一条指令的执行,当访问的页不在主存时,则输出“*”,表示产生了一次缺页中断。

实验六请求分页存储管理

实验六请求分页存储管理

实验六:请求分页存储管理一.实验目的深入理解请求页式存储管理的基本概念和实现方法,重点认识其中的地址变换、缺页中断、置换算法等实现思想。

二.实验属性该实验为综合性、设计性实验。

三.实验仪器设备及器材普通PC386以上微机四.实验要求本实验要求2学时完成。

本实验要求完成如下任务:(1)建立相关的数据结构:页表、页表寄存器、存储块表等;(2)指定分配给进程的内存物理块数,设定进程的页面访问顺序;(3)设计页面置换算法,可以选择OPT、FIFO、LRU等,并计算相应的缺页率,以比较它们的优劣;(4)编写地址转换函数,实现通过查找页表完成逻辑地址到物理地址的转换;若发生缺页则选择某种置换算法(OPT、FIFO、LRU等)完成页面的交换;(5)将整个过程可视化显示出来。

实验前应复习实验中所涉及的理论知识和算法,针对实验要求完成基本代码编写并完成预习报告、实验中认真调试所编代码并进行必要的测试、记录并分析实验结果。

实验后认真书写符合规范格式的实验报告(参见附录A),并要求用正规的实验报告纸和封面装订整齐,按时上交。

三、设计过程3.1算法原理分析OPT算法是未来最远出现,当当前内存中没有正要访问的页面时,置换出当前页面中在未来的访问页中最远出现的页面或再也不出现的页面。

FIFO算法是先进先出,当当前内存中没有正要访问的页面时,置换出最先进来的页面。

LRU算法是最近最久未使用,当当前内存中没有正要访问的页面时,置换出在当前页面中最近最久没有使用的页面。

3.2数据定义int length,num_page,count,seed; //length记录访问串的长度,num_page页面数,count记录缺页次数int result[20][30],order[30],a[10]; //result记录结果,order存储访问串,a存储当前页面中的值int pos1,flag1,flag2,flag3; //pos1位置变量,flag1等为标志变量 char result1[30]; //记录缺页数组 void opt() //最佳void fifo() //先进先出bool search(int n) //查找当前内存中是否已存在该页3.3流程图与运行截图图6.1 FIFO ()函数流程图;否是 是否 开始得到执行的指令指令是否在内存中最先存入指令被淘汰下面是否还有指令 结束得出命中率图2.2 OPT算法流程图四、小结本次课程设计目的是通过请求页式管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

请求分页存储管理模拟实验1.实验目的请求页式管理是一种常用的虚拟存储管理技术。

本设计通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式管理的页面置换算法。

2.实验内容:通过随机数产生一个指令序列,共320条指令。

指令的地址按下述原则生成:① 50% 的指令是顺序执行的;② 25% 的指令是均匀分布在前地址部分;③ 25% 的指令是均匀分布在后地址部分。

具体的实施方法是:①在 [0,319] 的指令地址之间随机选取一起点 m;②顺序执行一条指令;③在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为 m′;④顺序执行一条指令,其地址为 m′+1;⑤在后地址 [m′+2,319] 中随机选取一条指令并执行;⑥重复上述步骤② ~ ⑤,直到执行 320 次指令。

将指令序列变换成为页地址流设:①页面大小为 1K;②用户内存容量为 4 页到 32 页;③用户虚存容量为 32K 。

在用户虚存中,按每 K 存放 10 条指令排列虚存地址,即 320 条指令在虚存中的存放方式为:第 0 条 ~ 第 9 条指令为第 0 页 ( 对应虚存地址为 [0,9]);第 10 条 ~ 第 19 条指令为第 1 页 ( 对应虚存地址为 [10,19] ) ;┇┇第 310 条 ~ 第 319 条指令为第 31 页 ( 对应虚存地址为 [310,319]) 。

按以上方式,用户指令可组成 32 页。

计算并输出下述各种算法在不同内存容量下的命中率。

先进先出的算法 (FIFO);最近最少使用算法 (LRR);最少访问页面算法 (LFR);最近最不经常使用算法 (NUR)。

3.实验环境每个学生一台微机,需要安装windows98或windows2000操作系统,配备VC、VB、java或C编程语言,每个学生上机时间不少于24个小时。

(1)、分页请求系统为了能实现请求调页和置换功能,系统必须提供必要的硬件支持,其中,最重要的是:(1)请求分页的页表机制。

它是在分页的页表机制上增加若干个项而形成的,作为请求分页的数据结构;(2)缺页中断机构。

每当用户程序要访问的页面尚未调入内存时,便产生一缺页中断,以请求OS将所缺的页面调入内存;(3)地址变换机构。

它同样是在分页的地址变换机构的基础上发展形成的。

为了实现请求调页还须得到OS的支持,在实现请求调页功能时,石油OS将所需的页从外存调入内存;在实现置换功能时,也是由OS将内存的某些页调至外存。

4.实验提示提示:A.命中率=1-页面失效次数/页地址流长度B.本实验中,页地址流长度为320,页面失效次数为每次访问相应指令时,该指令所对应的页不在内存的次数。

C.关于随机数产生方法,采用TC系统提供函数RAND()和RANDOMIZE()来产生。

5.算法的理解㈠FIFO页面置换算法⑴原理简述①在分配内存页面数(AP)小于进程页面数(PP)时,当然是最先运行的AP个页面放入内存。

②这时有需要处理新的页面,则将原来内存中的AP个页面最先进入的调出(是以称为FIFO),然后将新页面放入。

③以后如果再有新页面需要调入,则都按⑵的规则进行。

算法特点:所使用的内存页面构成一个队列。

㈡LRU页面置换算法⑴原理算述①当分配内存页面数(AP)小于进程页面数(PP)时,当然是把最先执行的AP个页面放入内存。

②当需要调页面进入内存,而当前分配的内存页面全部不空闲时,选择将其中最长时间没有用到的那个页面调出,以空出内存来放置新调入的页面(称为LRU)。

算法特点:每个页面都有属性来表示有多长时间未被CPU使用的信息。

㈢LFU即最不经常使用页置换算法⑴原理简述要求在页置换时置换引用计数最小的页,因为经常使用的页应该有一个较大的引用次数。

但是有些页在开始时使用次数很多,但以后就不再使用,这类页将会长时间留在内存中,因此可以将引用计数寄存器定时右移一位,形成指数衰减的平均使用次数。

LRU算法的硬件支持把LRU算法作为页面置换算法是比较好的,它对于各种类型的程序都能适用,但实现起来有相当大的难度,因为它要求系统具有较多的支持硬件。

所要解决的问题有:1.一个进程在内存中的各个页面各有多久时间未被进程访问;2.如何快速地知道哪一页最近最久未使用的页面。

为此,须利用以下两类支持硬件:(1)寄存器(2)栈可利用一个特殊的栈来保存当前使用的各个页面的页面号。

每当进程访问某页面时,便将该页面的页面号从栈中移出,将它压入栈顶。

算法特点:LFU算法并不能真正反映出页面的使用情况,因为在每一时间间隔内,只是用寄存器的一位来记录页的使用情况,因此,访问一次和访问10000次是等效的。

㈣NUR页面置换算法⑴原理简述所谓“最近未使用”,首先是要对“近”作一个界定,比如CLEAR_PERIOD=50,便是指在CPU最近的50次进程页面处理工作中,都没有处理到的页面。

那么可能会有以下几种情况:①如果这样的页面只有一个,就将其换出,放入需要处理的新页面。

②如果有这样的页面不止一个,就在这些页面中任取一个换出(可以是下标最小的,或者是下标最大的),放入需要处理的页面。

③如果没有一个这样的页面,就随意换出一个页面(可以是下标最小的,或者是下标最大的)。

算法特点:有一个循环周期,每到达这个周期,所有页面存放是否被CPU处理的信息的属性均被置于初始态(没有被访问)。

6.实验流程图7. 实验运行结果等等。

8. 实验源程序#include<iostream>#include<time.h>using namespace std;const int MaxNum=320;//指令数const int M=5;//内存容量int PageOrder[MaxNum];//页面请求int Simulate[MaxNum][M];//页面访问过程int PageCount[M],LackNum;//PageCount用来记录LRU算法中最久未使用时间,LackNum记录缺页数float PageRate;//命中率int PageCount1[32];bool IsExit(int i)//FIFO算法中判断新的页面请求是否在内存中{bool f=false;for(int j=0;j<M;j++){if(Simulate[i-1][j]==PageOrder[i])//在前一次页面请求过程中寻找是否存在新的页面请求{f=true;}}return f;}int IsExitLRU(int i)//LRU算法中判断新的页面请求是否在内存中{int f=-1;for(int j=0;j<M;j++){if(Simulate[i-1][j]==PageOrder[i]){f=j;}}return f;}int Compare()//LRU算法找出内存中需要置换出来的页面{int p,q;p=PageCount[0];q=0;for(int i=1;i<M;i++){if(p<PageCount[i]){p=PageCount[i];q=i;}}return q;}void Init() //初始化页框{for(int k=0;k<MaxNum;k++){int n=rand()%320;//随机数产生320次指令PageOrder[k]=n/10;//根据指令产生320次页面请求}for(int i=0;i<MaxNum;i++)//初始化页面访问过程{for(int j=0;j<M;j++){Simulate[i][j]=-1;}}for(int q=0;q<M;q++)//初始化最久未使用数组{PageCount[q]=0;}}void OutPut()//输出{int i,j;cout<<"页面访问序列:"<<endl;for(j=0;j<MaxNum;j++){cout<<PageOrder[j]<<" ";}cout<<endl;cout<<"页面访问过程(只显示前10个):"<<endl;for(i=0;i<10;i++){for(j=0;j<M;j++){if(Simulate[i][j]==-1)cout<<" ";elsecout<<Simulate[i][j]<<" ";}cout<<endl;}cout<<"缺页数= "<<LackNum<<endl;cout<<"命中率= "<<PageRate<<endl;cout<<"--------------------------------------------------------------"<<endl;}void FIFO()//FIFO算法{int j,x=0,y=0;LackNum=0,Init();for(j=0;j<M;j++)//将前五个页面请求直接放入内存中{for(int k=0;k<=j;k++){if(j==k)Simulate[j][k]=PageOrder[j];elseSimulate[j][k]=Simulate[j-1][k];}//LackNum++;}for(x=M;x<MaxNum;x++){for(int t=0;t<M;t++)//先将前一次页面访问过程赋值给新的页面访问过程{Simulate[x][t]=Simulate[x-1][t];}if(!IsExit(x))//根据新访问页面是否存在内存中来更新页面访问过程{LackNum++;Simulate[x][y%M]=PageOrder[x];y++;}}PageRate=1-((float)LackNum/(float)MaxNum);//算出命中率OutPut();}void LRU()//LRU算法{int j,x=0,y=0;LackNum=0,Init();for(j=0;j<M;j++)//将前五个页面请求直接放入内存中{for(int k=0;k<=j;k++){PageCount[k]++;if(j==k)Simulate[j][k]=PageOrder[j];elseSimulate[j][k]=Simulate[j-1][k];}LackNum++;}for(x=M;x<MaxNum;x++){for(int t=0;t<M;t++)//先将前一次页面访问过程赋值给新的页面访问过程{Simulate[x][t]=Simulate[x-1][t];}int p=IsExitLRU(x);if(p==-1)//根据反回的p值来更新页面访问过程{int k;k=Compare();for(int w=0;w<M;w++){if(w!=k)PageCount[w]++;elsePageCount[k]=1;}Simulate[x][k]=PageOrder[x];LackNum++;}else{for(int w=0;w<M;w++){if(w!=p)PageCount[w]++;elsePageCount[p]=1;}}}PageRate=1-((float)LackNum/(float)MaxNum);//算出命中率OutPut();}//最近最不常用调度算法(LFU)void LFU(){}void NUR(){}void YourChoice(int choice){switch(choice){case 1:cout<<"----------------------------------------------------------"<<endl;cout<<"FIFO算法结果如下:"<<endl;FIFO();break;case 2:cout<<"----------------------------------------------------------"<<endl;cout<<"LRU算法结果如下:"<<endl;LRU();break;case 3:cout<<"----------------------------------------------------------"<<endl;cout<<"LFU算法结果如下:"<<endl;//LFU();break;case 4:cout<<"----------------------------------------------------------"<<endl;cout<<"NUR算法结果如下:"<<endl;//NUR();break;case 5:break;default:cout<<"重新选择算法:1--FIFO 2--LRU 3--LFU 4--NUR 5--退出 "<<endl;cin>>choice;YourChoice(choice);}}void main(){int choice,i=1;while(i){cout<<"请选择算法:1--FIFO 2--LRU 3--LFU 4--NUR 5--退出 "<<endl;cin>>choice;if(choice==5){i=0;}else{YourChoice(choice);}}}9. 实验体会通过上面的截图可以发现,实验中指令是由随机函数产生的,然后根据产生的指令算出需要访问的页面.在本次实验中我写了四个页面置换算法—(先进先出)FIFO算法和(最久未使用)LRU算法, 最少访问页面算法 (LFR);最近最不经常使用算法 (NUR)。

相关文档
最新文档