c模拟 页式管理页面置换算法之FIFO
写的操作系统作业。。。。
放上来给需要的小伙伴
需要注意的地方:
1.该算法只涉及单进程
2.只是用c模拟FIFO的思想
FIFO思想:选择在内存中存活时间最久的页面淘汰
关于该算法我的理解:
一个进程可以分为多个页面,页面大小一致,每个页面需要占用一个相同大小的内存块,在进程的页面较多而内存块较少的情况下,比如5个页面,3个内存块,这种情况内存块肯定是不够用的,当前面三个页面都有了自己的内存块之后,现在已经没有空的内存块了,第四个页面想要进入内存块中,就要从占用内存块的页面中淘汰一个,那么就需要定义一个淘汰的规则:我们这里使用的淘汰规则:FIFO规则,选择在内存中存活时间最久的页面淘汰
代码分析:
假设一共有一个进程,该进程可以分为5个不同的页面
假设有3个内存块
一共三个表
第一个表:页面执行顺序数组表(表中存放的是页面的编号,意思是先执行2号页面,然后执行4号页面,再执行3号页面...........................最后又执行4号页面)(重复执行某个页面是因为代码需要重用,比如函数多次调用)
| 2 | 4 | 3 | 0 | 1 | 2 | 4 |
第二个表:页表(页表中的页号和上面的页面顺序执行表中的存的页号是对应的)
| 页号 | 页面在内存块中的地址 | 页面在内存中存活的时间 |
| 0 | -1(最开始默认-1) | 0(最开始默认0) |
| 1 | -1 | 0 |
| 2 | 0 | 3 |
| 3 | 2 | 1 |
| 4 | 1 | 2 |
第三个表:内存块信息表(存放的是占用该内存块的页号)
| 2 | 4 | 3 |
现在执行顺序数组中的前面3个页面都有了内存块(2号页面,4号页面,3号页面)且内存块中已经没有了空闲的内存块,当页面执行顺序表中的0号页面要进入内存块的时候,就必须淘汰一个占用内存块的页面,按照FIFO的淘汰规则,存活时间最长的2号页面将被淘汰(2号页面存活时间为3秒)所以现在表回产生变化:
| 页号 | 页面在内存块中的地址 | 页面在内存中存活的时间 |
| 0 | 0 | 1 |
| 1 | -1 | 0 |
| -1 | ||
| 3 | 2 | 2(时间滚动,增加1秒) |
| 4 | 1 |
| 0(此时0号页面占用该内存块) | 4(此时还是4号页面占用该内存块) | 3此时还是3号页面占用该内存块) |
根据我们FIFO的淘汰规则:淘汰了2号页面,将2号页面占用的内存块交给了0号页面使用,现在页面执行顺序数组执行到了第4个,后面的依次类推,按照FIFO淘汰规则进行淘汰
代码如下:
#include <stdio.h>
#include <stdlib.h>
//数据结构 页式管理 FIFO 先进先出 单进程 #define MEMORY_MAX_BLOCKS 10//定义物理块最大数量
#define PROGRESS_MAX_PAGE 20 //定义虚拟页面的最大数量
#define PROGRESS_MAX_LENGTH 30 //定义进程的最大长度 //当前进程的相关信息
int curProPages;//当前进程虚拟页
int curMemoryBlocks;//当前进程物理块
int proLength;// 进程执行长度
int proSort[PROGRESS_MAX_LENGTH];//虚拟页执行顺序数组 typedef struct PageItem
{
int vpage;//虚拟页的编号
int mblock;//对应的物理号 默认不存在对应的内存块-1
int loadTime;//该页面在内存中存在的时间
} PageItem; PageItem pageList[PROGRESS_MAX_PAGE];//页表: int memoryAllocInfo[MEMORY_MAX_BLOCKS];//内存物理块分配信息,某个内存块放某个页面 //初始化函数
void init()
{
int i=;
curProPages=;//虚拟页面数量
curMemoryBlocks=;//内存块数量
proLength=;//虚拟页执行顺序数组长度
proSort[]=;//存放的是虚拟页的编号
proSort[]=;
proSort[]=;
proSort[]=;
proSort[]=;
proSort[]=;
proSort[]=;
for(i=; i<curProPages; i++) //页表的初始化
{
pageList[i].vpage=i;
pageList[i].mblock=-;
pageList[i].loadTime=;
}
for(i=; i<curMemoryBlocks; i++) //内存块的初始化
{
memoryAllocInfo[i]=-;
}
} void showInfo()
{
//页表信息打印
printf("-------------------------------------------------------------\n");
printf("页表信息:\n");
printf("页号\t页对应的内存块编号\t页面在内存中存活的时间\n");
int i;
for(i=; i<curProPages; i++)
{
printf("%d\t\t%d\t\t\t%d\n",pageList[i].vpage,pageList[i].mblock,pageList[i].loadTime);
}
printf("\n");
printf("内存块信息表:\n");
printf("内存块地址\t存放在此的页面\n");
for(i=; i<curMemoryBlocks; i++)
{
printf("%d\t\t%d\n",i,memoryAllocInfo[i]);
}
printf("-------------------------------------------------------------\n\n\n");
} //页表中已经存在于内存的虚拟页的时间加一个点
void extnedTime()
{
int i=;
for(i=; i<curProPages; i++)
{
if(pageList[i].mblock!=-)
{
pageList[i].loadTime+=;
} }
} //检查物理内存中是否有空闲的块
int findFreeBlock()
{
int i=;
for(i=; i<curMemoryBlocks; i++)
{
if(memoryAllocInfo[i]==-)
{
return i;
}
}
return -;//返回-1表示不存在空闲内存块
} //FIFO淘汰
//找到在内存块中存活时间最久的页面
int fifoPage()
{ int i=;
int maxTime=-;
int vpage=-;
for(i=; i<curProPages; i++)
{
if(pageList[i].mblock==-)
{
continue;
}
if(pageList[i].loadTime>maxTime)
{
maxTime=pageList[i].loadTime;
vpage=i;
}
}
return vpage;
} void fifo()
{
//开始程序执行,调用虚拟机
int index;
int vpage;
int fpage;
int freeIndex;
for(index=; index<proLength; index++)
{
vpage=proSort[index];
//检查是否已经分配物理页
if(pageList[vpage].mblock!=-)
{
//对于已经存在于内存的虚拟页都必须加一个时间点
extnedTime();
}
else
{
//说明虚拟页没有在内存中
//检查内存中是否有空闲块
freeIndex=findFreeBlock();
if(freeIndex!=-)
{
memoryAllocInfo[freeIndex]=vpage;
pageList[vpage].mblock=freeIndex;
extnedTime();
}
else
{
//空闲区没有
//查页表:淘汰最长时间
fpage=fifoPage();
//找到在内存中所占有的物理块
freeIndex=pageList[fpage].mblock;
//更新淘汰的虚拟页的相关信息
pageList[fpage].loadTime=;
pageList[fpage].mblock=-;
//更新分配情况
memoryAllocInfo[freeIndex]=vpage;
//更新当前调到内存中的虚页的信息
pageList[vpage].mblock=freeIndex;
extnedTime();
}
}
showInfo();
}
} int main()
{
//初始化(交互)
init();
//显示()
showInfo();
//核心逻辑()
fifo();
return ;
}
运行结果如下:



