文档详情

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

发布:2017-06-02约5.4千字共11页下载文档
文本预览下载声明
实验四 请求分页存储管理模拟实验 一:实验目的 通过对页面、页表、地址转换和页面置换过程的模拟,加深对请求分页存储管理系统的原理和实现技术的理解。 二:实验内容 假设每个页面可以存放10条指令,分配给进程的存储块数为4。 用C语言或Pascal语言模拟一进程的执行过程。设该进程共有320条指令,地址空间为32个页面,运行前所有页面均没有调入内存。模拟运行时,如果所访问的指令已经在内存,则显示其物理地址,并转下一条指令;如果所访问的指令还未装入内存,则发生缺页,此时需要记录缺页产生次数,并将相应页面调入内存,如果4个内存块已满,则需要进行页面置换。最后显示其物理地址,并转下一条指令。在所有指令执行完毕后,显示进程运行过程中的缺页次数和缺页率。 页面置换算法:分别采用OPT、FIFO、LRU三种算法。 进程中的指令访问次序按如下原则生成: 50%的指令是顺序执行的。 25%的指令是均匀分布在低地址部分。 25%的指令是均匀分布在高地址部分。 三:实验类别 分页存储管理 四:实验类型 模拟实验 五:主要仪器 计算机 六:结果 OPT: LRU: FIFO: 七:程序 # includestdio.h # includestdlib.h # includeconio.h # define blocknum 4//页面尺寸大小 int m; //程序计数器,用来记录按次序执行的指令对应的页号 static int num[320]; //用来存储320条指令 typedef struct BLOCK //声明一种新类型--物理块类型 { int pagenum; //页号 int accessed; //访问量,其值表示多久未被访问 }BLOCK; BLOCK block[blocknum]; //定义一大小为8的物理块数组 void init() //程序初始化函数,对block初始化 { for(int i=0;iblocknum;i++) { block[i].pagenum=-1; block[i].accessed=0; m=0; } } int pageExist(int curpage)//查找物理块中页面是否存在,寻找该页面curpage是否在内存块block中,若在,返回块号 { for(int i=0; iblocknum; i++) { if(block[i].pagenum == curpage ) return i; //在内存块block中,返回块号 } return -1; } int findSpace()//查找是否有空闲物理块,寻找空闲块block,返回其块号 { for(int i=0;iblocknum;i++) { if(block[i].pagenum==-1) return i; //找到了空闲的block,返回块号 } return -1; } int findReplace()//查找应予置换的页面 { int pos = 0; for(int i=0;iblocknum;i++) { if(block[i].accessed block[pos].accessed) pos = i; //找到应该置换页面,返回BLOCK中位置 } return pos; } void display()//显示物理块中的页面号 { for(int i=0; iblocknum; 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;i320;i++) {//进程中的320条指令访问次序的生成 num[i]=m;//当前执行的指令数, if(flag%2==0) m=++m%320;//顺序执行下一条指令 if(flag==1) m=rand()%(m-1);//通过随机数,跳转到低地址部分[0,m-1]的一条指令处,设其序号为m1 if(flag==3) m=m+1+(rand()
显示全部
相似文档