多線程和多進程的區別與聯繫

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 爲多核的狀況下,多線程在性能上不如多進程。

於是,當前面向多核的服務器端編程中,須要習慣多進程而非多線程。

編程




多線程使得程序內部能夠分出多個線程來作多件事情,而不會形成程序界面卡死。好比迅雷等多線程下載工具就是典型的多線程。一個下載任務進來,迅雷把文件平分紅10份,而後開10個線程分別下載。這時主界面是一個單獨的線程,並不會由於下載文件而卡死。並且主線程能夠控制下屬線程,好比某個線程下載緩慢甚至中止,主線程能夠把它強行關掉並重啓另一個線程。

另外就是一些程序的打印功能,好比記事本、Adobe Reader,打印的時候就只能打印,沒法在主界面進行操做,而Word就有「後臺打印」的功能,點了打印命令以後,還能夠回到主界面進行修改、保存等操做。

另外多線程除了並行完成一些任務之外,還有生產者-消費者模式。好比Windows命令行下在某個硬盤根目錄執行一個"dir/s | more"命令,前一條顯示硬盤裏的全部文件,要執行好久才能執行得完,後面那條命令會把前面命令的輸出分屏顯示出來。可是執行整條命令時,會馬上有顯示,也就是說,前面一條命令輸出滿一頁內容到緩衝區,more命令就把緩衝區封死了,等用戶敲了一個鍵顯示下一屏的時候,more命令把緩衝區的內容取出並清空,前面的命令才能輸出下一屏到緩衝區。這樣的多線程使得整條命令不用等待前面的命令所有執行完才能執行下一條命令。

多線程和多進程的區別。日常指的多進程是操做系統下同時運行多個進程,好比Word和Excel同時打開,而且能夠並行地同時執行一些操做。這種多進程和多線程沒什麼比如較的。能夠比較的是同一個程序裏的多線程和多進程。 多線程由於在同一個進程裏,因此能夠共享內存和其餘資源,好比迅雷裏10個線程一齊下載一個文件,這個文件是由進程打開的,而後10個線程均可以往裏寫入東西。若是是10個進程就不行了,操做系統不容許一個文件由兩個進程同時寫入。另外,Chrome就是一個典型的多進程程序,裏面每一個標籤頁、擴展、插件都是單獨的進程,各自獨佔資源,相互隔離,一個進程出錯死掉只會影響一個頁面或者插件,不再會出現Flash插件出錯崩潰致使整個瀏覽器崩潰的狀況了。
相關文章
相關標籤/搜索