iT邦幫忙

2022 iThome 鐵人賽

1
自我挑戰組

冒牌工程師上學去系列 第 34

2-11 執行緒Thread+死結Deadlock

  • 分享至 

  • xImage
  •  

執行緒Thread

  • Process: 它是資源分配的最小單位,並且同時是個『操作單位』。
  • Thread: CPU執行的最小單位,它是最小的操作單位,且包含在 process 中。

以independent process來說,假設Process A 要切給B時,B需要A處理過的某個變數,Process A需要先store,再讓Process B load,process彼此間無法共享Memory space, O.S. Resource, Files
https://ithelp.ithome.com.tw/upload/images/20221017/20141684gKLChFV8Tv.png

作業系統可以分配 cpu 直接給 thread 來進行工作,然後在同一個 process 中的thread間切換都可以共享記憶體空間,context switching 負擔較輕,但有可能會有不同thread同時試圖修改一個共享記憶體的內容,造成race condition(用critical section臨界區間解 2-13)。
https://ithelp.ithome.com.tw/upload/images/20221017/20141684V0PbIylwN0.png

死結Deadlock

  • 缺一不可的4要件
    1. 不可搶奪 No Preemptive - 不可以搶別人手上的資源
    2. 持有並等待 Hold and Wait - 持有現有的資源並等待
    3. 不可共用(互斥) Mutal Exclusion - 資源不能共用
    4. 循環等待 Circulation - 每個Process都在等下一個Process,最後一個Process又剛好在等第一個Process形成一個圈;就像我愛你 -> 你愛他 -> 他愛我

舉例

假設一個情境,在馬路上一個圓環,車子一輛接著一輛剛好環繞整個包住卡死這個圓環,唯有其中一台車駛出圓環,才能讓交通順暢,但現在問題是:
A車司機在等B車的司機拿車鑰匙給他才能把車開走;
但B車司機在等C車的司機拿鑰匙給他;
C車司機一樣在等D車司機...
最後Z車司機說他鑰匙丟在A車上,要A車司機拿鑰匙給他

  1. 不可搶奪 - 每個司機不能直接下車去另一台車拿自己的車鑰匙,要等對方拿來給他
  2. 持有並等待 - 每一台車的司機都拿有上一台車的車鑰匙,但他們都要等下一台車的司機拿鑰匙來才願意把鑰匙給上一台車司機
  3. 互斥 - 每一台車的鑰匙都只有一把不能同時給兩台車用
  4. 循環等待 - 每個司機都在等待下一台車司機拿鑰匙過來,最後一位司機又在等第一位形成一個圈

https://ithelp.ithome.com.tw/upload/images/20221019/20141684n5bWD4fxor.jpg
圖片來源

打破死結

剛剛說4個條件都要達到才會發生死結,所以只要我打破其中一個,就能阻止死結的發生

  1. 可搶奪 - 我得不到的,搶就對了
  2. 打破持有並等待 - 如果沒有能夠一次拿到所有我要的東西我就要先釋放掉手上有的資源,或是當我要申請資源時我就必須先放掉我手中的資源
  3. 打破互斥 - 資源共用
  4. 打破循環等待 - 將資源編號,資源只能依編號大小由小到大申請;意思就是說我在鑰匙上面編號A->Z,A車司機手上有鑰匙Z,如果他想要B車司機給他鑰匙A,他就必須要先釋放掉鑰匙Z(因為Z>A,我們用ASCII Code來看的話XD)

分類會依照第一篇介紹的分類架構來進行
由於是將學習過程記錄下來,如果有任何錯誤歡迎糾正

以下參考連結在學習過程中覺得非常有幫助:
-應用層的運算加速 - 並行運算
-Chapter3-作業系統-行程-part3


上一篇
2-10 短期排班演算法
下一篇
2-12 死結避免(銀行家演算法)、偵測及恢復
系列文
冒牌工程師上學去42
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言