線程死鎖和飢餓的區別


死鎖: 可以認為是兩個線程或進程在請求對方占有的資源。
餓死:一個線程在無限地等待另外兩個或多個線程相互傳遞使用並且用不會釋放的資源。

出現以下四種情況會產生死鎖:

  1,相互排斥。一個線程或進程永遠占有共享資源,比如,獨占該資源。

  2,循環等待。例如,進程A在等待進程B,進程B在等待進程C,而進程C又在等待進程A。

  3,部分分配。資源被部分分配,例如,進程A和B都需要訪問一個文件,同時需要用到打印機,進程A得到了這個文件資源,進程B得到了打印機資源,但兩個進程都不能獲得全部的資源了。

  4,缺少優先權。一個進程獲得了該資源但是一直不釋放該資源,即使該進程處於阻塞狀態。

  按照前面的分析,情況1和情況4是線程或進程無休止的等待另外的幾個線程或進程所占據的資源。

  針對上面可能出現死鎖的幾種情況,可以給出預防措施,比如控制線程或進程如果判斷不能夠獲取到所需的全部的資源,那么就釋放已經占有的資源等等。

  現實中,當遇到一個對象要執行多個動作,而這些動作又穿插在一起時就

 

 

9. 什么是活鎖

 

活鎖和死鎖很像似。 只是活鎖的狀態可以發生改變。不過雖然狀態可以改變,卻沒有實質的進展。

比如兩個人在一個很宅的胡同里。 一次只能並排過兩個人。 兩人比較禮貌,都要給對方讓路。 結果一起要么讓到左邊,要么讓到右邊,結果仍然是誰也過不去。 類似於原地踏步或者震盪狀態。

活鎖一般是由於對死鎖的不正確處理引起的。由於處於死鎖中的多個線程同時采取了行動。 而避免的方法也是只讓一個線程釋放資源。

10. 什么是餓死。

餓死(starvation) 是一個線程長時間得不到需要的資源而不能執行的現象。 有人餓死並不代表着出現了死鎖。

很有可能系統還能很好的進行。

所以,沒有出現死鎖並不能就認為系統是完好的。還要保證沒有出現餓死的現象。

避免餓死就應該是采用隊列的方式,保證每個人都有機會獲得請求的資源。 當然實現方式可以很多個變化,比如優先級,時間片,等,都是“隊列”的特殊形式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM