進程間的通信方式以及多線程和多進程之間的區別

一.兩者區別

在這裏插入圖片描述
多進程和多線程的主要區別是:線程是進程的子集(部分),一個進程可能由多個線程組成。多進程的數據是分開的、共享複雜,需要用IPC;但同步簡單。多線程共享進程數據,共享簡單;但同步複雜

(1)多進程

進程是程序在計算機上的一次執行活動,即正在運行中的應用程序,通常稱爲進程。當你運行一個程序,你就啓動了一個進程。每個進程都有自己獨立的地址空間(內存空間),每當用戶啓動一個進程時,操作系統就會爲該進程分配一個獨立的內存空間,讓應用程序在這個獨立的內存空間中運行。

在同一個時間裏,同一個計算機系統中如果允許兩個或兩個以上的進程處於運行狀態,這便是多進程,也稱多任務。現代的操作系統幾乎都是多任務操作系統,能夠同時管理多個進程的運行。

多任務帶來的好處是明顯的,比如你可以邊聽mp3邊上網,與此同時甚至可以將下載的文檔打印出來,而這些任務之間絲毫不會相互干擾。

1.數據是分開的,共享複雜,同步簡單
2.佔用內存多,切換複雜,CPU利用率低
3.創建銷燬複雜,切換複雜,速度慢 
4.編程簡單,調試簡單
5.進程間不會相互影響 
6.適應於多核、多機分佈 ;如果一臺機器不夠,擴展到多臺機器比較簡單

(2)多線程

線程是一個輕量級的子進程,是最小的處理單元;是一個單獨的執行路徑。可以說:線程是進程的子集(部分),一個進程可能由多個線程組成。

線程是獨立的。如果在一個線程中發生異常,則不會影響其他線程。它使用共享內存區域。

多線程是一種執行模型,它允許多個線程存在於進程的上下文中,以便它們獨立執行但共享其進程資源。

1.多線程共享進程數據,共享簡單,同步複雜
2.佔用內存少,切換簡單,CPU利用率高
3.創建銷燬簡單,切換簡單,速度快
4.編程複雜,調試複雜
5.一個線程掛掉將導致整個進程掛掉
6.適應於多核分佈

二.使用場景

1)需要頻繁創建和銷燬的優先用線程。

實例:web 服務器,來一個任務建立一個線程,完了就銷燬線程。要是用進程,創建和銷燬的代價是很高的。

2)需要進行大量計算的優先使用線程。

所謂大量計算,當然就是要消耗很多 cpu,切換頻繁了,這種情況線程是最合適的。實例:圖像處理、算法處理

3)強相關的處理用線程,弱相關的處理用進程。

4)可能擴展到多機分佈的用進程,多核分佈的用線程。

5)都滿足需求的情況下,用你最熟悉、最拿手的方式。

三.通信方式

(1)進程間的通信方式

進程間通信(IPC,InterProcess Communication)是指在不同進程之間傳播或交換信息。IPC的方式通常有管道(包括無名管道和命名管道)、消息隊列、信號量、共享存儲、Socket、Streams等。其中 Socket和Streams支持不同主機上的兩個進程IPC。

1.管道( pipe ):管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關係的進程間使用。進程的親緣關係通常是指父子進程關係。

2.有名管道 (namedpipe) : 有名管道也是半雙工的通信方式,但是它允許無親緣關係進程間的通信。

3.信號量(semophore ) : 信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作爲一種鎖機制,防止某進程正在訪問共享資源時,其他進程也來訪問該資源。因此,主要作爲進程間以及同一進程內不同線程之間的同步手段。

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

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

6.共享內存(shared memory ) :共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的通信 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。

7.套接字(socket ) : 套解字也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同及其間的進程通信。


(2)線程間的通信方式

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

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

2.信號量機制(Semaphore):包括無名線程信號量和命名線程信號量.

3.信號機制(Signal)

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