Linux內(nèi)核-進(jìn)程間通信組件的實(shí)現(xiàn)
作者:深度Linux
來(lái)源:SegmentFault 思否社區(qū)
Linux內(nèi)核的五大組件
一、內(nèi)存管理
二、進(jìn)程管理
三、進(jìn)程間通信
數(shù)據(jù)傳輸:一個(gè)進(jìn)程需要將它的數(shù)據(jù)發(fā)送給另一個(gè)進(jìn)程; 資源共享:多個(gè)進(jìn)程之間共享同樣的資源; 通知事件:一個(gè)進(jìn)程需要向另一個(gè)或者另一組進(jìn)程發(fā)送消息,通知他們發(fā)生了某種事件。 進(jìn)程控制:有些進(jìn)程需要完全控制另一個(gè)進(jìn)程的執(zhí)行,此時(shí)控制進(jìn)程希望能夠攔截另一個(gè)進(jìn)程的所有陷入和異常,并能夠及時(shí)知道它的狀態(tài)改變。
關(guān)于System V標(biāo)準(zhǔn)的進(jìn)程間通信主要有以下幾類(lèi):
1. 管道
管道適用于進(jìn)程間的數(shù)據(jù)傳輸。本質(zhì)上管道是操作系統(tǒng)在內(nèi)核中為進(jìn)程開(kāi)辟了一塊緩沖區(qū),多個(gè)進(jìn)程通過(guò)訪問(wèn)同一緩沖區(qū)進(jìn)行通信,數(shù)據(jù)在緩沖區(qū)中以讀寫(xiě)的方式被不同進(jìn)程獲取和操作。
管道有三大特性:
1.生命周期隨進(jìn)程;
2.自帶同步與互斥;
3.提供字節(jié)流服務(wù)。
管道主要分為匿名管道和命名管道
前面說(shuō)了管道是操作系統(tǒng)為進(jìn)程在內(nèi)核中分配的一塊緩沖區(qū),匿名管道就是指這塊緩沖區(qū)沒(méi)有標(biāo)識(shí)符,因此其他進(jìn)程無(wú)法直接訪問(wèn)匿名管道,只有類(lèi)似父子進(jìn)程這樣的具有親緣關(guān)系的進(jìn)程才能使用匿名管道進(jìn)行通信(原因是子進(jìn)程會(huì)復(fù)制父進(jìn)程的PCB,其中包括這塊信息)。匿名管道的創(chuàng)建使用如下接口:
int?pipe(int?fd[2])
匿名管道的特性是:
這些特性體現(xiàn)了管道自帶同步與互斥。
命名管道和匿名管道相反,命名管道是有標(biāo)識(shí)符的一塊緩沖區(qū),并且這個(gè)標(biāo)識(shí)符一般是一個(gè)可見(jiàn)于文件系統(tǒng)的文件。所以命名管道是一個(gè)特殊類(lèi)型的文件,其他進(jìn)程可以通過(guò)這個(gè)標(biāo)識(shí)符找到這塊緩沖區(qū),即通過(guò)打開(kāi)同一個(gè)管道文件,訪問(wèn)到同一緩沖區(qū),進(jìn)而實(shí)現(xiàn)進(jìn)程間通信。
創(chuàng)建一個(gè)命名管道既可以使用mkfifo filename命令也可以使用接口,函數(shù)接口如下:int?mkfifo(const?char*?pathname,?mode_t?mode)
命名管道的打開(kāi)特性:
1.若管道文件以只讀的方式打開(kāi),會(huì)阻塞,直到這個(gè)文件被以寫(xiě)的方式打開(kāi);
2.若管道文件以只寫(xiě)的方式打開(kāi),會(huì)阻塞,直到這個(gè)文件被以讀的方式打開(kāi);
3.若文件以讀寫(xiě)的方式打開(kāi),就不會(huì)阻塞。
不管是匿名還是命名管道,同查那個(gè)對(duì)管道進(jìn)行的數(shù)據(jù)操作的大小不超過(guò)PIPE_BUF這個(gè)宏的大小,默認(rèn)是4KB。
共享內(nèi)存用于進(jìn)程間的數(shù)據(jù)共享,是最快的進(jìn)程間通信。共享內(nèi)存的創(chuàng)建大概是以下步驟:首先,在物理內(nèi)存中開(kāi)辟一塊空間,將這塊物理內(nèi)存映射到程序的虛擬地址空間,進(jìn)程就可以通過(guò)虛擬地址來(lái)訪問(wèn)這塊內(nèi)存。多個(gè)進(jìn)程映射到同一物理內(nèi)存,這樣進(jìn)行通信的方式,不需要進(jìn)入內(nèi)核,只需要再共享的內(nèi)存區(qū)進(jìn)行操作即可。其他方式的通信都是因?yàn)閮?nèi)核中的緩沖區(qū),進(jìn)程在通信的時(shí)候會(huì)涉及內(nèi)核態(tài)和用戶態(tài)的兩次數(shù)據(jù)拷貝。而共享內(nèi)存不會(huì)所以速度更快。
共享內(nèi)存的操作流程:
1.創(chuàng)建共享內(nèi)存即開(kāi)辟具有標(biāo)識(shí)符的物理內(nèi)存空間;
2.將共享內(nèi)存映射到各個(gè)進(jìn)程的虛擬地址空間;
3.直接通過(guò)虛擬地址進(jìn)行對(duì)共享內(nèi)存的操作;
4.解除映射;
5.釋放共享內(nèi)存。
int?shmget(key_t?key,?int?size,?int?flag)??//創(chuàng)建一個(gè)共享內(nèi)存
void*?shmat(int?shmid,?void*?addr,?int?flag)?//建立映射
int?shmdt(void*?shmstart)?//解除映射
int?shmctl(int?shmid,?int?cmd,?struct?shmid_ds*?bf)?//操作共享內(nèi)存
//cmd參數(shù)為IC_RMID的時(shí)候是刪除共享內(nèi)存
需要注意的是共享內(nèi)存自帶沒(méi)有同步與互斥。
消息隊(duì)列用于進(jìn)程間的數(shù)據(jù)傳輸(有標(biāo)識(shí)符)
消息隊(duì)列實(shí)際上就是內(nèi)核中的一個(gè)優(yōu)先級(jí)隊(duì)列,多個(gè)進(jìn)程通過(guò)向同一個(gè)隊(duì)列中 添加 或者 獲取 節(jié)點(diǎn)來(lái)實(shí)現(xiàn)通信。主要是傳輸一個(gè)有類(lèi)型(優(yōu)先級(jí))的數(shù)據(jù)塊。
特性:
2.生命周期隨內(nèi)核;
3.數(shù)據(jù)傳輸自帶優(yōu)先級(jí)。
信號(hào)量用于實(shí)現(xiàn)進(jìn)程間的控制,主要是同步和互斥。
本質(zhì):內(nèi)核中的一個(gè)計(jì)數(shù)器(對(duì)資源進(jìn)行計(jì)數(shù)) + pcb等待隊(duì)列
之前先獲取信號(hào)量,計(jì)數(shù) -1;若計(jì)數(shù) <0 則使進(jìn)程等待(將進(jìn)程pcb加入隊(duì)列中);否則可
以對(duì)臨界資源進(jìn)行訪問(wèn)(并且在訪問(wèn)期間,已經(jīng)將臨界資源的狀態(tài)置為不可訪問(wèn)狀態(tài),因此
可一保證其他進(jìn)程不會(huì)再訪問(wèn)臨界資源。當(dāng)前進(jìn)程訪問(wèn)完畢之后,則對(duì)計(jì)數(shù)進(jìn)行+1,則喚醒
一個(gè)進(jìn)程(將一個(gè)pcb出隊(duì),置為運(yùn)行狀態(tài))
理;若計(jì)數(shù)小于 0,則表示不能獲取(并且對(duì)計(jì)數(shù)進(jìn)行 -1),需要等待(加入pcb隊(duì)列)。
這時(shí)候若其他進(jìn)程生產(chǎn)一個(gè)資源,則會(huì)對(duì)計(jì)數(shù)進(jìn)行 +1,若計(jì)數(shù) <= 0 ,則喚醒一個(gè)進(jìn)程。
(負(fù)數(shù)表示正在等待進(jìn)程的數(shù)量,如果為正說(shuō)明沒(méi)有進(jìn)程需要資源)。
四、虛擬文件系統(tǒng)
五、網(wǎng)絡(luò)接口


評(píng)論
圖片
表情
