首页 技术 正文
技术 2022年11月19日
0 收藏 464 点赞 4,771 浏览 3446 个字

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

放上来给需要的小伙伴

需要注意的地方:

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

c模拟 页式管理页面置换算法之FIFO

c模拟 页式管理页面置换算法之FIFO

运行结果符合预期

希望能给看到此博文的你一点小小的帮助!

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,492
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,493
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,132
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,295