Nova的遊戲王反主流學院

反主流的精神在於不屈於大環境, 本站旨在研究對抗主流的新戰術。

Transation的Deadlock問題

Deadlock的意思是說程式在搶資源導致卡死的問題,舉個例:

A和B這兩個人想要完成作業,都必須拿鉛筆跟橡皮擦這兩項資源才能完成。

然後A拿了鉛筆,B在A拿了鉛筆之前拿了橡皮擦,接著兩方都在等對方用完手上的東西還回來才能開始工作,但是又不肯先讓對方先做,所以工作進度就遲遲沒進展,這就是deadlock。

 

以定義來說可以分為

1.Mutual Exclusion(鉛筆和橡皮擦只有一塊,兩個人又都要用)

2.Lock and Wait(雙方拿了自己要的東西,然後在等對方手上的東西)

3.No Preemption(拿了東西後又不肯先給對方用)

4.Cyclic Waits(雙方等待對方放開東西的情況會造成一個無法解決的循環問題)

 

解決方式有二

以上面A拿鉛筆比B拿像皮擦早的情況為例

1.Wait-Die

A可以繼續拿著鉛筆等,假如B想拿A的鉛筆就得先放棄手上的橡皮擦,重新做。

2.Wound-Wait

假如A想拿B的橡皮擦,可以要求B放棄手上的橡皮擦,假如B想拿A的就要等。

P.S.B被要求放棄的時候,取得資源的時間仍然保留,不會重算。所以假如這時候有C又要過來搶,B可以倚老賣老(無誤),要求C讓他先做完。

 

避免方式有三

1.兩階段並行

先告訴其他人我要用這個資源,確人沒人用我才用,等用完後再告訴大家現在可以用了。

2.時間戳記

排隊比較久的先做(交易>讀寫)

3.樂觀控制

等到不一致再回復交易

 

關於上面的例子,有人可能會說哪有那麼笨,又不是沒寫好的程式,實際上日常生活中就是存在很多deadlock的現象,通常是為了自尊問題,比如說雙方開車在窄巷卡住,卻彼此不讓,或是有爭吵的時候,都希望對方先道歉。

 

所以我們不只需要在寫程式的時候注意到Deadlock的問題,更要在日常生活中多學著禮讓,否則對大家都沒好處。