`

LRU简单实现C++

 
阅读更多
页面置换算法 在地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断。当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。下面是LRU简单实现:双向链表,时间复杂度O(n)
#include <iostream>
#include <assert.h>
using namespace std;

typedef struct node{
	int num; //页面编号
	node *next;	//
	node *pre;
}node;

typedef struct lru_queue{
	lru_queue(int n, int max){
		this->n=n;
		this->max=max;
		l=NULL;
	}
	
	int n;	//当前个数 
	int max; //最大内存容量
	node *l; 
}lru_queue;

void print(lru_queue q){
	node *p=q.l;
	while(p!=NULL){
		cout<<p->num<<"\t";
		p=p->next;
	}
	cout<<endl;
}
void print2(node *p){
	while(p!=NULL){
		cout<<p->num<<"\t";
		p=p->pre;
	}
	cout<<endl;
}

//lru队列l最大容量为max, 调入页面i, 返回调出页面 
int insert(lru_queue &q, int i){
	node *p=q.l;
	node *pre=NULL;
	while(p!=NULL && p->num!=i){
		pre=p;
		p=p->next;
	}
	
	int res=-1;
	if(p==NULL){
		if(q.n == q.max){
			pre->pre->next=NULL;
			res=pre->num;
			delete pre;
			
			node *tmp=new node;
			tmp->num=i;
			tmp->pre=NULL;
			tmp->next=q.l;
			
			q.l->pre=tmp;
			q.l=tmp;
		}else{
			node *tmp=new node;
			tmp->num=i;
			tmp->pre=NULL;
			tmp->next=q.l;
			
			if(q.l!=NULL)
				q.l->pre=tmp;
			q.l=tmp;
			q.n++;
		}
	}else{		
		if(p->pre!=NULL){
			p->pre->next=p->next;
		}
		if(p->next!=NULL){
			p->next->pre=p->pre;
		}
		delete p;
		
		node *tmp=new node;
		tmp->num=i;
		tmp->pre=NULL;
		tmp->next=q.l;
		
		q.l->pre=tmp;
		
		q.l=tmp;
	}
	return res;
}

int main(void){
	lru_queue q(0,3);
	print(q);

	assert(-1 == insert(q, 3));
	print(q);

	assert(-1 == insert(q, 5));
	print(q);

	assert(-1 == insert(q, 1));
	print(q);

	assert(-1 == insert(q, 5));
	print(q);

	assert(3 == insert(q, 4));
	print(q);	
	
	assert(-1 == insert(q, 1));
	print(q);
	
	system("pause");
	
	return 0;
}

 

 

分享到:
评论

相关推荐

    LRU Cache的简单C++实现

    什么是 LRU  LRU Cache是一个Cache的置换算法,含义是“近少使用”,把满足“近少使用”的数据从Cache中剔除出去,并且保证Cache中第一个数据是近刚刚访问的,因为这样的数据更有...  由于我只是简单实现一下这个算

    FIFO,LRU,LFU 的三种页面置换算法的C++实现

    OS操作系统上机题 FIFO,LRU,LFU 的三种页面置换算法的C++实现 {3,2,1,3,2,5,2,3,6,2,1,4,2} 为本实验例子的页面走向 copy直接可运行 提供简单可视化菜单 三种页面置换算法可供选择 注释详细,初学者亦可看懂

    操作系统课程设计:用C++实现虚拟内存技术

    用C++实现的虚拟内存技术,控制台程序,简便易懂,旨在模拟操作系统中缺页换页技术,实现fifo和lru两种调页方法

    javalruleetcode-LRU-Cache:LRUCache在C中的实现,LRUCache在C++中的实现,LRUCache在Go中的

    LRU缓存的实现 LRU - 最近最少使用。 完成清单: C C++ 去 JAVA(进行中) C 实现是完整的,并通过 Leetcode 上的 LRU 缓存问题进行了检查。 (C 实现是为了重新熟悉 C 并“回归基础”) C++ 中的实现与 C++ 实现...

    内存管理调度操作系统c++实现

    这次作业的数据结构比较简单,所以没有单独写类,而是把成员和方法放在DLG类中。 首先关于指令访问次序,我写了一个Rand函数,用于生成上下限之间的伪随机数。由于指令不需要重复执行,所以函数里添加了一些判断指令...

    用qt写的带界面的操作系统模拟请求调页(FIFO与LRU)

    第一次用qt写,写的还不是很好,简单实现了带界面的请求调页的存储管理模式

    lrucacheleetcode-leetcode:记录自己LeetCode以及剑指offer刷题过程,主要是Python/Go/C++实现

    lru缓存leetcode 使用 Python 的 Leetcode 解决方案 这个项目记录了我用python解决leetcode的想法,持续更新...... # 标题 解决方案 困难 1 简单的 53 简单的 # 标题 解决方案 困难 3 中等的 5 中等的 # 标题 解决...

    lrucacheleetcode-leetcode-solutions:用C语言编写Leetcode问题解决方案

    C++)中的解决方案。 困难 名称 问题 解决方案 笔记 中等的 字符串到整数 (atoi) 中等的 设计循环队列 简单的 四的力量 难的 正则表达式匹配 仅通过 90% 的测试 简单的 1 位的数量 中等的 实现 Trie(前缀树) 中等...

    vmsimulator:虚拟内存模拟器

    实现的页面替换算法如下: LRU(上次最近使用) 先进先出(先进先出) WSCLOCK(工作设定时钟) 添加新的替换算法非常简单,只需要修改 PageTable 类的 selectEvictPage 函数即可。 switch (this-&gt;strategy) { case...

    leveldb-py:使用 ctypes 的 LevelDB Python 接口

    这个 Python 模块只是简单地使用 ctypes 库到 LevelDB 的 C 接口 - 使其在 Python 实现中更具可移植性,并且更易于安装和分发。 leveldb-py: 支持 get/put/delete(带有标准读/写选项) 支持布隆过滤器 支持 ...

    javalruleetcode-LeetCode:记录我在博士生涯中对LeetCode的训练

    表示我使用其他代码(因为这是一个简单的问题或易于实现(懒惰)或太难(我做不到!'))。 基本上我使用,感谢他的帮助! Insigt文件夹是用来记录我的insight的,如果看不懂代码,请找我对应的insight文件阅读。 ...

    cpp-算法精粹

    这样的一大好处是,读者可以边看书,边实现自己的代码,然后提交到网站上验证自己的想法是否正确。AlgoHub的使命是成为最好的算法学习和交流平台。AlgoHub囊括了 POJ, ZOJ, leetcode, HackerRank 等网站的经典题目...

Global site tag (gtag.js) - Google Analytics