【问题标题】:Is it possible to control page-out and page-in by user programming? If yes then how?是否可以通过用户编程来控制页面输出和页面输入?如果是,那怎么办?
【发布时间】:2016-04-26 06:28:41
【问题描述】:

我的问题如下:

mmap(内存映射)一个文件到虚拟内存空间。 当我第一次使用 pointer 访问文件的第一个字节时,操作系统会尝试访问内存中的数据,但它会失败并引发 page fault,因为数据现在不存在于内存中。因此操作系统会将数据从磁盘交换到内存中。最后我的访问将成功。

(问题来了) 当我修改数据(内存中)并写回磁盘文件时,我如何才能释放物理内存以供其他使用,但保留虚拟内存以根据需要将数据取回内存? 这听起来像是操作系统知道内存耗尽的页面出和页面入行为,它将LRU(或类似的东西)内存页面交换到磁盘(交换文件)并为其他进程释放物理内存,并且根据需要将被驱逐的数据取回内存。但是这个机制是由操作系统控制的。

由于某些原因,我需要自己控制页面出和页面入行为。那我该怎么办?破解内核?

【问题讨论】:

  • 为什么你想这样做?你试图解决的实际问题是什么?用例是什么?
  • @JoachimPileborg 我正在研究 H-Store 团队提出的“反缓存”方法。 “反缓存”与 OS 中的 VMM 类似。他们都想处理数据大小远大于内存大小的情况。我想实现一个用户空间 VMM 进行比较。

标签: c memory memory-management linux-kernel


【解决方案1】:

您可以使用madvise 系统调用。它的行为受advice 参数的影响;建议的选择有很多,应根据您的应用程序的具体情况选择最佳选择。

标志MADV_DONTNEED 表示应该无条件释放给定范围的物理后备帧(即换页)。另外:

MADV_DONTNEED 操作成功后,语义 指定区域的内存访问发生变化:后续 范围内页面的访问将成功,但会导致 在从最新的重新填充内存内容中 底层映射文件的内容(对于共享文件 映射、共享匿名映射和基于 shmem 技术,如 System V 共享内存段)或零 匿名私有映射的按需填充页面。

如果您绝对确定在您再次访问同一职位之前会非常很长时间,这可能会很有用。

但是,可能没有必要强制内核实际换页;相反,如果您按顺序访问映射,则另一种可能性是使用madviseMADV_SEQUENTIAL 告诉内核您将主要按顺序访问内存映射:

期望页面引用按顺序排列。 (因此,给定范围内的页面可以被积极地提前读取,并且可能在被访问后很快被释放。)

MADV_RANDOM

期望页面引用以随机顺序排列。 (因此,预读可能不如平时有用。)

这些不像显式调用MADV_DONTNEED 来换页那样激进。 (当然你也可以把这些和MADV_DONTNEED结合起来)


在最近的内核版本中,还有the MADV_FREE flag 会延迟释放页框;如果有足够的内存可用,它们将保持映射,但如果内存压力增加,它们会被内核回收。

【讨论】:

  • 谢谢。我已经阅读了一些关于madvise 的资料。一个新问题是,在使用madvise系统调用后,物理内存范围内的新数据内容会被刷新回映射文件,那么物理后备帧会立即被释放吗?
  • @Gemsnail 不保证 ,AFAIK。但这无关紧要。总而言之,内核还在其块缓存层中缓存块设备内容,您不会真正刷新它。
  • 实际上我使用mmap 来分配带有标志MAP_ANONYMOUS 的大内存。操作大量内存数据命令后(物理内存快用完),如果有新数据到来,我会将 LRU 数据(在内存中,但映射到特定范围的虚拟内存)写回磁盘并调用madvise 在特定的虚拟内存范围内。然后我将新数据添加到内存中,系统是否会先使用madvised 内存来存储新数据,而不是通过操作系统交换来提供可用内存空间?
  • @Gemsnail 如果您说MADV_DONTNEED,那么操作系统很可能会考虑使用这些页面。但是,除非您锁定 MAP_ANONYMOUS,否则操作系统也可以 LRU-page-out 这个区域。
【解决方案2】:

您可以查看 mlock+munlock 来锁定/解锁页面。这将使您能够控制被换出的页面。

您需要有 CAP_IPC_LOCK 功能才能执行此操作。

【讨论】:

    猜你喜欢
    • 2011-12-04
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多