2013-03-13 88 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