我正在尝试通过共享内存学习IPC。我不明白一件事如何将共享内存分配给不同进程的各种变量。例如,在矩阵乘法中,我不想全局声明矩阵,而是通过共享内存。我们如何将内存附加到不同的矩阵:
有人可以帮我解决这个问题吗?另外,它可以被 mmap() 和 shm_open() 替换还是只是文件?如果是,怎么办?我找不到恰当的例子来说明进程如何修改共享内存。
最佳答案
首先:IPC不要使用共享内存。很乱。
在共享内存有意义的大多数情况下,仅使用线程会更容易且更合适(以便所有内存都是共享的)。如果不可能,您最好使用某种消息传递方案。
How do I allocate memory from this shared memory for matrix A , B and resultant matrix and
attach to it as I don't have to declare matrices globally and each process would need A B C to do
part of problem.
您必须想出某种方法来在共享内存段内分配内存。您不能为此使用 malloc()
,因为它的 arena 不包含共享内存。
如果您要存储的唯一数据是这三个矩阵,并且并且两个进程都知道这些矩阵的大小,那么您可以将它们全部堆叠到一个结构中,然后将其存储在段中:
struct shm_data {
float A[123][123], B[123][123], C[123][123];
};
struct shm_data *mat = (struct shm_data *) shm;
但是,如果矩阵的大小不固定,则必须在运行时计算它们的地址。
Also , can it be replaced by mmap() and shm_open() or is it just files ?
是的。事实上,mmap()
几乎普遍优于 shm_open()
,因为内存段由文件支持并遵循文件系统语义,因此可以合理地清理它。 POSIX 共享内存(这就是您正在使用的)要奇怪得多。
关于c - 涉及多个进程的矩阵乘法中的共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15396294/