当前位置:文档之家› OS实验指导四——虚拟存储器管理

OS实验指导四——虚拟存储器管理

OS实验指导四——虚拟存储器管理————————————————————————————————作者:————————————————————————————————日期:2《操作系统》实验指导四开课实验室:A207、A209 2015/11/23 、2015/11/24实验类型设计实验项目(四)虚拟存储器管理实验实验学时 4一、实验目的设计一个请求页式存储管理方案,并编写模拟程序实现。

二、设备与环境1. 硬件设备:PC机一台2. 软件环境:安装Windows操作系统或者Linux操作系统,并安装相关的程序开发环境,如C \C++\Java 等编程语言环境。

三、实验要求1) 上机前认真复习页面置换算法,熟悉FIFO算法和LRU页面分配和置换算法的过程;2) 上机时独立编程、调试程序;3) 根据具体实验要求,完成好实验报告(包括实验的目的、内容、要求、源程序、实例运行结果截图)。

四、实验内容1、问题描述:设计程序模拟FIFO和LRU页面置换算法的工作过程。

假设内存中分配给每个进程的最小物理块数为m,在进程运行过程中要访问的页面个数为n,页面访问序列为P1, … ,Pn,分别利用不同的页面置换算法调度进程的页面访问序列,给出页面访问序列的置换过程,并计算每种算法缺页次数和缺页率。

2、程序具体要求如下:编写程序用来模拟虚拟页式存储管理中的页面置换要求:1)快表页面固定为4块2)从键盘输入N个页面号3)输出每次物理块中的页面号和缺页次数,缺页率4)实现算法选择3、程序流程图3、源程序参考:(1)FIFO 算法部分#include "stdio.h"#define n 12#define m 4void main(){int ym[n],i,j,q,mem[m]={0},table[m][n];char flag,f[n];printf("请输入页面访问序列\n ");for(i =0;i <n;i ++) scanf("%d ",&ym[i]);printf("\n ");for(i =0;i <n;i ++) //查页表,看是否缺页{输入页面取访问查是否是置缺页标按不同算调入所访否q=0;while((ym[i]!=mem[q])&&(q!=m)) q++;if(q==m) flag='*'; //缺页,则置标志flag为‘*’else flag='';if(flag=='*'){for(j=m-1;j>0;j--) //淘汰最先调入的页面调入当前访问的mem[j]=mem[j-1];mem[0]=ym[i];}for(j=0;j<m;j++)table[j][i]=mem[j];f[i]=flag;}printf("输出结果为下表(0代表为空,*代表有缺页):\n");for(i=0;i<m;i++){for(j=0;j<n;j++)printf("%3d",table[i][j]);printf("\n");}for(i=0;i<n;i++)printf("%3c",f[i]);}(2)LRU算法#include "stdio.h"#define n 12#define m 4void main(){int ym[n],i,j,q,mem[m]={0},table[m][n];char flag,f[n];printf("请输入页面访问序列\n");for(i=0;i<n;i++)scanf("%d",&ym[i]);printf("\n");for(i=0;i<n;i++) //查页表,看是否缺页{q=0;while((ym[i]!=mem[q])&&(q!=m)) q++;if(q==m) flag='*'; //缺页,则置标志flag为‘*’else flag=' ';for(j=q;j>0;j--)mem[j]=mem[j-1];mem[0]=ym[i];for(j=0;j<m;j++)table[j][i]=mem[j];f[i]=flag;}printf("输出结果为下表(0代表为空,*代表有缺页):\n");for(i=0;i<m;i++){for(j=0;j<n;j++)printf("%3d",table[i][j]);printf("\n");}for(i=0;i<n;i++)printf("%3c",f[i]);}4.测试用例:见第四章课后习题第26题(P159),(注意用比较的方式对程序的运行结果加以分析,比如令M=3或M=4时,结果各有什么不同。

并注意FIFO算法实现时是否有抖动现象。

)同时要求输出物理块中的页面号和算法执行后的缺页次数和缺页率,页面置换次数和页面置换率。

五、思考提高(1)设计友好的界面,将两种算法集成在一个程序中。

(2)考虑不限定m值,而改由在程序执行时界面输入确定,页面引用序列采用随机函数产生。

#include "stdio.h"#define n 12#define m 4void FIFO(){int ym[n],i,j,q,mem[m]={0},table[m][n];char flag,f[n];printf("请输入页面访问序列\n");for(i=0;i<n;i++)scanf("%d",&ym[i]);printf("\n");for(i=0;i<n;i++) //查页表,看是否缺页{q=0;while((ym[i]!=mem[q])&&(q!=m)) q++;if(q==m) flag='*'; //缺页,则置标志flag为'*' else flag=' ';if(flag=='*'){for(j=m-1;j>0;j--) //淘汰最先调入的页面调入当前访问的mem[j]=mem[j-1];mem[0]=ym[i];}for(j=0;j<m;j++)table[j][i]=mem[j];f[i]=flag;}printf("输出结果为下表(0代表为空,*代表有缺页):\n");for(i=0;i<m;i++){for(j=0;j<n;j++)printf("%3d",table[i][j]);printf("\n");}for(i=0;i<n;i++)printf("%3c",f[i]);}//(2)LRU算法void LRU(){int ym[n],i,j,q,mem[m]={0},table[m][n];char flag,f[n];printf("请输入页面访问序列\n");for(i=0;i<n;i++)scanf("%d",&ym[i]);printf("\n");for(i=0;i<n;i++) //查页表,看是否缺页{q=0;while((ym[i]!=mem[q])&&(q!=m)) q++;if(q==m) flag='*'; //缺页,则置标志flag为'*' else flag=' ';for(j=q;j>0;j--)mem[j]=mem[j-1];mem[0]=ym[i];for(j=0;j<m;j++)table[j][i]=mem[j];f[i]=flag;}printf("输出结果为下表(0代表为空,*代表有缺页):\n");for(i=0;i<m;i++){for(j=0;j<n;j++)printf("%3d",table[i][j]);printf("\n");}for(i=0;i<n;i++)printf("%3c",f[i]);}int main(){int x;printf("1:FIFO算法,2:LRU算法");scanf("%d",&x);switch(x){case 1:FIFO();break;case 2:LRU();break;}return 0;}。

相关主题