您好,登錄后才能下訂單哦!
這篇文章主要介紹了linux有幾種鎖機(jī)制的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇linux有幾種鎖機(jī)制文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。
linux鎖的種類:1、mutex(互斥鎖),用于保證在任何時(shí)刻,都只能有一個(gè)線程訪問(wèn)該對(duì)象;2、rwlock(讀寫(xiě)鎖),分為讀鎖和寫(xiě)鎖,適用于讀取數(shù)據(jù)的頻率遠(yuǎn)遠(yuǎn)大于寫(xiě)數(shù)據(jù)的頻率的場(chǎng)合;3、spinlock(自旋鎖),在任何時(shí)刻同樣只能有一個(gè)線程訪問(wèn)對(duì)象;4、seqlock(順序鎖),用于能夠區(qū)分讀與寫(xiě)的場(chǎng)合,并且是讀操作很多、寫(xiě)操作很少,寫(xiě)操作的優(yōu)先權(quán)大于讀操作。
本教程操作環(huán)境:linux7.3系統(tǒng)、Dell G3電腦。
互斥鎖:mutex
??互斥鎖:mutex,用于保證在任何時(shí)刻,都只能有一個(gè)線程訪問(wèn)該對(duì)象。當(dāng)獲取鎖操作失敗時(shí),線程會(huì)進(jìn)入睡眠,等待鎖釋放時(shí)被喚醒。
讀寫(xiě)鎖:rwlock
??讀寫(xiě)鎖:rwlock,分為讀鎖和寫(xiě)鎖。處于讀操作時(shí),可以允許多個(gè)線程同時(shí)獲得讀操作。但是同一時(shí)刻只能有一個(gè)線程可以獲得寫(xiě)鎖。其它獲取寫(xiě)鎖失敗的線程都會(huì)進(jìn)入睡眠狀態(tài),直到寫(xiě)鎖釋放時(shí)被喚醒。
注意:寫(xiě)鎖會(huì)阻塞其它讀寫(xiě)鎖。當(dāng)有一個(gè)線程獲得寫(xiě)鎖在寫(xiě)時(shí),讀鎖也不能被其它線程獲?。粚?xiě)者優(yōu)先于讀者(一旦有寫(xiě)者,則后續(xù)讀者必須等待,喚醒時(shí)優(yōu)先考慮寫(xiě)者)。
適用于讀取數(shù)據(jù)的頻率遠(yuǎn)遠(yuǎn)大于寫(xiě)數(shù)據(jù)的頻率的場(chǎng)合。
自旋鎖:spinlock
??自旋鎖:spinlock,在任何時(shí)刻同樣只能有一個(gè)線程訪問(wèn)對(duì)象。但是當(dāng)獲取鎖操作失敗時(shí),不會(huì)進(jìn)入睡眠,而是會(huì)在原地自旋,直到鎖被釋放。這樣節(jié)省了線程從睡眠狀態(tài)到被喚醒期間的消耗,在加鎖時(shí)間短暫的環(huán)境下會(huì)極大的提高效率。但如果加鎖時(shí)間過(guò)長(zhǎng),則會(huì)非常浪費(fèi)CPU資源。
RCU
??RCU:即read-copy-update,在修改數(shù)據(jù)時(shí),首先需要讀取數(shù)據(jù),然后生成一個(gè)副本,對(duì)副本進(jìn)行修改。修改完成后,再將老數(shù)據(jù)update成新的數(shù)據(jù)。
使用RCU時(shí),讀者幾乎不需要同步開(kāi)銷,既不需要獲得鎖,也不使用原子指令,不會(huì)導(dǎo)致鎖競(jìng)爭(zhēng),因此就不用考慮死鎖問(wèn)題了。而對(duì)于寫(xiě)者的同步開(kāi)銷較大,它需要復(fù)制被修改的數(shù)據(jù),還必須使用鎖機(jī)制同步并行其它寫(xiě)者的修改操作。在有大量讀操作,少量寫(xiě)操作的情況下效率非常高。
信號(hào)量:semaphore
linux內(nèi)核的信號(hào)量在概念和原理上與用戶態(tài)的SystemV的IPC機(jī)制信號(hào)量是一樣的,但是它絕不可能在內(nèi)核之外使用,因此它與SystemV的IPC機(jī)制信號(hào)量毫不相干。
信號(hào)量在創(chuàng)建時(shí)需要設(shè)置一個(gè)初始值,表示同時(shí)可以有幾個(gè)任務(wù)可以訪問(wèn)該信號(hào)量保護(hù)的共享資源,初始值為1就變成互斥鎖(Mutex),即同時(shí)只能有一個(gè)任務(wù)可以訪問(wèn)信號(hào)量保護(hù)的共享資源。一個(gè)任務(wù)要想訪問(wèn)共享資源,首先必須得到信號(hào)量,獲取信號(hào)量的操作將把信號(hào)量的值減1,若當(dāng)前信號(hào)量的值為負(fù)數(shù),表明無(wú)法獲得信號(hào)量,該任務(wù)必須掛起在該信號(hào)量的等待隊(duì)列等待該信號(hào)量可用;若當(dāng)前信號(hào)量的值為非負(fù)數(shù),表示可以獲得信號(hào)量,因而可以立刻訪問(wèn)被該信號(hào)量保護(hù)的共享資源。當(dāng)任務(wù)訪問(wèn)完被信號(hào)量保護(hù)的共享資源后,必須釋放信號(hào)量,釋放信號(hào)量通過(guò)把信號(hào)量的值加1實(shí)現(xiàn),如果信號(hào)量的值為非正數(shù),表明有任務(wù)等待當(dāng)前信號(hào)量,因此它也喚醒所有等待該信號(hào)量的任務(wù)。
rw_semaphore (讀寫(xiě)信號(hào)量)
讀寫(xiě)信號(hào)量對(duì)訪問(wèn)者進(jìn)行了細(xì)分,或者為讀者,或者為寫(xiě)者,讀者在保持讀寫(xiě)信號(hào)量期間只能對(duì)該讀寫(xiě)信號(hào)量保護(hù)的共享資源進(jìn)行讀訪問(wèn),如果一個(gè)任務(wù)除了需要讀,可能還需要寫(xiě),那么它必須被歸類為寫(xiě)者,它在對(duì)共享資源訪問(wèn)之前必須先獲得寫(xiě)者身份,寫(xiě)者在發(fā)現(xiàn)自己不需要寫(xiě)訪問(wèn)的情況下可以降級(jí)為讀者。讀寫(xiě)信號(hào)量同時(shí)擁有的讀者數(shù)不受限制,也就說(shuō)可以有任意多個(gè)讀者同時(shí)擁有一個(gè)讀寫(xiě)信號(hào)量。如果一個(gè)讀寫(xiě)信號(hào)量當(dāng)前沒(méi)有被寫(xiě)者擁有并且也沒(méi)有寫(xiě)者等待讀者釋放信號(hào)量,那么任何讀者都可以成功獲得該讀寫(xiě)信號(hào)量;否則,讀者必須被掛起直到寫(xiě)者釋放該信號(hào)量。如果一個(gè)讀寫(xiě)信號(hào)量當(dāng)前沒(méi)有被讀者或?qū)懻邠碛胁⑶乙矝](méi)有寫(xiě)者等待該信號(hào)量,那么一個(gè)寫(xiě)者可以成功獲得該讀寫(xiě)信號(hào)量,否則寫(xiě)者將被掛起,直到?jīng)]有任何訪問(wèn)者。因此,寫(xiě)者是排他性的,獨(dú)占性的。
讀寫(xiě)信號(hào)量有兩種實(shí)現(xiàn),一種是通用的,不依賴于硬件架構(gòu),因此,增加新的架構(gòu)不需要重新實(shí)現(xiàn)它,但缺點(diǎn)是性能低,獲得和釋放讀寫(xiě)信號(hào)量的開(kāi)銷大;另一種是架構(gòu)相關(guān)的,因此性能高,獲取和釋放讀寫(xiě)信號(hào)量的開(kāi)銷小,但增加新的架構(gòu)需要重新實(shí)現(xiàn)。在內(nèi)核配置時(shí),可以通過(guò)選項(xiàng)去控制使用哪一種實(shí)現(xiàn)。
讀寫(xiě)信號(hào)量:rw_semaphore
讀寫(xiě)信號(hào)量對(duì)訪問(wèn)者進(jìn)行了細(xì)分,或者為讀者,或者為寫(xiě)者,讀者在保持讀寫(xiě)信號(hào)量期間只能對(duì)該讀寫(xiě)信號(hào)量保護(hù)的共享資源進(jìn)行讀訪問(wèn),如果一個(gè)任務(wù)除了需要讀,可能還需要寫(xiě),那么它必須被歸類為寫(xiě)者,它在對(duì)共享資源訪問(wèn)之前必須先獲得寫(xiě)者身份,寫(xiě)者在發(fā)現(xiàn)自己不需要寫(xiě)訪問(wèn)的情況下可以降級(jí)為讀者。讀寫(xiě)信號(hào)量同時(shí)擁有的讀者數(shù)不受限制,也就說(shuō)可以有任意多個(gè)讀者同時(shí)擁有一個(gè)讀寫(xiě)信號(hào)量。如果一個(gè)讀寫(xiě)信號(hào)量當(dāng)前沒(méi)有被寫(xiě)者擁有并且也沒(méi)有寫(xiě)者等待讀者釋放信號(hào)量,那么任何讀者都可以成功獲得該讀寫(xiě)信號(hào)量;否則,讀者必須被掛起直到寫(xiě)者釋放該信號(hào)量。如果一個(gè)讀寫(xiě)信號(hào)量當(dāng)前沒(méi)有被讀者或?qū)懻邠碛胁⑶乙矝](méi)有寫(xiě)者等待該信號(hào)量,那么一個(gè)寫(xiě)者可以成功獲得該讀寫(xiě)信號(hào)量,否則寫(xiě)者將被掛起,直到?jīng)]有任何訪問(wèn)者。因此,寫(xiě)者是排他性的,獨(dú)占性的。
讀寫(xiě)信號(hào)量有兩種實(shí)現(xiàn),一種是通用的,不依賴于硬件架構(gòu),因此,增加新的架構(gòu)不需要重新實(shí)現(xiàn)它,但缺點(diǎn)是性能低,獲得和釋放讀寫(xiě)信號(hào)量的開(kāi)銷大;另一種是架構(gòu)相關(guān)的,因此性能高,獲取和釋放讀寫(xiě)信號(hào)量的開(kāi)銷小,但增加新的架構(gòu)需要重新實(shí)現(xiàn)。在內(nèi)核配置時(shí),可以通過(guò)選項(xiàng)去控制使用哪一種實(shí)現(xiàn)。
seqlock****(順序鎖)
用于能夠區(qū)分讀與寫(xiě)的場(chǎng)合,并且是讀操作很多、寫(xiě)操作很少,寫(xiě)操作的優(yōu)先權(quán)大于讀操作。seqlock的實(shí)現(xiàn)思路是,用一個(gè)遞增的整型數(shù)表示sequence。寫(xiě)操作進(jìn)入臨界區(qū)時(shí),sequence++;退出臨界區(qū)時(shí),sequence再++。
寫(xiě)操作還需要獲得一個(gè)鎖(比如mutex),這個(gè)鎖僅用于寫(xiě)寫(xiě)互斥,以保證同一時(shí)間最多只有一個(gè)正在進(jìn)行的寫(xiě)操作。當(dāng)sequence為奇數(shù)時(shí),表示有寫(xiě)操作正在進(jìn)行,這時(shí)讀操作要進(jìn)入臨界區(qū)需要等待,直到sequence變?yōu)榕紨?shù)。讀操作進(jìn)入臨界區(qū)時(shí),需要記錄下當(dāng)前sequence的值,等它退出臨界區(qū)的時(shí)候用記錄的sequence與當(dāng)前sequence做比較,不相等則表示在讀操作進(jìn)入臨界區(qū)期間發(fā)生了寫(xiě)操作,這時(shí)候讀操作讀到的東西是無(wú)效的,需要返回重試。
seqlock寫(xiě)寫(xiě)是必須要互斥的。但是seqlock的應(yīng)用場(chǎng)景本身就是讀多寫(xiě)少的情況,寫(xiě)沖突的概率是很低的。所以這里的寫(xiě)寫(xiě)互斥基本上不會(huì)有什么性能損失。而讀寫(xiě)操作是不需要互斥的。seqlock的應(yīng)用場(chǎng)景是寫(xiě)操作優(yōu)先于讀操作,對(duì)于寫(xiě)操作來(lái)說(shuō),幾乎是沒(méi)有阻塞的(除非發(fā)生寫(xiě)寫(xiě)沖突這一小概率事件),只需要做sequence++這一附加動(dòng)作。而讀操作也不需要阻塞,只是當(dāng)發(fā)現(xiàn)讀寫(xiě)沖突時(shí)需要retry。seqlock的一個(gè)典型應(yīng)用是時(shí)鐘的更新,系統(tǒng)中每1毫秒會(huì)有一個(gè)時(shí)鐘中斷,相應(yīng)的中斷處理程序會(huì)更新時(shí)鐘(寫(xiě)操作)。
而用戶程序可以調(diào)用gettimeofday之類的系統(tǒng)調(diào)用來(lái)獲取當(dāng)前時(shí)間(讀操作)。在這種情況下,使用seqlock可以避免過(guò)多的gettimeofday系統(tǒng)調(diào)用把中斷處理程序給阻塞了(如果使用讀寫(xiě)鎖,而不用seqlock的話就會(huì)這樣)。中斷處理程序總是優(yōu)先的,而如果gettimeofday系統(tǒng)調(diào)用與之沖突了,那用戶程序多等等也無(wú)妨。
1)讀寫(xiě)鎖區(qū)分讀者和寫(xiě)者,而互斥鎖不區(qū)分
2)互斥鎖同一時(shí)間只允許一個(gè)線程訪問(wèn)該對(duì)象,無(wú)論讀寫(xiě);讀寫(xiě)鎖同一時(shí)間內(nèi)只允許一個(gè)寫(xiě)者,但是允許多個(gè)讀者同時(shí)讀對(duì)象。
關(guān)于“l(fā)inux有幾種鎖機(jī)制”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“l(fā)inux有幾種鎖機(jī)制”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。