国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux產(chǎn)生死鎖的必要條件和常見的鎖種類

這篇具有很好參考價值的文章主要介紹了Linux產(chǎn)生死鎖的必要條件和常見的鎖種類。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

前言

  1. 之前面試的時候,有面試官問我產(chǎn)生死鎖的(4個)必要條件,這個我之前有了解過,但是當(dāng)時覺得這些必要條件很官方,也就沒有重視,最后答得支支吾吾,面試官笑著說下去去可以看看,這個在面試中跟智能指針一樣還挺常見的;(面試全程都很順利,卡在這個簡單的問題上確實(shí)不應(yīng)該)
  2. 由此面試碰到了讓我介紹linux下mutex的種類,這個也是之前略知一二,但是詳細(xì)場景和機(jī)制還是欠缺;

這篇博客根據(jù)上面兩個面試中出現(xiàn)的問題,以本人個人理解進(jìn)行總結(jié):


產(chǎn)生死鎖的4個必要條件

下面四個必要條件不詳細(xì)介紹,如果不理解需要溫習(xí)一下mutex互斥量的作用和lock,unlock加鎖解鎖的底層原理;

(1)互斥條件:進(jìn)程要求對所分配的資源進(jìn)行排它性控制,即所分配的資源在一段時間內(nèi)某資源僅為一進(jìn)程所占用。
(2)請求與保持條件:當(dāng)進(jìn)程因請求資源而阻塞時,對已獲得的資源保持不放。(請求新資源的時候,保持已獲得的舊資源)
(3)不剝奪條件進(jìn)程已獲得的資源在未使用完之前,不能剝奪,只能在使用完時由自己釋放。
(4)循環(huán)等待條件:在發(fā)生死鎖時,必然存在一個進(jìn)程–資源的環(huán)形鏈。


預(yù)防(解決)死鎖

破壞4個必要條件中的任一個:

互斥這個規(guī)則,這個為了臨界區(qū)的安全,肯定不能破壞呀;那就破壞后3個;

(1)資源一次性分配一次性分配所有資源,用完一次性全部釋放,這樣就不會再有別的進(jìn)程請求時的沖突的現(xiàn)象了:

(2)可剝奪資源:即當(dāng)某進(jìn)程獲得了部分資源,但得不到其它資源,則釋放(剝奪)已占有的資源(破壞不可剝奪條件)
(3)資源有序分配法:系統(tǒng)給每類資源賦予一個編號,每一個進(jìn)程按編號遞增的順序請求資源,釋放則相反,就不會出現(xiàn)環(huán)路了(破壞環(huán)路等待條件);


Linux常見的鎖

我們在開發(fā)中常用的鎖主要有互斥鎖,遞歸鎖,自旋鎖,讀寫鎖、樂觀鎖和悲觀鎖這五種:

互斥鎖(普通鎖)

  • 正常進(jìn)程間保護(hù)臨界區(qū)的普通鎖,沒有什么特點(diǎn),就是lock()和unlock()的正常上鎖解鎖;
  1. 當(dāng)線程加鎖失敗時,內(nèi)核會把線程的狀態(tài)從運(yùn)行狀態(tài)設(shè)置為睡眠狀態(tài),然后把CPU切換給其他進(jìn)程運(yùn)行;

  2. 當(dāng)需要的鎖被其他線程釋放時,之前睡眠狀態(tài)的進(jìn)程會變?yōu)榫途w狀態(tài),然后內(nèi)核會在合適的時候,把CPU切換給該線程運(yùn)行。

普通鎖看似使用簡單,但是由于內(nèi)核幫我們切換進(jìn)程的內(nèi)核態(tài)和用戶態(tài),存在一定的開銷(進(jìn)行了兩次線程上下文切換)


自旋鎖

  • 自旋鎖在用戶態(tài)完成加鎖和解鎖的操作不會主動產(chǎn)生內(nèi)核態(tài)和用戶態(tài)的切換和上下文的切換,所以相比互斥鎖來說,會快一些,開銷也小一些。

自旋鎖的工作原理是在一段時間內(nèi)反復(fù)嘗試獲取被占用的鎖

當(dāng)加鎖失敗時,互斥鎖用線程切換來應(yīng)對,自旋鎖則用忙等待(反復(fù)嘗試獲取鎖)來應(yīng)對。


互斥鎖和自旋鎖小結(jié)

如果能確定被鎖住的代碼執(zhí)行時間很短,而且多核處理器,就應(yīng)該使用自旋鎖,減少了普通mutex線程上下文切換的開銷;

如果被鎖住的代碼執(zhí)行時間長,而且單核處理器,還是用普通mutex好點(diǎn),因?yàn)檫@時候遞歸鎖反復(fù)長時間輪詢檢測,無疑是浪費(fèi)了cpu資源的舉措

mutex和自旋鎖是鎖的兩種最基本處理方式,更高級的鎖都會選擇其中一個方式來實(shí)現(xiàn);

