内存映射文件和“软”页面错误。不可避免的?

时间:2010-03-25 07:08:10

标签: memory-mapped-files page-fault pagefile

我有两个在Windows XP下运行的应用程序(进程),它们通过内存映射文件共享数据。尽管我努力消除每次迭代内存分配,但每次数据传输仍然会出现大约10个软页错误。我已经尝试过CreateFileMapping()和CreateFileView()中的每个标志,但它仍然会发生。我开始怀疑它是否只是内存映射文件的工作方式。

如果有人知道内存映射文件背后的O / S实现细节,我将赞赏以下理论的评论:如果两个进程共享一个内存映射文件,一个进程写入它而另一个进程读取它,那么O / S将写入的页面标记为无效。当另一个进程读取现在属于无效页面的内存区域时,这会导致软页面错误(按设计),并且O / S知道重新加载无效页面。而且,软页面错误的数量因此与数据写入的大小成正比。

我的实验似乎证实了上述理论。当我共享数据时,我写了一个连续的数据块。换句话说,每次都会覆盖整个共享内存区域。如果我使块更大,软页面错误的数量也会相应增加。因此,如果我的理论是正确的,那么除了不使用内存映射文件之外,我无法做任何事情来消除软页面错误,因为这是它们的工作方式(使用软页面错误来维护页面一致性)。具有讽刺意味的是,我选择使用内存映射文件而不是TCP套接字连接,因为我认为它会更有效。

注意,如果软页面错误无害,请注意。我听说如果数量过多,系统的性能可能会受损。如果软页面故障本质上没有明显的危害,那么如果有人对每秒的数量是“过度”有任何指导,我想听听。

感谢。

0 个答案:

没有答案