【发布时间】:2016-04-02 14:41:54
【问题描述】:
我正在 Windows 7 下开发基于 C++ 的系统。我处理部署在不同 CPU 上并相互通信的一堆进程。由于通信对时间至关重要(实际上我处理的是一个实时系统,我知道 Win7 不是最适合我的操作系统..)我需要它尽可能快。我在 Win7(管道、MemMappedFiles、套接字)下阅读了有关 IPC 的信息。最快的方法似乎是内存映射文件 (Fastest IPC method on Windows 7)。但是,我不喜欢 Win7 交换器在后台运行,将数据从 RAM 来回复制到 HD 的想法。此外,每当我访问虚拟内存地址时,虚拟内存管理器都需要计算物理内存地址。
我的方法:我想在 RAM 中分配几个 MB 并使用它们的物理地址直接写入/读取它们。此外,我想从 Win7 内存管理中删除那块 RAM 内存。这可能吗?这应该是在不同 CPU 上的进程之间共享数据的最快方式,对吧? 我知道那样我不允许 Win7 使用任何缓存算法,但是由于我的所有进程都部署在单独的 CPU 上,因此无法访问彼此的缓存内存,这不会打扰我,对吧?
非常感谢任何 cmets(也是非常通用的),因为我仍处于设计系统和寻找输入的阶段!
【问题讨论】:
-
出于好奇的一些问题:您考虑过 Linux 内核吗?它可以(并且已经)配置为在实时环境中使用,因此它已经过验证。另外,为什么要绕过操作系统的机制?你要求的麻烦多于它的价值。如果您在 RTOS 环境中,让操作系统本身负责跟上约束。 首先让它工作,然后然后担心性能。看来你还什么都没有,所以现在考虑如何让你还没有“更快”还为时过早。
-
我很乐意使用 Linux,但不幸的是我被绑定到 Win7。如上所述:我正在考虑绕过 Win7 功能以获得性能。我从来没有这样做过,这就是为什么我把它留给讨论。
-
从简单的共享内存开始。然后简介。如果您发现性能不佳来自页面错误,请研究将页面保留在物理内存中的技术(最简单的方法就是禁用交换文件)。如果您发现来自颠簸的 TLB 性能不佳,请研究在没有 MMU 开销的情况下访问物理内存的技术(我什至不确定在保护模式下的 x86 上是否可行)。当然,这一切都是在您尝试将工作集保持在最低限度之后。
-
无根据的假设不是问题的良好基础。 Windows 7“交换器”不将数据来回复制到 HDD 只是任性地。虚拟内存管理器也不计算物理地址。
-
当然可以,您只需要为您的应用程序编写一个内核模式组件。让我印象深刻的是对错误问题的错误解决方案。
标签: c++ windows memory memory-management ipc