系统进程间的同步机制
說(shuō)出你所知道的各類linux系統(tǒng)的各類同步機(jī)制(重點(diǎn)),什么是死鎖?如何避免死鎖
linux系統(tǒng)的通訊機(jī)制,主要是指進(jìn)程間通訊,其實(shí)通訊就是進(jìn)程同步的手段。如果問(wèn)進(jìn)程間同步,見問(wèn)題7,這里要說(shuō)的linux系統(tǒng)的同步機(jī)制是講線程間的同步。?
簡(jiǎn)單總結(jié)一下。更多資料參考《unix環(huán)境高級(jí)編程》、《操作系統(tǒng)》。?
互斥量?
首先是最基礎(chǔ)的加鎖原語(yǔ),互斥量。既確保同一時(shí)間只有一個(gè)線程訪問(wèn)數(shù)據(jù),通過(guò)在訪問(wèn)共享資源前對(duì)互斥量加鎖,阻塞其他試圖再次加鎖的線程知道互斥鎖被釋放。互斥的具體實(shí)現(xiàn)有多種方法,例如開關(guān)中斷,使用原子的機(jī)器指令。?
讀寫鎖?
與互斥量類似,不過(guò)允許更高的并行性。讀寫鎖有三種狀態(tài),讀模式的加鎖,寫模式的加鎖,不加鎖狀態(tài)。一次只有一個(gè)線程可以占有寫模式的讀寫鎖,但是可以多個(gè)線程可以同時(shí)占用讀模式的讀寫鎖。既讀模式下可以共享,寫模式下互斥。一般一個(gè)線程試圖以讀模式獲取鎖時(shí),讀寫鎖通常會(huì)阻塞隨后的讀模式鎖請(qǐng)求。?
條件變量?
互斥量是加鎖原語(yǔ),條件變量屬于等待原語(yǔ),用于等待某個(gè)條件成立后喚醒阻塞的線程。條件變量與互斥量一起使用,條件本身由互斥量保護(hù)。Java Object內(nèi)置了條件變量wait(),notify(),notifyAll()。 ?
pthread_cond_wait(),pthread_cond_signal(),pthread_cond_broadcast(Unix),從函數(shù)的命名就可以看出其大致作用。?
根據(jù)陳碩的總結(jié),條件變量的正確使用方式:?
對(duì)于wait端:?
1.必須與mutex一起使用。?
2.在mutex已上鎖時(shí)才能調(diào)用wait()。?
3.把判斷布爾條件和wait()放到while循環(huán)中。?
第三個(gè)條件主要是為了防止spurious wakeup,既虛假喚醒。因?yàn)閜thread_conf_wait能被除了pthread_cond_signal(),pthread_cond_broadcast外的其他信號(hào)喚醒。需要再wait后再次檢查,同時(shí)也是為了避免錯(cuò)過(guò)一次條件變量后永遠(yuǎn)的等待下去。?
對(duì)于signal端:?
1.一定不要在mutex已經(jīng)上鎖的情況下調(diào)用signal。?
2.在signal之前一般要修改布爾表達(dá)式。?
3.修改布爾表達(dá)式通常用mutex保護(hù)。?
4.注意區(qū)分signal和broadcast:“broadcast通常用于表明狀態(tài)變化,signal通常用于表示資源可用”。?
自旋鎖?
自旋鎖與互斥量類似,但它不是通過(guò)休眠使進(jìn)程阻塞,二是在獲取鎖之前一直處于忙等。既一直占用CPU資源直到鎖被釋放。?
屏障?
屏障主要用于多個(gè)線程之間的并行工作的協(xié)調(diào)。屏障允許每個(gè)線程等待,直到所有的合作線程都達(dá)到某個(gè)點(diǎn),然后從該點(diǎn)繼續(xù)執(zhí)行。?
信號(hào)量?
這個(gè)在《unix環(huán)境高級(jí)編程》中沒有提及,在《操作系統(tǒng)》中有論述。?
信號(hào)量可作用與進(jìn)程間合作,以及多線程的同步。?
一個(gè)進(jìn)程可以被迫在某一個(gè)位置停止,直到接收到某一個(gè)信號(hào)。為了發(fā)信號(hào),需要使用一個(gè)稱為信號(hào)量的特殊變量,可以看做一個(gè)具有整數(shù)值得變量。其中只允許信號(hào)量取0和1的稱為二元信號(hào)量。非二元信號(hào)量常稱為計(jì)數(shù)信號(hào)量或一般信號(hào)量。?
一般在信號(hào)量上定義三個(gè)操作:?
1.一個(gè)信號(hào)量可以初始化成非負(fù)數(shù)。?
2.semWait操作使信號(hào)量減1。如果值變?yōu)樨?fù)數(shù),則執(zhí)行semWait的進(jìn)程或線程被阻塞,否則繼續(xù)執(zhí)行。?
3.semSignal操作使信號(hào)量加1。如果值<=0,則被semWait阻塞的進(jìn)程被解除阻塞。?
信號(hào)量需要隊(duì)列保存阻塞在信號(hào)量上等待的進(jìn)程。至于進(jìn)程按什么順序移除,最公平的是先進(jìn)先出,采用此策略的為強(qiáng)信號(hào)量。沒有規(guī)定順序的為弱信號(hào)量。?
互斥量和二元信號(hào)量的主要區(qū)別在于互斥量的加鎖和解鎖必須由同一線程分別對(duì)應(yīng)使用,信號(hào)量可以由一個(gè)線程釋放,另一個(gè)線程得到。至于用于互斥和用于同步的說(shuō)法,十分牽強(qiáng)。?
陳碩關(guān)于信號(hào)量的建議是不用。?
因?yàn)榭捎脳l件變量加互斥量完全代替,另外還需要擔(dān)心計(jì)數(shù)值需要和自己的數(shù)據(jù)長(zhǎng)度常常保持一致的問(wèn)題。?
死鎖?
死鎖大概已經(jīng)被講爛了,我也不想再搬運(yùn)了。堅(jiān)持使用Scoped Locking,死鎖的時(shí)候好檢測(cè)。?
? ?補(bǔ)充一個(gè)坑爹坑爹坑爹坑爹的問(wèn)題:系統(tǒng)如何將一個(gè)信號(hào)通知到進(jìn)程?
? ? ?前面講過(guò)信號(hào)了,為什么又問(wèn)一遍?這個(gè)問(wèn)題有什么特殊的地方么??
? ? ?內(nèi)核給進(jìn)程發(fā)送信號(hào),是在進(jìn)程所在的進(jìn)程表項(xiàng)的信號(hào)域設(shè)置對(duì)應(yīng)的信號(hào)的位。
? ? ? ? 更多:http://blog.csdn.net/joejames/article/details/37960873?
總結(jié)
以上是生活随笔為你收集整理的系统进程间的同步机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 多进程和多线程的区别
- 下一篇: TCP/IP网络中专有名词注解