我正在尝试通过共享内存学习IPC。我不明白如何将共享内存分配给不同进程的各种变量。例如,在矩阵乘法中,我不想全局声明矩阵,而是通过共享内存。我们如何将内存附加到不同的矩阵:
有人可以帮我吗?此外,它可以替换为mmap()和shm_open()还是只是文件?如果有,怎么样?我找不到可以说明如何通过进程修改共享内存的简单示例。
答案 0 :(得分:1)
首先:不要将共享内存用于IPC。这太乱了。
在大多数共享内存有意义的情况下,使用线程更简单,更合适(以便共享所有内存)。如果不可能,你可能最好使用某种消息传递方案。
如何从此共享内存中为矩阵A,B和结果矩阵和
分配内存 附加到它,因为我不必全局声明矩阵,每个过程都需要A B C来执行 问题的一部分。
您必须想出一些在共享内存段中分配内存的方法。您不能使用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共享内存(这是你正在使用的)更加怪异。