進程間通訊的方式及比較


進程間通訊就是在不一樣進程之間傳播或交換信息,那麼不一樣進程之間存在着什麼雙方均可以訪問的介質呢?進程的用戶空間是互相獨立的,通常而言是不能互相訪問的,惟一的例外是共享內存區。可是,系統空間倒是「公共場所」,因此內核顯然能夠提供這樣的條件。除此之外,那就是雙方均可以訪問的外設了。在這個意義上,兩個進程固然也能夠經過磁盤上的普通文件交換信息,或者經過「註冊表」或其它數據庫中的某些表項和記錄交換信息。廣義上這也是進程間通訊的手段,可是通常都不把這算做「進程間通訊」。由於那些通訊手段的效率過低了,而人們對進程間通訊的要求是要有必定的實時性。html

一.Linux下進程間通訊的幾種主要手段簡介:數據庫

1.管道(Pipe)及有名管道(named pipe):管道可用於具備親緣關係進程間的通訊,有名管道克服了管道沒有名字的限制,所以,除具備管道所具備的功能外,它還容許無親緣關係進程間的通訊;ide

管道包括三種:1)普通管道PIPE, 一般有種限制,一是半雙工,只能單向傳輸;二是隻能在父子進程間使用. 2)流管道s_pipe: 去除了第一種限制,能夠雙向傳輸. 3)命名管道:name_pipe, 去除了第二種限制,能夠在許多並不相關的進程之間進行通信.函數

2.信號(Signal):信號是比較複雜的通訊方式,用於通知接受進程有某種事件發生,除了用於進程間通訊外,進程還能夠發送信號給進程自己;Linux除了支持Unix早期信號語義函數sigal外,還支持語義符合Posix.1標準的信號函數sigaction(實際上,該函數是基於BSD的,BSD爲了實現可靠信號機制,又可以統一對外接口,用sigaction函數從新實現了signal函數);ui

3.報文(Message)隊列(消息隊列):消息隊列是消息的連接表,包括Posix消息隊列systemV消息隊列。有足夠權限的進程能夠向隊列中添加消息,被賦予讀權限的進程則能夠讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式字節流以及緩衝區大小受限等缺點。spa

4.共享內存:使得多個進程能夠訪問同一塊內存空間,是最快的可用IPC形式。是針對其餘通訊機制運行效率較低而設計的。每每與其它通訊機制,如信號量結合使用,來達到進程間的同步及互斥。.net

5.信號量(semaphore):主要做爲進程間以及同一進程不一樣線程之間的同步手段。線程

6.套接口(Socket):更爲通常的進程間通訊機制,可用於不一樣機器之間的進程間通訊。起初是由Unix系統的BSD分支開發出來的,但如今通常能夠移植到其它類Unix系統上:LinuxSystem V的變種都支持套接字。設計

二.相關問題unix

FAQ1: 管道與文件描述符,文件指針的關係?

: 其實管道的使用方法與文件相似,都能使用read,write,open等普通IO函數. 管道描述符相似於文件描述符. 事實上, 管道使用的描述符, 文件指針和文件描述符最終都會轉化成系統中SOCKET描述符. 都受到系統內核中SOCKET描述符的限制. 本質上LINUX內核源碼中管道是經過空文件來實現.

FAQ2: 管道的使用方法?

: 主要有下面幾種方法: 1)pipe, 建立一個管道,返回2個管道描述符.一般用於父子進程之間通信. 2)popen, pclose: 這種方式只返回一個管道描述符,經常使用於通訊另外一方是stdin or stdout; 3)mkpipe: 命名管道, 在許多進程之間進行交互.

FAQ3: 管道與系統IPC之間的優劣比較?

: 管道: 優勢是全部的UNIX實現都支持, 而且在最後一個訪問管道的進程終止後,管道就被徹底刪除;缺陷是管道只容許單向傳輸或者用於父子進程之間.

 系統IPC: 優勢是功能強大,能在絕不相關進程之間進行通信; 缺陷是關鍵字KEY_T使用了內核標識,佔用了內核資源,並且只能被顯式刪除,並且不能使用SOCKET的一些機制,例如select,epoll.

FAQ4: WINDOS進程間通訊與LINUX進程間通訊的關係?

: 事實上,WINDOS的進程通訊大部分移植於UNIX, WINDOS的剪貼板,文件映射等均可從UNIX進程通訊的共享存儲中找到影子.

FAQ5: 進程間通訊與線程間通訊之間的關係?\

: 由於WINDOWS運行的實體是線程, 狹義上的進程間通訊實際上是指分屬於不一樣進程的線程之間的通信.而單個進程之間的線程同步問題可歸併爲一種特殊的進程通訊.它要用到內核支持的系統調用來保持線程之間同步. 一般用到的一些線程同步方法包括:Event, Mutex, 信號量Semaphore, 臨界區資源等.

三.進程間通訊各類方式效率比較

類型

無鏈接

可靠

流控制

記錄

消息類型優先級

普通PIPE

N

Y

Y


N

PIPE

N

Y

Y


N

命名PIPE(FIFO)

N

Y

Y


N

消息隊列

N

Y

Y


Y

信號量

N

Y

Y


Y

共享存儲

N

Y

Y


Y

UNIXSOCKET

N

Y

Y


N

UNIX數據包SOCKET

Y

Y

N


N

:無鏈接: 指無需調用某種形式的OPEN,就有發送消息的能力

流控制: 若是系統資源短缺或者不能接收更多消息,則發送進程能進行流量控制



參考自:http://blog.chinaunix.net/uid-21411227-id-1826900.html

相關文章
相關標籤/搜索