線程、進程、協程(多進程,多線程)

關於進程間通訊pipe,內存共享mmap的詳細介紹

進程

進程是程序的一次執行過程,是一個動態概念,是程序在執行過程當中分配和管理資源的基本單位,每個進程都有一個本身的地址空間,至少有 5 種基本狀態,它們是:初始態,執行態,等待狀態,就緒狀態,終止狀態。html

線程

線程是CPU調度和分派的基本單位,它可與同屬一個進程的其餘的線程共享進程所擁有的所有資源。多線程

協程

協程,是一種比線程更加輕量級的存在,協程不是被操做系統內核所管理,而徹底是由程序所控制(也就是在用戶態執行)。這樣帶來的好處就是性能獲得了很大的提高,不會像線程切換那樣消耗資源。協程在子程序內部是可中斷的,而後轉而執行別的子程序,在適當的時候再返回來接着執行。併發

併發

併發:在操做系統中,是指一個時間段中有幾個程序都處於已啓動運行到運行完畢之間,且這幾個程序都是在同一個處理機上運行。其中兩種併發關係分別是同步和互斥異步

互斥

互斥:進程間相互排斥的使用臨界資源的現象,就叫互斥分佈式

同步

同步:進程之間的關係不是相互排斥臨界資源的關係,而是相互依賴的關係。進一步的說明:就是前一個進程的輸出做爲後一個進程的輸入,當第一個進程沒有輸出時第二個進程必須等待。具備同步關係的一組併發進程相互發送的信息稱爲消息或事件。其中併發又有僞併發和真併發,僞併發是指單核處理器的併發,真併發是指多核處理器的併發。性能

並行

並行:在單處理器中多道程序設計系統中,進程被交替執行,表現出一種併發的外部特種;在多處理器系統中,進程不只能夠交替執行,並且能夠重疊執行。在多處理器上的程序纔可實現並行處理。從而可知,並行是針對多處理器而言的。並行是同時發生的多個併發事件,具備併發的含義,但併發不必定並行,也亦是說併發事件之間不必定要同一時刻發生。操作系統

異步

異步:異步和同步是相對的,同步就是順序執行,執行完一個再執行下一個,須要等待、協調運行。異步就是彼此獨立,在等待某事件的過程當中繼續作本身的事,不須要等待這一事件完成後再工做。線程就是實現異步的一個方式。異步是讓調用方法的主線程不須要同步等待另外一線程的完成,從而可讓主線程幹其它的事情。
異步和多線程並非一個同等關係,異步是最終目的,多線程只是咱們實現異步的一種手段。異步是當一個調用請求發送給被調用者,而調用者不用等待其結果的返回而能夠作其它的事情。實現異步能夠採用多線程技術或則交給另外的進程來處理。.net

進程和線程

  • 進程是資源分配的最小單位,線程是程序執行的最小單位。
  • 進程有本身的獨立地址空間,每啓動一個進程,系統就會爲它分配地址空間,創建數據表來維護代碼段、堆棧段和數據段。而線程是共享進程中的數據的,使用相同的地址空間,所以CPU切換一個線程的花費遠比進程要小不少,同時建立一個線程的開銷也比進程要小不少。
  • 線程之間的通訊更方便,同一進程下的線程共享全局變量、靜態變量等數據,而進程之間的通訊須要以通訊的方式(IPC)進行。不過如何處理好同步與互斥是編寫多線程程序的難點。
  • 可是多進程程序更健壯,多線程程序只要有一個線程死掉,整個進程也死掉了,而一個進程死掉並不會對另一個進程形成影響,由於進程有本身獨立的地址空間。

協程和線程

  • 極高的執行效率:由於子程序切換不是線程切換,而是由程序自身控制,所以,沒有線程切換的開銷,和多線程比,線程數量越多,協程的性能優點就越明顯;
  • 不須要多線程的鎖機制:由於只有一個線程,也不存在同時寫變量衝突,在協程中控制共享資源不加鎖,只須要判斷狀態就行了,因此執行效率比多線程高不少。

線程間的通訊方式

  • 使用全局變量
  • 鎖機制:包括互斥鎖、條件變量、讀寫鎖
  • 信號量機制(Semaphore):包括無名線程信號量和命名線程信號量
  • 信號機制(Signal):相似進程間的信號處理

線程間的同步方式

  • 臨界區(Critical Section)、互斥對象(Mutex):主要用於互斥控制;都具備擁有權的控制方法,只有擁有該對象的線程才能執行任務,因此擁有,執行完任務後必定要釋放該對象。
  • 信號量(Semaphore)、事件對象(Event):事件對象是以通知的方式進行控制,主要用於同步控制!

進程間的通訊方式

  • 管道(PIPE):管道是一種半雙工的通訊方式,數據只能單向流動,並且只能在具備親緣關係(父子進程)的進程間使用。另外管道傳送的是無格式的字節流,而且管道緩衝區的大小是有限的(管道緩衝區存在於內存中,在管道建立時,爲緩衝區分配一個頁面大小)。
  • 有名管道 (FIFO): 有名管道也是半雙工的通訊方式,可是它容許無親緣關係進程間的通訊。
  • 信號(Signal): 信號是一種比較複雜的通訊方式,用於通知接收進程某個事件已經發生。
  • 信號量(Semaphore):信號量是一個計數器,能夠用來控制多個進程對共享資源的訪問。它常做爲一種鎖機制,防止某進程正在訪問共享資源時,其餘進程也訪問該資源。所以,主要做爲進程間以及同一進程內不一樣線程之間的同步手段。
  • 消息隊列(Message Queue):消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩衝區大小受限等缺點。
  • 共享內存(Shared Memory ):共享內存就是映射一段能被其餘進程所訪問的內存,這段共享內存由一個進程建立,但多個進程均可以訪問。共享內存是最快的 IPC 方式,它是針對其餘進程間通訊方式運行效率低而專門設計的。它每每與其餘通訊機制,如信號量,配合使用,來實現進程間的同步和通訊。
  • 套接字(Socket): 套解口也是一種進程間通訊機制,與其餘通訊機制不一樣的是,它可用於不一樣主機間的進程通訊。

多進程與多線程

  • 多進程模型的優點是CPU
  • 多線程模型主要優點爲線程間切換代價較小,所以適用於I/O密集型的工做場景,所以I/O密集型的工做場景常常會因爲I/O阻塞致使頻繁的切換線程。同時,多線
    程模型也適用於單機多核分佈式場景。
  • 多進程模型,適用於CPU密集型。同時,多進程模型也適用於多機分佈式場景
    中,易於多機擴展。
  • (1)線程執行開銷小,但不利於資源管理和保護;進程則相反,進程可跨越機器遷移。線程

    (2)多進程時每一個進程都有本身的內存空間,而多線程間共享內存空間;設計

    (3)線程產生的速度快,線程間通訊快、切換快;

    (4)線程的資源利用率比較好;

    (5)線程使用公共變量或者資源時須要同步機制。

參考連接:

【1】https://www.jianshu.com/p/354066717f78

【2】http://www.javashuo.com/article/p-gssvmvcp-bx.html

【3】https://blog.csdn.net/qq_32621445/article/details/78635951

【4】http://blog.sina.com.cn/s/blog_bf63e2650102xcu6.html

【5】http://www.javashuo.com/article/p-kdjgsgvj-kd.html

【6】http://www.javashuo.com/article/p-mxvkvufb-dg.html

【7】https://blog.csdn.net/N1314N/article/details/93711852

【8】https://zhuanlan.zhihu.com/p/34016871

相關文章
相關標籤/搜索