如何获取共享内存中的共享对象

2024-02-06

我们的应用程序依赖于外部第三方提供的配置(包括自定义驱动/决策功能),可作为 .so 文件加载。

独立地,它使用一块共享内存与外部 CGI 模块协作,其中几乎所有易失性状态都被保留,以便外部模块可以读取它并在适用的情况下修改它。

问题是 CGI 模块也需要来自 .so 的大量永久配置数据,并且主应用程序在两个内存区域之间执行大量完全不必要的复制以使数据可用。这个想法是将整个共享对象加载到共享内存中,并使其直接可供 CGI 使用。问题是:怎么办?

  • dlopen 和 dlsym 不提供任何用于分配 SO 文件加载位置的工具。
  • 我们尝试了 shmat()。它似乎只有在某些外部 CGI 实际尝试访问共享内存时才起作用。然后,所指向的区域就显得私密,就好像它从未被共享过一样。也许我们做错了什么?
  • 在每个需要它的脚本中加载 .so 是毫无疑问的。该结构的庞大规模,与调用频率相关(某些脚本每秒调用一次以生成实时更新),而且这是一个嵌入式应用程序,因此无法使用。
  • 简单地 memcpy() 将 .so 转换为 shm 也不好 - 某些结构和所有函数都通过指针互连。

使用共享内存时首先要记住的是,相同的物理内存很可能作为不同的地址映射到两个进程的虚拟地址空间中。这意味着如果在数据结构中的任何地方使用指针,它们都会导致问题。一切都必须通过索引或偏移量才能正常工作。要使用共享内存,您必须清除代码中的所有指针。

加载 .so 文件时,仅加载 .so 文件代码的一份副本(因此称为共享对象)。

fork也可能是你在这里的朋友。大多数现代操作系统都实现写时复制语义。这意味着当您fork,当一个进程写入给定的数据段时,您的数据段仅被复制到单独的物理内存中。

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

如何获取共享内存中的共享对象 的相关文章

