多線程有什么用?


作者:pansz
鏈接:https://www.zhihu.com/question/19901763/answer/13299543
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

這么解釋問題吧:

1。單進程單線程:一個人在一個桌子上吃菜。
2。單進程多線程:多個人在同一個桌子上一起吃菜。
3。多進程單線程:多個人每個人在自己的桌子上吃菜。

多線程的問題是多個人同時吃一道菜的時候容易發生爭搶,例如兩個人同時夾一個菜,一個人剛伸出筷子,結果伸到的時候已經被夾走菜了。。。此時就必須等一個人夾一口之后,在還給另外一個人夾菜,也就是說資源共享就會發生沖突爭搶。


1。對於 Windows 系統來說,【開桌子】的開銷很大,因此 Windows 鼓勵大家在一個桌子上吃菜。因此 Windows 多線程學習重點是要大量面對資源爭搶與同步方面的問題。


2。對於 Linux 系統來說,【開桌子】的開銷很小,因此 Linux 鼓勵大家盡量每個人都開自己的桌子吃菜。這帶來新的問題是:坐在兩張不同的桌子上,說話不方便。因此,Linux 下的學習重點大家要學習進程間通訊的方法。

--
補充:有人對這個開桌子的開銷很有興趣。我把這個問題推廣說開一下。

開桌子的意思是指創建進程。開銷這里主要指的是時間開銷。
可以做個實驗:創建一個進程,在進程中往內存寫若干數據,然后讀出該數據,然后退出。此過程重復 1000 次,相當於創建/銷毀進程 1000 次。在我機器上的測試結果是:
UbuntuLinux:耗時 0.8 秒
Windows7:耗時 79.8 秒
兩者開銷大約相差一百倍。

這意味着,在 Windows 中,進程創建的開銷不容忽視。換句話說就是,Windows 編程中不建議你創建進程,如果你的程序架構需要大量創建進程,那么最好是切換到 Linux 系統。

大量創建進程的典型例子有兩個,一個是 gnu autotools 工具鏈,用於編譯很多開源代碼的,他們在 Windows 下編譯速度會很慢,因此軟件開發人員最好是避免使用 Windows。另一個是服務器,某些服務器框架依靠大量創建進程來干活,甚至是對每個用戶請求就創建一個進程,這些服務器在 Windows 下運行的效率就會很差。這"可能"也是放眼全世界范圍,Linux 服務器遠遠多於 Windows 服務器的原因。

--
再次補充:如果你是寫服務器端應用的,其實在現在的網絡服務模型下,開桌子的開銷是可以忽略不計的,因為現在一般流行的是按照 CPU 核心數量開進程或者線程,開完之后在數量上一直保持,進程與線程內部使用協程或者異步通信來處理多個並發連接,因而開進程與開線程的開銷可以忽略了。

另外一種新的開銷被提上日程:核心切換開銷。

現代的體系,一般 CPU 會有多個核心,而多個核心可以同時運行多個不同的線程或者進程。

當每個 CPU 核心運行一個進程的時候,由於每個進程的資源都獨立,所以 CPU 核心之間切換的時候無需考慮上下文。

當每個 CPU 核心運行一個線程的時候,由於每個線程需要共享資源,所以這些資源必須從 CPU 的一個核心被復制到另外一個核心,才能繼續運算,這占用了額外的開銷。換句話說,在 CPU 為多核的情況下,多線程在性能上不如多進程。

因而,當前面向多核的服務器端編程中,需要習慣多進程而非多線程。
 
來源於知乎 https://www.zhihu.com/question/19901763


免責聲明!

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



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