写的操作系统作业。。。。
放上来给需要的小伙伴
需要注意的地方:
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 |
2 | -1 | 0 |
3 | 2 | 2(时间滚动,增加1秒) |
4 | 1 | 3 |
0(此时0号页面占用该内存块) | 4(此时还是4号页面占用该内存块) | 3此时还是3号页面占用该内存块) |
根据我们FIFO的淘汰规则:淘汰了2号页面,将2号页面占用的内存块交给了0号页面使用,现在页面执行顺序数组执行到了第4个,后面的依次类推,按照FIFO淘汰规则进行淘汰
代码如下:
#include#include //数据结构 页式管理 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=0; curProPages=5;//虚拟页面数量 curMemoryBlocks=3;//内存块数量 proLength=7;//虚拟页执行顺序数组长度 proSort[0]=2;//存放的是虚拟页的编号 proSort[1]=4; proSort[2]=3; proSort[3]=0; proSort[4]=1; proSort[5]=2; proSort[6]=4; for(i=0; i maxTime) { maxTime=pageList[i].loadTime; vpage=i; } } return vpage;}void fifo(){ //开始程序执行,调用虚拟机 int index; int vpage; int fpage; int freeIndex; for(index=0; index
运行结果如下:
运行结果符合预期
希望能给看到此博文的你一点小小的帮助!