移动到64位操作系统时,共享内存性能降低

时间:2010-09-03 15:36:53

标签: c++ windows winapi ipc shared-memory

我遇到了在64位Windows上运行的32位遗留应用程序的问题。有问题的应用程序使用CreateFileMapping来创建共享内存。当在64位Windows上运行时,任何从另一个进程访问此共享内存的尝试大约需要1秒。使用页面保护标志创建共享内存:

flProtect = PAGE_READONLY | SEC_NOCACHE | SEC_COMMIT;

使用以下命令创建相同的内存时:

flProtect = PAGE_READONLY | SEC_COMMIT;

问题消失了。目前这个工作是可以接受的,但我们确实有一些设备需要设置SEC_NOCACHE标志。

有人可以告诉我为什么SEC_NOCACHE会影响这种情况下的表现吗?

更新:似乎只写入此缓冲区已增加到1000毫秒。阅读似乎没有受到影响。我们在这个时候写了大约5MB的缓冲区。

Update2:此软件在许多系统上使用,其中一个系统具有需要使用此标志的物理设备。我们目前仅限于在32位窗口中使用此设备运行机器。

3 个答案:

答案 0 :(得分:3)

以下是Microsoft对该标志的评论:

  

SEC_NOCACHE标志适用于   需要各种各样的架构   锁定结构位于   永远不会进入的内存   CPU缓存。在x86和MIPS上   机器,使用这个标志只会减慢   因为性能下降了   硬件使缓存保持一致。

不幸的是,他们没有量化减速的数量。

答案 1 :(得分:1)

您正在使用该标志禁用文件系统缓存。是的,这会产生巨大的差异,它会强制操作系统使用磁盘驱动程序并直接读取扇区。无法读取和缓存圆柱体,禁用优化,使读取轨道不必如此便宜地移动读取头。并且禁用了延迟回写,这是一种使磁盘写入即时显示的优化。

答案 2 :(得分:-1)

我猜,因为内存必须从64位重新映射到32位,所以提供“反弹”缓冲区变得很昂贵。启用缓存后,此反弹缓冲区是隐式的,操作系统可能无需连续更新内存部分。