请求调页存储器管理方式的模拟
16存储管理5请求页式管理请求段式管理2

7
0
采用最佳置换算法,只发生了6次页面 置换,发生了9次缺页中断。缺页率=9/21
17
2、先进先出页面置换算法(FIFO) 这是最早出现的置换算法,这种算 法总是淘汰最先进入内存的页面,选 择在内存中驻留时间最久的页面予以淘 汰。
18
采用FIFO算法进行页面置换时的情况。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 1 7 0 1 7 7 0 7 2× 2 2 4× 4 4 0× 0 0 7× 7 7 0 0 3× 3 3 2× 2 2 1× 1 1 0× 0 1 1 1 0× 0 0 3× 3 3 2× 2 2 1× 3 4 5 6 7 8 9 10 11-13 14 15-18 19 20 21
次数减少;不同的计算机系统,有不同页面大小;
11
(3)程序的编制方法
例:程序要把128×128的数组初值置“0”,数组 中每一个元素为一个字,假定页面大小为128个字, 数组中的每一行元素存放一页,能供该程序使用 的主存块只有1块。初始时第一页在内存; 程序编制方法1: 程序编制方法2: For j:=1 to 128 For i:=1 to 128 For i:=1 to 128 For j:=1 to 128 A[i][j]:=0; A[i][j]:=0; 按列:缺页中断次数: 按行:缺页中断次数 128-1 128×128-1
21
D A D A C D B C + +
B B A D +
E E B A +
A B C D E E E C D D B B E C C A A B E E + +
存储管理模拟程序 - 存储管理模拟程序

