在 C++ 中寻找基于 Windows RAM 的共享内存解决方案

2023-11-25

我面临着一种情况,我需要将多达数百兆字节的内存从一个进程传递到另一个进程。现在我正在通过文件来完成它,但速度太慢了。 我想为了更快,这些文件应该直接写入 RAM 并且可以从另一个进程访问。不需要花哨的同步。一个进程将创建共享内存对象并用数据填充它们。另一个进程将读取并删除它们。不过,我进行了一项快速研究,似乎您无法在 Windows 中共享 RAM 中的内存 - 共享内存由文件或分页文件支持。 boost::interprocess 的文档证实了这一点。如果共享内存实现仍然使用磁盘,那么速度在哪里?有没有使用基于 RAM 的共享内存的 C++ 库?

编辑:我做了一些进一步的阅读: 1.来自 boost::interprocess 文档: “由于操作系统必须将文件内容与内存内容同步,因此内存映射文件的速度不如共享内存。” 2. 来自http://msdn.microsoft.com/en-us/library/ms810613.aspx: “内存映射文件也可以同时被多个应用程序映射。这是 Windows NT 中两个或多个进程直接共享数据的唯一机制。”


我认为这是一个根本性的误解:您认为,如果创建由分页文件支持的文件映射,那么它会像实际在磁盘上写入内容一样慢。

绝对不是这种情况:文档中“由分页文件支持”的含义意味着共享内存通常驻留在内存中,但如果没有足够的可用空间,它在分页文件中保留了一个位置来写入此类数据物理内存和虚拟内存管理器需要交换内存页面。

文档中并不清楚这一点,但文件映射MSDN 页面确认:

[...] 它由磁盘上的文件支持。这意味着当系统交换文件映射对象的页面时,对文件映射对象所做的任何更改都会写入该文件。当文件映射对象的页面被换回时,它们将从文件中恢复。

请注意,这适用于由分页文件支持的共享内存以及由常规文件支持的内存(VMM 保证各种视图保持一致)。

顺便说一句,这就是用户进程中“常规”(=虚拟)内存的工作方式:如果当前未使用分配的内存,并且系统需要将物理内存用于其他内容(例如,当前使用的内存页可供您/另一个应用程序使用)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ 中寻找基于 Windows RAM 的共享内存解决方案 的相关文章

