我有两个在 Windows XP 下运行的应用程序(进程),它们通过内存映射文件共享数据。尽管我尽一切努力消除每次迭代的内存分配,但每次数据传输我仍然会遇到大约 10 个软页面错误。我已经尝试了 CreateFileMapping() 和 CreateFileView() 中的每个标志,它仍然会发生。我开始怀疑这是否只是内存映射文件的工作方式。
如果有人知道内存映射文件背后的 O/S 实现细节,我将不胜感激对以下理论的评论:如果两个进程共享一个内存映射文件并且一个进程写入它而另一个进程读取它,那么 O/S 标记页面写入无效。当另一个进程去读取现在属于无效页面的内存区域时,这会导致软页面错误(通过设计),并且 O/S 知道重新加载无效页面。此外,软页面错误的数量因此与数据写入的大小成正比。
我的实验似乎证实了上述理论。当我共享数据时,我会写入一个连续的数据块。换句话说,每次都会覆盖整个共享内存区域。如果我使块更大,软页面错误的数量会相应增加。因此,如果我的理论是正确的,那么除了不使用内存映射文件之外,我无法消除软页面错误,因为它们就是这样工作的(使用软页面错误来保持页面一致性)。具有讽刺意味的是,我选择使用内存映射文件而不是 TCP 套接字连接,因为我认为它会更有效。
注意,如果软页面错误是无害的,请注意。我听说在某些时候如果数量过多,系统的性能可能会受到损害。如果软页面错误本质上并没有太大的危害,那么如果有人对每秒多少个“过多”有任何指导方针,我想听听。
谢谢。