Pages

2009年2月9日 星期一

Shared memory and Semaphore 的使用

形成通訊是蠻常會遇到的問題。當兩個 process 在執行過程中需要溝通,可以使用許多方式,例如:
  • socket(by AF_UNIX)
  • pipe or fifo
  • file
  • shared memory
  • mmap (我覺得可以歸類到file)
  • message queue (不會用XD)
這裡我所要舉得例子是:shared memory + semaphore。畢竟是共享資源,就要考慮同步,否則會發生 race condition。由於程式碼貼上來過於累贅,我就放在 google doc,程式碼的內容是 P1(write)會一直寫進去,而 P2(read)會去讀取並列印再終端機。[註1]
[註1] 若沒有使用 semaphore,印出來的結果會有重複的內容出現。
[註2] semaphore 是另外包裝的一組 API,提供七個函式,如下:
  1. sem_create - 產生 semaphore,並設定初值。
  2. sem_open - 開啟 semaphore,前題以執行過。
  3. sem_rm - 刪除 semaphore,給 sem_close 使用。
  4. sem_close - 關閉 semaphore,並做刪除(sem_rm)。
  5. sem_op - 給 sem_wait、sem_signal 使用。
  6. sem_wait - semaphore--。
  7. sem_signal - semaphore++。

3 則留言:

安東尼 提到...

不好意思 我剛剛在查詢的時候發現你的文章剛好想問一個問題
race condition 和 同步問題之間的差異在哪
我知道前者的意思是  如果不對共享變數作互斥機制 就會造成結果會不一樣 
但後者的意思不是說 process執行時會因為某些事情的發生被迫中斷 必須等其他process做完某件事後 才可以繼續執行 
這不就是一樣的意思嗎
兩個都是在存取共享變數時,只能有一個進行運作 不知道兩者差異在哪 謝謝

Bee 提到...

同步不會用到變數。它只是代表要等一些工作完成。像是火車進站控制,要等有火車出站,下一班車才能進站。這種算是現實問題互斥就是用同步來解。但工作間沒有存取共享變數。

Eric 提到...

To安東尼:
我覺得這只是兩個不同的字眼,在說明同一種概念,只不過,同步問題解釋的格局比較大,但兩者都是為了讓資源,以你認為正確的方式去分配。

 
Blogger Templates