在虚拟内存系统上强制执行介质类型

Enforcing the type of medium on a Virtual Memory system

假设我正在设计一个需要高带宽/低延迟内存传输才能正常运行的软件应用程序。 我的 OS 使用虚拟内存寻址。

有没有办法强制变量(我选择的)位于 DDR 而不是硬盘驱动器?

据我所知,当虚拟内存处理内存转换时,无法强制将某些变量存储在 DDR 与 HDD 中。你可以做的是配置你的操作系统为虚拟内存使用不同类型的辅助存储——比如固态硬盘、HDD 等

您将 虚拟内存交换内存 混为一谈:虚拟内存只是意味着地址 space 其中进程运行是一种抽象,呈现出非常有序的结构,而实际的物理地址space几乎是杂乱无章的被占用。是的,虚拟内存是内存页面交换的一部分,但它不是它的同义词。

实现您想要的效果的一种方法是简单地关闭整个系统的页面交换。也可以针对虚拟地址 space 的特定部分完成。但在我向你解释如何做到这一点之前,我需要告诉你这个:

您从错误的角度来处理这个问题。您称为 DDR 的系统主内存组(这只是一种特定的传输时钟模式,BTW)只是整个内存层次结构中的一个级别。但实际上,与处理器的计算吞吐量相比,即使是系统主内存也是。自计算诞生之日起就是如此。这就是计算机具有高速缓存的原因。少量快速内存。在现代架构中,这些缓存还构成了缓存层次结构层之间的接口。

如果您在现代 CPU 上执行内存操作,此内存操作将命中缓存。如果是读,缓存很热,缓存会投递,否则会升级操作到下一层。写入只会在短期内影响缓存,并且只会通过 cache eviction or explicit memory barriers.

传播到主内存

通常您不想干涉 OS 就虚拟内存管理做出的决定;你几乎无法胜过它。如果您在内存中有大量数据,您会以高频率访问这些数据,那么内存管理会看到这一点,甚至不会考虑调出那部分内存。我想我必须再写一遍,用清晰的词:在每个现代 OS 上,活跃和重复使用的内存区域不会被调出 . 如果发生交换,那么,因为系统 运行 内存不足并试图处理一些东西。 这称为 Thrashing 并且将页面锁定到内存中不会帮助反对它;它所要做的就是迫使 OS 绕过并杀死占用内存的进程(可能是您的进程)以获得呼吸 space.

无论如何,如果您真的想将页面锁定到内存中,请查看 mlock(2) 系统调用。