页面置换算法的实现-最近最久未使用算法(计数器法)
1、页面置换算法的实现-最近最久未使用算法(计数器法)的基本思想
最近最久未使用算法(LRU)与每个页面的最后使用时间有关,这种算法给每个页面一个访问字段,记录一个页面上次访问到现在的时间(t)。当要淘汰一个页面是,选择页面中时间(t)最大的一个淘汰。而最近最久未使用算法的计数器法是给每个页表对应一个时间字段,并给CPU增加一个计数器,每进行一次存储访问,该时钟都加1。每当访问一个页面时,时钟寄存器的内容就被复制到相应页表的使用时间字段中。这样,可以始终保留着每个页面最后访问的时间。在淘汰页面时,选择该时间值最小的页面。使用这个算法必须要考虑计数器溢出问题。
如果最近一段时间内某些页面被频繁访问,那么在将来还可能被频繁访问。反之,未被访问的将来也不会被访问。
2、算法的具体步骤:首先每一次调用页面时,先把进程拥有的内存块从头到尾的扫描一遍,查看内存块中是否已经存在了要调用的页面,如果存在证明这一次调用已经成功了,然后把想要调用的页面的时间改成最近的时刻。扫描的过程中标志哪些内存块未被使用(第一次调用页面都未被使用)指针指向未被使用的内存块,到了扫描的最后指针指向未被使用的内存块的最后一个。如果在一次扫描中没有找到想要调用的页面,那么就使用最后一个未被使用的内存块(指针指向的内存块)来调用想要的调用的页面,把他的使用时间改成最近的时间。如果扫描没有找到想要调用的页面,也没有未被使用的内存块,就要进行第二次扫描(只扫描第一个到n-1个),首先定义一个变量指向最久为被使用的内存块(时间最小的),然后就进行置换,把时间改成最近的时间。
3、C语言代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct // 定义结构体
{
int isUsing; // 当前块是否被使用
int pageNumber; // 块中装载的页面的页面号
int lastUseTime; // 内存块最后一次被使用的时间
} BlockNode;
BlockNode *initialNodes(int size)
{
BlockNode *bn = (BlockNode *)malloc(size * sizeof(BlockNode)); // 分配空间
if (bn == NULL)
{
printf("进程内存块初始化失败!");
return 0;
}
memset(bn, 0, size * sizeof(BlockNode));
// 将节点数组内容初始化为0
return bn;
}
int