前言
上个星期跟几位朋友一起开了个公众号 “ 于你供读 ”,每日推送Android,iOS,UI,前端,产品和生活情感的文章。好了,入正题,这个星期的面试题是 今日头条的面试题。
题目
操作系统中可以使用 LRU(Least Recently Used)内存淘汰旧数据的策略,如果内存需要加载新数据但空间不足,则会按照最近访问时间进行排序,并将最老的数据淘汰。假设现在内存空间大小为 5,原本内存中没有数据,对内存中数据的访问顺序如下:
1, 2, 5, 3, 4, 6,1, 4, 3, 6, 7, 8, 3, 9
问访问过程中发生缺页的次数是多少次?A. 缺页次数:4
B. 缺页次数:10
C. 缺页次数:5
D. 缺页次数:9
知识点
要解决上面的题目,首先我们先要了解什么是缺页
缺页中断
在请求分页系统中,可以通过查询页表中的状态位来确定所要访问的页面是否存在于内存中。每当所要访问的页面不在内存时,会产生一次缺页中断,此时操作系统会根据页表中的外存地址在外存中找到所缺的一页,将其调入内存。
缺页本身是一种中断,与一般的中断一样,需要经过4个处理步骤:
- ?;PU现场
- 分析中断原因
- 转入缺页中断处理程序进行处理
- 恢复CPU现场,继续执行
但是缺页中断时由于所要访问的页面不存在与内存时,有硬件所产生的一种特殊的中断,因此,与一般的中断存在区别:
- 在指令执行期间产生和处理缺页中断信号
- 一条指令在执行期间,可能产生多次缺页中断
- 缺页中断返回时,执行产生中断的那一条指令,而一般的中断返回时,执行下一条指令
还有一点就是我们必需了解 LRU 算法,这个算法使用频率还是相当的高的,因此我们也不陌生。
LRU
LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。
LRU 最常见的实现是使用一个链表保存缓存数据,详细算法实现如下:
- 新数据插入到链表头部;
- 每当缓存命中(即缓存数据被访问),则将数据移到链表头部;
- 当链表满的时候,将链表尾部的数据丢弃。
解题
这道题目答案选择 B ,缺页数为 10,我把解题思路弄了一个流程图出来,可以看下。
最后用 JAVA 来模拟一下:
Github:LRU.java