<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Linux內(nèi)核-進(jìn)程間通信組件的實(shí)現(xiàn)

          共 2957字,需瀏覽 6分鐘

           ·

          2020-11-06 06:36

          作者:深度Linux

          來(lái)源:SegmentFault 思否社區(qū)




          Linux內(nèi)核的五大組件


          一個(gè)完整的Linux內(nèi)核一般由五大部分組成,他們分別是內(nèi)存管理,進(jìn)程管理,進(jìn)程間通信,虛擬文件系統(tǒng)和網(wǎng)絡(luò)接口。



          一、內(nèi)存管理


          內(nèi)存管理主要完成的是如何合理有效地管理整個(gè)系統(tǒng)的物理內(nèi)存,同時(shí)快速響應(yīng)內(nèi)核各個(gè)子系統(tǒng)對(duì)內(nèi)存分配的請(qǐng)求。Linux內(nèi)存管理支持虛擬內(nèi)存,而多余出的這部分內(nèi)存就是通過(guò)磁盤(pán)申請(qǐng)得到的,平時(shí)系統(tǒng)只把當(dāng)前運(yùn)行的程序塊保留在內(nèi)存中,其他程序塊則保留在磁盤(pán)中。在內(nèi)存緊缺時(shí),內(nèi)存管理負(fù)責(zé)在磁盤(pán)和內(nèi)存間交換程序塊。



          二、進(jìn)程管理


          進(jìn)程管理主要控制系統(tǒng)進(jìn)程對(duì)CPU的訪問(wèn)。當(dāng)需要某個(gè)進(jìn)程運(yùn)行時(shí),由進(jìn)程調(diào)度器根據(jù)基于優(yōu)先級(jí)的調(diào)度算法啟動(dòng)新的進(jìn)程。:Linux支持多任務(wù)運(yùn)行,那么如何在一個(gè)單CPU上支持多任務(wù)呢?這個(gè)工作就是由進(jìn)程調(diào)度管理來(lái)實(shí)現(xiàn)的。在系統(tǒng)運(yùn)行時(shí),每個(gè)進(jìn)程都會(huì)分得一定的時(shí)間片,然后進(jìn)程調(diào)度器根據(jù)時(shí)間片的不同,選擇每個(gè)進(jìn)程依次運(yùn)行,例如當(dāng)某個(gè)進(jìn)程的時(shí)間片用完后,調(diào)度器會(huì)選擇一個(gè)新的進(jìn)程繼續(xù)運(yùn)行。由于切換的時(shí)間和頻率都非常的快,由此用戶感覺(jué)是多個(gè)程序在同時(shí)運(yùn)行,而實(shí)際上,CPU在同一時(shí)間內(nèi)只有一個(gè)進(jìn)程在運(yùn)行,這一切都是進(jìn)程調(diào)度管理的結(jié)果。

          進(jìn)程間通信主要用于控制不同進(jìn)程之間在用戶空間的同步、數(shù)據(jù)共享和交換。由于不用的用戶進(jìn)程擁有不同的進(jìn)程空間,因此進(jìn)程間的通信要借助于內(nèi)核的中轉(zhuǎn)來(lái)實(shí)現(xiàn)。一般情況下,當(dāng)一個(gè)進(jìn)程等待硬件操作完成時(shí),會(huì)被掛起。當(dāng)硬件操作完成,進(jìn)程被恢復(fù)執(zhí)行,而協(xié)調(diào)這個(gè)過(guò)程的就是進(jìn)程間的通信機(jī)制。



          三、進(jìn)程間通信


          進(jìn)程間通信主要用于控制不同進(jìn)程之間在用戶空間的同步、數(shù)據(jù)共享和交換。由于不用的用戶進(jìn)程擁有不同的進(jìn)程空間,因此進(jìn)程間的通信要借助于內(nèi)核的中轉(zhuǎn)來(lái)實(shí)現(xiàn)。一般情況下,當(dāng)一個(gè)進(jìn)程等待硬件操作完成時(shí),會(huì)被掛起。當(dāng)硬件操作完成,進(jìn)程被恢復(fù)執(zhí)行,而協(xié)調(diào)這個(gè)過(guò)程的就是進(jìn)程間的通信機(jī)制。

          (1)進(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)改變。

          (2)進(jìn)程間通信方式

          進(jìn)程間通信主要分為兩大標(biāo)準(zhǔn):System V 標(biāo)準(zhǔn)和 POSIX 標(biāo)準(zhǔn)。
          關(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])

          這個(gè)接口的作用是創(chuàng)建一個(gè)匿名管道,并向用戶返回這個(gè)管道的操作句柄,其中參數(shù)fd[2]中fd[0]用于從管道中讀取數(shù)據(jù),fd[1]用于從管道中寫(xiě)入數(shù)據(jù),如果創(chuàng)建成功返回 0, 創(chuàng)建失敗返回 -1.

          匿名管道的特性是:

          1.若管道中沒(méi)有數(shù)據(jù),使用讀操作會(huì)阻塞;
          2.若管道寫(xiě)滿了,使用寫(xiě)操作會(huì)阻塞;
          3.若管道的寫(xiě)端關(guān)閉了,讀完數(shù)據(jù)之后不會(huì)阻塞而是返回 0;
          4.若管道的讀端關(guān)閉了,繼續(xù)寫(xiě)入數(shù)據(jù)會(huì)觸發(fā)異常,程序退出。

          這些特性體現(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)

          參數(shù)pathname是命名管道文件的名稱(chēng),mode是文件權(quán)限 。如果創(chuàng)建成功返回0,失敗返回-1.

          命名管道的打開(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。

          2.共享內(nèi)存

          共享內(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)存

          當(dāng)刪除共享內(nèi)存的時(shí)候,共享內(nèi)存不會(huì)立即被刪除(因?yàn)榭赡茉斐烧谠L問(wèn)的進(jìn)程奔潰)而是將key修改成0,表示這塊共享內(nèi)存不會(huì)再接收映射鏈接,當(dāng)這塊共享內(nèi)存的映射鏈接為0的時(shí)候,則自動(dòng)釋放。

          需要注意的是共享內(nèi)存自帶沒(méi)有同步與互斥。

          3. 消息隊(duì)列

          消息隊(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ù)塊。

          特性:


          1.自帶同步與互斥;
          2.生命周期隨內(nèi)核;
          3.數(shù)據(jù)傳輸自帶優(yōu)先級(jí)。

          信號(hào)量

          信號(hào)量用于實(shí)現(xiàn)進(jìn)程間的控制,主要是同步和互斥。
          本質(zhì):內(nèi)核中的一個(gè)計(jì)數(shù)器(對(duì)資源進(jìn)行計(jì)數(shù)) + pcb等待隊(duì)列

          互斥的實(shí)現(xiàn):通過(guò)只有 0 / 1 的計(jì)數(shù)器,實(shí)現(xiàn)對(duì)臨界資源訪問(wèn)狀態(tài)的標(biāo)記,在訪問(wèn)臨界資源
          之前先獲取信號(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))

          同步的實(shí)現(xiàn):信號(hào)量是一個(gè)對(duì)資源的計(jì)數(shù),可以通過(guò)計(jì)數(shù)判斷是否能夠獲取一個(gè)資源進(jìn)行處
          理;若計(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)


          Linux內(nèi)核中的虛擬文件系統(tǒng)用一個(gè)通用的文件模型表示了各種不同的文件系統(tǒng),這個(gè)文件模型屏蔽了很多具體文件系統(tǒng)的差異,使Linux內(nèi)核支持很多不同的文件系統(tǒng),這個(gè)文件系統(tǒng)可以分為邏輯文件系統(tǒng)和設(shè)備驅(qū)動(dòng)程序:邏輯文件系統(tǒng)指Linux所支持的文件系統(tǒng),例如ext2、ext3和fat等;設(shè)備驅(qū)動(dòng)程序指為每一種硬件控制器所編寫(xiě)的設(shè)備驅(qū)動(dòng)程序模塊。



          五、網(wǎng)絡(luò)接口


          網(wǎng)絡(luò)接口提供了對(duì)各種網(wǎng)絡(luò)標(biāo)準(zhǔn)的實(shí)現(xiàn)和各種網(wǎng)絡(luò)硬件的支持。網(wǎng)絡(luò)接口一般分為網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)驅(qū)動(dòng)程序。網(wǎng)絡(luò)協(xié)議部分負(fù)責(zé)實(shí)現(xiàn)每一種可能的網(wǎng)絡(luò)傳輸協(xié)議。網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序則主要負(fù)責(zé)與硬件設(shè)備進(jìn)行通信,每一種可能的網(wǎng)絡(luò)硬件設(shè)備都有相應(yīng)的設(shè)備驅(qū)動(dòng)程序。






          點(diǎn)擊左下角閱讀原文,到?SegmentFault 思否社區(qū)?和文章作者展開(kāi)更多互動(dòng)和交流。

          -?END -

          瀏覽 33
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲精品成人无码在线观看 | 国产极品人妖ts91热爆 | 永久精品无码福利视频 | 人操人人操 | 青久久久 |