如果进程崩溃,mmap文件会发生什么?

19

这可能在OSX、Windows和Linux之间有不同的答案。

如果进程崩溃,假设它没有崩溃,那么mmap中的dirty page会被操作系统丢弃还是最终写出?

如果另一个进程已经映射了它们,那么它们将持久存在,但如果崩溃的进程是唯一的进程呢?我对文档中技术承诺以及实现实际效果都感兴趣。 如果你只知道一个操作系统,请针对该操作系统回复。


1
相关链接:https://dev59.com/aW025IYBdhLWcg3wnXWf#6219962 - Brian Cain
1
只要操作系统本身不崩溃,就应该被回收,因为内核肯定会跟踪进程使用的所有段的位置和大小,无论它是正常退出还是被信号杀死等。 - Eric Z
@EricZ 是的,它肯定会被重新获取,但我的问题是支持文件的脏页面会发生什么?它们会写入文件,丢弃还是未定义? - Eloff
1
@Eloff,即使进程崩溃,操作系统也应该有机会提交脏页以便回收内存。我建议您编写一些代码来验证它,方法是设置足够长的提交间隔并在其中崩溃您的进程。 - Eric Z
2
@EricZ - 我猜他想知道是否有人有支持文档的答案。即使操作系统没有提供保证,这样的测试也可能会返回错误的结果。 - Brett Hale
显示剩余3条评论
1个回答

2
对于Windows操作系统,我认为毫无疑问的是,脏页面最终会被写入磁盘。文档明确说明取消映射文件视图不会刷新数据,但与任何缓存一样,数据将懒惰地写入磁盘。FlushViewOfFile强制进行立即写入,但调用它是可选的。
可能有相关的例外情况。保证两个文件的映射视图保持协同,即使其中一个程序异常终止,但这种协同性不适用于远程文件或同时使用ReadFile/WriteFile访问的文件。
文档没有提供明确的答案,但也没有给出任何暗示相反的可能是真的。我会依靠测试来确认。
正如链接中指出的那样,如果存在机器故障的风险,确保页面在写入时被刷新可能是一个好主意。内核刷新缓存可能会延迟很长时间。

1
我发现了这个讨论(和测试结果),似乎证实了对于Windows系统而言:https://groups.google.com/forum/m/#!topic/microsoft.public.win32.programmer.kernel/_PvdXW2xSEU - Eloff
1
此外,这篇文章提供了内核写出脏页面的良好理由:http://blogs.msdn.com/b/oldnewthing/archive/2010/04/28/10003540.aspx - Eloff
@Eloff:MSDN 链接恰好反映了我的思维过程(但更加优美)。Google Groups 链接不太有帮助,似乎只适用于整个系统在清除缓存之前崩溃的情况。 - david.pfx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接