阻塞,無鎖,無等待的區別


阻塞,blocking

一個方法被稱為阻塞的,即這個方法在其演進過程中不能正常運行直到其他(占有鎖的)線程釋放。

也就是普通的synchronized方法,同一時間內只有一個線程占有了鎖,其他線程只能等待。但是這個占有鎖的線程並不一定真的在工作(可能被掛起了)。

 

無鎖,lock-free

An algorithm is lock-free if, when the program threads are run for a sufficiently long time, at least one of the threads makes progress (for some sensible definition of progress). 

如果所有線程運行了足夠長時間后,至少有一個線程能獲得進展,那么這個算法是無鎖的。

用人話講就是:系統中無論何時,始終有一個線程在工作。

 

無等待,wait-free

An algorithm is wait-free if every operation has a bound on the number of steps the algorithm will take before the operation completes.

假如一個方法是無等待的,那么它保證了每一次調用都可以在有限的步驟內結束。

用人話講就是,系統中的所有線程,都會在有限時間內結束,無論如何也不可能出現餓死(starving)的情況。

 

再通俗一點的說:

阻塞算法可能會出現整個系統都掛起的情況(占有鎖的線程被中斷,那么所有試圖爭用這個鎖的線程會被掛起),系統中的所有線程全部餓死

無鎖算法可以保證系統中至少有一個線程處於工作狀態,但是還是可能有線程永遠搶不到資源而被餓死

無等待算法保證系統中的所有線程都能處於工作狀態,沒有線程會被餓死,只要時間夠,所有線程都能結束。

The difference between wait-free and lock-free is that wait-free operation by each process is guaranteed to succeed in a finite number of steps, regardless of the other processors.

 

補充:

集居數無關無等待,Wait-Free-Population-Oblivious

一個無等待的方法,如果其性能和活動線程數目無關,那么被稱為集居數無關無等待的。

這個是更強的wait-free算法,因為一般的wait-free中的每個線程雖然能在有限步數內結束,但是實際上它的開銷往往與並發的線程數有關。可能工作線程越多,平均到每個線程頭上的耗時就越長。

而集居數無關無等待算法則可以理解為:線程的平均開銷是一個與並發數n無關的函數。

也就是說,我們可以通過無限制的增加線程數來提高總的工作效率(而且是線性擴展)。

 

參考資料

https://en.wikipedia.org/wiki/Non-blocking_algorithm#Wait-freedom

http://ifeve.com/lock-free-and-wait-free/

http://ifeve.com/why-is-wait-free-so-important/


免責聲明!

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



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