第7次 常用页面置换算法模拟实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统课程实验报告
缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。最简单的页面置换算法是先入先出(FIFO)法。
2、算法流程图
3、步骤说明
(1)初始化
void init(){//初始化
int i;
for (i = 0; i < page_frame_number; i++){
page_table[i].page_id = -1;
page_table[i].load_time = -1;
page_table[i].last_visit_time = -1;
}
}
(2)选择算法,输入插入页面号。进入判断函数
int judge(){//判断页框是否满,或者页框里面是否已存在页面
int i;
for (i = 0; i < page_frame_number; i++){
if (page_table[i].page_id == -1 || page_table[i].page_id == page_id)
return i;
}
return -2;
}
之后根据返回数的不同决定了不同类型
返回-2则说明页框满且页框里面没有存在要插入的页面。
返回-1则说明页框未满
返回其它数则说明页框里存在相同的页面
(3)//当没有空页框,并且页面本身也没有存在,则执行一下代码
qsort(page_table, page_frame_number, sizeof(struct Page_table), cmp);//按照装入时间从小到大排序
page_table[0].page_id = page_id;
page_table[0].load_time = counter;
page_table[0].last_visit_time = counter;
page_interrupt_number++;
将页框号为0的页面置换成最新插入的页面。
int cmp(const void *p, const void *q){//按照装入时间从小到大排序
int c = (*(struct Page_table*)p).load_time - (*(struct Page_table*)q).load_time;
if (c > 0)
return 1;
else
return -1;
}
排序函数,将页面按装入时间从小到大排序
(4)//如果页面未满,则将页面替换在空页框里
if (page_table[j].page_id == -1){
page_table[j].page_id = page_id;
page_table[j].load_time = counter;
page_table[j].last_visit_time = counter;
page_interrupt_number++;
则将页面替换在页框号最小的空页框里
(5)//如果页面本身存在页框中,则执行一下代码
page_table[j].last_visit_time = counter;
则更新页面的最近访问时间
(6)qsort(page_table, page_frame_number, sizeof(struct Page_table), cmp3);//按照装入时间从小到大排序
print(2);
打印出页表详细信息
printf("页表信息:\n页号页框号装入时间最近访问时间\n");
for (j = 0; j < page_frame_number; j++){
printf("%4d%8d%7d%7d\n", page_table[j].page_id, j, page_table[j].load_time,
}; break;
排序函数
int cmp3(const void *p, const void *q){//按照装入时间从小到大排序,,并且不要排序没页面的部分
if ((*(struct Page_table*)p).page_id != -1 && (*(struct Page_table*)q).page_id != -1){ int c = (*(struct Page_table*)p).load_time - (*(struct Page_table*)q).load_time;
if (c > 0)
return 1;
else
return -1;
}
}
(7)并计算出中断页面次数及命中概率,并打印页表出来
int sum;
sum = ((virtual_page_number - page_interrupt_number) * 100 / virtual_page_number);
printf("缺页中断次数:%d\n", page_interrupt_number);
printf("中断命中率:%d%%\n", sum);
printf("打印出页面\n");
for (int i = 0; i < page_frame_number; i++)
{
for (int g = 1; g <= virtual_page_number; g++)
{
printf("%4d", pr[i][g]);
}
printf("\n");
}
4、实现
(1)选择FIFO算法