原创


最近操作系统实习,写了先进先出算法(FIFO)的代码来实现页面置换。

题目阐述如下:

        设计四:页面置换

设计目的:

加深对请求页式存储管理实现原理的理解,掌握页面置换算法。

设计内容:

设计一个程序,有一个虚拟存储区和内存工作区,实现下述三种算法中的任意两种,计算访问命中率

(命中率=1-页面失效次数/页地址流长度)。附加要求:能够显示页面置换过程。算法包括:先进先出的

算法(FIFO)、最少使用算法(LRU)、最近未使用算法(NUR)该系统页地址流长度为320,页面失效

次数为每次访问相应指令时,该指令对应的页不在内存的次数。   程序首先用srand()和rand()函数分别进

行初始化、随机数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算

出相应的命中率。通过随机数产生一个指令序列。共320条指令,指令的地址按下述原则生成:

(1)50%的指令是顺序执行的。

(2)25%的指令是均匀分布在前地址部分。

(3)25%的指令是均匀分布在后地址部分。

具体的实施方法如下:

在【0,319】的指令地址之间随机选取一起点m。

顺序执行一条指令,即执行地址为m+1的指令。

在前地址【0,m+1】中随机选取一条指令并执行,该指令的地址为m’。

顺序执行一条指令,其地址为m’+1。

在后地址【m’+2,319】中随机选取一条指令并执行。

重复步骤(1)-(5),直到320次指令。

将指令序列变换为页地址流。

设:

页面大小为1KB。

用户内存容量4页到32页。(动态变化)

用户虚存容量为32KB。(32页)

在用户虚存中,按每K存放10条指令虚存地址,即320条指令在虚存中的存放方式为:

第0条~9条指令为第0页(对应虚存地址为【0,9】)。

第10条~19条指令为第1页(对应虚存地址为【10,19】)。

……

第310条~319条指令为第31页(对应虚拟地址为【310,319】)。

按以上方式,用户指令可组成32页。

计算每种算法在不同内存容量下的命中率。

分页管理是这样的,将内存和作业分成大小相等的页块,作业中的每个页块在不需要被使用时存放在外存中(虚拟存储区),

当需要使用时将其从外存调入内存页块中;根据题意,在外存中的页面顺序存储着指令,需要执行哪一条指令就找到其对应的

页面,若页面已在内存则无需再操作,否则此页面缺页,需要将其调入内存,当内存块未满时,只需要直接将其插入内存块中

若内存块已满,则需要调用先进先出算法淘汰出一个页面(将其调回外存),再将此页面调入。

首先通过 rand 函数和 srand 函数产生320条指令,计算每条指令对应的页面很简单,只需要将指令/10即可;得到页地址流后

(页地址流存放在数组中),从头到尾访问一遍页地址流,每访问一个页面就判断其是否已经在内存中,在无需操作,不在则

将其(使用FIFO)调入内存。

FIFO:在页面缺页并且内存块不足时,只需要将内存块中原先的页面依次淘汰即可。

假设页地址流为:1  2  3  5  4  3  8  11  12  6(内存块大小为 3 )

1  2  3  进入内存

5  2  3  1被调出

5  4  3  2被调出

5  4  3  命中

5  4  8  3被调出(形成一个循环)

11   4  8  5被调出

11  12   8  4被调出

11  12   6  8被调出(形成一个循环)

只要为内存块编号(不是为页面编号),用一个变量(初值为1)作为指针,此变量指向的内存块,就是被FIFO选中需要调出的

