FIFO页面置换算法,计算缺页率,文末附代码,及例题解析

1、内容

在地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断。当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。

模拟内存的页式管理,实现内存的分配和调用,完成虚拟内存地址序列和物理内存的对应。在内存调用出现缺页时,调入程序的内存页。在出现无空闲页面时,使用先进先出(FIFO)算法实现页面置换。

2、页的结构

页的结构如下:

页号、页面号、时间戳(在本算法中未使用,在LRU中使用)

名称

符号

功能

页号

Page_num

记录页号

页面号

Pframe_num

记录页面号

FIFO页面置换算法选择在主存中停留时间最长(即最老)的一页置换,即先进入内存的页,先退出内存。理由是:最早调入内存的页,其不再被使用的可能性比刚调入内存的可能性大。建立一个FIFO队列,收容所有在内存中的页。被置换页面总是在队列头上进行。当一个页面被放入内存时,就把它插在队尾上

通过使用线性表来实现页表,在每次需要淘汰页时,都是淘汰最先进入的页,这样就可以实现淘汰在主存中停留时间最长的页。

流程如下:

3、例题解析

在页式管理系统中,访问的顺序(访问串)为:1,2,3,4,1,2,5,1,2,3,4,5,当分配的页面数量为3时,请分别计算使用下述(1)替换算法的缺页次数,并画出页面置换图。

(1)  FIFO。

访问串 1 2 3 4 1 2 5 1 2 3 4 5
页面1 1 2 3 4 1 2 5 5 5 3 4 4
页面2 1 2 3 4 1 2 2 2 5 3 3
页面3 1 2 3 4 1 1 1 2 5 5
是否缺页

缺页率:9/12=0.75