比如讀寫鎖既可以選擇基于互斥鎖實(shí)現(xiàn),也可以選擇基于自旋鎖實(shí)現(xiàn)。


遞歸鎖

遞歸鎖只是互斥鎖的一個特例,同樣只能有一個線程訪問該對象;

遞歸鎖允許同一個線程在 未釋放其擁有的鎖時 反復(fù)對 該鎖 進(jìn)行加鎖操作(普通的鎖就死鎖了)

顯然遞歸鎖的常見場景就是對某一個包含加鎖操作的遞歸類型函數(shù)進(jìn)行調(diào)用; 某線程反復(fù)遞歸這個函數(shù)的時候,使用遞歸鎖就不會像普通mutex那樣第二次遇到加鎖操作就直接進(jìn)入睡眠狀態(tài)掛起了;


讀寫鎖

線程間讀臨界區(qū)資源的時候,不阻塞,只有在有寫的時候才起到mutex的作用,線程間互相阻塞;

這是一種提高效率的鎖,比如mysql中的讀寫鎖,讀的時候因?yàn)椴粫薷呐R界區(qū)的資源,不會產(chǎn)生線程安全問題,因此讀不阻塞效率更高;

寫的時候存在線程安全問題,那就阻塞了;


樂觀鎖與悲觀鎖

悲觀鎖

前面提到的互斥鎖、自旋鎖、讀寫鎖,都屬于悲觀鎖

悲觀鎖認(rèn)為多線程同時對共享資源進(jìn)行修改的事件發(fā)生概率比較高,很容易出現(xiàn)沖突問題,所以訪問共享資源前,必須先上鎖。(做法有點(diǎn)謹(jǐn)慎,悲觀,因此得名)


樂觀鎖(無鎖編程)

  • 與悲觀鎖相反,樂觀鎖認(rèn)為沖突的概率很低;

它的工作方式是:先修改完共享資源,再驗(yàn)證這段時間內(nèi)有沒有發(fā)生沖突

  1. 如果沒有其他線程在修改資源,那么操作完成;(賺了,沒發(fā)生沖突而且執(zhí)行效率還高)
  2. 如果發(fā)現(xiàn)有其他線程已經(jīng)修改過這個資源,就直接無腦放棄本次操作。(不虧,有沖突,放棄這次操作以免事態(tài)惡化,之后進(jìn)行重試; 做法很樂觀,因此得名)

樂觀鎖全程沒有加鎖,所以它也叫無鎖編程


樂觀鎖和悲觀鎖小結(jié)

悲觀鎖直接進(jìn)行加鎖操作,進(jìn)行加鎖的操作,適用于沖突事件發(fā)生概率高的場景(這個場景用悲觀鎖得不停地)

樂觀鎖雖然去除了加鎖解鎖的操作,但是一旦發(fā)生沖突,重試的成本其實(shí)也非常高,所以只有在沖突事件發(fā)生的概率非常低,且加鎖成本非常高的場景(比如cpu執(zhí)行效率非常快)時,才考慮使用樂觀鎖

其他鎖(了解)

還有很多鎖,比如mysql在RR隔離級別下處理幻讀問題使用了row行鎖+GAP間隙鎖等,都是一些高級的適用于某種場景的鎖,所以鎖的可拓展性還是很大的;文章來源地址http://www.zghlxwxcb.cn/news/detail-833180.html

