科普帖:線程與進程

本文來自技術問答模塊,問題地址:http://segmentfault.com/q/1010000000125280#a-1020000000148152java


這麼解釋問題吧:編程

  1. 單進程單線程:一我的在一個桌子上吃菜。segmentfault

  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 服務器的緣由。

justjavac微信公衆號

相關文章
相關標籤/搜索