运行结果符合预期
希望能给看到此博文的你一点小小的帮助!
c模拟 页式管理页面置换算法之FIFO的更多相关文章
- 虚存管理页面置换算法 — FIFO和RUL算法模拟实现
本篇博文为追忆以前写过的算法系列第一篇(20081021) 温故知新 目的: 为了解决内存容量有限与多作业执行的冲突.运用了虚拟存储技术.能从逻辑上对内存进行扩充,达到扩充内存的效果.分页存储管理是实 ...
- (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)
目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...
- 缓存算法(页面置换算法)-FIFO、LFU、LRU
在前一篇文章中通过leetcode的一道题目了解了LRU算法的具体设计思路,下面继续来探讨一下另外两种常见的Cache算法:FIFO.LFU 1.FIFO算法 FIFO(First in First ...
- 操作系统页面置换算法之FIFO,LRU
#include<iostream> #include<unistd.h> #include<vector> #include<wait.h> #inc ...
- 页面置换算法 - FIFO、LFU、LRU
缓存算法(页面置换算法)-FIFO. LFU. LRU 在前一篇文章中通过leetcode的一道题目了解了LRU算法的具体设计思路,下面继续来探讨一下另外两种常见的Cache算法:FIFO. LFU ...
- 操作系统-1-存储管理之LFU页面置换算法(leetcode460)
LFU缓存 题目:请你为 最不经常使用(LFU)缓存算法设计并实现数据结构.它应该支持以下操作:get 和 put. get(key) - 如果键存在于缓存中,则获取键的值(总是正数),否则返回 -1 ...
- 操作系统-2-存储管理之LRU页面置换算法(LeetCode146)
LRU缓存机制 题目:运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制. 它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - ...
- OS_页面置换算法:C++实现
一.实验目的: 通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种页面置换算法的基本思想和实现过程,并比较它们的效率. 二.实验内容: 本实 ...
- 页面置换算法(最佳置换算法、FIFO置换算法、LRU置换算法、LFU置换算法)
页面置换产生的原因是:分页请求式存储管理(它是实现虚拟存储管理的方法之一,其中一个特性是多次性-->多次将页面换入或换出内存) 效果最好的页面置换算法:最佳置换算法 比较常用的页面置换算法有:F ...
随机推荐
- 洛谷P2973 [USACO10HOL]赶小猪(高斯消元 期望)
题意 题目链接 Sol 设\(f[i]\)表示炸弹到达\(i\)这个点的概率,转移的时候考虑从哪个点转移而来 \(f[i] = \sum_{\frac{f(j) * (1 - \frac{p}{q}) ...
- for、for..in、forEach、$.each等循环性能测试
var num = 10000000,arr = []; for(i=0;i<num;i++){ arr[i] = i+2; } //1) 使用 for 循环 function test1() ...
- angularjs ui-view多视口多层嵌套路由配置
最近研究了一下ui-view多层嵌套,整理了一下 1.最简单的ui-view用法 html部分: <ul class="nav navbar-nav"> <li ...
- csv注入漏洞原理&&实战
前言 为了找工作,巩固巩固知识.本文会介绍 csv 注入漏洞的原理,最后给出一个示例. 正文 在 csv 文件 和 xlsx 文件中的每一项的值如果是 =, @, +, - 就会被 excel 识 ...
- Android 时间轴的实现
时间轴 时间轴,顾名思义就是将发生的事件按照时间顺序罗列起来,给用户带来一种更加直观的体验.京东和淘宝的物流顺序就是一个时间轴(如图),想必大家都不陌生. 时间轴的初探 初次见到这种UI,感觉整个布局 ...
- c# 设计模式 之:装饰模式
一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).A ...
- deep learning深度学习之学习笔记基于吴恩达coursera课程
feature study within neural network 在regression问题中,根据房子的size, #bedrooms原始特征可能演算出family size(可住家庭大小), ...
- C语言的参数传递
一.三道考题 开讲之前,我先请你做三道题目.(嘿嘿,得先把你的头脑搞昏才行……唉呀,谁扔我鸡蛋?) 考题一,程序代码如下:void Exchg1(int x, int y){ int tmp; ...
- MyEclipse 智能提示设置
在实际的开发当中,编译器没有智能提示,确实是效率很低,下面我就给大家讲一下在MyEclipse中设置智能提示,方便大家的开发,希望能帮到大家. 方法一:首先,在MyEclipse的菜单栏中找到wind ...
- spider-抓取网页内容(Beautiful soup)
http://jingyan.baidu.com/article/afd8f4de6197c834e386e96b.html http://cuiqingcai.com/1319.html Windo ...