我遇到了在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位窗口中使用此设备运行机器。
答案 0 :(得分:3)
以下是Microsoft对该标志的评论:
SEC_NOCACHE标志适用于 需要各种各样的架构 锁定结构位于 永远不会进入的内存 CPU缓存。在x86和MIPS上 机器,使用这个标志只会减慢 因为性能下降了 硬件使缓存保持一致。
不幸的是,他们没有量化减速的数量。
答案 1 :(得分:1)
您正在使用该标志禁用文件系统缓存。是的,这会产生巨大的差异,它会强制操作系统使用磁盘驱动程序并直接读取扇区。无法读取和缓存圆柱体,禁用优化,使读取轨道不必如此便宜地移动读取头。并且禁用了延迟回写,这是一种使磁盘写入即时显示的优化。
答案 2 :(得分:-1)
我猜,因为内存必须从64位重新映射到32位,所以提供“反弹”缓冲区变得很昂贵。启用缓存后,此反弹缓冲区是隐式的,操作系统可能无需连续更新内存部分。