存储管理模拟程序1.设计目的存储管理的主要功能之一是合理地分配空间。
请求页式管理是一种常用的虚拟存储管理技术。
本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。
2.设计内容(1)通过输入或由程序产生程序执行时的页号序列,共32个页号。
页号序列按下述原则生成:页号序列应具有一定随机性。
(如:50%的顺序访问);(2)计算并输出下述各种算法在不同内存容量(4~32内存页面)下的命中率。
①先进先出的算法(FIFO)②最近最少使用算法(LRU)③最佳淘汰算法(OPT):先淘汰最不常用的页地址④最少访问页面算法(LFR)其中和为选择内容命中率= 1 - (页面失效次数/页地址流长度)3.程序设计:本程序首先用rand()函数定义和产生地址流序列,并针对不同的算法计算出相应的命中率。
I 根据实验内容将函数分成五个模块:1主程序模块,主要包括页面结构数组及页面控制结构定义,将指令流转换成页地址流 2 三个置换算法程序模块:FIFO 算法模块,LRU算法模块,OPT算法模块,LFU算法模块II 总程序模块流程图如下:4.源程序如下:#include <stdio.h>#include<math.h>#define maxsize 32##include <stdlib.h>define vpf 200void FIFO(int a[]);void LRU(int a[]);void OPT(int a[]);void LFU(int a[]);int count[maxsize];//int b[pf];int a[vpf];void main()// 定义主函数。
{for(int i=0;i<200;i++) //用随机数产生页地址流a[i]=rand()%32;FIFO(a);LFU(a);OPT(a);LRU(a);}void LFU(int a[])//LFU算法{for(int n=4;n<33;n++) //不同的页面数计算命中率{int num=0;int same=0;int min;int minpage=0;int dis=0;int i=0;int k=0;int sum=n; //空白页面数int num2=2; //设置清零时间间隔int b[maxsize];for (k=0;k<n;k++) //页面数组,计数数组初始化{ b[k]=-1;count[k]=0;}for (i=0;i<vpf;i++){num=0;for (k=0;k<n;k++) //测试是否命中{if(a[i]==b[k]){ same=k;num++; }}if(num!=0) //命中页面计数器加1count[same]++;else{dis++; //未命中,缺页次数加1if(sum==0) //无空白页面{ min=201;for(k=0;k<n;k++) //找出计数器值最小的页面替换{if(min>count[k]){min=count[k];minpage=k;}b[minpage]=a[i];if(num2==0) //每两次缺页计数器清零for(k=0;k<n;k++){count[k]=0;num2=3;}count[minpage]=1;num2--;//count[minpage]=0;}else { //有空白页面{b[n-sum]=a[i];if(num2==0) //每两次缺页计数器清零for(k=0;k<n;k++){count[k]=0;num2=3;}num2--;count[n-sum]=1;sum--;}}}}printf("%d",n);printf(" page frames LFU:%3d",dis);printf(" LFU:%6.4f\n",1-(float)dis/32);}}void OPT(int a[]) //OPT算法{for(int n=4;n<33;n++) //不同的页面数计算命中率{int num1=0,num2=0,num3=0,num4=0;int d;int dis=0;int b[maxsize];int sum=n;int max;int maxpage;int dist[vpf];for(int i=0;i<vpf;i++){ num1=0;for(int j=0;j<n;j++) //测试是否命中if(a[i]==b[j])num1++;if(num1==0) //未命中{ dis++; //缺页次数加1if (sum!=0) //有空白页面时{ b[n-sum]=a[i];sum--;}else //无空白页面{ for(int k=0;k<vpf;k++)//初始化页地址离当前页地址的距离dist[a[k]]=0;for (k=0;k<vpf;k++){ num2=0;for(j=0;j<n;j++)if(b[j]==a[k]) //测试未来页地址是否在内存num2++;if(num2!=0)dist[a[k]]=201; //在内存的页地址的距离赋予最大值。
模拟请求页式存储管理中硬件的地址转换和缺页中断

课程名称操作系统原理实验名称模拟请求页式存储管理中硬件的地址转换和缺页中断姓名学号专业班级实验日期成绩指导老师(①实验目的②实验原理③主要仪器设备④实验内容与步骤⑤实验数据记录与处理⑥实验结果分析⑦问题建议)一、实验目的模拟请求页式存储管理中硬件的地址转换和缺页中断,并用先进先出调度算法(FIFO)处理缺页中断。
二、实验内容内容:模拟请求页式存储管理中硬件的地址转换和缺页中断处理思想:装入新页置换旧页时,若旧页在执行中没有被修改过,则不必将该页重写磁盘。
因此,页表中增加是否修改过的标志,执行“存”指令和“写”指令时将对应的修改标志置成模拟算法流程三、程序及截图程序:#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<<"绝对地址";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]<<" ";cout<<m_Pagenum<<" ";cout<<m_Station<<" ";cout<<pSign[m_Pagenum]<<" ";if(Y_Station!=m_Station){cout<<Y_Station<<" ";cout<<" ";cout<<pStool[m_Pagenum]<<" ";cout<<Y_Station<<endl;}else{cout<<"*"<<m_Pagenum<<" ";for(j=z;j<7;j++){if(pSign[j]==1){z++;break;}}cout<<m_Pagenum<<"->"<<j<<" ";pStool[m_Pagenum]=pStool[j];pSign[j]=0;pStool[j]=0;cout<<pStool[m_Pagenum]<<" ";cout<<pStool[m_Pagenum]*1024+m_Station<<endl;}}int main(void){Store();char judge='Y';while(judge=='Y'){Find();cout<<"是否继续输入?Y = 是N=否"<<endl;cin>>judge;}return 0;}截图:五.心得体会在实验过程中,遇到了一些问题但是在调试的过程中,会出现很多错误,有的自己可以解决,也有一些在同学的帮助下,基本都解决了所有问题。
第16讲 存储器管理之请求分页存储管理方式

第十六讲存储器管理之请求分页存储管理方式1 基本概述请求分页管理是建立在基本分页基础上的,为了能支持虚拟存储器而增加了请求调页功能和页面置换功能。
基本原理:地址空间的划分同页式;装入页时,可装入作业的一部分(运行所需)页即可运行。
2 请求分页的硬件支持为实现请求分页,需要一定的硬件支持,包括:页表机制、缺页中断机构、地址变换机构。
2.1 页表机制作用:将用户地址空间的逻辑地址转换为内存空间的物理地址。
因为请求分页的特殊性,即程序的一部分调入内存,一部分仍在外存,因此页表结构有所不同。
如图:说明:(1)状态位P:指示该页是否已调入内存。
(2)访问字段A:记录本页在一段时间内被访问的次数或最近未被访问的时间。
(3)修改位M:表示该页在调入内存后是否被修改过。
若修改过,则换出时需重写至外存。
(4)外存地址:指出该页在外存上的地址。
2.2 缺页中断机构在请求分页系统中,每当所要访问的页面不在内存时,便产生缺页中断,请求OS将所缺的页调入内存。
缺页中断与一般中断的区别:(1)在指令执行期间产生和处理中断信号(2)一条指令在执行期间,可能产生多次缺页中断2.3 地址变换机构请求分页系统的地址变换机构。
是在分页系统地址变换机构的基础上,又增加了一些功能。
例:某虚拟存储器的用户空间共有32个页面,每页1KB,主存16KB。
假定某时刻系统为用户的第0、1、2、3页分别分配的物理块号为5、10、4、7,试将虚拟地址0A5C和093C 变换为物理地址。
解:虚拟地址为:页号(2^5=32)5位页内位移(1K =2^10=1024)10位物理地址为物理块号(2^4=16)4位因为页内是10 位,块内位移(1K =2^10=1024)10位虚拟地址OA5C对应的二进制为:00010 1001011100即虚拟地址OA5C的页号为2,页内位移为1001011100,由题意知对应的物理地址为:0100 1001011100即125C同理求093C。
模拟请求页式管理

目录一、设计目的1二、设计内容1三、设计原理2四、算法实现4五、流程图4六、源程序4七、运行示例及结果分析12八、心得体会12九、参考资料12模拟请求页式管理一、设计目的1.通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点.2。
通过对页面、页表、地址转换和页面置换过程的模拟,加深对请求调页系统的原理和是实验过程的理解。
3.掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率.二、设计内容通过随机数产生一个指令序列,共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);最近最久未使用算法(LRU);最佳访问算法(OPT);三、设计原理㈠FIFO页面置换算法⑴原理简述①在分配内存页面数(AP)小于进程页面数(PP)时,当然是最先运行的AP个页面放入内存.②这时有需要处理新的页面,则将原来内存中的AP个页面最先进入的调出(是以称为FIFO),然后将新页面放入.③以后如果再有新页面需要调入,则都按⑵的规则进行.算法特点:所使用的内存页面构成一个队列。
操作系统实验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;ﻩ}}}。
请求页式管理缺页中断模拟设计--+LRU、随机淘汰算法