4、代码如下:

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <stdlib.h>#define MAX_PAGES 20
#define MAX_PFRAME 20
#define INVALID -1typedef struct {int page_num;int pframe_num;int count;int timestamp;
}page_type;page_type page[MAX_PAGES];typedef struct pf_struct {int pframe_num;//页面号struct pf_struct* next;
}pf_type;pf_type pframe[MAX_PFRAME];int diseffct = 0;//缺页记录void InitPage(const int* page_n, const int* pframe_n)
{int total_vp = *page_n, total_pf = *pframe_n;int i = 0;diseffct = 0;for (i = 0; i < total_vp; i++)//虚拟页{page[i].page_num = i;page[i].pframe_num = INVALID;page[i].count = 0;page[i].timestamp = -1;}for (i = 0; i < total_pf - 1; i++){pframe[i].next = &pframe[i];pframe[i].pframe_num = i;}pframe[total_pf - 1].next = NULL;pframe[total_pf - 1].pframe_num = total_pf - 1;
}double miss_page_rate(int pframe_order[100]) {int i = 0;double missrate = 0, count = 0;while (pframe_order[i] != -1){count++;i++;}missrate = diseffct / count;return missrate;
}void menu(int* page_n, int* pframe_n)
{int a, b;printf("---------------------------------------------\n");printf("请输入页面的数量:");scanf("%d", page_n);printf("请输入页的数量:");scanf("%d", pframe_n);printf("--------------------------------------------\n");
}int get_input_order(int fprame_order[100], int pframe_n)
{int p = 0;int tmp = 0;printf("请输入访问串(1到%d中的数字,每输入一个数输入一次回车,输入-1表示结束):\n", pframe_n);while (1){scanf("%d", &tmp);fprame_order[p] = tmp;p++;if (tmp == -1){break;}}return p;
}int check_all_page(int page_num, int target)
{int judge = 0;for (int i = 0; i < page_num; i++){if (page[i].pframe_num == target){judge = 1;}}if (judge == 1){return 1;}else{diseffct++;//全程序只在本处处理缺页次数return 0;}
}void display(int page_num, int judge)//就是打印出所有的页
{printf("页面号\t页号\t时间戳\n");for (int i = 0; i < page_num; i++){printf("%d\t%d\t%d\n", page[i].page_num, page[i].pframe_num, page[i].timestamp);}if (judge == 1) {printf("不缺页\n");}else{printf("缺页\n");}
}void FIFO(int page_num, int pframe_id)//page_num为页的数量,pframe_id为页面号
{int i, j;pf_type* p;for (i = page_num - 2; i >= 0; i--){//page[i + 1].count = page[i].count;page[i + 1].pframe_num = page[i].pframe_num;}page[0].pframe_num = pframe_id;
}void execute_pagef(int pframe_order[100], int page_num)//page_num为虚拟页的数量,page_n指针和page_num的值一样
{int i = 0, jugde = 0;while (pframe_order[i] != -1){printf("************************************\n");printf("使用页 %d\n", pframe_order[i]);jugde = check_all_page(page_num, pframe_order[i]);if (jugde == 1) {//在虚拟页内i++;}else//不在页内就调用页面置换算法{FIFO(page_num, pframe_order[i]);i++;}display(page_num, jugde);}
}int main()
{int* page_n = (int*)malloc(sizeof(int));int* pframe_n = (int*)malloc(sizeof(int));int pframe_order[100];int order_num = 0;menu(page_n, pframe_n);InitPage(page_n, pframe_n);order_num = get_input_order(pframe_order, *pframe_n);execute_pagef(pframe_order, *page_n);//printf("%d %d\n", *page_n, *pframe_n);printf("\n缺页率为: %lf", miss_page_rate(pframe_order));free(page_n);free(pframe_n);return 0;
}

5、运行如下:

程序分为5个页,内存中有3个页面,访问串是1、2、3、2、4、5、2

缺页率为:0.857143

【操作系统】FIFO先进先出页面置换算法(C语言实现)相关推荐

  1. 操作系统 FIFO 先进先出页面置换算法

    FIFO 先进先出页面置换算法 根据作业序列判断置换,先进先置换的原则. 实现过程: 用vector简单模拟这个过程,不用直接queue模拟,是因为,当判断是否需要置换的时候,queue不好判断在队列 ...

  2. 先进先出(FIFO)页面置换算法 C语言实现

    广东工业大学 操作系统实验 实验内容 假设每个页面中可存放10条指令,分配给作业的内存块数为4.用C语言模拟一个作业的执行过程,该作业共有320条指令,即它的地址空间为32页,目前它的所有页都还未调入 ...

  3. java实现FIFO先进先出页面置换算法

    import java.util.LinkedList; import java.util.Scanner;public class Demo {public static void main(Str ...

  4. OPT和LRU页面置换算法C语言代码,页面置换算法模拟——OPT、FIFO和LRU算法.doc

    实用标准文案 精彩文档 操作系统实验报告 页面置换算法模拟 --OFT.FIFO和LRU算法 班级:2013级软件工程1班 学号:X X X 姓名:萧氏一郎 数据结构说明: Memery[10]物理块 ...

  5. 先进先出页面置换算法详解

    *先进先出(First In first Out,FIFO) 页面置换算法的基本思想: **每次置换最先调入内存的页面,即将内存中等待时间最长的页面进行置换.此算法的适用范围是顺序结构程序. 基本原理 ...

  6. 操作系统实验:页面置换算法的模拟实现及命中率对比(学习笔记)

    操作系统实验:页面置换算法的模拟实现及命中率对比(学习笔记) 题目要求 输入要求 输出要求 编程平台 实验成果 开始模拟 错误输入 退出程序 代码实现 抽象数据类型定义 指令地址流生成 指令地址流到页 ...

  7. 操作系统:基于页面置换算法的缓存原理详解(下)

    概述: 在上一篇<操作系统:基于页面置换算法的缓存原理详解(上)>中,我们主要阐述了FIFO.LRU和Clock页面置换算法.接着上一篇说到的,本文也有三个核心算法要讲解.分别是LFU(L ...

  8. 操作系统实验2—页面置换算法模拟程序设计

    一.实验目的 对页面置换做进一步的理解. 了解页面置换的任务. 通过编程掌握页面置换算法及缺页率计算. 了解Belady现象和抖动现象. 二.实验内容 输入给出一组页面访问顺序(如页面走向是1.2.5 ...

  9. 【南邮操作系统实验】页面置换算法(FIFO、LRU、OPT)图形化界面(JavaFx)

    页面置换算法图形化界面 前言 运行效果 源码 FIFO LRU OPT FXML界面 控制器 启动类 前言 其实以前操作系统实验的时候我写过了三份了:(命令行) 页面置换算法 (FIFO.LRU.OP ...

最新文章

  1. 线性回归之案例:波士顿房价预测
  2. 深入理解ReactRedux
  3. phpStudy在linux下的使用说明
  4. C++实现插入排序算法
  5. SAPCAR 压缩解压软件的使用方法
  6. linux下file命令使用技巧
  7. i5 9400f和GTX1660能玩战地5吗?
  8. Facebook 有序队列服务设计原理和高性能浅析
  9. 如何在Java中分割字符串
  10. JavaScript语言核心(五)-- 异步 async/await
  11. HighChart 体验之旅 (后台传递JSON参数和数据的方法)
  12. 详细介绍ASP.NET状态保存方法
  13. c3p0 mysql 连接池配置文件_使用XML配置c3p0数据库连接池
  14. 图像处理零件尺寸测量matlab,题目基于数字图像处理技术的零件几何尺寸测量.doc...
  15. 转]自己开心一下!!!很轻松的~
  16. 【信息安全技术】RSA算法的研究及不同优化策略的比较
  17. Ubuntu下安装Python的Tkinter和Pmw库
  18. JavaScript进阶篇③ — 浏览器对象、Dom对象
  19. 5 Hibernate:Java Persistence API (JPA) 入门
  20. 用JS实现的一个贷款计算器

热门文章

  1. 克琳:http://liyu.eu5.org
  2. EasyFloat:浮窗从未如此简单
  3. 解说文案哪个网站好?解说文案素材哪里找?4大影视解说文案网站
  4. c语言while语句求圆周率,[求助]圆周率程序
  5. linux美元符号切换为井号,MyBatis中井号与美元符号的区别
  6. python中导入numpy库_python中的Numpy库
  7. 分享几个下载免费电子图书的地方ebook
  8. 2023 车险计算器微信小程序源码
  9. 2019广东申论县级下水文——优化营商环境,促进经济高速发展
  10. 益普生携手海王星辰,布局大健康领域