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

放上来给需要的小伙伴

需要注意的地方:

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. Hello world &博客客户端试用

    第一篇博客,使用 open live writer客户端进行测试,下载地址见http://openlivewriter.org/,软件为英文,但配置比较简单,选择“其他博客类型”就ok. 同时安装了语 ...

  2. drupal7 查看哪些模块实现了某个钩子

    module_implements($hook) 可参考函数module_invoke_all function module_invoke_all($hook) { $args = func_get ...

  3. web页面超时自动退出方法

    思路: 使用 mousemover 事件来监测是否有用户操作页面,写一个定时器间隔特定时间检测是否长时间未操作页面,如果是,退出: 具体时间代码如下(js):var lastTime = new Da ...

  4. 关于WebSocket协议

    WebSocket是单个TCP连接上进行全双工通信的协议 在WebSocket的API中,客户端与服务器只需要进行一次握手就可以保持持久的连接,并可以双向传输数据 与HTTP不同的是,WebSocke ...

  5. javaSE——字符流

    字符流: 读取数据的单位是字符,即每次可以读取至少一个字符(一个字母.数字.汉字.符号). 和字节流一样,管子搭载的对象不同,则字符流就不同. 类 FileReader: 用于读取文件的便捷类. 继承 ...

  6. ArcGIS10+:ArcGIS version not specified. You must call RuntimeManager.Bind before creating any ArcGIS

    ArcGIS10+版本,使用VS创建一个简单的AE应用程序,然后拖放一个toolbar.LicenseControl以及MapControl控件. 接着编译应用程序,编译成功. 然后单击F5运行程序, ...

  7. ArcEngine对Blob字段赋值的方法

    今天在测试数据入库程序,发现对某个图层操作之后,调用StopOperation,会出现“尝试写入或读取受保护的内存”错误. 经过测试,最终发现是因为该图层包含有Blob字段,而代码没有专门对Blob字 ...

  8. 3.CSS使用基础(2)

    目录 一.CSS 链接 二.CSS 列表样式(ul) 三.CSS Table(表格) 四.盒子模型 五.CSS Border(边框) 六.CSS 轮廓(outline)属性 七.CSS Margin( ...

  9. 《SQL Server 2008从入门到精通》--20180704

    XML查询技术 XML文档以一个纯文本的形式存在,主要用于数据存储.不但方便用户读取和使用,而且使修改和维护变得更容易. XML数据类型 XML是SQL Server中内置的数据类型,可用于SQL语句 ...

  10. 查询会龄 sql部分

      AND (       case when ${fld:vc_age} = '1' then ((current_date-d.c_idate::date)/30)<3       when ...