实验5 页面置换算法_实验五页面置换算法
实验5 页面置换算法由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“实验五页面置换算法”。
实验5
页面置换算法
一、实验题目:页面置换算法(请求分页)
二、实验目的:
进一步理解父子进程之间的关系。
1)理解内存页面调度的机理。2)掌握页面置换算法的实现方法。3)通过实验比较不同调度算法的优劣。4)培养综合运用所学知识的能力。
页面置换算法是虚拟存储管理实现的关键,通过本次试验理解内存页面调度的机制,在模拟实现FIFO、LRU等经典页面置换算法的基础上,比较各种置换算法的效率及优缺点,从而了解虚拟存储实现的过程。将不同的置换算法放在不同的子进程中加以模拟,培养综合运用所学知识的能力。
三、实验内容及要求
这是一个综合型实验,要求在掌握父子进程并发执行机制和内存页面置换算法的基础上,能综合运用这两方面的知识,自行编制程序。
程序涉及一个父进程和两个子进程。父进程使用rand()函数随机产生若干随机数,经过处理后,存于一数组Ace_Series[]中,作为内存页面访问的序列。两个子进程根据这个访问序列,分别采用FIFO和LRU两种不同的页面置换算法对内存页面进行调度。要求:
1)每个子进程应能反映出页面置换的过程,并统计页面置换算法的命中或缺页情况。
设缺页的次数为diseffect。总的页面访问次数为total_instruction。缺页率 = disaffect/total_instruction 命中率 = 1-disaffect/total_instruction 2)将为进程分配的内存页面数mframe 作为程序的参数,通过多次运行程序,说明FIFO算法存在的Belady现象。
四、程序流程图
开始创建子进程1创建子进程2
结束 子进程1逻辑页面读完?N命中?N内存页面满?Y命中次数+1YY最先进入的进程退出内存页面N当前调入页面进入内存页面退出 2逻辑页面读完?N命中?N内存页面满?N当前调入页面进入内存页面Y被访问次数最少的进程退出内存页面Y命中次数+1,命中页面访问数+1Y退出
五、运行结果及其说明
FIFO:
LRU:
:
六、回答以下问题: ① 父进程、子进程之间的并发执行的过程
父进程与子进程之间的并发执行宏观并行,微观串行。从宏观来说,父进程创建子进程1,子进程1和父进程同时执行,直到父进程创建子进程2遇到wait()函数挂机为止,当子进程1结束父进程和子进程2并发执行到再次遇见wait()函数是挂起等待子进程2结束,到子进程2结束返回父进程父进程继续执行至结束。从微观来说,父进程先执行至创建子进程1,接下来父进程挂起执行子进程1知道子进程1结束回到父进程;父进程继续执行到创建子进程2再次挂起,执行子进程2,直到子进程2结束回到父进程继续执行至结束。
② 通过完成实验,根据你的体会,阐述虚拟存储器的原理。虚拟存储器实际上是用来解决作业大而内存小的问题,他通过页面置换算法来提供远大于内存地址空间的地址范围,针对不同的程序将不同的数据页面读取到虚拟存储器中用来实现。
③ 写出FIFO算法中出现Belady现象的内存页面访问序列。
4个内存页面数:
序列2 2 5 3 3 1 3 1 2 5 5 2 3个内存页面数:
序列2 1 3 2 1 4 3 1 3 1 5 5
7次命中,命中率为0.58 6次命中,命中率为0.5
七、程序源代码、文档注释及文字说明
#include #include #include #include #include #include #include #include #define max_Frame 12 #define Frame 2
main(){ srand(time(0));int pid1, pid2, fd[2], Ace_Series[12], temp;float effect, rate = 0;char str1[100], str2[100];struct M_Frame {
int page_no;
char flag;};struct M_Frame one_frame[4];one_frame[0].page_no = 0;one_frame[1].page_no = 0;one_frame[2].page_no = 0;one_frame[3].page_no = 0;effect = 0;int i = 0;printf(“内存访问页面序列:”);for(;i
Ace_Series[i] = rand()% 5 + 1;
printf(“%d ”, Ace_Series[i]);} while((pid1 = fork())==-1);if(pid1 == 0){
int no = 0;
int pno = 0;
printf(“FIFO页面置换算法:n”);
for(;no
{
printf(“调入的页面号是%d ”, Ace_Series[no]);
int k = 0;
for(;k
{
if(one_frame[k].page_no == Ace_Series[no]){ effect++;printf(“命中n”);break;}
if(one_frame[k].page_no == 0)
{
one_frame[k].page_no = Ace_Series[no];
printf(“未命中n”);
break;
}
if(k == Frame)
{
int j = 1;
for(;j
{
one_frame[j1].page_no;one_frame[t1].page_no = one_frame[j].page_no;
}
one_frame[Frame].page_no = Ace_Series[no];
printf(“未命中n”);
}
}
printf(“内存情况为:%d |%d |%d |%dn”, one_frame[0].page_no, one_frame[1].page_no, one_frame[2].page_no, one_frame[3].page_no);
}
rate = effect / 12;
printf(“命中次数:%fn”, effect);
printf(“命中率:%fn”, rate);
}
wait(0);
exit(0);} }