進程及進程間的通信
對于軟件開發(fā)人員來說,不管你做的是前端、WEB、中間件、底層,還是其他,掌握進程相關知識都是非常重要的。最近,我被問到了一個問題:進程間通信的方式都有哪些?作為一位多年的開發(fā)者,我竟然一時答不上來(相當?shù)膶擂?。后來,我在網(wǎng)上查閱了相關資料,算是對這個問題有了大致的了解。在這篇文章中,根據(jù)查閱到的資料,我介紹一下進程及進程間通信的方式,供大家溫習基礎知識,也希望大家在從事開發(fā)工作的同時,不要忘了強化自己的基礎知識。
進程簡介
進程的概念已經(jīng)出現(xiàn)有半個多世紀了,它是60年代初首先在麻省理工學院的MULTICS系統(tǒng)和IBM公司的CTSS/360系統(tǒng)中引入的。
進程的定義有廣義和狹義之分。狹義的進程是指正在運行的程序的實例;廣義的進程是一個具有一定獨立功能的程序關于某個數(shù)據(jù)集合的一次運行活動,它是操作系統(tǒng)動態(tài)執(zhí)行的基本單元。
關于進程,需要注意的有兩點:***,進程是一個實體,每一個進程都有它自己的地址空間;第二,進程是一個“執(zhí)行中的程序”(只有當操作系統(tǒng)執(zhí)行它的時候,它才能成為一個活動的實體)。
進程間通信的方式
進程之間通信的方式有以下8種:
***種,無名管道(pipe):它是一種半雙工的通信方式,數(shù)據(jù)只能單向流動,而且只能在具有親緣關系的進程間使用(進程的親緣關系通常是指父子進程關系)。
第二種,高級管道(popen):將另一個程序當做一個新的進程在當前程序進程中啟動,則它算是當前程序的子進程,這種方式稱為高級管道方式。具體的程序執(zhí)行可參考這篇文章:http://blog.csdn.net/zhouzhaoxiong1227/article/details/50403299。
第三種,有名管道(named pipe):它也是半雙工的通信方式,但是它允許無親緣關系的進程進行通信。
第四種,消息隊列(message queue):它是一種數(shù)據(jù)結(jié)構,存放在內(nèi)核中并由消息隊列標識符標識;它克服了信號傳遞信息少、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點。具體的隊列操作可參考這篇文章:http://blog.csdn.net/zhouzhaoxiong1227/article/details/52186663
第五種,信號量(semaphore):它是一個計數(shù)器,可以用來控制多個進程對共享資源的訪問;它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,它主要作為進程間以及同一進程內(nèi)不同線程之間的同步手段。
第六種,信號(signal):它是一種比較復雜的通信方式,用于通知接收進程某個事件已經(jīng)發(fā)生。
第七種,共享內(nèi)存(shared memory):它是由程序映射的一段能被其他進程所訪問的內(nèi)存,這段共享內(nèi)存由一個進程創(chuàng)建,但多個進程都可以訪問;它是針對其他進程間通信方式運行效率低而專門設計的,往往與其他通信機制(如信號量)配合使用來實現(xiàn)進程間的同步和通信。
第八種,套接字(socket):它也是一種進程間通信機制,與其他通信機制不同的是,它可用于不同機器間的進程通信。具體的socket的消息流程可參考這篇文章:http://blog.csdn.net/zhouzhaoxiong1227/article/details/46416555。
【本文是51CTO專欄作者“周兆熊”的原創(chuàng)文章,作者微信公眾號:周氏邏輯(logiczhou)】