每一個進程有本身的地址空間。兩個進程中的地址即便值相同,實際指向的位置也不一樣。進程間通訊通常經過操做系統的公共區進行。
同一進程中的線程因屬同一地址空間,可直接通訊。
不只是系統內部獨立運行的實體,並且是獨立競爭資源的實體。
線程也被稱爲輕權進程,同一進程的線程共享全局變量和內存,使得線程之間共享數據很容易也很方便,但會帶來某些共享數據的互斥問題。
許對程序爲了提升效率也都是用了線程來編寫。
父子進程的派生是很是昂貴的,並且父子進程的通信須要ipc或者其餘方法來實現,比較麻煩。而線程的建立就花費少得多,而且同一進程內的線程共享全局存儲區,因此通信方便。
線程的缺點也是由它的優勢形成的,主要是同步,異步和互斥的問題,值得在使用的時候當心設計。網絡
只有進程間須要通訊,同一進程的線程share地址空間,沒有通訊的必要,但要作好同步/互斥mutex,保護共享的全局變量。線程擁有本身的棧。同步/互斥是原語primitives.
而進程間通訊不管是信號,管道pipe仍是共享內存都是由操做系統保證的,是系統調用.數據結構
線程間通訊:因爲多線程共享地址空間和數據空間,因此多個線程間的通訊是一個線程的數據能夠直接提供給其餘線程使用,而沒必要經過操做系統(也就是內核的調度)。多線程
進程間的通訊則不一樣,它的數據空間的獨立性決定了它的通訊相對比較複雜,須要經過操做系統。之前進程間的通訊只能是單機版的,如今操做系統都繼承了基於套接字(socket)的進程間的通訊機制。這樣進程間的通訊就不侷限於單臺計算機了,實現了網絡通訊。併發
1、進程間的通訊方式
# 管道( pipe ):管道是一種半雙工的通訊方式,數據只能單向流動,並且只能在具備親緣關係的進程間使用。進程的親緣關係一般是指父子進程關係。
# 有名管道 (namedpipe) : 有名管道也是半雙工的通訊方式,可是它容許無親緣關係進程間的通訊。
# 信號量(semophore ) : 信號量是一個計數器,能夠用來控制多個進程對共享資源的訪問。它常做爲一種鎖機制,防止某進程正在訪問共享資源時,其餘進程也訪問該資源。所以,主要做爲進程間以及同一進程內不一樣線程之間的同步手段。
# 消息隊列( messagequeue ) : 消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩衝區大小受限等缺點。
# 信號 (sinal ) : 信號是一種比較複雜的通訊方式,用於通知接收進程某個事件已經發生。
# 共享內存(shared memory ) :共享內存就是映射一段能被其餘進程所訪問的內存,這段共享內存由一個進程建立,但多個進程均可以訪問。共享內存是最快的 IPC 方式,它是針對其餘進程間通訊方式運行效率低而專門設計的。它每每與其餘通訊機制,如信號兩,配合使用,來實現進程間的同步和通訊。
# 套接字(socket ) : 套解口也是一種進程間通訊機制,與其餘通訊機制不一樣的是,它可用於不一樣及其間的進程通訊。異步
2、線程間的通訊方式socket
# 鎖機制:包括互斥鎖、條件變量、讀寫鎖
*互斥鎖提供了以排他方式防止數據結構被併發修改的方法。
*讀寫鎖容許多個線程同時讀共享數據,而對寫操做是互斥的。
*條件變量能夠以原子的方式阻塞進程,直到某個特定條件爲真爲止。對條件的測試是在互斥鎖的保護下進行的。條件變量始終與互斥鎖一塊兒使用。
# 信號量機制(Semaphore):包括無名線程信號量和命名線程信號量
# 信號機制(Signal):相似進程間的信號處理
線程間的通訊目的主要是用於線程同步,因此線程沒有像進程通訊中的用於數據交換的通訊機制。測試