Java併發程式設計的藝術之第四章讀後感
阿新 • • 發佈:2021-08-23
Question:為什麼IO密集型執行緒優先順序需要高於CPU密集型執行緒?
原文中說到:
優先順序高的執行緒分配時間片的數量要多於優先順序低的執行緒。設定執行緒優先順序時:
針對頻繁阻塞(休眠或者I/O操作)的執行緒需要設定較高優先順序,
而偏重計算(需要較多CPU時間或者偏運算)的執行緒則設定較低的優先順序,確保處理器不會被獨佔。
這段話應該怎麼理解呢,可參考 IOS 如何高效的使用多執行緒。
其線上程優先順序權衡中提到:通常來說,執行緒排程除了輪轉法以外,還有優先順序排程的方案。
線上程排程時,高優先順序的執行緒大概率會更早的執行。有兩個概念需要明確:
-
IO 密集型執行緒:頻繁等待的執行緒,等待的時候會讓出時間片。
-
CPU 密集型執行緒:很少等待的執行緒,意味著長時間佔用著 CPU。
在特殊場景下,當多個 CPU 密集型執行緒霸佔了所有 CPU 資源,
而它們的優先順序都比較高,而此時優先順序較低的 IO 密集型執行緒將持續等待,產生執行緒餓死的現象。
為避免執行緒餓死,系統會逐步提高被“冷落”執行緒的優先順序,IO 密集型執行緒通常下比 CPU 密集型執行緒更容易獲取到優先順序提升。
雖然系統會自動做這些事情,但是這總歸會造成時間等待,可能會影響使用者體驗。所以開發者需要從兩個方面權衡優先順序問題:
- 讓 IO 密集型執行緒優先順序高於 CPU 密集型執行緒。
- 讓緊急的任務擁有更高的優先順序。