通訊(一)進程間通訊和線程間通訊

1、進程間通訊程序員

  一、進程間通訊概述:進程間通訊(IPC,Interprocess communication)是一組編程接口,讓程序員可以協調不一樣的進程,使之能在一個操做系統裏同時運行,並相互傳遞、交換信息。這使得一個程序可以在同一時間裏處理許多用戶的要求。由於即便只有一個用戶發出要求,也可能致使一個操做系統中多個進程的運行,進程之間必須互相通話。IPC接口就提供了這種可能性。每一個IPC方法均有它本身的優勢和侷限性,通常,對於單個程序而言使用全部的IPC方法是不常見的。編程

  二、進程間通訊的目的:數據結構

    1)數據傳輸:一個進程須要將它的數據發送給另外一個進程,發送的數據量在一個字節到幾兆字節之間。
    2)共享數據:多個進程想要操做共享數據,一個進程對共享數據的修改,別的進程應該馬上看到。
    3)通知事件:一個進程須要向另外一個或一組進程發送消息,通知它(它們)發生了某種事件(如進程終止時要通知 父進程)。
    4)資源共享:多個進程之間共享一樣的資源。爲了做到這一點,須要 內核提供鎖和同步機制。
    5)進程控制:有些進程但願徹底控制另外一個進程的執行(如Debug進程),此時控制進程但願可以攔截另外一個進程的全部陷入和異常,並可以及時知道它的狀態改變。
 
   三、進程間通訊的方式:進程間的通訊則不一樣,它的數據空間的獨立性決定了它的通訊相對比較複雜,須要經過操做系統。通訊機制主要有: 管道、有名管道、消息隊列、信號量、共享空間、信號、套接字(socket)。   

 

  (1)管道:它傳遞數據是單向性的,只能從一方流向另外一方,也就是一種半雙工的通訊方式;只用於有親緣關係的進程間的通訊,親緣關係也就是 父子進程或兄弟進程;沒有名字而且大小受限,傳輸的是無格式的流,因此兩進程通 信時必須約定好數據通訊的格式。管道它就像一個特殊的文件,但這個文件之存在於內存中,在建立管道時,系統爲管道分配了一個頁面做爲數據緩衝區,進程對這個數據緩衝區進行讀寫,以此來完成通訊。其中一個進 程只能讀一個只能寫,因此叫半雙工通訊,爲何一個只能讀一個只能寫呢?由於寫進程是在緩衝區的末尾寫入,讀進程是在緩衝區的頭部讀取,他們各自 的數據結構不一樣,因此功能不一樣。多線程

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

    實例:http://blog.csdn.net/yl2isoft/article/details/20228279spa

    代碼下載:http://files.cnblogs.com/files/qtiger/NamedPipeExample.zip操作系統

  (3)高級管道(popen):將另外一個程序當作一個新的進程在當前程序進程中啓動,則它算是當前程序的子進程,這種方式咱們成爲高級管道方式。.net

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

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

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

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

  (8)套接字( socket ) : 套接字也是一種進程間通訊機制,與其餘通訊機制不一樣的是,它可用於不一樣機器間的進程通訊。

2、線程間通訊

  一、線程間通訊的概況

    因爲多線程共享地址空間和數據空間,因此多個線程間的通訊是一個線程的數據能夠直接提供給其餘線程使用,而沒必要經過操做系統。因此線程間通訊和同步的方式主要有鎖機制(包括互斥鎖、條件變量、讀寫鎖)、信號機制(Signal)、信號量機制(Semaphore)

相關文章
相關標籤/搜索