到了這里,關(guān)于Linux產(chǎn)生死鎖的必要條件和常見的鎖種類的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【100個 Unity實(shí)用技能】?? | 關(guān)于觸發(fā)器互相檢測的必要前提條件配置

    【100個 Unity實(shí)用技能】?? | 關(guān)于觸發(fā)器互相檢測的必要前提條件配置

    老規(guī)矩,先介紹一下 Unity 的科普小知識: Unity 是 實(shí)時3D互動內(nèi)容創(chuàng)作和運(yùn)營平臺 。 包括 游戲開發(fā) 、 美術(shù) 、 建筑 、 汽車設(shè)計 、 影視 在內(nèi)的所有創(chuàng)作者,借助 Unity 將創(chuàng)意變成現(xiàn)實(shí)。 Unity 平臺提供一整套完善的軟件解決方案,可用于創(chuàng)作、運(yùn)營和變現(xiàn)任何實(shí)時互動的2D和

    2023年04月09日
    瀏覽(37)
  • 越細(xì)粒度的鎖越好嗎?產(chǎn)生死鎖怎么辦?

    越細(xì)粒度的鎖越好嗎?產(chǎn)生死鎖怎么辦?

    大家好,我是哪吒。 上一篇提到了鎖粒度的問題,使用“越細(xì)粒度的鎖越好”,真的是這樣嗎?會不會產(chǎn)生一些其它問題?

    2024年02月08日
    瀏覽(18)
  • Java進(jìn)階(6)——搶購問題中的數(shù)據(jù)不安全(非原子性問題)& Java中的synchronize和ReentrantLock鎖使用 & 死鎖及其產(chǎn)生的條件

    Java進(jìn)階(6)——搶購問題中的數(shù)據(jù)不安全(非原子性問題)& Java中的synchronize和ReentrantLock鎖使用 & 死鎖及其產(chǎn)生的條件

    1.大量請求擁擠搶購中的數(shù)據(jù)不安全問題; 2.事務(wù)ACID:原子性(Atomicity)一致性(Consistency)隔離性(Isolation)持久性(Durability); 3.線程安全特征:原子性(Atomicity)可見性(Visibility)有序性(Ordering); 4.java中的鎖初步,synchronize鎖和ReentrantLock鎖使用初步; 5.濫用鎖的問

    2024年02月11日
    瀏覽(27)
  • MySQL innoDB 間隙鎖產(chǎn)生的死鎖問題

    線上經(jīng)常偶發(fā)死鎖問題,當(dāng)時處理一張表,也沒有聯(lián)表處理,但是有兩個mq入口,并且消息體存在一樣的情況,頻率還不是很低,這么一個背景,我非常容易懷疑到,兩個消息同時近到這一個事務(wù)里面導(dǎo)致的,但是是偶發(fā)的,又模擬不出來什么場景會導(dǎo)致死鎖,只能進(jìn)行代碼

    2024年02月08日
    瀏覽(20)
  • 什么條件下會出現(xiàn)死鎖,如何避免?

    什么條件下會出現(xiàn)死鎖,如何避免?

    死鎖,簡單來說就是兩個或者兩個以上的線程在執(zhí)行過程中,去爭奪同一個共享資源導(dǎo)致相互等待的現(xiàn)象。如果沒有外部干預(yù),線程會一直處于阻塞狀態(tài),無法往下執(zhí)行。這樣一直等待處于阻塞狀態(tài)的線程,被稱為死鎖線程。 產(chǎn)生死鎖需要同時滿足以下四個條件: 第一個:

    2024年02月12日
    瀏覽(26)
  • 多線程常見的鎖策略

    多線程常見的鎖策略

    目錄 1.1 樂觀鎖 和 悲觀鎖 1.2 輕量級鎖 和 重量級鎖 1.3 自旋鎖 和 掛起等待鎖 1.4 互斥鎖 和 讀寫鎖 1.5 可重入鎖 和 不可重入鎖 1.6 公平鎖 和 非公平鎖 1.7 synchronized 鎖的屬性 說到鎖,Java 里面常用的鎖有 synchronized ,鎖的意義在于在多線程并發(fā)執(zhí)行的時候保證線程安全,防止

    2023年04月25日
    瀏覽(25)
  • 設(shè)計模式第九講:常見重構(gòu)技巧 - 去除不必要的!=

    設(shè)計模式第九講:常見重構(gòu)技巧 - 去除不必要的!=

    項(xiàng)目中會存在大量判空代碼,多么丑陋繁冗!如何避免這種情況?我們是否濫用了判空呢?本文是設(shè)計模式第九講,講解常見重構(gòu)技巧:去除不必要的!= 通常是這樣的 初步的,使用Apache Commons,Guvava,Hutool等 StringUtils 考慮用Assert斷言 逐級判斷空,還是拋出自定義異常,還是

    2024年02月11日
    瀏覽(24)
  • 【Linux】修復(fù) Linux 錯誤 - 沒有可用的鎖

    在使用 Linux 操作系統(tǒng)時,有時會遇到錯誤消息“沒有可用的鎖”。這個錯誤通常與文件或進(jìn)程鎖相關(guān),可能會導(dǎo)致系統(tǒng)功能受限或無法正常工作。本文將介紹該錯誤的原因和解決方法。 “沒有可用的鎖”錯誤通常是由以下幾個原因引起的: 文件鎖沖突:當(dāng)多個進(jìn)程同時嘗試

    2024年02月03日
    瀏覽(20)
  • Java避免死鎖的幾個常見方法(有測試代碼和分析過程)

    Java避免死鎖的幾個常見方法(有測試代碼和分析過程)

    目錄 Java避免死鎖的幾個常見方法 死鎖產(chǎn)生的條件 上死鎖代碼 然后 :jstack 14320 jstack.text Java避免死鎖的幾個常見方法 Java避免死鎖的幾個常見方法 避免一個線程同時獲取多個鎖。 避免一個線程在鎖內(nèi)同時占用多個資源,盡量保證每個鎖只占用一個資源。 嘗試使用定時鎖,使

    2023年04月16日
    瀏覽(34)
  • 【Linux】線程安全-死鎖

    【Linux】線程安全-死鎖

    死鎖的兩種場景: 線程加鎖之后一直沒有將鎖釋放,在上一篇文中,我們模擬過這種場景,某個線程拿到鎖,進(jìn)行加鎖,線程退出之前沒有釋放鎖,導(dǎo)致后面的線程不能拿到鎖,一直在等待加鎖,導(dǎo)致程序一直不退出,這也是為什么條件變量等待函數(shù)中第二個參數(shù)是鎖的原因

    2024年02月10日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包