我正在尝试通过共享内存学习 IPC。我不明白如何将共享内存分配给不同进程的各种变量。例如,在矩阵乘法中,我不想全局声明矩阵,而是通过共享内存。我们如何将内存附加到不同的矩阵:
谁能帮我解决这个问题?另外,它可以被 mmap() 和 shm_open() 替换还是只是文件?如果是,如何?我找不到恰当的例子来说明进程如何修改共享内存。
我正在尝试通过共享内存学习 IPC。我不明白如何将共享内存分配给不同进程的各种变量。例如,在矩阵乘法中,我不想全局声明矩阵,而是通过共享内存。我们如何将内存附加到不同的矩阵:
谁能帮我解决这个问题?另外,它可以被 mmap() 和 shm_open() 替换还是只是文件?如果是,如何?我找不到恰当的例子来说明进程如何修改共享内存。
首先:不要将共享内存用于 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 共享内存(这是您正在使用的)更奇怪。