问题标签 [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 投票
3 回答
471 浏览

python - 在 python 中利用多处理器共享数据

我有一个 cpu 密集型代码,它使用繁重的字典作为数据(大约 250M 数据)。我有一个多核处理器并想利用它,以便我一次可以运行多个任务。字典大多是只读的,可能每天更新一次。
如何在不复制字典的情况下用 python 编写这个?
我知道 python 线程不使用本机线程并且不会提供真正的并发性。我可以使用多处理模块而不在进程之间序列化数据吗?

我来自 java 世界,我的要求是可以共享数据、在多个处理器上运行并提供同步原语的 java 线程。

0 投票
11 回答
110360 浏览

linux - 删除类 UNIX 系统上的所有 SYSTEM V 共享内存和信号量

如何在类 UNIX 系统(例如 Ubuntu)上使用单个命令删除所有未使用的信号量和共享内存?

0 投票
2 回答
1894 浏览

c# - 使用 COM 对象的 C++ 应用程序和 C# 应用程序之间的 C# 共享内存

是否可以/可能在 COM 对象中拥有一个共享内存,该内存将由使用 C# 和/或 C++ 构建的应用程序使用?
C# 可以访问 COM 对象中的共享内存而不会崩溃吗?

谢谢,
阿迪巴尔达

0 投票
3 回答
1792 浏览

kernel - 从用户级空间访问内核空间中的变量

所以让我们有一个结构,我想从内核空间中定义的用户级空间读取,但用户级空间有多个进程。

例子:

在内核模块中,我有一个全局结构。结构 { int a; 诠释 b; } 测试;

在用户级模块中,我已经“外部化”了该全局结构

外部结构 { int a; 诠释 b; } 测试;

编译器不抱怨,链接编辑器也不抱怨。但是,如果用户有多个进程,那么是否为每个进程克隆了该结构?如果我与 extern 一起使用共享内存,那么我可以访问内核的结构,如果我有 n 个进程,那么自共享以来只有 1 个结构。我可以使用 1 个用户级进程访问内核级变量,但如果我有更多进程,那么我会为每个“外部”结构获得克隆

我的问题是,多个用户级进程可以读取内核级变量吗?

0 投票
4 回答
12526 浏览

python - Python中的System V共享内存?

如何使用来自 Python的shmat(), shmdt(), shmctl(),调用?shmget()它们是否隐藏在标准库中的某个地方?

更新0

我正在寻找可以在 Ubuntu 存储库或 Python 标准库(现在或将来的版本中)中找到的 System V 绑定。

0 投票
5 回答
1829 浏览

algorithm - 如何有效地调试共享内存中的引用计数问题?

假设您在共享内存中有一个引用计数对象。引用计数表示使用对象的进程数,进程负责通过原子指令递增和递减计数,所以引用计数本身也是在共享内存中的(可以是对象的字段,也可以是对象可能包含指向计数的指针,如果他们有助于解决这个问题,我愿意接受建议)。有时,一个进程会有一个错误,阻止它减少计数。您如何尽可能轻松地找出哪个进程没有减少计数?

我想到的一个解决方案是给每个进程一个 UID(也许是他们的 PID)。然后,当进程递减时,它们会将其 UID 推送到与引用计数一起存储的链表上(我选择了链表,因为您可以使用CAS原子地附加到头部)。当你想调试时,你有一个特殊的过程来查看仍然存在于共享内存中的对象的链表,并且无论哪个应用程序的 UID 不在列表中,都是那些尚未减少计数的应用程序的 UID。

此解决方案的缺点是它使用 O(N) 内存,其中 N 是进程数。如果使用共享内存区域的进程数量很大,并且您有大量对象,那么这很快就会变得非常昂贵。我怀疑可能有一个中途解决方案,使用部分固定大小的信息,您可以通过某种方式缩小可能进程的列表来帮助调试,即使您无法查明一个进程。或者,如果您可以检测到只有一个进程没有减少时哪个进程没有减少(即无法处理检测到 2 个或多个未能减少计数的进程),那可能仍然会有很大帮助。

(对于这个问题有更多的“人为”解决方案,比如确保所有应用程序使用同一个库来访问共享内存区域,但是如果共享区域被视为二进制接口并且并非所有进程都将是由你那是你无法控制的。此外,即使所有应用程序都使用同一个库,一个应用程序也可能在库之外有一个错误,以防止减少计数的方式破坏内存。是的,我使用的是一种不安全的语言,比如C/C++ ;)

编辑:在单进程情况下,您将拥有控制权,因此您可以使用RAII(在 C++ 中)。

0 投票
2 回答
2649 浏览

c - 具有非空 shmaddr 的 shmat

有人可以提供一个(合理地)使用具有非空第二个参数的函数 shmat() 的示例吗?

手册说:

#include <sys/shm.h>

void *shmat(int shmid, const void *shmaddr, int shmflg);

shmat() 函数将与共享内存标识符 shmid 关联的共享内存段附加到调用进程的数据段。该段附加在由以下条件之一指定的地址处:

  • 如果shmaddr是 NULL 指针,则将段附加到系统选择的第一个可用地址。
  • 如果shmaddr不是 NULL 指针并且 (shmflg & SHM_RND) 不为零,则该段附加在 (shmaddr - (shmaddr % SHMLBA)) 给出的地址处。
  • 如果shmaddr不是 NULL 指针并且 (shmflg & SHM_RND) 为 0,则该段附加到 shmaddr 给出的地址。

但我从未见过任何与 shmaddr 设置为 NULL 之外的任何东西一起使用的 shmat 示例。在我的项目中,一个进程必须将它附加到malloc()一块内存上就好了,并且可以很好地使用它,然后另一个进程获取了指向该共享内存的指针(通过 shmid),然后在尝试访问内存时出现了段错误.

0 投票
6 回答
1272 浏览

c - 这是与子进程共享只读内存的安全方法吗?

我想分配和初始化相当大的连续内存块(~1GB),然后将其标记为只读并派生多个(比如说几十个)将使用它的子进程,而不制作自己的内存副本(机器将没有足够的内存用于此)。

我是否认为如果我malloc像往常一样将内存标记为只读,然后将其标记为只读mprotect(addr, size, PROT_READ)fork这将允许子进程安全地使用内存而不会导致它被复制?(前提是我确保在调用后没有尝试写入分配的内存mprotect)。

编辑:感谢所有的答案。

一个后续问题 - 我计划使用shmget,但我认为它已使用mm,因此仅限于较小的分配(请参阅本页的限制部分)。例如/proc/sys/kernel/shmmax,在我使用这个的服务器上是 32MB。但我想要 1GB 的连续内存。我对这个限制有误吗?

0 投票
2 回答
231 浏览

multithreading - 在生成访问共享资源的子线程之前,是否应该由父线程锁定对共享资源的访问?

如果我有以下伪代码:

sharedVariable = somevalue;
CreateThread(threadWhichUsesSharedVariable);

理论上,多核 CPU 是否可以在 threadWhichUsesSharedVariable() 中执行代码,该代码在父线程写入之前读取 sharedVariable 的值?为了在理论上完全避免竞争条件的可能性,代码应该看起来像这样:

sharedVariableMutex.lock();
sharedVariable = somevalue;
sharedVariableMutex.unlock();
CreateThread(threadWhichUsesSharedVariable);

基本上我想知道线程的产生是否在那时显式地线性化了 CPU,并保证这样做。

我知道线程创建的开销可能需要足够的时间,这在实践中并不重要,但我的完美主义者害怕理论上的竞争条件。在极端条件下,一些线程或内核可能严重滞后,而其他线程或内核运行得又快又高效,我可以想象,除非有锁,否则执行顺序(或内存访问)可能会被逆转。

0 投票
1 回答
2435 浏览

linux - 更改现有共享内存段大小

我有一些遗留代码使用 shmget/shmat/shmdt 来创建、附加和管理共享内存段。

带有代码的应用程序有时会崩溃,将段留在内存中。该代码重复使用相同的段键重新连接到它们,但问题是它每次使用不同的共享内存大小,因此无法连接。

我的问题是:

1)是否可以在连接时更改共享内存大小?

2)如果没有,我如何连接到共享内存段(即使我可能不知道大小),以便擦除它(以便以后重新创建一个新的)?

谢谢!