2016年头条校招笔试(LRU算法)

题目

操做系统中可使用 LRU(Least Recently Used)内存淘汰旧数据的策略,若是内存须要加载新数据但空间不足,则会按照最近访问时间进行排序,并将最老的数据淘汰。假设如今内存空间大小为 5,本来内存中没有数据,对内存中数据的访问顺序以下:
1, 2, 5, 3, 4, 6,1, 4, 3, 6, 7, 8, 3, 9
问访问过程当中发生缺页的次数是多少次?java

A. 缺页次数:4
B. 缺页次数:10
C. 缺页次数:5
D. 缺页次数:9git

知识点

要解决上面的题目,首先咱们先要了解什么是缺页github

缺页中断算法

在请求分页系统中,能够经过查询页表中的状态位来肯定所要访问的页面是否存在于内存中。每当所要访问的页面不在内存时,会产生一次缺页中断,此时操做系统会根据页表中的外存地址在外存中找到所缺的一页,将其调入内存。缓存

缺页自己是一种中断,与通常的中断同样,须要通过4个处理步骤:
1. 保护CPU现场
2. 分析中断缘由
3. 转入缺页中断处理程序进行处理
4. 恢复CPU现场,继续执行ui

可是缺页中断时因为所要访问的页面不存在与内存时,有硬件所产生的一种特殊的中断,所以,与通常的中断存在区别:spa

  1. 在指令执行期间产生和处理缺页中断信号
  2. 一条指令在执行期间,可能产生屡次缺页中断
  3. 缺页中断返回时,执行产生中断的那一条指令,而通常的中断返回时,执行下一条指令

还有一点就是咱们必需了解 LRU 算法,这个算法使用频率仍是至关的高的,所以咱们也不陌生。操作系统

LRU.net

LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“若是数据最近被访问过,那么未来被访问的概率也更高”。排序

LRU 最多见的实现是使用一个链表保存缓存数据,详细算法实现以下:

LRU算法.png

  1. 新数据插入到链表头部;
  2. 每当缓存命中(即缓存数据被访问),则将数据移到链表头部;
  3. 当链表满的时候,将链表尾部的数据丢弃。

解题

这道题目答案选择 B ,缺页数为 10,我把解题思路弄了一个流程图出来,能够看下。

2016年头条校招笔试题:LRU算法.png

最后用 Java 来模拟一下:

Github:LRU.java

LRU队列.png

LRU解题.png

相关文章
相关标签/搜索