c++ - 理解 LRU 算法

标签 c++ c algorithm page-replacement

我正在尝试理解 LRU,但它对我来说毫无意义。如果我理解它,那么我编写代码会更容易。有人可以引导我完成这些步骤吗? 喜欢,

  1. 如果您当前所在的引用字符串在数组中,则 你增加到下一个空间吗?
  2. 当您检查缓冲区中是否有内容时,我们是否需要扫描我们所在的位置或整个数组?

我似乎无法跟上。它是如何跟踪最近最少使用的?最近最少使用的不应该是你的索引之后的那个吗?

enter image description here

最佳答案

为每个“项目”存储两个项目。值(当然)和不断增加的整数“时间”。

因此,使用您的数据,假设按顺序访问 1 到 4:

(1, 1), (2, 2), (3, 3), (4, 4)

访问“1”(为清楚起见按时间排序,时间 = 5)

(2, 2), (3, 3), (4, 4), (1, 5)

访问“2”(为清楚起见按时间排序,时间 = 6)

(3, 3), (4, 4), (1, 5), (2, 6)

访问将找不到的“5”,导致缓存未命中。为了找到存储“5”的“空间”,我们需要刷新最近最少使用(LRU)。这意味着删除“3”。请注意时间 = 7。

(4, 4), (1, 5), (2, 6), (5, 7)

访问“1”(为清楚起见按时间排序,时间 = 8)

(4, 4), (2, 6), (5, 7), (1, 8)

访问“2”(为清楚起见按时间排序,时间 = 9)

(4, 4), (5, 7), (1, 8), (2, 9)

访问将找不到的“3”,导致缓存未命中。为了找到存储“3”的“空间”,我们需要刷新最近最少使用(LRU)。这意味着删除“4”。请注意,时间 = 10。

(5, 7), (1, 8), (2, 9), (3, 10)

访问将找不到的“4”,导致缓存未命中。为了找到存储“4”的“空间”,我们需要刷新最近最少使用(LRU)。这意味着删除“5”。请注意时间 = 11。

(1, 8), (2, 9), (3, 10), (4, 11)

访问将找不到的“5”,导致缓存未命中。为了找到存储“5”的“空间”,我们需要刷新最近最少使用(LRU)。这意味着删除“1”。请注意时间 = 12。

(2, 9), (3, 10), (4, 11), (5, 12)

既然您知道如何选择要刷新的项目,并且有一个工作示例,那么在不在数组中四处移动的情况下刷新项目就由您来实现了。

--- 编辑附加说明---

好的,以列表形式显示东西的想法似乎提出了一些问题,所以我将以数组形式显示它

访问 1,缓存未命中,空槽可用,存储在第一个可用槽中

Value   Age
1       1
---     ---
---     ---
---     ---

访问 2,缓存未命中,空槽可用,存储在第一个可用槽中

Value   Age
1       1
2       2
---     ---
---     ---

访问 3,缓存未命中,空槽可用,存储在第一个可用槽中

Value   Age
1       1
2       2
3       3
---     ---

访问 4,缓存未命中,空槽可用,存储在第一个可用槽中

Value   Age
1       1
2       2
3       3
4       4

访问1,缓存命中,更新访问时间

Value   Age
1       5
2       2
3       3
4       4

访问2,缓存命中,更新访问时间

Value   Age
1       5
2       6
3       3
4       4

访问 5,缓存未命中,没有可用的空,丢弃并替换“最近最少使用”

Value   Age
1       5
2       6
5       7
4       4

访问1,缓存命中,更新访问时间

Value   Age
1       8
2       6
5       7
4       4

访问2,缓存命中,更新访问时间

Value   Age
1       8
2       9
5       7
4       4

访问 3,缓存未命中,没有可用的空,丢弃并替换“最近最少使用”

Value   Age
1       8
2       9
5       7
3       10

访问 4,缓存未命中,没有可用的空,丢弃并替换“最近最少使用”

Value   Age
1       8
2       9
4       11
3       10

访问 5,缓存未命中,没有可用的空,丢弃并替换“最近最少使用”

Value   Age
5       12
2       9
4       11
3       10

关于c++ - 理解 LRU 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13337854/

相关文章:

c++ - 虚拟分配地址

c++ - 我如何比较 C/C99 规范和 C++ 规范?

c - 存储指针值

c - 在 C 中不使用对象进行管理 - 而且,为什么我可以在 C 中的函数中的任何位置声明变量?

algorithm - 数组中最长的凸子序列

c++ - 如何在 C++ 中将输入流的前缀复制到不同的流?

c++ - GTest 参数化测试从数组或类似文件中解压值参数

c - 如何监控套接字

python - 生成恰好有 1 个元素与组中其他集合相交的集合的算法

algorithm - SPOJ CCHESS(昂贵的国际象棋)