多執行緒和多程序的區別與聯絡

2022-03-26 23:11:37 字數 1425 閱讀 8387

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

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

程式 程序 執行緒的區別與聯絡以及多執行緒與多程序

程式設計思想之多執行緒與多程序 1 以作業系統的角度述說執行緒與程序 程式設計思想之多執行緒與多程序 2 執行緒優先順序與執行緒安全 程式設計思想之多執行緒與多程序 4 c 中的多執行緒 程式並不能單獨執行,只有將程式載入到記憶體中,系統為他分配資源後才能夠執行,這種執行的程式稱之為程序,也就是說程...

多程序與多執行緒的區別

據說這個問題很重要,要從多個方面總結。多執行緒和多程序的區別 小結 多執行緒還是多程序的選擇及區別 關於程序和執行緒對於全域性變數共享的問題學習總結 程序是資源分配的最小單位,執行緒是cpu排程的最小單位。同一程序的不同執行緒會共享程序記憶體空間中的全域性區和堆。執行緒私有的是棧和暫存器。因此。區域...

多程序與多執行緒的區別

多程序與多執行緒的區別?解 1 從資料共享 同步方面來講,多程序資料共享複雜,需要用ipc,資料是分開的,同步簡單 多執行緒資料共享簡單,但也是因為這個原因導致同步複雜。2 從內 存 cpu 方面來講,多程序占用記憶體多,切換複雜,cpu利用率低 多執行緒占用記憶體少,切換簡單,cpu利用率高。3 ...