Windows/Linuxx64 是如何判断某个内存页最后一次被访问的时间?

How does Windows/Linux x64 determine the last time a memory page was accessed?

当虚拟内存系统决定将内存页面逐出到磁盘时,有时会提到该内存页面的最后一次访问时间用于帮助决定逐出哪个页面。但是用什么机制来跟踪最后一次访问内存页的时间呢?

我相信 TLB 只在其当前页面集而不是所有页面上存储信息。还是仅仅是 TLB 中不存在的任何东西都可以根据该标准进行驱逐?

页框回收算法(PFRA) Linux 内核实际上相当复杂,它使用多种启发式方法来决定要驱逐哪个页面。实际的决定是基于很多因素,但以下两个因素很突出。

1.最近最少使用 (LRU) 列表

Linux 将内存分成不同的 memory zones,每个区域都有一个区域描述符,这个描述符和其他东西一起存储对 两个非常重要列表的引用即活跃和不活跃.

活动列表包括最近访问过的页面,而不活动列表包括一段时间未访问的页面。根据访问模式,不同的页面框架从一个列表移动到另一个列表并移出列表。

2。页面描述符标志

页面描述符中的以下两个标志允许内核识别给定页面是否包含在上述列表之一中。

PG_lru - The page is in the active or inactive page list

PG_active -The page is in the active page list

Understanding the Linux Kernel 在描述 PFRA 实际如何使用上述信息时声明如下。

The main idea behind the LRU algorithm is to associate a counter storing the age of the page with each page in RAM—that is, the interval of time elapsed since the last access to the page. This counter allows the PFRA to reclaim only the oldest page of any process. Some computer platforms provide sophisticated support for LRU algorithms;† unfortunately, 80 × 86 processors do not offer such a hardware feature, thus the Linux kernel cannot rely on a page counter that keeps track of the age of every page. To cope with this restriction, Linux takes advantage of the Accessed bit included in each Page Table entry, which is automatically set by the hardware when the page is accessed; moreover, the age of a page is represented by the position of the page descriptor in one of two different “The Least Recently Used (LRU) Lists”.