雖然過去mobo在課堂上曾經介紹過,我也曾經印了一本書放在 lab 拜,不過直到今天我還是沒機會在實作上使用這個技術,所以早就忘光了。本來晚上想要繼續研究 arburg function 跟想辦法解決nb不能切磁區來裝ubuntu的問題,但在家實在無法做,就又來整理一下資料了。
顧名思義,IPC 就是數種在 MultiProcess 下相互溝通的方法,其實不只是 process,甚至可推及 thread 間及 computer 間的溝通。這些技術包含像 synchronization, message passing, shared memory, memory-mapped files, pipe, socket…等等。我就我能理解的簡單介紹一下。
synchronization
這個應該是最多人使用過的技術,通常是用在thread間資料同步的溝通,OS課本上聽過的 critical section, mutex, monitor, semaphore等,很多語言是用 thread join 的方式實作,win32 api則是用handle搭配 WaitForSingleObject ,要注意的問題不外乎是 deadlock 跟 race condition,這些細節在 design pattern 中會有些 case 有解說,日後有機會再介紹。
shared memory
這個看英文就知道它是什麼,只是不同的平台有不同的實作方式,像最近很夯的Cuda就有自己提供 c++ library 給我們用,那算是硬體層面自行提供的。如果是在軟體層,兩個 processes 要共用同一塊記憶體時,POSIX 有提供 shm_open,搭配 mmap 就可以實作;在Windows上,shared memory跟shared file一樣都是用 CreateFileMapping。雖然它們在實作上可能有將資料寫到硬碟上,但至少在程式中你看到的會是一整塊的記憶體而非一個檔案。
memory-mapped file
大家可以參考一下msdn上的這張圖。
這東西跟讀寫檔其實沒兩樣,如果process間共用的資料如果非常大,讀寫的機制又不會很複雜的話,這是個不錯的選擇。
pipe
依照wiki的說法,pipe分成 anonymous pipe 跟 named pipe,其實就是仿照硬體 pipeline 的行為,在process間開一條或數條線來放資料。在Unix上,pipe()是個system call;在Windows上則是使用CreatePipe再搭配ReadFile或WriteFile。
socket
雖然很簡單,卻是十分好用的方法,就是不同的process透過socket互傳資料,無論是走tcp/ip還是rtp都可以,在同一台電腦上的話速度還非常的快,唯一的缺點是資料一筆不能太大。這個方法wiki將之歸納為 named pipe 的一種。
後記
其實寫這篇文章,加上請教keiko、wiki、google的時間大約花兩個多小時,寫出來的東西還是只有一點點實在很悶,但沒辦法沒實作過的話也沒什麼心得,無法分享這些作法可應用在哪些不同的情況。以後如果有收集到新資料再補上囉。
2 則留言:
感謝分享!!!非常實用阿>////<
都只是皮毛而已,而且今天的我已經全部忘光了 XD,不常用的東西不做筆記很容易就沉沒在記憶的大海裡了...
張貼留言