看板 uefacool
作者 標題 [Embe] 互斥(mutex)和旗語(semaphore)之間有什麼不同?
時間 2011年07月13日 Wed. PM 11:32:29
http://www.eettaiwan.com/ART_8800557420_676964_NT_0d68ab4c.HTM
專家觀點:不要輕信有關RTOS的表面說法
上網時間: 2008年12月22日
「互斥(mutex)和旗語(semaphore)之間有什麼不同?」這樣的問題措辭簡潔有力,但要如何回答卻相當困難。即使是有經驗的即時作業系統(RTOS)用戶在區別如何正確使用mutex和semaphore時也存在著困難。
但這一點很不幸而且也很危險,因為無論這兩種原生RTOS中的哪一個被錯誤使用,都會導致嵌入式系統出現意想不到的錯誤,特別是這些系統甚至包括悠關生命安全的產品。
「浴室鑰匙」的比喻
幾乎所有的工程師似乎都認為mutex是一種二進位旗標,它確保程式碼中的關鍵部份為互斥,以保護共享資源。但當他們被要求進一步回答如何使用「計算semaphore」的方式時,大部分的工程師的回答就如同教科書一般的刻板──semaphore用於保護多種同類資源。
如果你認為mutex是作業系統所有的關鍵值,那麼我們可以很容易地將個別的mutex比喻為市區咖啡店中一間浴室的鑰匙。如果你想使用浴室,但卻找不到鑰匙,你就必須在佇列中等待。同樣地,mutex則協助串連多項任務,以取得全域資源的共享,並且為等待中的任務分配一個靜候其順序的位置。
但這種簡單的資源保護協議並不適用於兩間相同浴室的情況。如果把一個semaphore概括為一個mutex,使其能保護兩個或更多相同的共享資源,那麼在我們的比喻中,它就像是一個放著兩把相同鑰匙的籃子,你可以用任何一支鑰匙打開任何一扇浴室的門。
因此,semaphore本身並不能解決多個相同資源的問題。咖啡店中的客人可能只知道有一把鑰匙,但並不知道哪一間浴室可供使用。如果你試圖以此方式使用semaphore,你將會發現常常都需要更多的狀態資訊──它通常是由不同的mutex所保護的共享資源。
正確使用semaphore是為了使訊號從一項任務傳至另一項任務。mutex意味著取得與釋放,使用受保護共享資源的每一次任務總是以這樣的順序進行。相形之下,使用semaphore的任務通常不是發送訊號,就是進入等待狀態──不可能二者同時發生。
例如,任務1可能包含程式碼,當按下「電源」(power)鈕時,即可提出(如發送訊號或增量)一個特別的semaphore;任務2則依據相同的semaphore而用於喚醒顯示器。在這種情況下,其中一項任務是該事件訊號的製造者,另一項任務則是消費者。
(參考原文: Don't believe everything you hear about RTOSes ,by Michael Barr,Netrino LLC公司總裁)
--
※ 作者: uefangsmith 時間: 2011-07-13 23:32:29
※ 看板: uefacool 文章推薦值: 0 目前人氣: 0 累積人氣: 39
回列表(←)
分享