操作系统实验4请求分页存储管理系统模拟实验.docx
- 文档编号:20028910
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:15
- 大小:371.84KB
操作系统实验4请求分页存储管理系统模拟实验.docx
《操作系统实验4请求分页存储管理系统模拟实验.docx》由会员分享,可在线阅读,更多相关《操作系统实验4请求分页存储管理系统模拟实验.docx(15页珍藏版)》请在冰豆网上搜索。
操作系统实验4请求分页存储管理系统模拟实验
实验四
请求分页存储管理模拟实验
一:
实验目的
通过对页面、页表、地址转换和页面置换过程的模拟,加深对请求分页存储管理系统的原理和实现技术的理解。
二:
实验内容
假设每个页面可以存放10条指令,分配给进程的存储块数为4。
用C语言或Pascal语言模拟一进程的执行过程。
设该进程共有320条指令,地址空间为32个页面,运行前所有页面均没有调入内存。
模拟运行时,如果所访问的指令已经在内存,如此显示其物理地址,并转下一条指令;如果所访问的指令还未装入内存,如此发生缺页,此时需要记录缺页产生次数,并将相应页面调入内存,如果4个内存块已满,如此需要进展页面置换。
最后显示其物理地址,并转下一条指令。
在所有指令执行完毕后,显示进程运行过程中的缺页次数和缺页率。
页面置换算法:
分别采用OPT、FIFO、LRU三种算法。
进程中的指令访问次序按如下原如此生成:
50%的指令是顺序执行的。
25%的指令是均匀分布在低地址局部。
25%的指令是均匀分布在高地址局部。
三:
实验类别
分页存储管理
四:
实验类型
模拟实验
五:
主要仪器
计算机
六:
结果
OPT:
LRU:
FIFO:
七:
程序
#include
#include
#include
#defineblocknum4//页面尺寸大小
intm;//程序计数器,用来记录按次序执行的指令对应的页号
staticintnum[320];//用来存储320条指令
typedefstructBLOCK//声明一种新类型--物理块类型
{
intpagenum;//页号
intaccessed;//访问量,其值表示多久未被访问
}BLOCK;
BLOCKblock[blocknum];//定义一大小为8的物理块数组
voidinit()//程序初始化函数,对block初始化
{
for(inti=0;i { block[i].pagenum=-1; block[i].accessed=0; m=0; } } intpageExist(intcurpage)//查找物理块中页面是否存在,寻找该页面curpage是否在内存块block中,假如在,返回块号 { for(inti=0;i { if(block[i].pagenum==curpage) returni;//在内存块block中,返回块号 } return-1; } intfindSpace()//查找是否有空闲物理块,寻找空闲块block,返回其块号 { for(inti=0;i { if(block[i].pagenum==-1) returni;//找到了空闲的block,返回块号 } return-1; } intfindReplace()//查找应予置换的页面 { intpos=0; for(inti=0;i { if(block[i].accessed>block[pos].accessed) pos=i;//找到应该置换页面,返回BLOCK中位置 } returnpos; } voiddisplay()//显示物理块中的页面号 { for(inti=0;i { if(block[i].pagenum! =-1) { printf("%02d",block[i].pagenum); printf("%p|",&block[i].pagenum); } } printf("\n"); } voidrandam()//产生320条随机数,显示并存储到num[320] { intflag=0; printf("请为一进程输入起始执行指令的序号(0~320): \n"); scanf("%d",&m);//用户决定的起始执行指令 printf("******进程中指令访问次序如下: (由随机数产生)*******\n"); for(inti=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]的一条指令处,设其序号为m1 if(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"); } } voidpagestring()//显示调用的页面序列,求出此进程按次序执行的各指令所在的页面号并显示输出 { for(inti=0;i<320;i++) { printf("%02d",num[i]/10);//输出格式: 2位数 if((i+1)%10==0)//控制换行,每个页面可以存放10条指令,共32个页面 printf("\n"); } } voidOPT()//最优替换算法 { intn=0;//记录缺页次数 intexist,space,position; intcurpage;//当前指令的页面号 for(inti=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 { for(intj=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); } voidLRU()//最近最久未使用算法 { intn=0;//记录缺页次数 intexist,space,position; intcurpage;//当前指令的页面号 for(inti=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为-1 for(intj=0;j {//其余的accessed++ block[j].accessed++; } } printf("缺页次数: %d\n",n); printf("缺页率: %f%%\n",(n/320.0)*100); } voidFIFO() { intn=0;//记录缺页次数 intexist,space,position; intcurpage;//当前指令的页面号 intblockpointer=-1; for(inti=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); } voidmain() { intchoice; printf("************请求分页存储管理模拟系统*************\n"); randam(); printf("************此进程的页面调用序列如下**************\n"); pagestring(); while(choice! =4) { printf("********1: OPT2: LRU3: FIFO4: 退出*********\n"); printf("请选择一种页面置换算法: "); scanf("%d",&choice); init(); switch(choice) { case1: printf("最优置换算法OPT: \n"); printf("页面号物理地址页面号物理地址页面号物理地址页面号物理地址\n"); OPT(); break; case2: printf("最近最久未使用置换算法LRU: \n"); printf("页面号物理地址页面号物理地址页面号物理地址页面号物理地址\n"); LRU(); break; case3: printf("先进先出置换算法FIFO: \n"); printf("页面号物理地址页面号物理地址页面号物理地址页面号物理地址\n"); FIFO(); break; } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 请求 分页 存储 管理 系统 模拟