我想通過共享內存學習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共享內存(這是你正在使用的)是非常奇怪的。
'* shmem_ptr = value;',也許? – 2013-03-13 21:00:28
如果您需要使用共享內存,請使用它的現代版本'shm_open'以及'mmap'和'munmap'。使用簡單,限制少。通常,你發佈的代碼是一個真正的混亂,甚至不會編譯。在你張貼之前請清理你的東西。 – 2013-03-13 22:30:18
我只是想傳達這個概念......但我不知道它將如何被shm_open和mmap以及munmap所取代! – Lost 2013-03-14 01:24:30