【问题标题】:How the OS knows a page is dirty in mapped memory?操作系统如何知道映射内存中的页面是脏的?
【发布时间】:2017-01-02 21:09:09
【问题描述】:

我的意思是直接在内存中更新数据,而不使用 write()。

在 linux 中,我认为 msync 调用中指定的所有数据都已刷新。

但在 Windows 中,FlushViewOfFile 的文档说“写入脏页”,因此操作系统不知何故知道哪些页面已被更新。

它是如何工作的?我们是否必须使用 WriteFile 来更新映射内存? 如果我们在 linux 中使用 write(),msync 是否只同步脏页?

【问题讨论】:

  • 基本上操作系统使用硬件支持。例如,一个页面最初可以被标记为只读。然后在第一次写入时将生成操作系统处理的页面错误。此时页面可以被标记为脏页并变为可写。

标签: linux windows memory-mapped-files


【解决方案1】:

在大多数(也许是所有)运行 Linux 或 Windows 的现代计算机上,CPU 代表操作系统跟踪脏页。此信息存储在page table

(例如,参见Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 3A 的第 4.8 节和AMD64 Architecture Programmer's Manual, Volume 2 的第 5.4.2 节。)

如果该功能在特定 CPU 上不可用,操作系统可以改为使用页面错误来检测对页面的首次写入,如 datenwolf 的回答中所述。

【讨论】:

    【解决方案2】:

    当刷新页面(即清理它们)时,操作系统会在内部删除“可写”标志。之后,当程序尝试写入此类页面中的内存位置时,将调用内核的页面错误处理程序。然后页面错误处理程序设置页面访问权限以允许实际写入并将页面标记为脏,然后将控制权返回给程序以使其执行实际写入。

    【讨论】:

    • 除非我读错了Intel's documentation(参见第 4.8 节),在现代 Intel CPU 上不需要使用故障处理程序,CPU 可以直接设置脏标志。我想 AMD 也有类似的机制。
    • @HarryJohnston:当然特定的架构会在硬件中实现这样的优化。然而,我的目标是回答一般性的答案——不仅仅是 x86(_64)——而且范围如此之广,以至于可以理解为纯软件操作。
    • 所以您只是提供了一个可以完成的方法的示例? (您的回答对我来说就像在描述它是如何完成的。)
    • @HarryJohnston 这实际上是一个更完整/正确的答案,正是我想要的,谢谢。
    • 我将答案更改为 Harry 的答案,Daten 的答案很好,但有关处理器支持的详细信息非常相关。提及英特尔文档也很有用。
    猜你喜欢
    • 1970-01-01
    • 2020-09-01
    • 2012-05-07
    • 1970-01-01
    • 2012-12-23
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    相关资源
    最近更新 更多