您好,登錄后才能下訂單哦!
一、什么是死鎖
當兩個或兩個以上的線程在執行過程中,因為爭奪資源而造成的一種相互等待的狀態,由于存在一種環路的鎖依賴關系而永遠地等待下去,如果沒有外部干涉,他們將永遠等待下去,此時的這個狀態稱之為死鎖。
經典的 “哲學家進餐” 問題很好地描述了死鎖狀況:
5個哲學家去吃中餐,坐在一張圓桌旁,他們有5根筷子(而不是5雙),并且每兩個人中間放一根筷子,哲學家們要么在思考,要么
在進餐,每個人都需要一雙筷子才能吃到東西,并在吃完后將筷子放回原處繼續思考,有些筷子管理算法 (1) 能夠使每個人都能相對及
時的吃到東西,但有些算法卻可能導致一些或者所有哲學家都"餓死",后一種情況將產生死鎖:每個人都擁有其他人需要的資源,
同時有等待其他人已經擁有的資源,并且每個人在獲取所有需要的資源之前都不會放棄已經擁有的資源。
筷子管理算法(1):一個饑餓的科學家會嘗試獲得兩根臨近的筷子,但如果其中一根正在被另一個科學家使用,那么他將放棄已經得到的
那根筷子,并在等待幾分鐘之后嘗試
死鎖:每個人都立即抓住自己左邊的筷子,然后等待自己右邊的筷子空出來,但同時又不放下已經拿到的筷子,形成一種相互等待的狀態。
饑餓:哲學家們都同時想吃飯,同時拿起左手邊筷子,但是發現右邊沒有筷子,于是哲學家又同時放下左手邊筷子,然后大家發現又有筷子了,又同時開始拿起左手邊筷子,又同時放下,然后反復進行。
在線程A持有鎖L并想獲得鎖M的同時,線程B持有鎖M并嘗試獲得鎖L,那么這兩個線程將永遠地等待下去,這種情況就是死鎖形式(或者稱為"抱死").
二、死鎖的四個必要條件
互斥條件:指進程對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個進程占用。如果此時還有其它進程請求資源,則請求者只能等待,直至占有資源的進程用完釋放。
請求和保持條件:指進程XM代理申請www.kaifx.cn/broker/xm.html已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進程占有,此時請求進程阻塞,但又對自己已獲得的其它資源保持不放。
不剝奪條件:指進程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。
環路等待條件:指在發生死鎖時,必然存在一個進程——資源的環形鏈,即進程集合{A,B,C,···,Z} 中的A正在等待一個B占用的資源;B正在等待C占用的資源,……,Z正在等待已被A占用的資源。
三、死鎖實例
/**
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。