Memory management 如果在CPU中处理相应的内存请求,如何保证内存页不会被逐出?

Memory management 如果在CPU中处理相应的内存请求,如何保证内存页不会被逐出?,memory-management,operating-system,cpu,Memory Management,Operating System,Cpu,通常,在CPU中,内存请求通过内存层次结构传递 但是,当操作系统或其他东西决定从内存中退出页面时 与仍在CPU中处理的内存请求相关的页面不得从内存中逐出 如何保证这些页面不会从内存中移出 在CPU中处理请求时,是否有类似于页面引用计数器的功能来防止页面被逐出?从Linux的角度来看,有一些机制可以帮助确保安全地处理此场景 1)Linux处理页面替换策略的方式。Linux使用多个LRU列表作为其页面缓存。对于文件备份页面和匿名页面,每个页面都有各自的活动和非活动页面列表。使用页面时,CPU将通过相

通常,在CPU中,内存请求通过内存层次结构传递

但是,当操作系统或其他东西决定从内存中退出页面时

与仍在CPU中处理的内存请求相关的页面不得从内存中逐出

如何保证这些页面不会从内存中移出


在CPU中处理请求时,是否有类似于页面引用计数器的功能来防止页面被逐出?

从Linux的角度来看,有一些机制可以帮助确保安全地处理此场景

1)Linux处理页面替换策略的方式。Linux使用多个LRU列表作为其页面缓存。对于文件备份页面和匿名页面,每个页面都有各自的活动和非活动页面列表。使用页面时,CPU将通过相应页面表条目(
pte
)中的its将页面标记为已使用。当这种情况发生时,Linux可以将页面放入活动列表中。一段时间后,页面替换处理程序尝试将页面踢出,但页面必须经过几轮和几步才能被踢出。它的访问位必须关闭,然后必须将其置于非活动列表中。每次处理程序执行其中一个步骤时,它都会让页面处于活动状态,并移动到列表的其余部分,寻找要逐出的页面,也许直到它再次到达我们的页面为止。由于这些步骤中的每一步都涉及到通过LRU列表的多次迭代,因此当处理程序返回到我们的页面将其逐出时,可能使我们的页面最初处于活动状态的任何CPU操作都已结束。另一方面,如果CPU在页面处于非活动列表等待退出时再次访问该页面,则其访问位将打开,并且可以再次将其置于活动列表中。这里的关键是Linux通常会尝试在非活动列表中保留一定数量的页面,以便在退出时只选择非活动页面。这是一种防止出现活动页面被踢出的情况的方法

2)交换。假设您的场景确实发生了。您描述逐出的方式似乎使被逐出的活动内存是一个致命错误。实际上,当一个页面被逐出时,它要么是一个写回磁盘的文件备份页面,要么是一个写回交换空间的匿名页面(假设您有交换空间)。因此,除非发生任何电源故障,否则在逐出过程中不会丢失内存。此外,保存与此页对应的数据的任何缓存项都将无效。因此,当CPU尝试读/写页面时,它将看到缓存条目无效,从而引发页面错误。与任何其他页面错误一样,页面将返回内存,并通过缓存/内存层次结构向上。(页面错误期间CPU行为的一种分析)


3)页面锁定。如果您确实需要锁定页面,Linux有一种方法可以做到这一点。在Linux内核中,有一些在I/O操作或页面/页面表操作期间使用的页面锁定函数(如)。还可以从用户空间调用,将特定内存锁定到RAM中。请注意,mlock并不保证内存保持在相同的物理地址中,只保证它保持在RAM()中。

这是否回答了您的问题@wxz感谢您的回复,但链接与我的问题无关。我的问题与缓存刷新或缓存一致性不同。