迁移到64位操作系统时,共享内存性能变慢

我在64位窗口上运行的32位旧版应用程序存在问题。 有问题的应用程序使用CreateFileMapping创build共享内存。 在64位Windows上运行时,任何从另一个进程访问共享内存的尝试都需要大约1秒的时间。 共享内存使用页面保护标志创build:

flProtect = PAGE_READONLY | SEC_NOCACHE | SEC_COMMIT; 

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

 flProtect = PAGE_READONLY | SEC_COMMIT; 

问题就消失了。 目前这种解决方法是可以接受的,但是我们确实有一些设备需要设置SEC_NOCACHE标志。

有人能够启发我为什么SEC_NOCACHE会影响这种情况下的性能吗?

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

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

您正在使用该标志禁用文件系统缓存。 是的,这有很大的不同,它迫使操作系统与磁盘驱动程序一起工作,直接读取扇区。 无法读取和缓存气瓶,禁用优化,使读取轨道,而不必移动读取头如此便宜。 懒惰回写被禁用,使磁盘写入瞬间出现的优化。

以下是微软对这个标志的评价:

SEC_NOCACHE标志旨在用于需要将各种锁定结构放置在内存中的架构,而这些架构并不会被提取到CPU缓存中。 在x86和MIPS机器上,使用此标志只会降低性能,因为硬件会使缓存保持一致。

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

我猜想,因为内存必须从64位重新映射到32位,提供“反弹”缓冲区变得非常昂贵。 启用缓存时,此反弹缓冲区是隐含的,操作系统可能会绕过连续更新内存部分的需要。