FIFO(First in First out)算法 LRU(Least Recently Used)最久未使用淘汰算法

     09年9月28日,参加东软高端就业笔试,专业笔试关于缓存调度算法,由于事先没有准备,仓惶作答,漏洞百出,今作以总结,以备后用。

 

FIFO

package Fifo;
//FIFO(Firt in First out)算法
class Page {
	private int num;
	public Page(int num) {
		this.num = num;
	}
	public int getNum() {
		return num;
	}
}
class LinkNode {
	Page page;
	LinkNode next;
}
public class MyFiFo {
	LinkNode first;
	LinkNode last;
	int maxSize = 10; // 缓存的尺寸
	int currentSize = 0;

	public MyFiFo(int maxSize) {
		this.maxSize = maxSize;
	}

	public void changePage(Page p) {// FIFO 算法,每次读取新页都重新调整缓存结构
		LinkNode newItem = new LinkNode();
		newItem.page = p;
		newItem.next = null;
		if (first == null) {
			first = newItem;
			last = first;
			currentSize++;
		} else {
			LinkNode current = first;
			boolean isIn = false;
			for (int i = 0; i < currentSize; i++) {// 查看所请求的页面是否在缓存中
				if (current.page.getNum() == p.getNum()) {
					isIn = true;
					break;
				}
				current = current.next;
			}
			if (!isIn) { // 如果所请求页面不在缓存中,向缓存中添加数据
				// 从数据库里读出数据放到newItem上
				if (currentSize < maxSize) { // 缓存未满时,添加页面
					last.next = newItem;
					last = newItem;
					currentSize++;
				}else { // 缓存已满,先删除头部,再向尾部添加
					first = first.next;
					last.next = newItem;
					last = newItem;
				}
			} 
		}
		print();
	}

	public void print() {
		LinkNode current = first;
		System.out.println();
		while (current != null) {
			System.out.print(current.page.getNum() + ",");
			current = current.next;
		}
	}

	public static void main(String[] args) {
		MyFiFo fifo = new MyFiFo(10);
		int arr[] = { 2,2, 5,5, 3, 7, 2, 5, 4, 7, 4, 6, 9, 10, 3, 53, 45, 56,56, 5,67,
				89, 23 };
		for (int i = 0; i < arr.length; i++) {
			fifo.changePage(new Page(arr[i]));
		}
	}
}

 

图解:

FIFO

图片来源: 

 

LRU

package Fifo;

//LRU最久未使用淘汰算法
public class MyLRU {
	LinkNode first;
	LinkNode last;
	int maxSize = 10; // 缓存的尺寸
	int currentSize = 0;
	public MyLRU(int maxSize) {
		this.maxSize = maxSize;
	}
	public void changePage(Page p) {// LRU 算法,每次读取新页都重新调整缓存结构
		LinkNode newItem = new LinkNode();
		newItem.page = p;
		newItem.next = null;

		if (first == null) {
			first = newItem;
			last = first;
			currentSize++;
		} else {
			LinkNode current = first;
			LinkNode trailCurrent = first;
			for (int i = 0; i < currentSize; i++) {// 先判断缓存中有没有该页,有则删除
				if (current.page.getNum() == p.getNum()) {
					if (current == first) {		//有该页且在队头
						first = first.next;
						if (first == null)		//删除后,如果缓存为空,重设last
							last = first;
					} else {
						trailCurrent.next = current.next;
						if (current == last) {	//如果删除的是最后一个,重设last指针
							last = trailCurrent;
						}
					}
					currentSize--;
					break;
				}
				trailCurrent = current;
				current = current.next;
			}
			//删除完后,在队尾添加
			if (currentSize < maxSize) {//缓存未满时的插入
				if (first == null) {	//如果缓存为空,添加并重设first、last指针
					first = newItem;
					last = first;
				} else {				//如果缓存不为空添加到尾部
					last.next = newItem;
					last = newItem;
				}
				currentSize++;
			} else {					//缓存已满时,先删除队头,再向队尾插入
				first = first.next;
				currentSize--;
				last.next = newItem;
				last = newItem;
				currentSize++;
			}
		}
		print();
	}
	public void print() {
		LinkNode current = first;
		System.out.println();
		while (current != null) {
			System.out.print(current.page.getNum() + ",");
			current = current.next;
		}
	}

	public static void main(String[] args) {
		MyLRU fifo = new MyLRU(10);
		int arr[] = { 2, 2, 5, 3, 3, 7, 2, 5, 4, 7, 7, 4, 6, 9, 10, 3, 53, 45,
				56, 67, 89, 23, 53 };
		for (int i = 0; i < arr.length; i++) {
			fifo.changePage(new Page(arr[i]));
		}
	}
}

 

图解:

LRU

图片来源:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
虚拟存储区是计算机中一个用于管理内存的抽象概念,它将磁盘上的空间视为可以被分割成大小相等的页面(或称作块或帧),并将内存空间视为和磁盘空间同样大小的页面集合。当程序需要某个页面时,虚拟存储区会将其从磁盘上读取到内存中,当内存中的页面不够用时,虚拟存储区会根据一定的算法将其中一些页面从内存中置换出来到磁盘上,以便为新的页面腾出空间。 内存工作区是指计算机内存中用于存储程序运行时数据的一部分空间,在虚拟存储区中被分割成大小相等的页面(或称作块或帧),并与磁盘上的页面相对应。 在常用页面置换算法中,FIFO算法LRU算法和OPT算法都是根据不同的策略来选择要置换的页面。 1. 先进先出(FIFO)算法 FIFO算法是最简单的页面置换算法,它总是选择最早进入内存的页面进行置换。具体来说,FIFO算法维护一个队列,每次需要置换时,选择队列中最先进入的页面进行置换。当新的页面需要进入内存时,将其加入队列的末尾。 FIFO算法的实现比较简单,但是它有一个明显的缺点,就是无法考虑页面的使用频率和重要性。如果一个页面在进入内存后长时间没有被访问,但是由于它是先进入内存的,所以可能一直留在内存中,从而导致其他更加重要的页面无法进入内存,影响程序的性能。 2. 最近最久使用(LRU)算法 LRU算法是一种比较常用的页面置换算法,它考虑到了页面的使用频率和重要性。具体来说,LRU算法维护一个页面使用历史记录,每次需要置换时,选择最近最久使用的页面进行置换。当新的页面需要进入内存时,将其加入页面使用历史记录的末尾。 LRU算法的实现比较复杂,需要维护一个记录页面使用历史的数据结构,如双向链表或者数组。但是它能够比较好地反应页面的使用情况,因此通常能够取得比FIFO算法更好的置换效果。 3. 最优(OPT)算法 最优算法是一种理论上的最佳页面置换算法,它总是选择来最长时间内不会被访问的页面进行置换。具体来说,最优算法需要预测来的页面访问情况,选择能够使得来最长时间不会被访问的页面进行置换。 最优算法是一种理论上的最佳算法,因为它能够最大程度地保留程序中重要的页面,从而使得程序的性能最优。但是实际上,最优算法需要预测来的页面访问情况,这是很难做到的。因此,在实际应用中,最优算法很少被使用,常用的算法FIFO算法LRU算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值