未验证 提交 65132f8d 编写于 作者: L liu-jianhao 提交者: GitHub

LRU

上级 1170bde1
......@@ -28,3 +28,21 @@
### 实验中的难点
1. 要理解全局的`depth`和局部(桶)的`depth`的作用,用`HashKey`找位置时要仔细
2. 实验中最难的操作就是插入了,因为要考虑到当某个桶里的数据满的时候,就要分裂,即增加局部的`depth`,然后重新分配桶的`map`,分裂后桶的数目要加倍,全局的`depth`要一直大于等于局部的`depth`
## LRU页面替换政策
### 简介
内存管理的一种页面置换算法,对于在内存中但又不用的数据块(内存块)叫做LRU,操作系统会根据哪些数据属于LRU而将其移出内存而腾出空间来加载另外的数据。
LRU是Least Recently Used的缩写,即最近最少使用,常用于页面置换算法,是为虚拟页式存储管理服务的。
### 实验中的难点
1. 要选好数据结构,我选择的数据结构是哈希表,即STL中的`unordered_map`,键是页面,值是一个节点,节点我用一个双向链表连接起来
2. 剩下的工作就很简单了
### Q&A
#### 为什么要用哈希表?
虽然说实现LRU算法虽简单的数据结构是队列,但当你插入一个页面时,如果该页面是之前就已经在队列中的,那么就要找出之前已经存在队列中的那个页面,然后删除,在重新插入在队列尾部,找到并删除这个操作对于队列来说明显不合适,哈希表能快速查找并删除
#### 为什么节点要用双向链表连接?
既然已经决定了要用双向链表,那么怎么知道那个页面是最近未使用呢?那必定要用一个类似队列的东西,选择链表最为合适,然后为什么要用双向呢?是由于实验要求要支持`Erase`操作,即指定某个页面并删除,虽然用单向链表能找到要删除的页面,但是要删除一条链表中的某个节点,必须要知道前后的节点才能删除,因此要保存指向前一个节点的指针
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册