学号:0120610340231课程设计题目请求页式管理缺页中断模拟设计--LRU、随机淘汰算法学院计算机学院专业计算机科学与技术班级计算机0602姓名朱林指导教师王红霞2009 年01 月08 日课程设计任务书学生姓名:朱林专业班级:计算机0602指导教师:王红霞工作单位:计算机科学与技术学院题目:请求页式管理缺页中断模拟设计-- LRU、随机淘汰算法初始条件:1.预备内容:阅读操作系统的内存管理章节内容,了解有关虚拟存储器、页式存储管理等概念,并体会和了解缺页和页面置换的具体实施方法。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.实现指定淘汰算法。
能够处理以下的情形:⑴能够输入给作业分配的内存块数;⑵能够输入给定的页面,并计算发生缺页的次数以及缺页率;⑶缺页时,如果发生页面置换,输出淘汰的页号。
2.设计报告内容应说明:⑴需求分析;⑵功能设计(数据结构及模块说明);⑶开发平台及源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:错误!未找到引用源。
)你认为你完成的设计哪些地方做得比较好或比较出色;错误!未找到引用源。
)什么地方做得不太好,以后如何改正;错误!未找到引用源。
)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);错误!未找到引用源。
)完成本题是否有其他方法(如果有,简要说明该方法);错误!未找到引用源。
)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。
周4、周5:验收、撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日开始请求页面序列结束?内存块已满?利用替换算法,选择内存块中应该被替换的页面进行替换,修改页表选择将要调入页面放入未被占用的内存块中,修改页表NYN结束Y 页面在内存中?N Y请求页式管理缺页中段模拟设计 ——LRU 、随机淘汰算法1需求分析用一种计算机高级语言来实现请求页式管理缺页中段模拟设计的LRU 和随机淘汰算法,设计要求如下:⑴ 能够输入给作业分配的内存块数;⑵ 能够输入给定的页面,并计算发生缺页的次数以及缺页率; ⑶ 缺页时,如果发生页面置换,输出淘汰的页号。
请求分页存储管理设计

