写的操作系统作业。。。。

放上来给需要的小伙伴

需要注意的地方:

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的更多相关文章

  1. 虚存管理页面置换算法 — FIFO和RUL算法模拟实现

    本篇博文为追忆以前写过的算法系列第一篇(20081021) 温故知新 目的: 为了解决内存容量有限与多作业执行的冲突.运用了虚拟存储技术.能从逻辑上对内存进行扩充,达到扩充内存的效果.分页存储管理是实 ...

  2. (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)

    目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...

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

    在前一篇文章中通过leetcode的一道题目了解了LRU算法的具体设计思路,下面继续来探讨一下另外两种常见的Cache算法:FIFO.LFU 1.FIFO算法 FIFO(First in First ...

  4. 操作系统页面置换算法之FIFO,LRU

    #include<iostream> #include<unistd.h> #include<vector> #include<wait.h> #inc ...

  5. 页面置换算法 - FIFO、LFU、LRU

    缓存算法(页面置换算法)-FIFO. LFU. LRU 在前一篇文章中通过leetcode的一道题目了解了LRU算法的具体设计思路,下面继续来探讨一下另外两种常见的Cache算法:FIFO. LFU ...

  6. 操作系统-1-存储管理之LFU页面置换算法(leetcode460)

    LFU缓存 题目:请你为 最不经常使用(LFU)缓存算法设计并实现数据结构.它应该支持以下操作:get 和 put. get(key) - 如果键存在于缓存中,则获取键的值(总是正数),否则返回 -1 ...

  7. 操作系统-2-存储管理之LRU页面置换算法(LeetCode146)

    LRU缓存机制 题目:运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制. 它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - ...

  8. OS_页面置换算法:C++实现

    一.实验目的: 通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种页面置换算法的基本思想和实现过程,并比较它们的效率. 二.实验内容: 本实 ...

  9. 页面置换算法(最佳置换算法、FIFO置换算法、LRU置换算法、LFU置换算法)

    页面置换产生的原因是:分页请求式存储管理(它是实现虚拟存储管理的方法之一,其中一个特性是多次性-->多次将页面换入或换出内存) 效果最好的页面置换算法:最佳置换算法 比较常用的页面置换算法有:F ...

随机推荐

  1. js-用于检测类数组对象的函数

    //判定o是否是一个类数组对象 //字符串和函数有length属性,但是它们 //可以用typeof检测将其排除.在客户端JavaScript中,DOM文本节点 //也有length属性,需要用额外判 ...

  2. ubuntu禁止系统自动升级之界面操作

    ##第一步:首先找到System Settings,如下图所示: ##第二步:然后找到Solfware & Updates,如下图所示: ##第三步:点击Solfwate & Upda ...

  3. 记一次Android studio升级之后的坑

    像往常一样打开Android studio,但这次它提示我升级!说是什么为了更好的体验,在好奇心的驱使下,我毅然地点击了“update”按钮.升级之后,编译项目,报出了N多个error,我的心都慌完! ...

  4. PHP二维数据排序,二维数据模糊查询

    一.因为项目中的一个报表需要合并三个表的数据,所以分表查询再合并数据,利用PHP数组函数进行排序,搜索.三表合并后的数组结构如下: Array ( [0] => Array ( [history ...

  5. 水晶报表自定义纸张大小打印 (Crystal Report Print with custom paper size)

    System.Drawing.Printing.PrintDocument doc = new PrintDocument(); doc.PrinterSettings.PrinterName = & ...

  6. MagicalRecord使用中的注意事项

    MagicalRecord使用中的注意事项 使用CoreData [1] 使用CoreData [2] 使用CoreData [3] 使用CoreData [4] 使用MagicalRecord操作C ...

  7. Python学习---IO的异步[自定义异步IO]

    自定义IO异步基础知识: --所有的请求都基于socket实现,一个请求就是一个socket socket.setblocking(False) 不需要阻塞,一个请求完了发送另外一个,会报错,需解决 ...

  8. Python学习---爬虫学习[requests模块]180411

    模块安装 安装requests模块 pip3 install requests 安装beautifulsoup4模块 [更多参考]https://blog.csdn.net/sunhuaqiang1/ ...

  9. Linux 系统必须掌握的文件_【all】

    0.Linux 系统文件的详解 1.Linux 系统的网络配置文件 2.Linux 系统的DNS配置文件 3.Linux 系统的IP与域名解析文件[局域网的DNS] 4.Linux 系统的主机别名文件 ...

  10. (转)Matlab增加块注释

    1)方法一选中你要加注释的内容,然后选择工具菜单“text|comment”就可以了,如果要把注释变为语句,同样选中要转变的语句,然后用鼠标选择“text|uncomment”就可以了.用键盘的快捷键 ...