1. 程式人生 > >執行緒與程序

執行緒與程序

這麼解釋問題吧:

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 為多核的情況下,多執行緒在效能上不如多程序。

因而,當前面向多核的伺服器端程式設計中,需要習慣多程序而非多執行緒。