实验八请求分页存储管理设计一、虚拟存储器的相关知识:1.概述:虚拟存储器(Virtual Memory):在具有层次结构存储器的计算机系统中,自动实现部分装入和部分替换功能,能从逻辑上为用户提供一个比物理贮存容量大得多,可寻址的“主存储器”。
虚拟存储区的容量与物理主存大小无关,而受限于计算机的地址结构和可用磁盘容量。
作用:虚拟内存的作用内存在计算机中的作用很大,电脑中所有运行的程序都需要经过内存来执行,如果执行的程序很大或很多,就会导致内存消耗殆尽。
为了解决这个问题,Windows中运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,当内存占用完时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。
举一个例子来说,如果电脑只有128MB物理内存的话,当读取一个容量为200MB的文件时,就必须要用到比较大的虚拟内存,文件被内存读取之后就会先储存到虚拟内存,等待内存把文件全部储存到虚拟内存之后,跟着就会把虚拟内存里储存的文件释放到原来的安装目录里了。
下面,就让我们一起来看看如何对虚拟内存进行设置吧。
2.请求分页虚拟存储系统是将作业信息的副本存放在磁盘这一类辅助存储器中,当作业被调度投入运行时,并不把作业的程序和数据全部装入主存,而仅仅装入立即使用的那些页面,至少要将作业的第一页信息装入主存,在执行过程中访问到不在主存的页面时,再把它们动态地装入。
用得较多的分页式虚拟存储管理是请求分页(demand paging),当需要执行某条指令或使用某个数据,而发现它们并不在主存时,产生一个缺页中断,系统从辅存中把该指令或数据所在的页面调入内存。
3.替换算法:替换规则用来确定替换主存中哪一部分,以便腾空部分主存,存放来自辅存要调入的那部分内容。
常见的替换算法有4种。
随机算法用软件或硬件随机数产生器确定替换的页面。
先进先出先调入主存的页面先替换。
近期最少使用算法替换最长时间不用的页面。
最优算法替换最长时间以后才使用的页面。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计课程设计名称:计算机操作系统课程设计专业班级:计算机科学与技术班学生姓名:学号:指导教师:课程设计时间: 2010.12.20 ~ 2010.12.24计算机科学与技术专业课程设计任务书一需求分析请求调页存储管理方式的模拟是基于LRU算法的设计而设计的,通过学习计算机操作系统中的请求调页存储管理方式的几种算法,我选择了最近最久未使用算法即LRU算法实现请求调叶存储管理,通过具体的程序来模仿LRU的工作机制。
二概要设计1.数据结构依据给定的数据信息,数组必须以结构体实现,结构类型的层次结构如下: typedef struct BLOCK//声明一种新类型——物理块类型{int pagenum;//页号int accessed;//访问字段,其值表示多久未被访问}BLOCK;2.函数原型清单:Void main();//主函数void init(int Bsize); //程序初始化函数int findExist(int curpage);//查找物理块中是否有该页面int findSpace(int Bsize);//查找是否有空闲物理块int findReplace();//查找应予置换的页面void display(int Bsize);//显示void suijishu(int r);//产生320条随机数,显示并存储到temp[320]void pagestring();//显示调用的页面队列void LRU(int Bsize);// LRU算法3.全局变量:int Bsize;int pc;//程序计数器,用来记录指令的序号int n;//缺页计数器,用来记录缺页的次数static int temp[320];//用来存储320条随机数BLOCK block[Bsize]; //定义一大小为4的物理块数组三运行环境(软硬件环境)硬件:CPU,主板,内存,显示器,硬盘,显卡,键盘等等.软件:WINDOWS XP, Visual c++应用软件.四开发工具和编程语言开发工具:Visual c++编程语言:c语言五详细设计#include <iostream.h>#include<stdlib.h>#include<conio.h>#include<stdio.h>typedef struct BLOCK//声明一种新类型——物理块类型{int pagenum;//页号int accessed;//访问字段,其值表示多久未被访问}BLOCK;int Bsize;BLOCK block[32]; //模拟内存块int pc;//程序计数器,用来记录指令的序号int n;//缺页计数器,用来记录缺页的次数static int temp[320];//用来存储320条随机数//*************************************************************void init(int Bsize); //程序初始化函数int findExist(int curpage);//查找物理块中是否有该页面int findSpace(int Bsize);//查找是否有空闲物理块int findReplace();//查找应予置换的页面void display(int Bsize);//显示void suijishu(int r);//产生320条随机数,显示并存储到temp[320] void pagestring();//显示调用的页面队列void LRU(int Bsize);// LRU算法//************************************************************* void init(int Bsize){int i;for(i=0;i<Bsize;i++){block[i].pagenum=-1;block[i].accessed=0;pc=n=0;}}//------------------------------------------------------------- int findExist(int curpage,int Bsize){int i;for(i=0;i<Bsize; i++){if(block[i].pagenum == curpage )return i;//检测到内存中有该页面,返回block中的位置}return -1;}//------------------------------------------------------------- int findSpace(int Bsize){int i;for(i=0; i<Bsize; i++){if(block[i].pagenum == -1)return i;//找到空闲的block,返回block中的位置}return -1;}//------------------------------------------------------------- int findReplace(int Bsize){int i,pos = 0;for(i=0; i<Bsize; i++){if(block[i].accessed >block[pos].accessed)pos = i;//找到应予置换页面,返回BLOCK中位置}return pos;}//------------------------------------------------------------- void display(int Bsize){if(Bsize==4){int i;for(i=0; i<Bsize; i++){if(block[i].pagenum != -1){ printf(" %02d",block[i].pagenum);}}printf("\n");}}//------------------------------------------------------------- void suijishu(int r){int i,flag=0;pc=r;printf("****按照要求产生的320个随机数:*******\n");for(i=0;i<320;i++){temp[i]=pc;if(flag%2==0) pc=++pc%320;if(flag==1) pc=rand()% (pc-1);if(flag==3) pc=pc+1+(rand()%(320-(pc+1)));flag=++flag%4;printf(" %03d",temp[i]);if((i+1)%10==0) printf("\n");}}//------------------------------------------------------------- void pagestring(){int i;for(i=0;i<320;i++){printf(" %02d",temp[i]/10);if((i+1)%10==0) printf("\n");}}//-------------------------------------------------------------void LRU(int Bsize){int exist,space,position ;int i,j,curpage;init(Bsize);for(i=0;i<320;i++){pc=temp[i];curpage=pc/10;exist = findExist(curpage,Bsize);if(exist==-1){space = findSpace(Bsize);if(space != -1){block[space].pagenum = curpage;display(Bsize);n=n+1;}else{position = findReplace(Bsize);block[position].pagenum = curpage;display(Bsize);n++;}}else block[exist].accessed = -1;//恢复存在的并刚访问过的BLOCK中页面accessed为-1for(j=0; j<4; j++){block[j].accessed++;}}if(Bsize==4)printf("(LRU)算法在不同内存容量下的命中率为\n");printf("内存容量为%d",Bsize);printf("的缺页次数:%d",n);printf("缺页率:%f",(n/320.0)*100);printf("%%");printf("命中率:%f",(1-n/320.0)*100);printf("%%");printf("\n");}//------------------------------------------------------------- //************************************************************* void main(){int t,i,j=1,select;printf("请输入第1条指令号(0~320):");scanf("%d",&i);while(i>320||i<0){printf("你输入有误,请重新输入!\n");printf("请输入第1条指令号(0~320):");scanf("%d",&i);}while(i>=0&&i<=320){suijishu(i);printf("*****对应的调用页面队列*******\n");pagestring();printf("******************************\n");init(i);printf("最近最久未使用置换算法LRU:\n");printf("******************************\n");for(t=4;t<=32;t++)LRU(t);j=j+1;printf("请输入第%d条指令号(0~320)[输入-1结束]:",j);scanf("%d",&i);}}六调试分析(1).刚开始进行编译时,出现了86个错误和警告,吓了自己一跳,于是就静下心来一点一点分析程序,发现自己竟然那么粗心,不是少了括号就是少了分号,还有一些语法错误,经过慢慢的修改,程序最终顺利运行出来.(2).在调试过程中,有时会显示没有错误和警告,但程序会无法执行,或执行到中间就无法在执行了,于是我就用F10进行调试,发现可能出错的子函数,然后进行仔细分析改正,调试成功.七测试结果图1 输入错误数字的提示信息图2随机产生的320个数图3对应的调用页面的队列图4 LRU算法(1)图5 LRU算法(2)图6 LRU算法(3)图7 LRU算法(4)图8 LRU算法(5)和计算最近最少使用(LRU)算法在不同内存容量下的命中率八参考文献[1] 谭浩强《C程序设计》第三版北京清华大学出版社[2] 丁华伟《C语言程序设计系统》第三版北京清华大学出版社[3] 严蔚敏《数据结构》C语言版北京清华大学出版社课程设计总结本程序能通过输入第一条指令号(用3位整数代表指令号),产生320个随机数,并以每行10个显示出来。