如何为快速IPC分配一个连续的物理RAM

How to allocate a consequtive chuck of physical RAM for fast IPC

本文关键字:连续 一个 RAM IPC 分配      更新时间:2023-10-16

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

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

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

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

要想做出有意义的选择,你需要知道你真正需要的速度是多少。

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

现在,考虑到您成功创建了一个真实模式的应用程序(任务艰巨,顺便说一句!)此时,您不再有内存映射文件了,因为此映射是由操作系统使用虚拟内存执行的。

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

最后但同样重要的是,我不确定你是否真的理解你在这里做什么。