东北大学操作系统实验4.docx
- 文档编号:9975312
- 上传时间:2023-05-22
- 格式:DOCX
- 页数:13
- 大小:269.67KB
东北大学操作系统实验4.docx
《东北大学操作系统实验4.docx》由会员分享,可在线阅读,更多相关《东北大学操作系统实验4.docx(13页珍藏版)》请在冰点文库上搜索。
东北大学操作系统实验4
操作系统实验报告
实验名称
实验四:
页面置换算法
班级
物联网1201班
学号
20124052
姓名
李垠桥
一.实验目的
进一步加深理解父子进程之间的关系及其并发执行,理解内存页面调度的机理,掌握页面置换算法及其实现方法,培养综合运用所学知识的能力。
页面置换算法是虚拟存储管理实现的关键,通过本次试验理解内存页面调度的机制,在模拟实现FIFO、LRU等经典页面置换算法的基础上,理解虚拟存储实现的过程。
将不同的置换算法放在不同的子进程中加以模拟,培养综合运用所学知识的能力。
二.实验内容及要求
1.实验内容
程序涉及一个父进程和两个子进程。
父进程使用rand()函数随机产生若干随机数,经过处理后,存于一数组Acess_Series[]中,作为内存页面访问的序列。
两个子进程根据这个访问序列,分别采用FIFO和LRU两种不同的页面置换算法对内存页面进行调度。
2.实验要求
(1)这是一个综合性实验,要求在掌握父子进程并发执行机制和内存页面置换算法的基础上,能综合运用这两方面的知识,自行、独立编制程序。
(2)每个子进程应能反映出页面置换的过程,并统计页面置换算法的命中或缺页情况。
设缺页的次数为diseffect。
总的页面访问次数为total_instruction。
则:
缺页率=disaffect/total_instruction
命中率=1-disaffect/total_instruction
(3)将为进程分配的内存页面数mframe作为程序的参数,通过多次运行程序,说明FIFO算法存在的Belady现象。
三.程序流程图
四.程序源代码、文档注释及文字说明
1.程序语言:
c语言
2.源代码:
#include
#include
#include
#include
#include
intmain()
{
//初始化
intpageNum=0;
printf("请输入内存中页面数:
\n");
scanf("%d",&pageNum);
printf("请输入访问次数:
\n");
inttimes=0;
scanf("%d",×);
printf("是否随机生成访问页序号?
(1为是,其他任意数字为否)\n");
intconfig=0;
scanf("%d",&config);
pid_tpid1;//子进程1pid
pid_tpid2;//子进程2pid
intaccess_series[times];
inti=0;
intfifoDomain[pageNum];
intfPlace=0;//fifoDomain中指针位置
intafPlace=0;//access_series中指针位置
intfhitNum=0;//命中次数
intlruDomain[pageNum];
intlPlace=0;//lruDomain中指针位置
intalPlace=0;//access_series中指针位置
intlhitNum=0;//命中次数
if(config==1)
{
srand((unsigned)time(NULL));
printf("序列:
");
for(;i { inttemp=rand(); access_series[i]=temp%10; printf("%d",access_series[i]); } printf("\n"); } else { printf("请输入%d个数字(0-9)\n",times); into=0; for(;o { printf("第%d个数: ",o+1); scanf("%d",&access_series[o]); } printf("序列: "); for(o=0;o { printf("%d",access_series[o]); } printf("\n"); } while((pid1=fork())<0) { printf("ERROR: 生成子进程1失败! \n"); } if(pid1==0)//当前为子进程1FIFO { printf("生成了子进程1,PID: %d\n",getpid()); intj=0; for(;afPlace { for(j=0;j { if(access_series[afPlace]==fifoDomain[j]) { fhitNum++; break; } } if(j==fPlace) { if(fPlace==pageNum) { intm=0; for(;m { fifoDomain[m]=fifoDomain[m+1]; } fifoDomain[pageNum-1]=access_series[afPlace]; } else { fifoDomain[fPlace]=access_series[afPlace]; fPlace++; } } printf("FIFO: "); for(j=0;j { printf("%d,",fifoDomain[j]); if(j==fPlace-1) { printf("\n"); } } } printf("FIFO命中率为: %f\n",(fhitNum*1.0)/times); exit(0); } elseif(pid1>0)//当前为父进程 { while((pid2=fork())<0) { printf("ERROR: 生成子进程2失败! \n"); } if(pid2==0)//当前为子进程2LRU { printf("生成了子进程2,PID: %d\n",getpid()); intj=0; for(;alPlace { for(j=0;j { if(access_series[alPlace]==lruDomain[j]) { inttemp; intk; temp=lruDomain[j]; for(k=j+1;k { lruDomain[k-1]=lruDomain[k]; } lruDomain[lPlace-1]=temp; lhitNum++; break; } } if(j==lPlace) { if(lPlace==pageNum) { intn=0; for(;n { lruDomain[n]=lruDomain[n+1]; } lruDomain[pageNum-1]=access_series[alPlace]; } else { lruDomain[lPlace]=access_series[alPlace]; lPlace++; } } printf("LRU: "); for(j=0;j { printf("%d,",lruDomain[j]); if(j==lPlace-1) { printf("\n"); } } } printf("LRU命中率为: %f\n",(lhitNum*1.0)/times); exit(0); } elseif(pid2>0)//当前为父进程 { wait(0);//父进程进入阻塞状态,直到子进程执行结束 wait(0); printf("当前为父进程,PID: %d\n",getpid()); } } return0; } 五.运行结果及其说明 运行结果: Belady现象: 页面数变大(由图形2变成图形1),FIFO命中率反而降低(由0.2500变为0.1667) 图形1页面数为4时FIFO运行截图 图形2页面数为3时FIFO运行截图 六.程序使用说明 1.本程序提供对内存中页面数的设置,如图1所示: 图形3请输入子进程数量 2.本程序提供对访问次数的设置,如图2所示: 图形4设置访问次数 3.本程序提供两种产生访问页序号的模式: 随机生成和手动输入,随机生成模式如图3所示: 图形5随机生成模式 七.问题 1.父进程、子进程之间的并发执行过程。 (1)父进程调用fork函数产生子进程1 (2)父进程调用fork函数产生子进程2 (3)父进程调用wait函数等待子进程结束 (4)某一个子进程结束,激活父进程 (5)父进程执行,调用wait函数等待剩余的子进程结束 (6)另一个子进程结束,激活父进程 (7)父进程执行,程序执行结束 2.通过完成实验,根据你的体会,阐述虚拟存储器的原理。 虚拟存储器实际上是用来解决作业大而内存小的问题,他通过页面置换算法来提供远大于内存地址空间的地址范围,针对不同的程序将不同的数据页面读取到虚拟存储器中用来实现。 3.写出FIFO算法中出现Belady现象的内存页面访问序列。 序列: 123412512345 内存页面数为3时FIFO命中率为: 0.25 内存页面数为4时FIFO命中率为: 0.16667
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 东北大学 操作系统 实验