進程間通訊和線程間通訊的幾種方式

進程

進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操做系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。html

  進程是一個具備獨立功能的程序關於某個數據集合的一次運行活動。它能夠申請和擁有系統資源,是一個動態的概念,是一個活動的實體。它不僅是程序的代碼,還包括當前的活動,經過程序計數器的值和處理寄存器的內容來表示。python

  進程的概念主要有兩點:第一,進程是一個實體。每個進程都有它本身的地址空間,通常狀況下,包括文本區域(text region)、數據區域(data region)和堆棧(stack region)。文本區域存儲處理器執行的代碼;數據區域存儲變量和進程執行期間使用的動態分配的內存;堆棧區域存儲着活動過程調用的指令和本地變量。第二,進程是一個「執行中的程序」。程序是一個沒有生命的實體,只有處理器賦予程序生命時(操做系統執行之),它才能成爲一個活動的實體,咱們稱其爲進程安全

進程是具備必定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。每一個進程都有本身的獨立內存空間,不一樣進程經過進程間通訊來通訊。因爲進程比較重量,佔據獨立的內存,因此上下文進程間的切換開銷(棧、寄存器、虛擬內存、文件句柄等)比較大,但相對比較穩定安全。數據結構



線程

線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程本身基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),可是它可與同屬一個進程的其餘的線程共享進程所擁有的所有資源。線程間通訊主要經過共享內存,上下文切換很快,資源開銷較少,但相比進程不夠穩定容易丟失數據。多線程

一個線程能夠建立和撤消另外一個線程,同一進程中的多個線程之間能夠併發執行。因爲線程之間的相互制約,導致線程 在運行中呈現出間斷性。線程也有 就緒阻塞運行三種基本狀態。就緒狀態是指線程具有運行的全部條件,邏輯上能夠運行,在等待處理機;運行狀態是指線程佔有處理機正在運行;阻塞狀態是指線程在等待一個事件(如某個信號量),邏輯上不可執行。每個程序都至少有一個線程,若程序只有一個線程,那就是程序自己。
線程是程序中一個單一的順序控制流程。進程內一個相對獨立的、可調度的執行單元,是系統獨立調度和分派CPU的基本單位指 運行中的程序的調度單位。在單個程序中同時運行多個線程完成不一樣的工做,稱爲 多線程
 

協程

協程是一種用戶態的輕量級線程,協程的調度徹底由用戶控制。協程擁有本身的寄存器上下文和棧。協程調度切換時,將寄存器上下文和棧保存到其餘地方,在切回來的時候,恢復先前保存的寄存器上下文和棧,直接操做棧則基本沒有內核切換的開銷,能夠不加鎖的訪問全局變量,因此上下文的切換很是快。併發

 

進程、線程、協程的區別

 

概念

對於進程來講,子進程是父進程的複製品,從父進程那裏得到父進程的數據空間,堆和棧的複製品。異步

而線程,相對於進程而言,是一個更加接近於執行體的概念,能夠和同進程的其餘線程之間直接共享數據,並且擁有本身的棧空間,擁有獨立序列。socket

 

進程、線程共同點

它們都能提升程序的併發度,提升程序運行效率和響應時間。線程和進程在使用上各有優缺點。 線程執行開銷比較小,但不利於資源的管理和保護,而進程相反。同時,線程適合在SMP機器上運行,而進程能夠跨機器遷移。工具

 

進程、線程不一樣點

多進程中每一個進程有本身的地址空間,線程則共享地址空間。測試

全部其餘區別都是由於這個區別產生的。好比說:

1) 地址空間:線程是進程內的一個執行單元,進程內至少有一個線程,它們共享進程的地址空間,而進程有本身獨立的地址空間
2) 資源擁有:進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源
3) 線程是處理器調度的基本單位,但進程不是
4) 兩者都可併發執行

5) 每一個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口,可是線程不可以獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制

 

1. 速度。線程產生的速度快,通信快,切換快,由於他們處於同一地址空間。 
2. 線程的資源利用率好。 
3. 線程使用公共變量或者內存的時候須要同步機制,但進程不用。

而他們通訊方式的差別也仍然是因爲這個根本緣由形成的。

 

線程、協程比較

1) 一個線程能夠多個協程,一個進程也能夠單獨擁有多個協程,這樣python中則能使用多核CPU。

2) 線程進程都是同步機制,而協程則是異步

3) 協程能保留上一次調用時的狀態,每次過程重入時,就至關於進入上一次調用的狀態

 

通訊方式之間的差別

由於那個根本緣由,實際上只有進程間須要通訊,同一進程的線程共享地址空間,沒有通訊的必要,但要作好同步/互斥,保護共享的全局變量。

而進程間通訊不管是信號,管道pipe仍是共享內存都是由操做系統保證的,是系統調用。

 

進程通訊

管道(pipe)

管道是一種半雙工的通訊方式,數據只能單向流動,並且只能在具備親緣關係的進程間使用。進程的親緣關係一般是指父子進程關係。

有名管道 (namedpipe)

有名管道也是半雙工的通訊方式,可是它容許無親緣關係進程間的通訊。

信號量(semaphore)

信號量是一個計數器,能夠用來控制多個進程對共享資源的訪問。它常做爲一種鎖機制,防止某進程正在訪問共享資源時,其餘進程也訪問該資源。所以,主要做爲進程間以及同一進程內不一樣線程之間的同步手段。

消息隊列(messagequeue)

消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩衝區大小受限等缺點。

信號 (sinal)

信號是一種比較複雜的通訊方式,用於通知接收進程某個事件已經發生。

共享內存(shared memory)

共享內存就是映射一段能被其餘進程所訪問的內存,這段共享內存由一個進程建立,但多個進程均可以訪問。共享內存是最快的 IPC 方式,它是針對其餘進程間通訊方式運行效率低而專門設計的。它每每與其餘通訊機制,如信號量,配合使用,來實現進程間的同步和通訊。

套接字(socket)

套接口也是一種進程間通訊機制,與其餘通訊機制不一樣的是,它可用於不一樣設備及其間的進程通訊。


線程間的通訊方式

鎖機制:包括互斥鎖、條件變量、讀寫鎖

互斥鎖提供了以排他方式防止數據結構被併發修改的方法。 
讀寫鎖容許多個線程同時讀共享數據,而對寫操做是互斥的。 
條件變量能夠以原子的方式阻塞進程,直到某個特定條件爲真爲止。對條件的測試是在互斥鎖的保護下進行的。條件變量始終與互斥鎖一塊兒使用。

wait/notify 等待

Volatile 內存共享

CountDownLatch 併發工具

CyclicBarrier 併發工具

信號量機制(Semaphore)

包括無名線程信號量和命名線程信號量。

信號機制(Signal)

相似進程間的信號處理。

線程間的通訊目的主要是用於線程同步,因此線程沒有像進程通訊中的用於數據交換的通訊機制。

相關文章
相關標籤/搜索