实验5页面置换算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验5页⾯置换算法
实验5 页⾯置换算法
⼀、实验题⽬:页⾯置换算法(请求分页)
⼆、实验⽬的:
进⼀步理解⽗⼦进程之间的关系。
1)理解内存页⾯调度的机理。
2)掌握页⾯置换算法的实现⽅法。
3)通过实验⽐较不同调度算法的优劣。
4)培养综合运⽤所学知识的能⼒。
页⾯置换算法是虚拟存储管理实现的关键,通过本次试验理解内存页⾯调度的机制,在模拟实现FIFO、LRU等经典页⾯置换算法的基础上,⽐较各种置换算法的效率及优缺点,从⽽了解虚拟存储实现的过程。
将不同的置换算法放在不同的⼦进程中加以模拟,培养综合运⽤所学知识的能⼒。
三、实验内容及要求
这是⼀个综合型实验,要求在掌握⽗⼦进程并发执⾏机制和内存页⾯置换算法的基础上,能综合运⽤这两⽅⾯的知识,⾃⾏编制程序。
程序涉及⼀个⽗进程和两个⼦进程。
⽗进程使⽤rand()函数随机产⽣若⼲随机数,经过处理后,存于⼀数组Acess_Series[]中,作为内存页⾯访问的序列。
两个⼦进程根据这个访问序列,分别采⽤FIFO和LRU两种不同的页⾯置换算法对内存页⾯进⾏调度。
要求:
1)每个⼦进程应能反映出页⾯置换的过程,并统计页⾯置换算法的命中或缺页情况。
设缺页的次数为diseffect。
总的页⾯访问次数为total_instruction。
缺页率= disaffect/total_instruction
命中率= 1- disaffect/total_instruction
2)将为进程分配的内存页⾯数mframe 作为程序的参数,通过多次运⾏程序,说明FIFO算法存在的Belady现象。
四、程序流程图
开始
创建⼦进程1
创建⼦进程2
结束
⼦进程1
命中?
N
内存页⾯满?Y 最先进⼊的进程
退出内存页⾯
N
当前调⼊页⾯进
⼊内存页⾯
Y 命中次数+1N
完?
退出
Y
⼦进程2
命中?
N
内存页⾯满?
Y 被访问次数最少的进程退出内存页⾯N
当前调⼊页⾯进
⼊内存页⾯Y 命中次数+1,命中页⾯访问数+1N
逻辑页⾯读
完?
退出
Y
五、运⾏结果及其说明
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 6次命中,命中率为0.5
3个内存页⾯数:
序列2 1 3 2 1 4 3 1 3 1 5 5 7次命中,命中率为0.58 七、程序源代码、⽂档注释及⽂字说明
#include
#include
#include
#include
#include
#include
#define max_Frame 12
#define Frame 2
main()
{
srand(time(0));
int pid1, pid2, fd[2], Acess_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<12; i++)
{
Acess_Series[i] = rand() % 5 + 1;
printf("%d ", Acess_Series[i]);
}
while ((pid1 = fork()) == -1);
if (pid1 == 0)
{
printf("FIFO页⾯置换算法:\n");
for (; no<12; no++)
{
printf("调⼊的页⾯号是%d ", Acess_Series[no]);
int k = 0;
for (; k <= Frame; k++)
{
if (one_frame[k].page_no == Acess_Series[no]) { effect++; printf("命中\n"); break; }
if (one_frame[k].page_no == 0)
{
one_frame[k].page_no = Acess_Series[no];
printf("未命中\n");
break;
}
if (k == Frame)
{
int j = 1;
for (; j <= Frame; j++)
{
one_frame[j - 1].page_no = one_frame[j].page_no;
}
one_frame[Frame].page_no = Acess_Series[no];
printf("未命中\n");
}
}
printf("内存情况为:%d |%d |%d |%d\n", one_frame[0].page_no, one_frame[1].page_no, one_frame[2].page_no, one_frame[3].page_no);
}
rate = effect / 12;
printf("命中次数:%f\n", effect);
printf("命中率:%f\n", rate);
}
else
{
while ((pid2 = fork()) == -1);
if (pid2 == 0)
{
int no = 0;
int pno = 0;
one_frame[0].page_no = 0;
one_frame[1].page_no = 0;
one_frame[2].page_no = 0;
one_frame[3].page_no = 0;
for (; no<12; no++)
{
printf("调⼊的页⾯号是%d ", Acess_Series[no]);
int k = 0;
for (; k <= Frame; k++)
{
if (one_frame[k].page_no == Acess_Series[no])
{
int t = k;
for (; t <= Frame; t++)
{
if (t == Frame&&one_frame[t].page_no != 0)
{
temp = one_frame[t].page_no; one_frame[t].page_no = one_frame[k].page_no; one_frame[k].page_no = temp;
}
if (one_frame[t].page_no == 0)
{
temp = one_frame[t - 1].page_no; one_frame[t - 1].page_no = one_frame[k].page_no; one_frame[k].page_no = temp; }
}
effect++; printf("命中\n"); break;
}
if (one_frame[k].page_no == 0)
{
one_frame[k].page_no = Acess_Series[no];
printf("未命中\n");
break;
}
if (k == Frame)
{
int j = 1;
for (; j <= Frame; j++)
{
one_frame[j - 1].page_no = one_frame[j].page_no;
}
one_frame[Frame].page_no = Acess_Series[no];
printf("未命中\n");
}
}
printf("内存情况为:%d |%d |%d |%d\n", one_frame[0].page_no, one_frame[1].page_no, one_frame[2].page_no, one_frame[3].page_no);
}
rate = effect / 12;
printf("命中次数:%f\n", effect);
printf("命中率:%f\n", rate);
}
wait(0);
exit(0);
}
}。