随机推荐

  • 是否可以使用一个替换函数来替换一个字段中的多个字符串?

    在我的报告中 我需要使用内置替换函数将 a 替换为 b 将 c 替换为 d 当我只使用两个这样的函数时 替换 字段 field1 Value a b 替换 字段 field1 Value c d 我在报告中两次从现场获得文本 是否有可能做到
  • 使用 Google+ 登录时如何注销

    谷歌文档在那里gapi auth signOut 方法在这里 https developers google com web signin sign out 问题是它说你只能在之后调用该方法signinCallback已解雇 据我所知 唯一
  • 不同库中的相同符号和链接顺序

    我有 2 个库 test 1 and test 2 两个库都包含一个全局的外部 C void f 函数 具有不同的实现 只是cout用于测试 我做了以下测试 Test 1动态链接 如果我添加libtest 1 so进而libtest 2 s
  • 无法在 case 语句 bash 中设置变量

    我试图根据一堆输入条件设置一个变量 这是代码的一个小示例 bin bash INSTANCE SIZE case 1 in micro INSTANCE SIZE t1 micro small INSTANCE SIZE m1 small
  • 自动释放与释放

    当我需要一个数组临时使用时 这些有什么区别 1 NSMutableArray stuff NSMutableArray alloc init use the array stuff release 2 NSMutableArray stuf
  • 在 WooCommerce 购物车中获取购物车项目的产品 ID

    cart item woocommerce gt cart gt get cart 我有上面的代码 如果我在 cart item 上运行 print r 我会得到一个多维数组 Array a6292668b36ef412fa3c4102d1
  • Web应用中长时间运行查询问题的解决方案(异步请求)

    这是问题所在 企业 Web 应用程序的用户正在执行导致长 非常长 数据库查询 或其他长处理密集型任务 的任务 问题 请求超时 一段时间后用户可能会遇到请求超时 会话超时 如果未使用会话保持方法 则可能会发生会话超时 Request thre
  • Jest + Material-UI:正确模拟 useMediaQuery

    我正在使用 Material UIuseMediaQuery 我的组件之一中的函数来确定size用于 a 的道具
  • Angular 2 路由参数重新初始化组件 onInit

    我遇到一个问题 当我使用新参数路由到我的组件时 它正在重新初始化 这是我的路线 const appRoutes Routes path component MyNewComponentComponent path tiles compone
  • 关于多个“catch”的问题

    谁能告诉我为什么这个类的输出是 xa 为什么其他异常 RuntimeException和Exception 不会被捕获 public class Tree public static void main String args try th
  • WPF TabItem 内容对齐始终居中

    我试图将一些内容放入 TabItem 中 但无法添加填充 TabItem 空间的容器 我添加的任何内容都会居中显示 我正在使用 WPF Toolkit 中的主题 WhistlerBlue xaml 所以我认为这可能就是导致我出现这个问题的原
  • 为什么从 PHP 5.4 开始永久启用“echo”短标签?

    甚至官方文档曾经告诉我们PHP 短标签 是 坏 然而 从 PHP 5 4 开始 echo种类永久启用 无论short open tag setting 发生了什么变化 即使他们之前仅仅因为是否存在不可预测的性质而被劝阻short open
  • 如何在python(windows平台)中安装xgboost包?

    http xgboost readthedocs org en latest python python intro html 在xgboost的主页 上面的链接 上 写着 要安装 XGBoost 请执行以下步骤 你需要跑make在项目的根
  • 使用 FindMatchingFiles 工作流活动的 MatchPattern 属性

    我正在使用 TFS 2010 Team Build 自定义构建过程模板的默认工作流程 有一个活动叫FindMatchingFiles允许使用中定义的模式搜索特定文件MatchPattern财产 如果我只指定一个文件扩展名 它就会起作用 例子
  • OpenGraph 还是 Schema.org? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 只是想知道你们是否喜欢遵循以下标记的 OpenGraph 协议 或者 Schema org 协议 div span Kenmore White 17 Mi span div
  • 无法在 Ubuntu 13.04 上使用 RVM 安装 Ruby on Rails

    我正在尝试在我的 Ubuntu 机器上安装 RVM 我已经使用curl来获取RVM 但是一些RVM命令 安装 要求 抛出此apt get错误 There has been error while updating apt get pleas
  • Git-2-SVN 迁移?

    是的 我知道 为什么要从 Git 迁移到 SVN 好吧 我碰巧遇到这样的情况 我需要将一个巨大的 Git 存储库迁移到 Subversion 这是我根据埃德温的评论尝试的一个工作流程 首先创建一个本地SVN仓库 svnadmin creat
  • 通过推送通知启动应用程序时进行调试

    我目前正在开发一个接收推送通知的应用程序 我通过 PHP 页面使这一切 100 正常工作 我的应用程序可以接收多种不同类型的推送通知 PHP 处理这个问题并向我的应用程序发送不同的信息包 这些信息包都被很好地接收 但是 当用户 查看 通知并
  • 在类的构造函数中返回一个值

    到目前为止我有一个PHP带有构造函数的类 public function construct identifier NULL Return me if identifier NULL this gt emailAddress identif
  • 在 C++ 中寻找基于 Windows RAM 的共享内存解决方案

    我面临着一种情况 我需要将多达数百兆字节的内存从一个进程传递到另一个进程 现在我正在通过文件来完成它 但速度太慢了 我想为了更快 这些文件应该直接写入 RAM 并且可以从另一个进程访问 不需要花哨的同步 一个进程将创建共享内存对象并用数据填