内存块,调出后变量+1,当变量大于内存块数时,再将其置为1(循环)。

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define max_page 10    //内存页面数int Page[320]={0};    //虚拟存储区,存储320条指令,32个页面
int Page_flu[320]={0};    //存储320个页地址流
int count=0;    //计算随机产生的指令条数
double lack_page=0;    //记录缺页数
int count_page=max_page;     //计算队列空页面个数
int circle=1;    //在队列中循环指向被调出的进程 struct Memo{    //用结构体存储内存页面块int num;     //给每个页面编号,方便将其从队列中找到并调出 int a; struct Memo *next;
};int Judge_Page(int value){    //输入指令,返回指令对面的页面号 return value/10;
}int scan_queen(struct Memo *hear,int value){    //value代表页面号,扫描队列,缺页返回0,否则返回1struct Memo *move;move=hear->next;while(move!=NULL){if(move->a==value){return 1;}move=move->next;}return 0;
}void print(struct Memo *hear){    //输出内存页面struct Memo *move;move=hear->next;while(move!=NULL){printf("%d ",move->a);move=move->next;}printf("\n");
}void insert(struct Memo *hear,int value,int ZL){    //将页面value调入内存,ZL为对应指令 if(count_page>=1){    //内存页面空间充足struct Memo *move;move=hear->next;while(move->a!=-1){move=move->next;}move->a=value;    //将页面调入 count_page--;printf("页面 %d 被调入————对应指令为: %d \n",value,ZL);}else{    //内存空间不足,调出最先进入的页面后,将页面value后调入struct Memo *move;move=hear->next;while(move->num!=circle){    //circle存储的是需要调出的页面编号 move=move->next;}printf("页面 %d 被调出,页面 %d 被调入————指令为: %d \n",move->a,value,ZL);move->a=value;    //将页面调入circle++;if(circle==max_page+1){    //当circle>max_page+1时,最先进入的页面为队列首页面 circle=1;}}print(hear);    //调入后输出内存队列
}void FIFO(struct Memo *hear){int i=0;for(i=0;i<=319;i++){    //循环扫描页面 if( scan_queen(hear,Page_flu[i])==0){    //判断是否缺页lack_page++;insert(hear,Page_flu[i],Page[i]);    //缺页将页面调入内存
        }else{    //不缺页 printf("指令 %d 对应页面 %d 已在内存\n",Page[i],Page_flu[i]);}//不缺页无需操作
    }
}void Pro_Page(){    //形成页地址流函数 int m=0;    //在[0,319]的指令地址之间随机选取一起点mm=rand()%320;Page[count]=m;count++;if(count==320){return;}int m_=0;    //在前地址[0,m+1]中随机选取一条指令并执行m_=rand()%(m+1);Page[count]=m_;count++;if(count==320){return;}Page[count]=m_+1;count++;if(count==320){return;}int m__=0;m__=(m_+2)+rand()%( 319-(m_+2)+1 );    //在后地址[m_+2,319]的指令地址之间随机选取一条指令并执行Page[count]=m__;count++;if(count==320){return;}Pro_Page();
}void Flu(){    //将指令转换为页地址流int i=0;for(i=0;i<=319;i++){Page_flu[i]=Judge_Page( Page[i] );}
}int main(){struct Memo Stu[max_page+1];struct Memo *hear;hear=&Stu[0];//*************************************int i=0;for(i=0;i<=max_page;i++){    //形成内存页面队列if(i==max_page){Stu[i].a=-1;Stu[i].next=NULL;Stu[i].num=i;break;}Stu[i].next=&Stu[i+1];Stu[i].a=-1;Stu[i].num=i;}//*************************************srand(time(0));    //放在Pro_Page函数外面Pro_Page();    //形成页地址流Flu();    //形成页地址流 /*printf("页地址流:\n");for(i=0;i<=319;i++){    //输出页地址流printf("%d ",Page[i]);if(i%3==0 && i!=0){printf("\n");}}printf("\n");*///*************************************
    FIFO(hear);printf("缺页次数为: %0.0lf\n",lack_page);printf("命中率为:%lf\n",1-lack_page/320);return 0;
}

(运行结果部分截图)

11:33:47

2018-05-19

转载于:https://www.cnblogs.com/chiweiming/p/9058438.html

