浅析死锁
什么是死鎖?
??死鎖就是兩個(gè)或多個(gè)進(jìn)程在執(zhí)行的過(guò)程中,由于競(jìng)爭(zhēng)資源或者由于彼此通信而造成的一種阻塞現(xiàn)象,當(dāng)進(jìn)程處于這種狀態(tài)時(shí),如果沒(méi)有外力的作用,這些進(jìn)程都無(wú)法繼續(xù)向前進(jìn)行。這是操作系統(tǒng)層面的一個(gè)錯(cuò)誤,是進(jìn)程死鎖的簡(jiǎn)稱。
產(chǎn)生死鎖的原因:
資源競(jìng)爭(zhēng)
??系統(tǒng)中額資源分為可剝奪資源和不可剝奪資源。可剝奪資源指的是某進(jìn)程在獲得這類資源后,這份資源還可以繼續(xù)被其他進(jìn)程或者系統(tǒng)所獲得,CPU和主存均屬于可剝奪資源,比如說(shuō)可以把一個(gè)進(jìn)程從一個(gè)存儲(chǔ)區(qū)移到另一個(gè)存儲(chǔ)區(qū)。不可剝奪資源指的是系統(tǒng)把資源分配給某個(gè)進(jìn)程后,就不能強(qiáng)行把這份資源收回,只能在該進(jìn)程結(jié)束后自行釋放,比如說(shuō)一個(gè)進(jìn)程正在使用打印機(jī)打印一份文件,這時(shí)如果要給這個(gè)打印機(jī)重新分配一個(gè)進(jìn)程,那么打印出來(lái)的文件一定會(huì)受損,所以只能等這個(gè)進(jìn)程結(jié)束了,自己釋放這個(gè)打印機(jī)。
 ?? 通俗說(shuō):可剝奪資源就是你正在吃的饅頭,當(dāng)你剛拿起饅頭時(shí),一個(gè)比你彪悍的人和你要這個(gè)饅頭,你就得給他。不可剝奪資源就是你已經(jīng)吃進(jìn)肚子里的饅頭,這個(gè)彪悍的人想和你要這個(gè)已經(jīng)吃了的饅頭也要不到。
 ??產(chǎn)生死鎖中有關(guān)資源競(jìng)爭(zhēng)的其中一個(gè)就是競(jìng)爭(zhēng)不可剝奪資源,就按上面的例子,當(dāng)P1正在使用A打印機(jī)的時(shí)候,如果P2也要使用打印機(jī)A,那么打印機(jī)A就會(huì)阻塞
 產(chǎn)生死鎖中有關(guān)資源競(jìng)爭(zhēng)的另一個(gè)就是競(jìng)爭(zhēng)臨時(shí)資源,這些臨時(shí)資源一般有中斷、信號(hào)、消息等,通常消息通信順序進(jìn)行不當(dāng)時(shí),就會(huì)產(chǎn)生死鎖。
產(chǎn)生死鎖的4個(gè)必要條件
 1、互斥條件
 2、請(qǐng)求與保持條件
 3、不可剝奪條件
 4、環(huán)路等待條件
 互斥條件:在同一時(shí)刻只有一個(gè)線程可以操作
 請(qǐng)求與保持條件:嘴里吃著饅頭,還想要隔壁桌上的饅頭,隔壁桌子上的饅頭吃不著,自己的也不放
 不可剝奪條件上面已經(jīng)給出
 環(huán)路等待條件:A拿著A的饅頭去請(qǐng)求B的饅頭,同時(shí)B又拿著B(niǎo)的饅頭去請(qǐng)求A的饅頭,這樣就造成了一個(gè)環(huán)路
預(yù)防死鎖:
??破壞四個(gè)必要條件中的一個(gè)或幾個(gè)條件,易于實(shí)現(xiàn),但會(huì)導(dǎo)致資源利用率和系統(tǒng)吞吐量降低,有效預(yù)防死鎖的三個(gè)方案:
 ??a.舍棄“請(qǐng)求和保持”條件:要求所有的進(jìn)程一次性申請(qǐng)完所需的全部資源,不出現(xiàn)資源等待
 ??b.舍棄“不剝奪”條件:如果進(jìn)程已經(jīng)保持了資源,如果他在提出新的資源要求并且不能立刻滿足,這個(gè)進(jìn)程就必須釋放自己已經(jīng)保持的所有資源,以后需要重新申請(qǐng)。
 ??c.舍棄“環(huán)路等待”條件:將資源進(jìn)行分類并按順序排列,所有進(jìn)程請(qǐng)求資源時(shí)必須嚴(yán)格按照排列好的遞增次序來(lái)進(jìn)行,不出現(xiàn)環(huán)路情況。
避免死鎖:
??可以采用銀行家算法和死鎖檢測(cè)算法來(lái)避免產(chǎn)生死鎖
總結(jié)
 
                            
                        - 上一篇: Python 操作 Kafka ---
- 下一篇: Kali Linux 和 渗透测试
