今天翻出了Unix Network Programming Vol. 2,看了shared memory
原來還有分posix跟跟system v阿,之前用的是system v的share memory,主要利用到幾個呼叫函數
#include<sys/shm.h>
shmget 建立一塊share memory
shmat 將share memory attached到某個process的空間內
shmdt 分離share memory與該行程
shmctl share meory的操作,包含刪除的部分
一直誤shared memory是parent/child或者child/child之間的資訊交換使用,事實上他可以超越許多process,也就是兩個processes之間沒有關係也可以使用shared memory做溝通,不過中間有個重點就是key的產生,在使用shmget的時候會需要用到一個唯一的key去產生,只要知道這個key value,就可以取得相對應的shared memory
在書中使用ftok這個function去產生唯一的key,其實有個小小的陷阱,ftok接受一個存在的檔案路徑,並且產生相對應的唯一key,也就是只要預期兩個相同的檔案路徑就會產生相同的key,但是事實上man page有提到,如果說該檔案路徑被刪除後就有可能不一樣,也就是說假設A, B兩個processes,A使用ftok(path1,1)取得key1,當path1重新被建立(如刪除後又重新新增),這時候B使用ftok(path1,1)可能會取得key2且key2!=key1
效能方面,書中也有所解說,shared memory與pipe/FIFO/message que這些空間主要都由kernel在維護,但是後者是由process A讀取檔案(system call 1)後寫入pipe/FIFO/message queue(system call 2),跟著再由process B取得(system call 3),最後再由process B輸出到(system call4)檔案,也就是後者進行了四次的system call。由於shared memory是直接對於kernel將共享的記憶體映射到process空間,也就是不用透過kernel來管理,這樣只要兩次(system call 1, 4),所以效能會比較好
雖然richard steven大師這樣的解釋讓人比較了解差別跟應用的情境,但是實際上實作的差異還是有分別,如shared memory屬於哪個process?還是屬於kernel?如果實際屬於kernel那就嚴重囉,表示使用者如果讓他產生溢位的話可能會危害到kernel,如果屬於process,那他應該屬於哪個process的?這些疑問等以後有時間再來trace code好了
沒有留言:
張貼留言