我在 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 位 Windows 中运行带有此设备的机器。
最佳答案
这就是 Microsoft不得不说一下那个标志:
The SEC_NOCACHE flag is intended for architectures that require various locking structures to be located in memory that is not ever fetched into the CPU cache. On x86 and MIPS machines, use of this flag just slows down the performance because the hardware keeps the cache coherent.
不幸的是,他们没有量化减慢的程度。
关于c++ - 迁移到 64 位操作系统时共享内存性能降低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3637318/