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

放上来给需要的小伙伴

需要注意的地方:

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. Android 退出整个应用程序

    我们在写android应用程序时,经常会遇到想退出当前Acitivity,或者直接退出应用程序.我之前的一般操作是按返回键,或者直接按home键直接返回,其实这两种操作都没有关闭当前应用程序,没有释放 ...

  2. 【CVE-2018-11116】openwrt rpcd 配置文件错误导致访问控制失效

    User can access to ubus over HTTP. This way depend on rpcd service. When misconfigure the rpcd's ACL ...

  3. org.springframework.data.redis.cache.RedisCacheManager

    org.springframework.data.redis.cache.RedisCacheManager

  4. Eclipse Ctrl + H 搜索文件不覆盖已打开文件解决办法

    1.windows------->preferences

  5. ui-sref的参数传递

    例如:路由配置如下: $stateProvider.state('admin.userList', { url: '/listUser?type&role', //参数必须先在这边声明 tem ...

  6. log4j配置详解(非常详细)

    Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置,可以创建出Log4J的运行环境 ...

  7. 如何让你的Ssh连接,更加安全?

    希望你会涨姿势. First: vim /etc/ssh/sshd_config 在Port 22下面加一行,以端口1438为例,Port 1438 然后保存,重启ssh服务 systemctl re ...

  8. 搜索关键字自动更正 - Oracle Endeca Server

    做了几个Oracle Endeca 电商项目.每个项目都会有搜过关键字拼写错误更正(Spelling Correction)的需求.淘宝也有类似功能. Oracle Endeca Sever提供了关键 ...

  9. JSP中forEach和forTokens循环的用法

    <%@page import="java.util.*"%> <%@ page language="java" contentType=&qu ...

  10. iOS8 生成二维码与条形码

    iOS8 生成二维码与条形码 效果图: 源码: // // ViewController.m // CodeCreator // // Created by YouXianMing on 15/3/1 ...