科普帖:線程與進程

這麼解釋問題吧:

  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 服務器的原因。

本文整理自我在 segmentfault 的問答。來自:http://www.zhihu.com/question/1990176...

發佈了90 篇原創文章 · 獲贊 51 · 訪問量 114萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章