操作系統(tǒng)同步機(jī)制的實(shí)現(xiàn)

背景

多進(jìn)程(線程)并發(fā)執(zhí)行會(huì)出現(xiàn)進(jìn)程間相互制約的情況發(fā)生,例如兩個(gè)進(jìn)程需要:

  • 共享唯一的硬件設(shè)備
  • 共享同一塊內(nèi)存區(qū)域
  • 一個(gè)進(jìn)程的運(yùn)行依賴另一進(jìn)程對(duì)共享資源的執(zhí)行結(jié)果

如果多個(gè)進(jìn)程間存在時(shí)序關(guān)系,需要協(xié)同工作以完成一項(xiàng)任務(wù),則成為同步;如果不滿足協(xié)同的條件,而知識(shí)因?yàn)?strong>共享具有排他性資源時(shí)所產(chǎn)生的關(guān)系稱為互斥

1. 信號(hào)量

信號(hào)量和PV原語(yǔ)操作是有Dijkstra發(fā)明的,它是最為廣泛的互斥方法之一:

  • Semaphore S:信號(hào)量,表示共享資源的可用數(shù)量
  • Operation P:P原語(yǔ),用于減少S計(jì)數(shù)
  • Operation V:V原語(yǔ),用于增加S計(jì)數(shù)

信號(hào)量和PV操作原理:

  1. 當(dāng)進(jìn)程想要進(jìn)入共享區(qū)時(shí),首先執(zhí)行P操作,S-1
  2. 當(dāng)進(jìn)程想要退出共享區(qū)時(shí),執(zhí)行V操作,S+1
  3. 進(jìn)程進(jìn)出共享區(qū)的操作,是原子操作(執(zhí)行過(guò)程不允許被中斷)


    PV 原語(yǔ)

2. Mutex

Mutex是 Mutual Exclusion 簡(jiǎn)寫,其釋義有為互斥體

  1. 如果一個(gè)資源有多個(gè)對(duì)象同時(shí)訪問(wèn):稱為Counting Semaphores,
  2. 若只允許取值0或1(locked/unlocked):稱為Binary Semaphore,可以認(rèn)為它與Mutex是相同的性質(zhì)。Mutex是對(duì)于Binary Semaphore的一種簡(jiǎn)單實(shí)現(xiàn)方式

3. 管程 (Monitor)

管程是對(duì)Semaphore機(jī)制的延伸和改善,是一種更簡(jiǎn)單的同步手段

Semaphore 機(jī)制的缺陷:

程序的易讀性相對(duì)較差,對(duì)于信號(hào)量的管理也分散在各個(gè)參與對(duì)象中,因此有可能引起死鎖,進(jìn)程餓死等問(wèn)題

管程的定義

管程是可以被多個(gè)進(jìn)程/線程安全訪問(wèn)的對(duì)象或模塊
管程匯總的方法是受到Mutex保護(hù)的,意味著同一時(shí)刻只允許一個(gè)訪問(wèn)者來(lái)使用它們。

管程的特性

  • 安全性
  • 互斥性
  • 共享性

很多流行的編程語(yǔ)言都實(shí)現(xiàn)了管程機(jī)制:如Java,Python,Delphi,Ruby,C#等

4. Linux Futex (Fast Userspace muTEXes)

Linux 中的同步機(jī)制,它在應(yīng)用程序空間中就可以應(yīng)對(duì)大多數(shù)同步場(chǎng)景。
判斷是否開(kāi)啟了ART_USE_FUTEXES宏
Mutex的加鎖邏輯:如果獲取到鎖,就直接返回,否則進(jìn)入掛起的狀態(tài)。


futex例子
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容