進(jìn)程間通信目的
- 數(shù)據(jù)傳輸回右,
- 共享數(shù)據(jù)境钟,一個(gè)進(jìn)程對(duì)數(shù)據(jù)的修改令花,另外的進(jìn)程能立刻看到阻桅;
- 通知事件凉倚,一個(gè)進(jìn)程向另一個(gè)(一組)進(jìn)程發(fā)送消息,通知它們發(fā)生了什么事件(子進(jìn)程終止時(shí)通知父進(jìn)程嫂沉,Qt的消息機(jī)制)稽寒;
- 資源共享,多個(gè)進(jìn)程共享臨界資源趟章,需要內(nèi)核提供鎖和同步機(jī)制杏糙;
- 進(jìn)程控制,有些進(jìn)程希望完全控制另一個(gè)進(jìn)程的執(zhí)行(Debug進(jìn)程)蚓土,此時(shí)控制進(jìn)程希望能夠攔截另一個(gè)進(jìn)程的所有陷入和異常宏侍,并能夠及時(shí)知道它的狀態(tài)改變。
進(jìn)程間通信方式
1.信號(hào)
用于通知接收進(jìn)程某件事情發(fā)生蜀漆;信號(hào)由內(nèi)核管理谅河,在linux下每個(gè)進(jìn)程都有自己獨(dú)立的虛擬內(nèi)存空間,互不干擾嗜愈。
當(dāng)A進(jìn)程要通知B進(jìn)程某事件發(fā)生時(shí)旧蛾,A進(jìn)程將通知信號(hào)交給內(nèi)核莽龟,由內(nèi)核負(fù)責(zé)通知B進(jìn)程蠕嫁,即內(nèi)核充當(dāng)進(jìn)程A、B的郵遞員毯盈。
進(jìn)程不僅可以發(fā)送信號(hào)給另一進(jìn)程(kill)剃毒,還可以發(fā)送信號(hào)給自身(raise)
缺點(diǎn):承載信號(hào)少,一般來說只是一個(gè)整型數(shù)字搂赋。
2. 管道
管道是一種半雙工通信方式赘阀,數(shù)據(jù)只能單向流動(dòng),
匿名管道用于父到子(孫脑奠。基公。)單向進(jìn)程間通信;
有名管道(FIFO)還可用于無親緣關(guān)系的進(jìn)程間通信宋欺;
缺點(diǎn):1)只能操作無格式字節(jié)流轰豆;2)緩沖區(qū)大小有限;
3)FIFO長(zhǎng)期存在系統(tǒng)中齿诞,使用不當(dāng)容易出錯(cuò)酸休。
3. IPC
3.1 信號(hào)量
信號(hào)量是一個(gè)計(jì)數(shù)器,可以用來控制多個(gè)進(jìn)程對(duì)共享資源的訪問祷杈,常作為一種鎖機(jī)制斑司,通過PV原語(yǔ)來同步信號(hào)量S;
P原語(yǔ)(wait)申請(qǐng)一個(gè)單位資源但汞,若S>0,則將S--宿刮,進(jìn)程繼續(xù)執(zhí)行互站;否則進(jìn)程循環(huán)等待資源;
V原語(yǔ)(signal)釋放一個(gè)單位資源僵缺,S++云茸;
主要用于進(jìn)程間同步手段,還可以是進(jìn)程下的線程間同步谤饭;
系統(tǒng)調(diào)用 semget()
3.2 消息隊(duì)列
多個(gè)進(jìn)程共同維護(hù)一個(gè)隊(duì)列标捺,有寫權(quán)限的進(jìn)程向隊(duì)列中添加信息,有讀權(quán)限的進(jìn)程讀走信息揉抵。
主要用于進(jìn)程間交換短信息亡容,由內(nèi)核管理,不需要考慮同步問題(系統(tǒng)函數(shù)調(diào)用實(shí)現(xiàn)信息發(fā)送和接受間的同步冤今;
在實(shí)際操作中需要在內(nèi)核態(tài)和用戶態(tài)間進(jìn)行4次數(shù)據(jù)拷貝闺兢;
優(yōu)點(diǎn):克服承載信息少,只能操作無格式字節(jié)流等問題戏罢,且不需要考慮同步問題屋谭;
缺陷: 信息的復(fù)制消耗CPU時(shí)間,所以不適合信息量大和操作頻繁的場(chǎng)合龟糕。
系統(tǒng)調(diào)用msgget()
3.3 共享內(nèi)存
多個(gè)進(jìn)程共享內(nèi)存桐磁,直接讀取內(nèi)存,不需要任何數(shù)據(jù)拷貝讲岁。
通過mmap()系統(tǒng)調(diào)用使得進(jìn)程間通過映射同一文件(linux下一切皆可看成文件)到各自的虛擬內(nèi)存空間我擂,從而共享文件,是最快的通信方式缓艳,在內(nèi)存緩沖區(qū)直接交換信息校摩,
優(yōu)點(diǎn): 克服消息緩沖通信效率低問題;無需復(fù)制阶淘、信息量大衙吩。
缺陷: 1)直接將共享內(nèi)存映射到進(jìn)程的虛擬地址空間中,需要進(jìn)程自己管理同步問題(常與信號(hào)量結(jié)合使用溪窒,來處理進(jìn)程間同步問題)坤塞;
2)內(nèi)存實(shí)體存放在計(jì)算機(jī)系統(tǒng),因此只能是一臺(tái)機(jī)器內(nèi)的進(jìn)程共享霉猛,不方便網(wǎng)絡(luò)通信尺锚。
系統(tǒng)調(diào)用shmget()
4. socket通信
用于不同機(jī)器間的進(jìn)程通信。
總結(jié)
- 信號(hào):承載信息少惜浅;
- 管道:操作簡(jiǎn)單瘫辩;但速度慢,容量有限,只有父子進(jìn)程能通訊伐厌,單向通信承绸;
- FIFO:任何進(jìn)程間都能通訊;但速度慢挣轨,且長(zhǎng)期存在系統(tǒng)中军熏,使用不當(dāng)容易出錯(cuò);
- 信號(hào)量:不能傳遞復(fù)雜消息卷扮,只能用來同步荡澎;
- 消息隊(duì)列:信息復(fù)制需要額外消耗CPU時(shí)間,不適用與消息量大或操作頻繁的場(chǎng)合晤锹;
- 共享內(nèi)存區(qū):無需復(fù)制摩幔,快捷,信息量大鞭铆,速度快或衡,但要保持同步;
上述的進(jìn)程通信方式?jīng)]有絕對(duì)的優(yōu)與劣之分车遂,在具體使用過程中封断,根據(jù)當(dāng)前場(chǎng)景的不同,選擇合適的進(jìn)程通信方式舶担,如:當(dāng)用戶進(jìn)程傳遞的消息很少坡疼,或是通過信號(hào)來觸發(fā)某些行為,那么使用信號(hào)通信方式就是個(gè)不錯(cuò)的選擇柄沮。