進(jìn)程與通信
進(jìn)程可以理解為操作系統(tǒng)的可執(zhí)行程序乖订,每當(dāng)我們執(zhí)行一個(gè)程序時(shí)板壮,對(duì)于操作系統(tǒng)來(lái)講就創(chuàng)建了一個(gè)進(jìn)程斥难,隨著進(jìn)程的創(chuàng)建枝嘶,系統(tǒng)需要分配相關(guān)的資源,有分配就有回收蘸炸。所以也可以簡(jiǎn)單理解成進(jìn)程就是一次程序的調(diào)度過(guò)程躬络。
進(jìn)程用戶空間是相互獨(dú)立的,一般而言是不能相互訪問(wèn)的搭儒。例如在iOS或者Android等移動(dòng)端設(shè)備穷当,每個(gè)App承載著各自獨(dú)立的功能,擁有自己的用戶空間淹禾。但很多情況下馁菜,進(jìn)程之間是需要通信的,用過(guò)App的都可以理解铃岔。在不同的系統(tǒng)平臺(tái)汪疮,通行方式可能不一樣峭火,但是本質(zhì)上一定是一致的。
通信場(chǎng)景
數(shù)據(jù)傳輸:一個(gè)進(jìn)程需要將它的數(shù)據(jù)發(fā)送給另一個(gè)進(jìn)程智嚷,發(fā)送的數(shù)據(jù)量在一個(gè)字節(jié)到幾兆字節(jié)之間卖丸。
共享數(shù)據(jù):多個(gè)進(jìn)程想要操作共享數(shù)據(jù),一個(gè)進(jìn)程對(duì)共享數(shù)據(jù)的修改盏道,別的進(jìn)程應(yīng)該立刻看到稍浆。
通知事件:一個(gè)進(jìn)程需要向另一個(gè)或一組進(jìn)程發(fā)送消息,通知它(它們)發(fā)生了某種事件(如進(jìn)程終止時(shí)要通知父進(jìn)程)猜嘱。
資源共享:多個(gè)進(jìn)程之間共享同樣的資源衅枫。為了作到這一點(diǎn),需要內(nèi)核提供鎖和同步機(jī)制朗伶。
進(jìn)程控制:有些進(jìn)程希望完全控制另一個(gè)進(jìn)程的執(zhí)行(如Debug進(jìn)程)弦撩,此時(shí)控制進(jìn)程希望能夠攔截另一個(gè)進(jìn)程的所有陷入和異常,并能夠及時(shí)知道它的狀態(tài)改變论皆。
通信方式
管道( pipe ):
管道包括三種:
普通管道PIPE: 通常有兩種限制,一是單工,只能單向傳輸;二是只能在父子或者兄弟進(jìn)程間使用.
流管道s_pipe: 去除了第一種限制,為半雙工益楼,只能在父子或兄弟進(jìn)程間使用,可以雙向傳輸.
命名管道:name_pipe:去除了第二種限制,可以在許多并不相關(guān)的進(jìn)程之間進(jìn)行通訊.
信號(hào)量( semophore ) :
信號(hào)量是一個(gè)計(jì)數(shù)器纯丸,可以用來(lái)控制多個(gè)進(jìn)程對(duì)共享資源的訪問(wèn)偏形。它常作為一種鎖機(jī)制静袖,防止某進(jìn)程正在訪問(wèn)共享資源時(shí)觉鼻,其他進(jìn)程也訪問(wèn)該資源。因此队橙,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段坠陈。
消息隊(duì)列( message queue ) :
消息隊(duì)列是由消息的鏈表,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí)捐康。消息隊(duì)列克服了信號(hào)傳遞信息少仇矾、管道只能承載無(wú)格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。
信號(hào) ( sinal ) :
信號(hào)是一種比較復(fù)雜的通信方式解总,用于通知接收進(jìn)程某個(gè)事件已經(jīng)發(fā)生贮匕。
共享內(nèi)存( shared memory ) :
共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問(wèn)的內(nèi)存,這段共享內(nèi)存由一個(gè)進(jìn)程創(chuàng)建花枫,但多個(gè)進(jìn)程都可以訪問(wèn)刻盐。共享內(nèi)存是最快的 IPC 方式,它是針對(duì)其他進(jìn)程間通信方式運(yùn)行效率低而專門設(shè)計(jì)的劳翰。它往往與其他通信機(jī)制敦锌,如信號(hào)兩,配合使用佳簸,來(lái)實(shí)現(xiàn)進(jìn)程間的同步和通信乙墙。
套接字( socket ) :
套解口也是一種進(jìn)程間通信機(jī)制,與其他通信機(jī)制不同的是,它可用于不同機(jī)器間的進(jìn)程通信听想。