操作系统如何知道页面在映射内存中是否脏?

时间:2017-01-02 21:09:10

标签: linux windows memory-mapped-files

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

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

但是在Windows中,FlushViewOfFile的文档说“写脏页”,所以操作系统知道哪些页面已被更新。

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

2 个答案:

答案 0 :(得分:5)

在运行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的回答中所述。

答案 1 :(得分:3)

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