先进先出算法(FIFO)——页面置换相关推荐

  1. 操作系统之虚拟存储管理 java python 实现 最优(Optimal)置换算法 先进先出(FIFO)页面置换算法 LRU(Least Recently Used)置换算法

    操作系统之虚拟存储管理 实验内容:模拟请求分页虚拟存器管理技术中的硬件地址变换.缺页中断以及页式淘汰算法,处理缺页中断. 实验目的:清楚认识请求分页管理. 最佳(Optimal)置换算法 其所选择的被 ...

  2. FIFO页面置换算法详解

    页面置换算法的基本思想: FIFO每次置换最先调入内存的页面,即将内存中等待时间最长的页面进行置换.此算法的适用范围是顺序结构程序. 实现过程 比如有下述页面走向:1, 2, 3, 4, 2, 1, ...

  3. C#之FIFO算法实现页面置换算法

    实现原理:淘汰最先进入内存的ye页面,即选择页面在内存中停留时间最长的页面调出内存! 本程序使用到了两个数组:一个数组用于初始化存放内存外页面的序号,存放的页面序号是和网上大多数例子序号是一样的其实也 ...

  4. 计组之存储系统:7、Cache替换算法(随机算法RAND、先进先出算法FIFO、近期最少使用LRU、最近不经常使用LFU)

    7.Cache替换算法 思维导图 存在的问题 替换算法解决的问题 Cache替换算法 随机算法(RAND) 先进先出算法(FIFO) 近期最少使用(LRU) 最近不经常使用(LFU) 思维导图 存在的 ...

  5. 页面置换算法最佳页面置换算法模拟JAVA实现

    操作系统存储管理页面置换算法-----最佳页面置换算法模拟(JAVA实现) 话不多说,我们直接展示 package com.company;import java.util.Arrays;/*** @ ...

  6. 操作系统页面置换算法之先进先出(FIFO)页面置换算法(C语言实现)

    先进先出(FIFO)页面置换算法 [注]本代码数据及思路方法参考自<计算机操作系统(第四版)>汤小丹等 编著的教材. #include <iostream>int access ...

  7. 页面置换算法——最佳置换算法、最近最少使用算法、先进先出算法、时钟置换算法

    计算机操作系统--页面置换算法 根据中国大学MOOC计算机操作系统(电子科技大学)而写. 如果自己要设计页面置换,要根据什么原则来设计?我们首先想到的是存储器的局部性原理(时间局部性.空间局部性) P ...

  8. 请求分页置换算法——先进先出算法(FIFO)

    先进先出算法 1.策略 2.例题 3.先进先出算法的不足 4.练习题 1.策略 将内存中的页按装入内存真的先后顺序排列,淘汰时,选择最先进入内存的页 2.例题 一个进程在运行过程中依次访问的页号(也称 ...

  9. fifo页面置换算法java_缓存算法(页面置换算法)-FIFO、LFU、LRU

    转自:http://www.cnblogs.com/dolphin0520/ 1.FIFO算法 FIFO(First in First out),先进先出.其实在操作系统的设计理念中很多地方都利用到了 ...

  10. LRU和LFU 算法(页面置换算法)

    LRU和LFU的区别 LRU和LFU都是内存管理的页面置换算法. LRU:最近最少使用(最长时间)淘汰算法(Least Recently Used).LRU是淘汰最长时间没有被使用的页面. LFU:最 ...

最新文章

  1. 计算机操作员高级理论试题答案,计算机操作员高级理论试题答案1.doc
  2. asp.net(c#) static关键字用法小结
  3. Flex通用克隆(clone)方法
  4. 二叉树的操作(二叉树的创建、先序遍历---先根、中序遍历----先左、后续遍历---后根)
  5. 【Tools】VNC Server 6.7安装详解
  6. Unix基本操作指令备忘
  7. equipment header attribute mapping - two settypes in middleware
  8. 华三交换机配置access命令_H3C交换机配置基本命令详解
  9. 前端实现Office在线预览 (一)
  10. Gosn解决在集合中int自动转换为duble类型
  11. 网易邮箱显示服务器返回错误,企业退信的常见问题?
  12. JIRA导出工作日志到Excel
  13. 微信小程序地图如何显示附近厕所WC步行路线
  14. 自己DIY一个pinephone——debian与主线linux在红米2(msm8916)上的移植 (二)
  15. DRAM、NAND Flash、Nor Flash、EEPROM的区别和应用领域
  16. SQLServer系统函数之聚合函数
  17. 《仿真使用ARENA软件》
  18. 笔记本选购指南-2022年初购买笔记本建议
  19. 只能输入零和非零开头的数字的正则表达式
  20. 人们对人工智能的看法(积极篇)

热门文章

  1. python读取.locs文件
  2. 运动控制器对比:Windows MR、Rift、Vive、PSVR(译文修正版)
  3. 查看历史操作记录_燕麦课堂丨操作日志管理,为企业数据安全保驾护航
  4. 小猫咪小狗狗也有智能「手表」了,可监测健康,识别情绪,还防乱跑|CES 2022...
  5. 11年架构AI技术江湖,李彦宏:1块钱还是100亿,都会投进技术里
  6. 英特尔“包抄”英伟达:oneAPI对标CUDA、为《王者荣耀》云游戏提供GPU
  7. 全球最快无人卡车规模化商用,这家中国初创公司究竟凭什么
  8. 训练、标注成本节省90%!华为云自动化AI开发平台ModelArts 3.0发布,从训练数据到模型落地一站式打通...
  9. 你的AI模型有哪些安全问题,在这份AI攻防”词典”里都能查到
  10. eosjs v20 中文文档