0

我正在尝试通过共享内存学习 IPC。我不明白如何将共享内存分配给不同进程的各种变量。例如,在矩阵乘法中,我不想全局声明矩阵,而是通过共享内存。我们如何将内存附加到不同的矩阵:

谁能帮我解决这个问题?另外,它可以被 mmap() 和 shm_open() 替换还是只是文件?如果是,如何?我找不到恰当的例子来说明进程如何修改共享内存。

4

1 回答 1

1

首先:不要将共享内存用于 IPC。很乱。

在共享内存有意义的大多数情况下,只使用线程更容易也更合适(这样所有内存都是共享的)。如果这不可能,您最好使用某种消息传递方案。

如何从该共享内存中为矩阵 A 、 B 和结果矩阵分配内存
并附加到它,因为我不必全局声明矩阵并且每个进程都需要 ABC 来
解决部分问题。

您必须想出一些方法来在共享内存段中分配内存。您不能malloc()为此使用,因为它的竞技场不包括共享内存。

如果您要存储的唯一数据是这三个矩阵,并且两个进程都知道这些矩阵的大小,则可以将它们全部堆叠到一个结构中并将其存储在段中:

struct shm_data {
    float A[123][123], B[123][123], C[123][123];
};

struct shm_data *mat = (struct shm_data *) shm;

但是,如果矩阵的大小不固定,则必须在运行时计算它们的地址。

另外,它可以被 mmap() 和 shm_open() 替换还是只是文件?

是的。事实上,mmap()几乎普遍优于shm_open(),因为内存段由文件支持并遵循文件系统语义,因此可以明智地清理它。POSIX 共享内存(这是您正在使用的)更奇怪。

于 2013-03-13T21:06:12.217 回答