操作系統 — 信號量 記錄鎖 互斥量之間的區別

信號量 記錄鎖 互斥量之間的區別







如果多個進程間共享一個資源,則可以使用這三種技術中的一種來協調訪問. 我們可以使用映射到兩個進程地址空間中的信號量,記錄

鎖或者互斥量. 對於這三種技術兩兩之間在時間上的差別進行比較是有益的.

若使用信號量,則先創建一個包含一個成員的信號量集合,然後將該信號量的值初始化爲1. 爲了分配資源,以sem_op爲-1調用semop,

爲了釋放資源,以sem_op爲+1調用semop.對每個操作都指定SEM_UNDO,以處理在未釋放資源條件下進程終止的情況.

若使用記錄鎖則先創建一個空文件,並且用該文件的第一個字節作爲鎖字節,爲了分配資源,先對該字節過的一個寫鎖. 釋放該資源的

時候,則對字節解鎖. 記錄鎖的性質確保了當一個鎖的持有者進程終止時,內核會自動釋放該鎖.

若使用互斥量,需要所有的進程將相同的文件映射到他們的地址空間中,並使用PTHREAD_PROCESS_SHARED互斥量屬性在文件的相同偏移

處初始化互量.爲了分配資源,我們對互斥量加鎖. 爲了釋放鎖,我們解鎖互斥量,如果一個進程沒有釋放互斥量而終止,恢復將是

非常困難的,除非我們使魯棒互斥量.


在Linux中,記錄鎖比信號量要快,但是共享存儲中的互斥量的性能比信號量和記錄鎖都要優越. 如果我們能單一資源加鎖,並且不需要

XSI信號量的所有花哨功能,那麼記錄鎖將比信號量好,原因是它使用起來比較更簡單,速度更快,當進程終止時系統會管理遺留下來的

鎖. 儘管對於這種平臺來說,在共享存儲中使用互斥量是一個更快的選擇,但是我們依然喜歡使用記錄鎖,除非要特別考慮性能. 

這樣做有兩個原因. 首先,在多個進程間共享的內存中使用互斥量來恢復一個終止的進程更難. 其次,進程共享的互斥量屬性沒有得

到普遍的支持. 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章