【问题标题】:Calling msync Necessary?调用msync 需要吗?
【发布时间】:2018-03-31 07:40:52
【问题描述】:

在阅读了几篇文章和帖子后: https://lwn.net/Articles/502612/ mmap, msync(MS_ASYNC) and munmap

我有点困惑:
1. msync 是否真的做任何事情(上面的第二个链接包括一个手册页的一部分,表明它在较新的内核中没有;但是,第一个链接说它确实做了一些事情)
2. 如果进程可能被杀死或崩溃(但不是操作系统),是否需要调用 msync。
3.内核多久将映射的内存刷新回“磁盘”?

假设我使用内核 3.10 和 2.6.32。

谢谢。

【问题讨论】:

    标签: c linux-kernel centos7 centos6


    【解决方案1】:

    我们需要小心 - 您的问题标题显示“需要调用 msync? " 但msync() 接受参数使答案复杂化:

    1. 在 Linux 上 msync(MS_ASYNC) 是无操作的。在其他操作系统上,它可能会做一些事情,当然您可以使用其他参数调用msync()
    2. 如果您需要知道同步是否完成并且您愿意阻止直到它完成,您可以使用msync(MS_SYNC)(注意缺少A)。如果just your program crashes the Linux kernel will continue to track dirty filesystem pages.
    3. 这将取决于您的文件系统和 VM 设置。请参阅 https://www.kernel.org/doc/Documentation/sysctl/vm.txt 中的 dirty_* 设置。

    这个问题类似于having linux persist memory changes to disk - 如果您需要知道您的数据何时在稳定媒体上,您将不得不使用阻塞调用(这将触发立即写回)。 Linux 上没有“请在后台开始同步”调用。

    【讨论】:

    • 看起来您无意中复制了您的答案。你介意删除一个(并可能合并任何难以注意到的差异)吗?
    • @maxschlepzig 谢谢你告诉我 - 我已经删除了另一个,因为它们是相同的(我区分了它们)。
    猜你喜欢
    • 2013-01-26
    • 1970-01-01
    • 2010-12-07
    • 2021-08-11
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 2010-12-30
    相关资源
    最近更新 更多