【问题标题】:How to allocate a consequtive chuck of physical RAM for fast IPC [closed]如何为快速 IPC 分配连续的物理 RAM [关闭]
【发布时间】: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


【解决方案1】:

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

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

我也相信你的担心被误解了。操作系统实际上擅长确定要交换的内容和不交换的内容,并且在任何正常情况下,您积极使用的内存映射区域进行交换的机会几乎为零。

最后但并非最不重要的一点是,我不确定您是否真的了解您在这里所做的事情。

【讨论】:

    【解决方案2】:

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

    要做出有意义的选择,您需要知道自己真正需要的速度。

    【讨论】:

      猜你喜欢
      • 2014-03-15
      • 2015-04-01
      • 2012-12-26
      • 2015-01-26
      • 2011-11-23
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      相关资源
      最近更新 更多