Posted on 2012-12-18 13:58
鑫龍 閱讀(383)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
linux進(jìn)程通信專題
轉(zhuǎn)自http://www.ibm.com/developerworks/cn/linux/l-ipc/index.html,作者:鄭彥興
序
linux下的進(jìn)程通信手段基本上是從Unix平臺(tái)上的進(jìn)程通信手段繼承而來(lái)的。而對(duì)Unix發(fā)展做出重大貢獻(xiàn)的兩大主力 AT&T的貝爾實(shí)驗(yàn)室及BSD(加州大學(xué)伯克利分校的伯克利軟件發(fā)布中心)在進(jìn)程間通信方面的側(cè)重點(diǎn)有所不同。前者對(duì)Unix早期的進(jìn)程間通信手 段進(jìn)行了系統(tǒng)的改進(jìn)和擴(kuò)充,形成了“system V IPC”,通信進(jìn)程局限在單個(gè)計(jì)算機(jī)內(nèi);后者則跳過(guò)了該限制,形成了基于套接口(socket)的進(jìn)程間通信機(jī)制。Linux則把兩者繼承了下來(lái),如圖 示:
其中,最初Unix IPC包括:管道、FIFO、信號(hào);System V IPC包括:System V消息隊(duì)列、System V信號(hào)燈、System V共享內(nèi)存區(qū);Posix IPC包括: Posix消息隊(duì)列、Posix信號(hào)燈、Posix共享內(nèi)存區(qū)。有兩點(diǎn)需要簡(jiǎn)單說(shuō)明一下:1)由于Unix版本的多樣性,電子電氣工程協(xié)會(huì)(IEEE)開(kāi) 發(fā)了一個(gè)獨(dú)立的Unix標(biāo)準(zhǔn),這個(gè)新的ANSI Unix標(biāo)準(zhǔn)被稱為計(jì)算機(jī)環(huán)境的可移植性操作系統(tǒng)界面(PSOIX)。現(xiàn)有大部分Unix和流行版本都是遵循POSIX標(biāo)準(zhǔn)的,而Linux從一開(kāi)始就遵 循POSIX標(biāo)準(zhǔn);2)BSD并不是沒(méi)有涉足單機(jī)內(nèi)的進(jìn)程間通信(socket本身就可以用于單機(jī)內(nèi)的進(jìn)程間通信)。事實(shí)上,很多Unix版本的單機(jī) IPC留有BSD的痕跡,如4.4BSD支持的匿名內(nèi)存映射、4.3+BSD對(duì)可靠信號(hào)語(yǔ)義的實(shí)現(xiàn)等等。
圖一給出了linux 所支持的各種IPC手段,在本文接下來(lái)的討論中,為了避免概念上的混淆,在盡可能少提及Unix的各個(gè)版本的情況下,所有問(wèn)題的討論最終都會(huì)歸結(jié)到 Linux環(huán)境下的進(jìn)程間通信上來(lái)。并且,對(duì)于Linux所支持通信手段的不同實(shí)現(xiàn)版本(如對(duì)于共享內(nèi)存來(lái)說(shuō),有Posix共享內(nèi)存區(qū)以及System V共享內(nèi)存區(qū)兩個(gè)實(shí)現(xiàn)版本),將主要介紹Posix API。
linux下進(jìn)程間通信的幾種主要手段簡(jiǎn)介:
- 管道(Pipe)及有名管道(named pipe):管道可用于具有親緣關(guān)系進(jìn)程間的通信,有名管道克服了管道沒(méi)有名字的限制,因此,除具有管道所具有的功能外,它還允許無(wú)親緣關(guān)系進(jìn)程間的通信;
- 信號(hào)(Signal):信號(hào)是比較復(fù)雜的通信方式,用于通知接受進(jìn)程有某種事件發(fā)生,除了用于進(jìn)程間通信外,進(jìn)程還可以發(fā)送信號(hào) 給進(jìn)程本身;linux除了支持Unix早期信號(hào)語(yǔ)義函數(shù)sigal外,還支持語(yǔ)義符合Posix.1標(biāo)準(zhǔn)的信號(hào)函數(shù)sigaction(實(shí)際上,該函數(shù) 是基于BSD的,BSD為了實(shí)現(xiàn)可靠信號(hào)機(jī)制,又能夠統(tǒng)一對(duì)外接口,用sigaction函數(shù)重新實(shí)現(xiàn)了signal函數(shù));
- 報(bào)文(Message)隊(duì)列(消息隊(duì)列):消息隊(duì)列是消息的鏈接表,包括Posix消息隊(duì)列system V消息隊(duì)列。有足夠權(quán)限的進(jìn)程可以向隊(duì)列中添加消息,被賦予讀權(quán)限的進(jìn)程則可以讀走隊(duì)列中的消息。消息隊(duì)列克服了信號(hào)承載信息量少,管道只能承載無(wú)格式字 節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。
- 共享內(nèi)存:使得多個(gè)進(jìn)程可以訪問(wèn)同一塊內(nèi)存空間,是最快的可用IPC形式。是針對(duì)其他通信機(jī)制運(yùn)行效率較低而設(shè)計(jì)的。往往與其它通信機(jī)制,如信號(hào)量結(jié)合使用,來(lái)達(dá)到進(jìn)程間的同步及互斥。
- 信號(hào)量(semaphore):主要作為進(jìn)程間以及同一進(jìn)程不同線程之間的同步手段。
- 套接口(Socket):更為一般的進(jìn)程間通信機(jī)制,可用于不同機(jī)器之間的進(jìn)程間通信。起初是由Unix系統(tǒng)的BSD分支開(kāi)發(fā)出來(lái)的,但現(xiàn)在一般可以移植到其它類Unix系統(tǒng)上:Linux和System V的變種都支持套接字。
下面將對(duì)上述通信機(jī)制做具體闡述。
附1:參考文獻(xiàn)[2]中對(duì)linux環(huán)境下的進(jìn)程進(jìn)行了概括說(shuō)明:
一般來(lái)說(shuō),linux下的進(jìn)程包含以下幾個(gè)關(guān)鍵要素:
- 有一段可執(zhí)行程序;
- 有專用的系統(tǒng)堆棧空間;
- 內(nèi)核中有它的控制塊(進(jìn)程控制塊),描述進(jìn)程所占用的資源,這樣,進(jìn)程才能接受內(nèi)核的調(diào)度;
- 具有獨(dú)立的存儲(chǔ)空間
進(jìn)程和線程有時(shí)候并不完全區(qū)分,而往往根據(jù)上下文理解其含義。
參考資料
- UNIX環(huán)境高級(jí)編程,作者:W.Richard Stevens,譯者:尤晉元等,機(jī)械工業(yè)出版社。具有豐富的編程實(shí)例,以及關(guān)鍵函數(shù)伴隨Unix的發(fā)展歷程。
- linux內(nèi)核源代碼情景分析(上、下),毛德操、胡希明著,浙江大學(xué)出版社,提供了對(duì)linux內(nèi)核非常好的分析,同時(shí),對(duì)一些關(guān)鍵概念的背景進(jìn)行了詳細(xì)的說(shuō)明。
- UNIX網(wǎng)絡(luò)編程第二卷:進(jìn)程間通信,作者:W.Richard Stevens,譯者:楊繼張,清華大學(xué)出版社。一本比較全面闡述Unix環(huán)境下進(jìn)程間通信的書(shū)(沒(méi)有信號(hào)和套接口,套接口在第一卷中)。