【操作系統(tǒng)】2.2 進(jìn)程通信

進(jìn)程間通信的概念

每個(gè)進(jìn)程各自有不同的用戶地址空間,任何一個(gè)進(jìn)程的全局變量在另一個(gè)進(jìn)程中都看不到。因此,進(jìn)程之間要交換數(shù)據(jù)必須通過(guò)內(nèi)核,在內(nèi)核中開(kāi)辟一塊緩沖區(qū),進(jìn)程1把數(shù)據(jù)從用戶空間拷到內(nèi)核緩沖區(qū),進(jìn)程2再?gòu)膬?nèi)核緩沖區(qū)把數(shù)據(jù)讀走,內(nèi)核提供的這種機(jī)制稱為進(jìn)程間通信 IPC(InterProcess Communication)。

進(jìn)程間通信 IPC

進(jìn)程間通信的應(yīng)用場(chǎng)景

(1)數(shù)據(jù)傳輸

一個(gè)進(jìn)程需要將它的數(shù)據(jù)發(fā)送給另一個(gè)進(jìn)程,發(fā)送的數(shù)據(jù)量在一個(gè)字節(jié)到幾兆字節(jié)之間。

(2)共享數(shù)據(jù)

多個(gè)進(jìn)程想要操作共享數(shù)據(jù),一個(gè)進(jìn)程對(duì)共享數(shù)據(jù)的修改,別的進(jìn)程應(yīng)該立刻看到。

(3)通知事件

一個(gè)進(jìn)程需要向另一個(gè)或一組進(jìn)程發(fā)送消息,通知它(它們)發(fā)生了某種事件。

(4)資源共享

多個(gè)進(jìn)程之間共享同樣的資源,需要內(nèi)核提供鎖和同步機(jī)制。

(5)進(jìn)程控制

有些進(jìn)程希望完全控制另一個(gè)進(jìn)程的執(zhí)行(如Debug進(jìn)程),此時(shí)控制進(jìn)程希望能夠攔截另一個(gè)進(jìn)程的所有陷入和異常,并能夠及時(shí)知道它的狀態(tài)改變。

1.管道

管道是通過(guò)調(diào)用 pipe 函數(shù)創(chuàng)建的,fd[0] 用于讀,fd[1] 用于寫。

#include <unistd.h>

int pipe(intfd[2]);

限制:①只支持半雙工通信(單向交替?zhèn)鬏敚虎谥荒茉诟缸舆M(jìn)程或者兄弟進(jìn)程中使用。

管道

2.FIFO

FIFO也稱為管道,與上述管道不同的是沒(méi)有只能在父子進(jìn)程中使用的限制。

#include<sys/stat.h>

int mkfifo(const char *path, mode_t mode);

int mkfifoat(int fd, const char *path, mode_t mode);

FIFO 常用于客戶-服務(wù)器應(yīng)用程序中,F(xiàn)IFO 用作匯聚點(diǎn),在客戶進(jìn)程和服務(wù)器進(jìn)程之間傳遞數(shù)據(jù)。

管道 FIFO

3.消息隊(duì)列

消息隊(duì)列是存放在內(nèi)核中的消息鏈表,每個(gè)消息隊(duì)列由消息隊(duì)列標(biāo)識(shí)符表示。

①?消息隊(duì)列允許一個(gè)或多個(gè)進(jìn)程向它寫入與讀取消息。

②?管道和消息隊(duì)列的通信數(shù)據(jù)都是先進(jìn)先出的原則

③消息隊(duì)列克服了信號(hào)傳遞信息少、管道只能承載無(wú)格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。

4.信號(hào)量

信號(hào)量是是一個(gè)計(jì)數(shù)器,用于多個(gè)進(jìn)程之間訪問(wèn)共享數(shù)據(jù),即進(jìn)程間同步。

工作機(jī)制:信號(hào)量的初值(>0),每當(dāng)有進(jìn)程申請(qǐng)使用信號(hào)量,通過(guò)一個(gè)P操作來(lái)對(duì)信號(hào)量進(jìn)行-1操作。當(dāng)計(jì)數(shù)器減到0的時(shí)候就說(shuō)明沒(méi)有資源了,其他進(jìn)程要想訪問(wèn)就必須等待。當(dāng)該進(jìn)程執(zhí)行完之后,就會(huì)執(zhí)行V操作來(lái)對(duì)信號(hào)量進(jìn)行+1操作。

信號(hào)量

5.共享內(nèi)存

多個(gè)進(jìn)程可以直接讀寫同一塊內(nèi)存空間(最快的 IPC )。

工作機(jī)制:將不同進(jìn)程的虛擬內(nèi)存地址映射到相同的物理內(nèi)存地址,實(shí)現(xiàn)共享內(nèi)存。內(nèi)核有一塊內(nèi)存區(qū),可以將進(jìn)程的私有地址空間映射到該內(nèi)存區(qū),因此進(jìn)程間可以直接讀寫這一塊內(nèi)存而不需要進(jìn)行數(shù)據(jù)的拷貝。

共享內(nèi)存

6.套接字socket

套接字socket是一種通信機(jī)制,實(shí)現(xiàn)進(jìn)程間(本地/跨網(wǎng)絡(luò))的通信。socket是應(yīng)用層和傳輸層之間的橋梁。

socket的數(shù)據(jù)交互

socket通信的基本流程如下:

socket通信的基本流程
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容