背景
多進(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原語操作是有Dijkstra發(fā)明的冤狡,它是最為廣泛的互斥方法之一:
- Semaphore S:信號(hào)量生百,表示共享資源的可用數(shù)量
- Operation P:P原語递雀,用于減少S計(jì)數(shù)
- Operation V:V原語,用于增加S計(jì)數(shù)
信號(hào)量和PV操作原理:
- 當(dāng)進(jìn)程想要進(jìn)入共享區(qū)時(shí)蚀浆,首先執(zhí)行P操作缀程,S-1
- 當(dāng)進(jìn)程想要退出共享區(qū)時(shí)搜吧,執(zhí)行V操作,S+1
進(jìn)程進(jìn)出共享區(qū)的操作杨凑,是原子操作(執(zhí)行過程不允許被中斷)
PV 原語
2. Mutex
Mutex是 Mutual Exclusion 簡(jiǎn)寫滤奈,其釋義有為互斥體
- 如果一個(gè)資源有多個(gè)對(duì)象同時(shí)訪問:稱為Counting Semaphores,
- 若只允許取值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)程餓死等問題
管程的定義
管程是可以被多個(gè)進(jìn)程/線程安全訪問的對(duì)象或模塊
管程匯總的方法是受到Mutex保護(hù)的伪嫁,意味著同一時(shí)刻只允許一個(gè)訪問者來使用它們领炫。
管程的特性
- 安全性
- 互斥性
- 共享性
很多流行的編程語言都實(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)景碟狞。
判斷是否開啟了ART_USE_FUTEXES宏
Mutex的加鎖邏輯:如果獲取到鎖,就直接返回婚陪,否則進(jìn)入掛起的狀態(tài)族沃。