回覆列表
-
1 # zuin
-
2 # 普釘
這個問題是怎麼來的?
是什麼場景讓你說單執行緒比多執行緒好?而且還是好的多?
如果你是堵了node.js,nginx的非同步IO的設計理念和多執行緒的設計如Apache。那你應該仔細去讀一下他們的使用場景和以及他們作業系統的關係。
我想這個問題壓根就是一個錯誤的問題。
這個問題是怎麼來的?
是什麼場景讓你說單執行緒比多執行緒好?而且還是好的多?
如果你是堵了node.js,nginx的非同步IO的設計理念和多執行緒的設計如Apache。那你應該仔細去讀一下他們的使用場景和以及他們作業系統的關係。
我想這個問題壓根就是一個錯誤的問題。
為什麼會出現執行緒這個東西
一個應用一個程序,比如QQ,微信。程序是系統分配資源的最小單位,之間有很好的獨立性。在 Linux 系統中程序是 fork 系統呼叫的產物(除了 0 號程序)。程序佔有獨立的虛擬記憶體空間,互相“看不見”,執行程式互相隔離至少有2個好處:
模組化,Android手機畫面繪製是共同需求,可以把這個需求交給一個程序實現,其他程序呼叫這個程序的服務就可以了。提高模組之間隔離性,某一個模組出錯,對其他模組的影響比較小。如果要程序之間互相協作就麻煩了,程序間通訊不大方便,所以後來有了執行緒,執行緒之間共享一個記憶體空間,互相通訊方便了很多。進行任務排程時,同一個程序的執行緒切換不需要切換記憶體空間,所以執行緒的建立和切換非常輕便。同時在 2000 年前,CPU 發展主要靠提升執行頻率,到了後期進一步提升頻率造成 CPU能耗增加 溫度過高,CPU 朝著多核發專利。 所以 執行緒提升了併發度,提高了資源的利用率和系統的吞吐量。
多執行緒的優點可以顯著提升併發性,可以一次執行更多的任務。比如下載程式可以開多個執行緒一起從網路下載某個檔案,充分使用多核 CPU。
多執行緒帶來的新問題不可以忽略執行緒切換帶來的代價,cpu 中的 cache 速度遠超記憶體中的速度,每一次切換都是一次極大的效能損失。系統的執行緒過多會造成大量時間浪費線上程切換上面執行緒之間存在資料競爭,不恰當地推進可能會產生死鎖等問題。多執行緒併發執行很難對 bug 進行復現 ,除錯時候更麻煩,對程式設計師要求更高。單執行緒嚴格按照順序執行,不會出現各種么蛾子。不會因為執行緒排程而產生效能損失。可能存在隊頭阻塞問題,如果某個任務特別耗時,那後續任務全被堵住了。
綜上,哪個好要看具體的應用場景