操作系统LRU页面调度算法实现

算法思想:

  最近最久未使用(LRU)置换算法,是根据页面调入内存后的使用情况进行决策的。由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU置换算法是选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t,,当须淘汰一个页面时,选择现有页面中其t值最大的,即最近最久未使用的页面予以淘汰。

数据结构说明:

  在LRU算法中,要找出最近最久未使用的页面的话,要必须设置有关的访问记录项,且每一次访问这些记录项,页面都必须更新这些记录项。用结构体表示:

struct queue 
{
	int num; //页号
	int time; //记录最久未访问的时间
}lru[20];

源程序:

//LRU算法
#include <stdio.h>
#include <stdlib.h>
//3 4 2 6 4 3 7 4 3 6 3 4 8 4 6
struct queue 
{
	int num; //页号
	int time; //记录最久未访问的时间
}lru[20];
int page[30];
int length; //访问序列长度
int block; //页面大小
bool flag;
int res = 0; //缺页次数

void init() //初始化
{
	for (int i = 0; i < length; i++) 
	{
		lru[i].time = 0;
		lru[i].num = -1;
	}
}
int find_page(int k)
{
	int i = 0, j;
	for (j = 0; j < block; j++){   //查询是否在内存块中
		if (lru[j].num == page[k]) {
			i = j;
			flag = false;
			break;
		}
	}
	if (flag) {    //如果不在内存块,则找到最大的使用记录
		for (j = 1; j < block; j++){
			if (lru[i].time < lru[j].time) {
				i = j;
			}
		}
	}
	return i;
}
void in() //装入
{
	init(); //初始化
	int line = 0;
	bool flag1; //访问标志
	int i, j, tmp;
	for (i = 0; i < length; i++) {
		flag = true;
		if (line < block){ //没有装满的情况
			flag1 = false;
			for (j = 0; j < line; j++){
				if (lru[j].num == page[i]) { //访问序列目标已经存在
					printf("%d页面已经存在\n", lru[j].num);
					flag1 = true;
					lru[j].time = 0;
					break;
				}
			}
			if (!flag1){
				printf("没有装满,添加新页面\n");
				lru[line++].num = page[i];
				res++;
			}
		}
		else{
			tmp = find_page(i);
			if (flag){
				printf("产生页面置换中断\n");
				printf("将%d页置换出去,将%d页置换进来\n",lru[tmp].num,page[i]);
				lru[tmp].num = page[i];
				lru[tmp].time = 0;
				res++;
			}
			else{
				printf("访问%d页面成功\n", lru[tmp].num);
				lru[tmp].time = 0; //时间清零
			}
		}
		if (line > block) {   //内存装满
			for (int k = 0; k < block; k++) {
				lru[k].time++;
			}
		}
		else {
			for (int k= 0; k < line; k++) {
				lru[k].time++;
			}
		}
		printf("------------\n");
		for (int i = 0; i < block; i++) {
			printf("|%d ", lru[i].num);
		}
		printf("|\n");
		printf("------------\n");
	}
}

int main(void)
{
	system("color 3f");
	printf("输入队列的长度: \n");
	scanf("%d", &length);
	printf("输入访问序列: \n");
	for (int i = 0; i < length; i++) {
		scanf("%d", &page[i]);
	}
	printf("输入页面大小: \n");
	scanf("%d", &block);
	in();
	printf("缺页次数为: %d, 命中率率为: %.0lf%%\n", res, (1 - res * 1.0 / length) * 100);
	system("pause");
	return 0;
}

例子:

 

 

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值