【问题标题】:how to make sure an allocate buffer is in memory如何确保分配缓冲区在内存中
【发布时间】:2015-11-18 01:20:59
【问题描述】:

假设我在 C 中使用 mmap 分配了一个缓冲区。我可以使用任何 linux 操作来确保该缓冲区已被分页到内存中,并且页表中有该缓冲区的条目。我想要这个,因为我看到我的应用程序出现了一些页面错误,即使我的内存比应用程序要求大得多。我正在使用 CentOS 7。

【问题讨论】:

  • 你可以每页写一个字节吗?
  • “我想要这个,因为我看到一些页面错误”不是一个很好的理由......
  • 您真的在问如何固定内存以使其永远不会被分页吗?因为即使您导致内存被分页,也不能保证它不会在任何给定时间被分页 - 除非您明确固定它。如果您想这样做,请查看mlock

标签: c linux memory


【解决方案1】:

通过MAP_POPULATE as a flag to the mmap call。这正是它的用途。它不能保证页面稍后不会在内存压力下分页,但如果可能,它会在mmap 时间分页。引用手册页:

MAP_POPULATE(自 Linux 2.5.46 起)

为映射填充(预设)页表。对于文件映射,这会导致文件预读。以后对映射的访问不会被页面错误阻塞。 MAP_POPULATE 自 Linux 2.6.23 起仅支持私有映射。

如果您真的想强制将内容锁定到内存中,您还可以尝试传递MAP_LOCKED 标志(mlocks 防止内存页出),但这很危险,因为它阻碍了内存管理并且作为因此,mlock-ed 页面的上限通常非常低,以避免引起问题。

【讨论】:

    猜你喜欢
    • 2017-04-17
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多