2013-03-13 43 views
0

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

任何人都可以帮助我吗?另外,它可以替换为mmap()和shm_open()还是只是文件?如果是,如何?我无法找到共享内存如何被进程修改的示例。

+0

'* shmem_ptr = value;',也许? – 2013-03-13 21:00:28

+1

如果您需要使用共享内存,请使用它的现代版本'shm_open'以及'mmap'和'munmap'。使用简单,限制少。通常,你发布的代码是一个真正的混乱,甚至不会编译。在你张贴之前请清理你的东西。 – 2013-03-13 22:30:18

+0

我只是想传达这个概念......但我不知道它将如何被shm_open和mmap以及munmap所取代! – Lost 2013-03-14 01:24:30

回答

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共享内存(这是你正在使用的)是非常奇怪的。

+0

如果我不能在不同的进程中使用全局变量,我在哪里声明包含矩阵,行和列的结构? – Lost 2013-03-14 01:39:34

+0

您将其声明为指向共享内存的指针。 – duskwuff 2013-03-14 03:44:28