多進程和多線程的概念

多進程和多線程的概念

目錄

  • 零、進程和線程的定義和區別
  • 一、多線程是什麼?
  • 二、多進程是什麼?
  • 三、多線程與多進程,選擇誰?
  • 四、並行、併發、高併發等概念

零、進程和線程的定義和區別

進程和線程的定義

進程的概念:以一個整體的形式暴露給操作系統管理,裏面包含各種資源的調用。 對各種資源管理的集合就可以稱爲進程。
線程的概念:是操作系統能夠進行運算調度的最小單位。本質上就是一串指令的集合。

進程和線程的區別

1、線程共享內存空間,進程有獨立的內存空間。
2、線程啓動速度快,進程啓動速度慢。注意:二者的運行速度是無法比較的。
3、線程是執行的指令集,進程是資源的集合
4、兩個子進程之間數據不共享,完全獨立。同一個進程下的線程共享同一份數據。
5、創建新的線程很簡單,創建新的進程需要對他的父進程進行一次克隆。
6、一個線程可以操作(控制)同一進程裏的其他線程,但是進程只能操作子進程
7、同一個進程的線程可以直接交流,兩個進程想要通信,必須通過一箇中間代理來實現。
8、對於線程的修改,可能會影響到其他線程的行爲。但是對於父進程的修改不會影響到子進程

一、多線程是什麼?

       說起多線程,那麼就不得不說什麼是線程,而說起線程,又不得不說什麼是進程。

       進程可以簡單的理解爲一個可以獨立運行的程序單位,它是線程的集合,進程就是有一個或多個線程構成的。而線程是進程中的實際運行單位,是操作系統進行運算調度的最小單位。可理解爲線程是進程中的一個最小運行單元。

       那麼多線程就很容易理解:多線程就是指一個進程中同時有多個線程正在執行。

爲什麼要使用多線程?

       在一個程序中,有很多的操作是非常耗時的,如數據庫讀寫操作,IO操作等,如果使用單線程,那麼程序就必須等待這些操作執行完成之後才能執行其他操作。使用多線程,可以在將耗時任務放在後臺繼續執行的同時,同時執行其他操作。
可以提高程序的效率。
       在一些等待的任務上,如用戶輸入,文件讀取等,多線程就非常有用了。

多線程的缺點:

  • 使用太多線程,是很耗系統資源,因爲線程需要開闢內存。更多線程需要更多內存。
  • 影響系統性能,因爲操作系統需要在線程之間來回切換。
  • 需要考慮線程操作對程序的影響,如線程掛起,中止等操作對程序的影響。
  • 線程使用不當會發生很多問題。
  • 總結:多線程是異步的,但這不代表多線程真的是幾個線程是在同時進行,實際上是系統不斷地在各個線程之間來回的切換(因爲系統切換的速度非常的快,所以給我們在同時運行的錯覺)。

二、多進程是什麼?

       進程是程序在計算機上的一次執行活動。當你運行一個程序,你就啓動了一個進程。凡是用於完成操作系統的各種功能的進程就是系統進程,而所有由你啓動的進程都是用戶進程。
同理,多進程就是指計算機同時執行多個進程,一般是同時運行多個軟件。

三、多線程與多進程,選擇誰?

       下面是本人從知乎-pansz上轉載的一個答案,非常通俗地回答了這個問題。

單進程單線程:一個人在一個桌子上喫菜。
單進程多線程:多個人在同一個桌子上一起喫菜。
多進程單線程:多個人每個人在自己的桌子上喫菜。
        多線程的問題是多個人同時喫一道菜的時候容易發生爭搶,例如兩個人同時夾一個菜,一個人剛伸出筷子,結果伸到的時候已經被夾走菜了。。。此時就必須等一個人夾一口之後,在還給另外一個人夾菜,也就是說資源共享就會發生衝突爭搶。

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 爲多核的情況下,多線程在性能上不如多進程。
因而,當前面向多核的服務器端編程中,需要習慣多進程而非多線程。

四、並行、併發、高併發等概念

並行:多個CPU實例或多臺機器同時執行一段處理邏輯,是真正的同時。

併發: 通過CPU調度算法,讓用戶看上去同時執行,實際上CPU操作層面不是真正的同時。

            併發時如果操作了公用資源,可能產生線程安全問題。

線程安全:多個線程操作公用資源,有可能產生安全問題。

高併發:

       高併發指的是是一種系統運行過程中遇到的一種“短時間內遇到大量操作請求”的情況,主要發生在web系統集中大量訪問或者socket端口集中性收到大量請求(例如:12306的搶票情況;天貓雙十一活動)

       該情況的發生會導致系統在這段時間內執行大量操作,例如對資源的請求,數據庫的操作等。如果高併發處理不好,不僅僅降低了用戶的體驗度(請求響應時間過長),同時可能導致系統宕機,嚴重的甚至導致OOM異常,系統停止工作等。如果要想系統能夠適應高併發狀態,則需要從各個方面進行系統優化,包括,硬件、網絡、系統架構、開發語言的選取、數據結構的運用、算法優化、數據庫優化……。

 多線程與高併發的聯繫

多線程只是在同/異步角度上解決高併發問題的其中的一個方法手段,是在同一時刻利用計算機閒置資源的一種方式。

多線程在高併發問題中的作用就是充分利用計算機資源,使計算機的資源在每一時刻都能達到最大的利用率,不至於浪費計算機資源使其閒置。

參考:https://www.cnblogs.com/fnng/p/3670789.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章