笑对 死锁
第一次聽到這個詞是在今年九期師哥李社河講的,大概是關于我們學校的考試系統,因為死鎖引起了一些列的問題,最終被社河師哥解決,當時,聽到死鎖這個詞,可謂是一頭霧水,什么都不知道,什么都不明了,事后也查過死鎖這個詞,但是,還是不明所以
?
沒有想到,在我們學習自考的操作系統中,就有一小章節來專門講了這個死鎖,頓時,又懵了,看書,上網,總算是有了點體悟:(個人學習理解,不一定對,日后定有更新)
要說死鎖的形成,就要講一下什么是并發進程,因為,死鎖是當一組進程(至少有兩個),它們中的每一個進程都占用了某種資源,而又都在等待其他進程所占用的資源,造成組進程一直處于等待不能結束的狀態如圖:
?
下面給大家解釋一下,如圖所示,進程T1占用了資源R1,進程T2占用了資源R2,可是,大家知道,處理器一次只能執行一個進程,所以要想進程T1或者T2結束進程并釋放資源的話,就要等著對方先把資源釋放出來給自己,但是要命的是雙方都是這么想,所以就一直僵持,等著對方把資源釋放,可是由于進程進行所需要申請的資源被對方占用并且不能釋放,所以,造成一種死等待,就是死鎖。不知道這么說大家能理解不能
其實在我們的社會中,也有不少類似死鎖的問題,其中最形象的是交通:
?
就像這幅交通圖,四個方向的車就好比一組四個并發進程,他們只需要直行,中心路就就是他們所欲要的資源(共享),可是,這個資源被其他方向的車占用,導致自己的車想通過路口就要讓其他所有停在路口的車讓開,可每個司機都是這么想,所以就一直等待啊等待,等待啊等待,一直也沒有結果,為了解決這個問題(交通死鎖),我們裝上了交通紅綠燈(我們的PV操作)
?
同樣,針對我們電腦編程上的死鎖,我們也有解決辦法:
通過總結,我們得出,系統出現死鎖必須同時保持四個必要條件:
1、互斥的使用資源(一個資源每次只能給一個進程使用)
2、占有等待資源(當一個進程申請資源得不到滿足的時候,會處于等待狀態且由于沒 有之行結束,不會 釋放所占有的資源)
3、非搶奪是分配資源(不能搶奪對方已占用的資源)
4、循環等待資源
?
有了這四條,我們就可以見縫插針,對癥下藥了
一、死鎖的防治:
1、靜態分配資源(通俗點講,就是在進程開始執行之前,就將其所需要的資源全都備 齊,不需要再額外 申請資源,可是,這大大的降低了資源的利用率啊)
2、按序分配資源(給資源編上大小號,規定所有申請兩個以上資源的進程都要先申請 小號資源,逐漸加 大,這樣就避免了所有進程都處于等待別人的占用資源的現象)
3、剝奪式分配資源(這就不用多說了吧)(目前只適用于處理器和主存資源的分配)
舉個例子:
??????
就拿課本上的例子來說,五個哲學家,五根筷子,一盤面,每兩個人之間放一根筷子
如果這些哲學家懂得謙讓還好,一個人吃完另一個人在吃,就都能吃到,可是,誰又想餓著呢?如果每個人都拿起自己身邊的一根筷子,就沒個人就只有一根筷子,結果還得到別人給自己一根讓自己吃,怕就怕每個人都這么想
解決辦法:
1、P1分兩根筷子,P5分兩根筷子,等自己吃飽后,就把自己手中的兩個筷子一起傳給 下一個人(還沒吃 飯的)——靜態分配法
2、給筷子編上號,1,2,3,4,5,規定,每個人拿自己身邊筷子的時候必須從小號開始,有 ????了小號才能拿 大號,否則亂棍打死,這樣,不管怎么樣,肯定有至少一個人能吃到 面,當他吃飽后把筷子放回 去,別人也就能吃飯了——按序分配法
3、看誰壯誰就能吃飯,打架奪筷子——剝奪式分配資源
小結,吃個飯,真不容易
轉載于:https://www.cnblogs.com/DoubleEggs/p/5747202.html
總結
- 上一篇: 【重点突破】—— React实现富文本编
- 下一篇: QEMU 3.0.0 新特性一览