如何为快速IPC分配物理RAM的连续卡盘

时间:2015-12-28 18:30:09

标签: c++ windows memory memory-management ipc

我在Windows 7下开发了一个基于C ++的系统。我处理了一系列部署在不同CPU上并相互通信的进程。由于通信是时间关键的(实际上我处理的是实时系统,我知道Win7并不是最适合我的操作系统。)我需要它尽可能快。我在Win7(Pipes,MemMappedFiles,Sockets)下阅读了有关IPC的内容。最快的方法似乎是内存映射文件(Fastest IPC method on Windows 7)。但是,我不喜欢Win7交换器运行im后台从RAM到HD来回复制数据的想法。此外,每当我访问虚拟内存地址时,虚拟内存管理器都需要计算物理内存地址。

我的方法:我想在RAM中分配几个MB,并使用它们的物理地址直接写入/读取它们。另外我想从Win7内存管理中删除那个RAM内存。这可能吗?这应该是在不同CPU上的进程之间共享数据的最快方法,对吗? 我理解这一点,我不允许Win7使用任何缓存算法,但由于我的所有进程都部署在不同的CPU上,因此无法访问彼此的缓存内存。打扰我,对吗?

我非常感谢任何评论(也非常一般),因为我仍处于设计系统和寻找输入的阶段!

2 个答案:

答案 0 :(得分:4)

在我看来,你是从错误的脚开始的。实时并不意味着尽可能快。这意味着您需要满足特定的性能标准。

要有意义地选择,你需要知道你真正需要的速度。

答案 1 :(得分:1)

你想做什么根本不可能。首先,保护模式应用程序无法访问物理RAM - 除非CPU以非保护模式运行,否则任何内存访问都将被CPU的虚拟内存访问所取代。在非保护(实际)模式下运行代码的唯一方法是将其作为操作系统的内核运行,因为其余的都被置于保护模式。

现在,考虑到你成功创建了一个实模式应用程序(令人生畏的任务,顺便说一下!)此时,你还没有内存映射文件 - 因为这个映射是由OS 完全使用虚拟内存。

我也相信你的担忧被误解了。操作系统实际上很擅长确定什么是交换,什么不是,并且在任何正常情况下,你主动使用的内存映射区域交换的机会都很小。

最后但并非最不重要,我不确定你真的明白你在这里做了什么。