1

從編程語言語用,由Scott誰阻止誰阻止同步?

同步可以通過旋轉(也稱爲 忙等待)或通過阻斷來實現。

在忙等待同步,一個線程運行循環,其中它保持 重新評估一些條件,直到該條件爲真(例如,直到 消息隊列非空變或共享變量達到一個特定 值)-presumably作爲一些其他 線程的行動的結果,在其他一些核心上運行。

阻止同步(也稱爲基於調度程序的同步), 等待線程自願放棄其核心到其他線程。在這之前,它會在與同步條件相關的某個數據結構中留下一個註釋。在未來的某個時間點使條件成立的線程將會找到筆記並採取措施使被阻塞的線程再次運行。

這個同步機制爲什麼叫做「阻塞」?

誰阻止誰?

謝謝。

回答

1

繁忙等待會導致多個不必要的上下文切換,因爲進程/線程反覆嘗試在循環中進入臨界區,因此耗費CPU時間。

阻塞同步通過擁有進程/線程塊來避免此問題。它將被放入一個等待隊列中,而不是試圖獲得CPU時間,進程/線程只是簡單地等待。沒有CPU週期被阻塞的進程/線程浪費,所以其他進程/線程可以繼續而不會不必要地共享週期。一旦某個關鍵部分被其他進程/線程釋放,某些東西會喚醒被阻塞的進程/線程。

所以這就是爲什麼這個同步機制叫做阻塞,它會被阻塞或者不能再獲取CPU,這個鎖被別人釋放。

誰封鎖了它?我會說這個機制做到了。它把沒有得到鎖的線程/進程放入隊列中等待,並且有監視器來監視鎖,一旦鎖被釋放,它將從被阻塞的隊列中檢索一個。

1

爲什麼[它]被稱爲「阻塞」?

想想你自己開車去奶奶家吃感恩節晚餐的時候,當你出現一個事故現場時:拖車操作員正在連接一輛橫跨整條路的大卡車。廣播上的交通記者說,「這是阻止雙線。」你可能會說,你的方式是被事故阻止了

誰阻止誰?

就像你引用的文字說的那樣,這是自願的。當你出現在事故現場時,你可以轉身尋找另一種方式,但取決於繞道的時間長短以及看起來他們將卡車駛離道路一側的時間,你可能會自願坐下來等待。

軟件通常坐等待。編寫等待的軟件比較容易,而且它更易於閱讀和理解。那種不是而是坐等的軟件叫做wait free algorithm,而且它們可能非常難以書寫。