随机推荐

  • 将 html5 应用程序作为 Windows 可执行文件运行

    我在网上到处寻找这类事情 发现了很多类似的问题和文章 但没有一个回答这个问题 我有一个大型 HTML 5 应用程序 我想将其作为 Windows 上的可执行文件作为全屏本机应用程序运行 我可以想象你可以稍后在 c 中通过 webkit 来完
  • Leaflet:在 GeoJSON 层中使用动态过滤器

    我已经非常接近了 但我很难理解如何将多个用户提交的表单复选框值传递到 Leaflet geoJSON 过滤器函数并仅显示这些点 到目前为止我所拥有的 map filters on submit function e e preventDef
  • 如何使用 numba 优化 numpy.packbits?

    我正在努力优化numpy packbits import numpy as np from numba import njit prange njit parallel True def numba pack arr div su for
  • 如何在任何给定时间检查池中活动 sqlalchemy 连接的数量?

    我遇到过这样的情况 由于高流量负载 sqlalchemy 会不时耗尽活动连接 我想运行一些测试来验证和优化每个用例的池参数 但是 我找不到轮询活动连接计数的直接方法 当前设置如下 args mapping pool size 10 max
  • py2app 在构建过程中获取包的 .git 子目录

    我们在我们的工厂广泛使用 py2app 来生成自包含的 app 包 以便轻松进行内部部署 而不会出现依赖性问题 我最近注意到的一件事 但不知道它是如何开始的 是在构建 app 时 py2app 开始包含我们主库的 git 目录 例如 com
  • 加速(缓慢的)巨大的 WordPress 数据库

    我正在测试一个新项目 其中涉及使用 WordPress 安装 该安装有超过 150 万个帖子 通常帖子内容 标题只有一两行 所以很短 我已经有了强烈推荐的 W3 cache 插件 它很有帮助 但是当你第一次登陆一个页面时 需要 40 60
  • 检查菜谱中是否包含某种成分 - MYSQL

    嘿大家 我在有效运行查询 PHP 组合时遇到了一些麻烦 我似乎只是在 php ini 的内部循环中循环了太多结果集 我确信有一种更有效的方法可以做到这一点 非常感谢任何帮助 我有一张桌子 里面有 3500 个食谱 recipe rid re
  • 在这种情况下,为什么我必须显式解开字符串?

    我有一根绳子var oneString String 然后在一个方法中 当我想将一个字符串连接到oneString我必须这样做 oneString anyString 如果我不添加 我收到一个错误 String is not identic
  • xcode 错误:所选的运行目标对此操作无效

    我的应用程序在 4 3 模拟器和设备中运行良好 现在我想在 4 0 模拟器中测试它 并且我还有 4 2 1 设备 因此 我将 ios 部署目标设置为 4 0 也尝试过 4 2 但 xcode 给了我该错误 所选的运行目标对此操作无效 然后我
  • java.io.IOException:grpc 失败

    当我使用 call getFromLocationName 时 我收到一个 IOException 描述为 grpc failed 运行的代码 Override public void onMapReady GoogleMap google
  • 如何构造HttpPostedFileBase?

    我必须为此方法编写一个单元测试 但我无法构造 HttpPostedFileBase 当我从浏览器运行该方法时 它运行良好 但我确实需要一个自动单元测试 所以我的问题是 如何构造 HttpPosterFileBase 以便将文件传递给 Htt
  • C# 6 Elvis 运算符(空传播)是否短路

    为什么这段 C 代码会抛出 null 异常 bool boolResult SomeClass NullableProperty ItsOkProperty false 一旦 NullableProperty 求值为 null elvis
  • 使用 .net Core 3.1 的 Kestrel ssl JSON 配置中的证书问题

    我已经看到这个问题的答案 但它似乎不适用于 net core 3 1 此代码查找证书 using var store new X509Store Root StoreLocation LocalMachine store Open Open
  • 如何将 PHP 数组格式化为字符串

    我有这个 php 数组 items array Item 1 gt Value 1 Item 2 gt Value 2 Item 3 gt Value 3 我想知道是否有一个我从未听说过的优雅的 PHP 函数可以执行与此相同的操作 outp
  • 使用 Visual Studio 2019 部署到 Hololens 2

    我正在尝试部署到我的 Hololens 2 并尝试通过 wifi 连接到它 我按照此处的说明进行操作 https learn microsoft com en us windows mixed reality mrlearning base
  • 将 y 轴上的数字转换为字符串,其中 K 表示千 d3.js

    我正在使用 d3 js 图表来绘制 y 轴和 x 轴 它工作正常 但是 y 轴上的值可以说范围是 0 到 10000 我希望如果数字大于千 它将带有 K 如果数字是 1000 它将显示 1K 如果数字是 15000 它将在 y 轴刻度上显示
  • Android 开发 Windows Defender 需要排除哪些文件夹?

    我在Windows Defender中排除了以下文件夹 但 反恶意软件服务可执行文件 仍然使用大量CPU C Program Files Android Android Studio C Users ME android C Users M
  • 更改 LocalDb 的默认位置

    我首先使用 EF5 代码进行编程 并希望使用 LocalDb 如何更改 LocalDb 数据库文件的默认位置 默认位置是 USERPROFILE 目录 根据http blogs msdn com b sqlexpress archive 2
  • 如何为独立的 Sinatra 应用程序启用 SSL?

    我想在 Sinatra 中编写一个快速的服务器应用程序 它必须是独立的 即不使用 apache nginx passenger 但也必须支持 SSL 有没有一种简单的方法来启用 Sinatra 的 SSL 支持 例如使用 WEBRick 要
  • 如何获取共享内存中的共享对象

    我们的应用程序依赖于外部第三方提供的配置 包括自定义驱动 决策功能 可作为 so 文件加载 独立地 它使用一块共享内存与外部 CGI 模块协作 其中几乎所有易失性状态都被保留 以便外部模块可以读取它并在适用的情况下修改它 问题是 CGI 模