亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

    linux鎖有哪幾種

    linux鎖的種類:1、mutex(互斥鎖),用于保證在任何時刻,都只能有一個線程訪問該對象;2、rwlock(讀寫鎖),分為讀鎖和寫鎖,適用于讀取數(shù)據(jù)的頻率遠(yuǎn)遠(yuǎn)大于寫數(shù)據(jù)的頻率的場合;3、spinlock(自旋鎖),在任何時刻同樣只能有一個線程訪問對象;4、seqlock(順序鎖),用于能夠區(qū)分讀與寫的場合,并且是讀操作很多、寫操作很少,寫操作的優(yōu)先權(quán)大于讀操作。

    linux鎖有哪幾種

    本教程操作環(huán)境:linux7.3系統(tǒng)、Dell G3電腦。

    Linux的幾種鎖機(jī)制

    互斥鎖:mutex

    ??互斥鎖:mutex,用于保證在任何時刻,都只能有一個線程訪問該對象。當(dāng)獲取鎖操作失敗時,線程會進(jìn)入睡眠,等待鎖釋放時被喚醒。

    讀寫鎖:rwlock

    ??讀寫鎖:rwlock,分為讀鎖和寫鎖。處于讀操作時,可以允許多個線程同時獲得讀操作。但是同一時刻只能有一個線程可以獲得寫鎖。其它獲取寫鎖失敗的線程都會進(jìn)入睡眠狀態(tài),直到寫鎖釋放時被喚醒。

    注意:寫鎖會阻塞其它讀寫鎖。當(dāng)有一個線程獲得寫鎖在寫時,讀鎖也不能被其它線程獲??;寫者優(yōu)先于讀者(一旦有寫者,則后續(xù)讀者必須等待,喚醒時優(yōu)先考慮寫者)。

    • 適用于讀取數(shù)據(jù)的頻率遠(yuǎn)遠(yuǎn)大于寫數(shù)據(jù)的頻率的場合。

    自旋鎖:spinlock

    ??自旋鎖:spinlock,在任何時刻同樣只能有一個線程訪問對象。但是當(dāng)獲取鎖操作失敗時,不會進(jìn)入睡眠,而是會在原地自旋,直到鎖被釋放。這樣節(jié)省了線程從睡眠狀態(tài)到被喚醒期間的消耗,在加鎖時間短暫的環(huán)境下會極大的提高效率。但如果加鎖時間過長,則會非常浪費CPU資源。

    RCU

    ??RCU:即read-copy-update,在修改數(shù)據(jù)時,首先需要讀取數(shù)據(jù),然后生成一個副本,對副本進(jìn)行修改。修改完成后,再將老數(shù)據(jù)update成新的數(shù)據(jù)。

    使用RCU時,讀者幾乎不需要同步開銷,既不需要獲得鎖,也不使用原子指令,不會導(dǎo)致鎖競爭,因此就不用考慮死鎖問題了。而對于寫者的同步開銷較大,它需要復(fù)制被修改的數(shù)據(jù),還必須使用鎖機(jī)制同步并行其它寫者的修改操作。在有大量讀操作,少量寫操作的情況下效率非常高。

    信號量:semaphore

    linux內(nèi)核的信號量在概念和原理上與用戶態(tài)的SystemV的IPC機(jī)制信號量是一樣的,但是它絕不可能在內(nèi)核之外使用,因此它與SystemV的IPC機(jī)制信號量毫不相干。

    信號量在創(chuàng)建時需要設(shè)置一個初始值,表示同時可以有幾個任務(wù)可以訪問該信號量保護(hù)的共享資源,初始值為1就變成互斥鎖(Mutex),即同時只能有一個任務(wù)可以訪問信號量保護(hù)的共享資源。一個任務(wù)要想訪問共享資源,首先必須得到信號量,獲取信號量的操作將把信號量的值減1,若當(dāng)前信號量的值為負(fù)數(shù),表明無法獲得信號量,該任務(wù)必須掛起在該信號量的等待隊列等待該信號量可用;若當(dāng)前信號量的值為非負(fù)數(shù),表示可以獲得信號量,因而可以立刻訪問被該信號量保護(hù)的共享資源。當(dāng)任務(wù)訪問完被信號量保護(hù)的共享資源后,必須釋放信號量,釋放信號量通過把信號量的值加1實現(xiàn),如果信號量的值為非正數(shù),表明有任務(wù)等待當(dāng)前信號量,因此它也喚醒所有等待該信號量的任務(wù)。

    rw_semaphore (讀寫信號量)

    讀寫信號量對訪問者進(jìn)行了細(xì)分,或者為讀者,或者為寫者,讀者在保持讀寫信號量期間只能對該讀寫信號量保護(hù)的共享資源進(jìn)行讀訪問,如果一個任務(wù)除了需要讀,可能還需要寫,那么它必須被歸類為寫者,它在對共享資源訪問之前必須先獲得寫者身份,寫者在發(fā)現(xiàn)自己不需要寫訪問的情況下可以降級為讀者。讀寫信號量同時擁有的讀者數(shù)不受限制,也就說可以有任意多個讀者同時擁有一個讀寫信號量。如果一個讀寫信號量當(dāng)前沒有被寫者擁有并且也沒有寫者等待讀者釋放信號量,那么任何讀者都可以成功獲得該讀寫信號量;否則,讀者必須被掛起直到寫者釋放該信號量。如果一個讀寫信號量當(dāng)前沒有被讀者或?qū)懻邠碛胁⑶乙矝]有寫者等待該信號量,那么一個寫者可以成功獲得該讀寫信號量,否則寫者將被掛起,直到?jīng)]有任何訪問者。因此,寫者是排他性的,獨占性的。
    讀寫信號量有兩種實現(xiàn),一種是通用的,不依賴于硬件架構(gòu),因此,增加新的架構(gòu)不需要重新實現(xiàn)它,但缺點是性能低,獲得和釋放讀寫信號量的開銷大;另一種是架構(gòu)相關(guān)的,因此性能高,獲取和釋放讀寫信號量的開銷小,但增加新的架構(gòu)需要重新實現(xiàn)。在內(nèi)核配置時,可以通過選項去控制使用哪一種實現(xiàn)。

    讀寫信號量:rw_semaphore

    讀寫信號量對訪問者進(jìn)行了細(xì)分,或者為讀者,或者為寫者,讀者在保持讀寫信號量期間只能對該讀寫信號量保護(hù)的共享資源進(jìn)行讀訪問,如果一個任務(wù)除了需要讀,可能還需要寫,那么它必須被歸類為寫者,它在對共享資源訪問之前必須先獲得寫者身份,寫者在發(fā)現(xiàn)自己不需要寫訪問的情況下可以降級為讀者。讀寫信號量同時擁有的讀者數(shù)不受限制,也就說可以有任意多個讀者同時擁有一個讀寫信號量。如果一個讀寫信號量當(dāng)前沒有被寫者擁有并且也沒有寫者等待讀者釋放信號量,那么任何讀者都可以成功獲得該讀寫信號量;否則,讀者必須被掛起直到寫者釋放該信號量。如果一個讀寫信號量當(dāng)前沒有被讀者或?qū)懻邠碛胁⑶乙矝]有寫者等待該信號量,那么一個寫者可以成功獲得該讀寫信號量,否則寫者將被掛起,直到?jīng)]有任何訪問者。因此,寫者是排他性的,獨占性的。

    讀寫信號量有兩種實現(xiàn),一種是通用的,不依賴于硬件架構(gòu),因此,增加新的架構(gòu)不需要重新實現(xiàn)它,但缺點是性能低,獲得和釋放讀寫信號量的開銷大;另一種是架構(gòu)相關(guān)的,因此性能高,獲取和釋放讀寫信號量的開銷小,但增加新的架構(gòu)需要重新實現(xiàn)。在內(nèi)核配置時,可以通過選項去控制使用哪一種實現(xiàn)。

    seqlock****(順序鎖)

    用于能夠區(qū)分讀與寫的場合,并且是讀操作很多、寫操作很少,寫操作的優(yōu)先權(quán)大于讀操作。seqlock的實現(xiàn)思路是,用一個遞增的整型數(shù)表示sequence。寫操作進(jìn)入臨界區(qū)時,sequence++;退出臨界區(qū)時,sequence再++。

    寫操作還需要獲得一個鎖(比如mutex),這個鎖僅用于寫寫互斥,以保證同一時間最多只有一個正在進(jìn)行的寫操作。當(dāng)sequence為奇數(shù)時,表示有寫操作正在進(jìn)行,這時讀操作要進(jìn)入臨界區(qū)需要等待,直到sequence變?yōu)榕紨?shù)。讀操作進(jìn)入臨界區(qū)時,需要記錄下當(dāng)前sequence的值,等它退出臨界區(qū)的時候用記錄的sequence與當(dāng)前sequence做比較,不相等則表示在讀操作進(jìn)入臨界區(qū)期間發(fā)生了寫操作,這時候讀操作讀到的東西是無效的,需要返回重試。

    seqlock寫寫是必須要互斥的。但是seqlock的應(yīng)用場景本身就是讀多寫少的情況,寫沖突的概率是很低的。所以這里的寫寫互斥基本上不會有什么性能損失。而讀寫操作是不需要互斥的。seqlock的應(yīng)用場景是寫操作優(yōu)先于讀操作,對于寫操作來說,幾乎是沒有阻塞的(除非發(fā)生寫寫沖突這一小概率事件),只需要做sequence++這一附加動作。而讀操作也不需要阻塞,只是當(dāng)發(fā)現(xiàn)讀寫沖突時需要retry。seqlock的一個典型應(yīng)用是時鐘的更新,系統(tǒng)中每1毫秒會有一個時鐘中斷,相應(yīng)的中斷處理程序會更新時鐘(寫操作)。

    而用戶程序可以調(diào)用gettimeofday之類的系統(tǒng)調(diào)用來獲取當(dāng)前時間(讀操作)。在這種情況下,使用seqlock可以避免過多的gettimeofday系統(tǒng)調(diào)用把中斷處理程序給阻塞了(如果使用讀寫鎖,而不用seqlock的話就會這樣)。中斷處理程序總是優(yōu)先的,而如果gettimeofday系統(tǒng)調(diào)用與之沖突了,那用戶程序多等等也無妨。

    互斥鎖和讀寫鎖的區(qū)別:

    1)讀寫鎖區(qū)分讀者和寫者,而互斥鎖不區(qū)分

    2)互斥鎖同一時間只允許一個線程訪問該對象,無論讀寫;讀寫鎖同一時間內(nèi)只允許一個寫者,但是允許多個讀者同時讀對象。

    贊(0)
    分享到: 更多 (0)
    網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號