如何为快速工控机配置一个物理RAM专用卡盘 我在Windows 7下开发了一个基于C++的系统。我处理部署在不同CPU上并相互通信的一组进程。由于通信是时间关键型的(实际上我处理的是一个实时系统,我知道Win7并不是最适合我的操作系统…),我需要它尽可能快。我在Win7(管道、Memmapped文件、套接字)下阅读了IPC。最快的方法似乎是内存映射文件()。然而,我不喜欢Win7交换程序运行im后台从RAM到HD来回复制数据的想法。此外,每当我访问虚拟内存地址时,虚拟内存管理器需要计算物理内存地址

如何为快速工控机配置一个物理RAM专用卡盘 我在Windows 7下开发了一个基于C++的系统。我处理部署在不同CPU上并相互通信的一组进程。由于通信是时间关键型的(实际上我处理的是一个实时系统,我知道Win7并不是最适合我的操作系统…),我需要它尽可能快。我在Win7(管道、Memmapped文件、套接字)下阅读了IPC。最快的方法似乎是内存映射文件()。然而,我不喜欢Win7交换程序运行im后台从RAM到HD来回复制数据的想法。此外,每当我访问虚拟内存地址时,虚拟内存管理器需要计算物理内存地址,c++,windows,memory,memory-management,ipc,C++,Windows,Memory,Memory Management,Ipc,我的方法是:我想在RAM中分配几个MB,并使用它们的物理地址直接对它们进行写入/读取。此外,我想从Win7内存管理中删除RAM内存卡盘。这可能吗?这应该是在不同CPU上的进程之间共享数据的最快方式,对吗? 我明白,这样我不允许Win7使用任何缓存算法,但由于我的所有进程都部署在单独的CPU上,因此无法访问彼此的缓存内存,所以这不会困扰我,对吗 任何意见(也非常一般的意见)都非常感谢,因为我仍然在设计我的系统和寻找输入的阶段 你想做的根本不可能。首先,受保护模式的应用程序不可能访问物理RAM—任何

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


任何意见(也非常一般的意见)都非常感谢,因为我仍然在设计我的系统和寻找输入的阶段

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

现在,考虑到您成功地创建了一个实模式应用程序(令人生畏的任务,顺便说一句!),您再也没有内存映射文件了-因为这个映射是由操作系统使用虚拟内存执行的

我也相信你的担心被误解了。操作系统实际上很擅长确定什么可以交换,什么不可以,在任何正常情况下,您的活动使用内存映射区域交换的可能性都很小,几乎为零


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

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


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

好奇的一些问题:你考虑过Linux内核吗?它可以(并且已经)配置为在实时环境中使用,因此经过验证。还有,为什么要绕过操作系统的机制呢?你自找的麻烦太多了。如果您的应用程序处于RTOS环境中,请让操作系统本身负责跟上约束。先让它工作,然后再担心性能。看起来你还没有什么,所以现在考虑如何让你还没有“更快”还为时过早。我很乐意使用Linux,但不幸的是我被Win7束缚住了。如上所述:我正在考虑绕过Win7功能以获得性能。我从来没有这样做过,这就是为什么我把它留给讨论。从简单的共享内存开始。然后是个人资料。如果您注意到页面错误导致性能低下,请研究将页面保留在物理内存中的技术(最简单的方法就是禁用交换文件)。如果您注意到TLB的糟糕性能,请调查在没有MMU开销的情况下访问物理内存的技术(我甚至不确定x86在保护模式下是否可能)。当然,所有这些都是在你已经尝试将工作环境保持在最低限度之后进行的。毫无根据的假设不是问题的良好基础。Windows7“交换程序”不会随意地将数据来回复制到硬盘上。虚拟内存管理器也不会计算物理地址。当然这是可能的,您只需要为应用程序编写一个内核模式组件。但我觉得这是解决错误问题的错误方法。