问题标签 [shared-memory]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
526 浏览

c++ - C 或 C++ - 动态增长/收缩磁盘支持的共享内存

我有几个应该共享数据的 fastcgi 进程。

数据绑定到一个会话(一个唯一的会话 id 字符串),并且应该能够在服务器重新启动后继续存在。根据会话的数量,共享数据可能太大而无法放入主内存。理想情况下,当共享数据超过某个阈值时,绑定到最不活跃会话的数据应该只存在于磁盘上,而最活跃的会话数据应该从主内存中可用。在会话处于非活动状态一段时间后,会话数据将被销毁。

我的问题是(作为 C/++ 的新手):

是否有任何方法或库可以帮助我解决这个非常棘手的问题?

mmap()考虑到应该销毁非活动会话数据的要求,是否可以与共享内存一起使用?

0 投票
8 回答
6012 浏览

c++ - 共享内存、MPI 和排队系统

我的 unix/windows C++ 应用程序已经使用 MPI 进行了并行化:作业在 N 个 cpus 中拆分,每个块并行执行,非常高效,速度扩展非常好,工作做得很好。

但是有些数据在每个过程中都是重复的,并且由于技术原因,这些数据不能轻易地通过 MPI 拆分(...)。例如:

  • 5 Gb 的静态数据,为每个进程加载完全相同的数据
  • 可以在 MPI 中分发的 4 Gb 数据,使用的 CPU 越多,每个 CPU 的 RAM 越小。

在 4 CPU 作业中,这意味着至少需要 20Gb RAM 负载,大部分内存“浪费”,这太糟糕了。

我正在考虑使用共享内存来减少整体负载,“静态”块每台计算机只会加载一次。

所以,主要问题是:

  • 是否有任何标准的 MPI 方法可以在节点上共享内存? 某种现成的+免费图书馆?

    • 如果没有,我将boost.interprocess使用 MPI 调用来分发本地共享内存标识符。
    • 共享内存将由每个节点上的“本地主机”读取,并且共享只读。不需要任何类型的信号量/同步,因为它不会改变。
  • 有任何性能下降或需要注意的特定问题吗?

    • (不会有任何“字符串”或过于奇怪的数据结构,一切都可以归结为数组和结构指针)
  • 该作业将在 PBS(或 SGE)排队系统中执行,在进程不干净退出的情况下,我想知道这些是否会清理节点特定的共享内存。

0 投票
1 回答
1448 浏览

c++ - 使用不同于 char 的类型来提升 shared_memory_object 问题

我对 boost shared_memory_object 和 mapped_region 有疑问。我想在内存对象中写一组对象(结构)。如果结构只包含一个字符,一切正常;如果我只是在结构中添加一个 int,那么如果我放置了太多对象(比如说 70,比块的限制少得多),我在编写时会遇到分段错误。

到目前为止,我只看到了将简单字符写入共享内存的示例,但我还没有阅读任何关于可以使用的对象类型的内容。我想知道是否必须在的对象和字节流之间进行转换,或者这样的函数是否已经存在。或者,如果我只是在我的代码中做错了什么。注释行是那些在取消注释时给我一个段错误的行...

谢谢你的任何提示!

MacOS X 10.6.2 - gcc 4.2 - 升压 1.41.0

0 投票
1 回答
1469 浏览

macos - 为共享内存增加内存

在尝试获取共享内存时,shmget()经常会因为无法分配内存而失败。RAM 的物理大小真的不应该是问题(我认为 4GB 就足够了)。相反,系统属性中的任何地方都可能存在分配共享内存集的限制。有谁知道,我在哪里可以找到这个属性?

我正在使用 Mac OS X 版本 10.6

0 投票
1 回答
3285 浏览

string - 共享内存和字符串:托管?

boost::interprocess::string我在共享内存中 有问题。

当我使用 a 时,shared_memory_object我可以操纵具有不同字段的结构,但字符串(我得到一个分段错误)。
另一方面,当我使用managed_shared_memory一切都很好。

难道我做错了什么?你知道使用 是否有性能损失managed_shared_memory

谢谢!

0 投票
6 回答
33968 浏览

c++ - wait and notify in C/C++ shared memory

How to wait and notify like in Java In C/C++ for shared memory between two or more thread?I use pthread library.

0 投票
2 回答
80 浏览

c - 混合 exe 的静态编译来对抗不同版本的带共享内存的库

对于这个冗长的问题,我提前道歉,但我想确保我没有遗漏任何可能改变您的回答的关键点。

我负责维护用“C”编写的系统软件,我们有一些常见的“.a”库。我们有一个我称之为“执行管理器”的东西,他的主要工作是分叉和执行“测试作业”可执行文件的变量列表,并在测试作业过程终止后将控制权返回给执行管理器。所有可执行文件,包括执行管理器,都与上述库静态链接。执行管理器和它派生的测试作业进程通过共享内存使用 IPC。其中一个公共库包含包装函数,用于创建和附加共享内存,其中包含一个永远不会更改的预定义密钥。

几个月前,我们锁定了我们的软件(测试作业加上执行管理器),静态编译它们并发布它们以对测试作业进行“验证”。从那时起,已经有一些对执行管理器进行更改的请求,这将需要更改一些选定的公共库函数。但是,管理层决定他们不想针对新版本的公共库重新编译测试作业,因为这将要求他们重新验证他们当前拥有的测试作业可执行文件;他们不想为此花钱。

由于所有可执行文件都是静态编译的,我通常会说将执行管理器与针对同一公共库的不同版本静态编译的测试作业混合不会有问题。然而,通过共享内存包含 IPC 让我想知道这是否仍然正确。我的直觉是,只要共享内存包装函数没有变化,尤其是密钥,那么我们应该没问题,但我真的可以在这方面使用一些专家意见。

感谢您花时间阅读本文,非常感谢。

0 投票
5 回答
1623 浏览

c++ - 是否可以在使用不同编译器编译的应用程序之间共享共享内存中的 C 结构?

我意识到通常 C 和 C++ 标准为编译器编写者提供了很大的自由度。但特别是它保证像 C 结构成员这样的 POD 类型必须按照它们在结构定义中列出的顺序排列在内存中,并且大多数编译器都提供了扩展,让您可以修复成员的对齐方式。因此,如果您有一个定义结构的标头并手动指定其成员的对齐方式,然后使用标头使用不同的编译器编译两个应用程序,那么一个应用程序是否应该能够将结构的实例写入共享内存而另一个应用程序能够正确读取它吗?

我假设包含的类型的大小在同一架构上的两个编译器中是一致的(它必须已经是同一个平台,因为我们正在谈论共享内存)。我意识到这对于某些类型并不总是正确的(例如 GCC 和 MSVC 64 位中的 long 与 long long),但现在有 uint16_t、uint32_t 等类型,并且 float 和 double 由 IEEE 标准指定。

0 投票
2 回答
8751 浏览

unix - 列出 AIX5.3+ 上进程使用的所有共享内存段

我想找到给定进程使用的所有共享内存段。我对找出 shmid 尤其感兴趣,因此我可以在调用 shmctl() 时使用它。

在 Solaris 上,我只需阅读 /proc/$PID/map 即可找出该信息(字段 pr_shmid)。该文件的内容由 sys/procfs 中的 struct prmap_t 定义。

AIX 也有一个 /proc/$PID/map 文件。还有一个 struct prmap 但不幸的是它缺少 pr_shmid 字段。

有什么想法可以在 AIX5.3+ 上实现吗?

0 投票
4 回答
9491 浏览

c++ - 如何在共享内存中获取共享对象

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

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

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

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