地址:http://www.zhihu.com/question/19901763編程
原文:服務器
這麼解釋問題吧:
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 爲多核的狀況下,多線程在性能上不如多進程。
於是,當前面向多核的服務器端編程中,須要習慣多進程而非多線程。網絡