最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

帶你剖析Linux內(nèi)核IPC機(jī)制(含內(nèi)核源碼)

2022-03-26 16:23 作者:補(bǔ)給站Linux內(nèi)核  | 我要投稿
  • Linux也支持3種IPC機(jī)制:消息隊列、共享內(nèi)存、信號量。在Linux內(nèi)核中,IPC所有對象有一個公共的數(shù)據(jù)結(jié)構(gòu)pc_perm結(jié)構(gòu),它是專門用來IPC對象權(quán)限描述,具體內(nèi)核源碼如下:


一、信號量

  • 信號量解決同步、互斥問題。semaphore實際是一個整數(shù),它的值由多個進(jìn)程進(jìn)行測試和設(shè)置,就每個進(jìn)程所關(guān)心的測試和設(shè)置操作而言,這兩個操作是不可中斷,或稱“原子"操作,一旦開始直到兩個操作全部完成。根據(jù)測試和設(shè)置操作的結(jié)果,一個進(jìn)程可能必須睡眠,直到有另一個進(jìn)程改變信號量的值。

  • semaphore可用來實現(xiàn)所謂的”臨界區(qū)"的互斥使用,臨界區(qū)指同一時刻只有一個進(jìn)程執(zhí)行其中代碼的代碼段。Linux信號量是通過內(nèi)核提供的數(shù)據(jù)結(jié)構(gòu)進(jìn)行實現(xiàn),此數(shù)據(jù)結(jié)構(gòu)在于內(nèi)核空間,具體內(nèi)核源碼如下:


  1. 系統(tǒng)中每個信號量的數(shù)據(jù)結(jié)構(gòu)

  2. 系統(tǒng)中表示信號量集合數(shù)據(jù)結(jié)構(gòu)

  3. 系統(tǒng)中每一信號量集合的隊列結(jié)構(gòu)

  • 它們?nèi)咧g關(guān)系如下:



1、系統(tǒng)調(diào)用:semget()

  • 為創(chuàng)建一個新的信號量集合,或者存取一個已存在的集合,要使用semget()系統(tǒng)調(diào)用:

  • 原型:

  • 返回值:

  • 參數(shù):


  • key_t ftok(char* pathname,char proj)


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!??!前100名進(jìn)群領(lǐng)取,額外贈送一份價值699的內(nèi)核資料包(含視頻教程、電子書、實戰(zhàn)項目及代碼)??


  • 二、消息隊列

  • 一個或者多個進(jìn)程可向消息隊列寫入消息,而一個或多個進(jìn)程可從消息隊列中讀取消息,這種進(jìn)程間通信機(jī)制通常用于在客戶端/服務(wù)器模型中,客戶端向服務(wù)端發(fā)送請求消息,服務(wù)器讀取消息并執(zhí)行相應(yīng)請求。內(nèi)核使用msgid_ds結(jié)構(gòu)描述一個消息隊列。


  • 消息隊列位于內(nèi)核空間的鏈表,鏈表的每個結(jié)點都是一條消息,每一條消息都有自己的消息類型,消息類型用整數(shù)來表示,并且必須大于0。

  • 三、共享內(nèi)存

  • 共享內(nèi)存允許兩個或多個進(jìn)程共享一個給定的存儲區(qū),這一段存儲區(qū)可以被兩個或兩個以上的進(jìn)程映射至自身的地址空間中,一個進(jìn)程寫入共享內(nèi)存的信息,可以被其他使用這個共享內(nèi)存的進(jìn)程,通過一個簡單的內(nèi)存讀取錯做讀出,從而實現(xiàn)了進(jìn)程間的通信。


  • 采用共享內(nèi)存進(jìn)行通信的一個主要好處是效率高,因為進(jìn)程可以直接讀寫內(nèi)存,而不需要任何數(shù)據(jù)的拷貝,對于像管道和消息隊里等通信方式,則需要再內(nèi)核和用戶空間進(jìn)行四次的數(shù)據(jù)拷貝,而共享內(nèi)存則只拷貝兩次:一次從輸入文件到共享內(nèi)存區(qū),另一次從共享內(nèi)存到輸出文件。



  • 一般而言,進(jìn)程之間在共享內(nèi)存時,并不總是讀寫少量數(shù)據(jù)后就解除映射,有新的通信時在重新建立共享內(nèi)存區(qū)域;而是保持共享區(qū)域,直到通信完畢為止,這樣,數(shù)據(jù)內(nèi)容一直保存在共享內(nèi)存中,并沒有寫回文件。共享內(nèi)存中的內(nèi)容往往是在解除映射時才寫回文件,因此,采用共享內(nèi)存的通信方式效率非常高。



  • 共享內(nèi)存有兩種實現(xiàn)方式:1、內(nèi)存映射 2、共享內(nèi)存機(jī)制

  • 1、內(nèi)存映射

  • 內(nèi)存映射 memory map機(jī)制使進(jìn)程之間通過映射同一個普通文件實現(xiàn)共享內(nèi)存,通過mmap()系統(tǒng)調(diào)用實現(xiàn)。普通文件被映射到進(jìn)程地址空間后,進(jìn)程可以

  • 像訪問普通內(nèi)存一樣對文件進(jìn)行訪問,不必再調(diào)用read/write等文件操作函數(shù)。

  • 例子:創(chuàng)建子進(jìn)程,父子進(jìn)程通過匿名映射實現(xiàn)共享內(nèi)存。

  • 分析:主程序中先調(diào)用mmap映射內(nèi)存,然后再調(diào)用fork函數(shù)創(chuàng)建進(jìn)程。那么在調(diào)用fork函數(shù)之后,子進(jìn)程繼承父進(jìn)程匿名映射后的地址空間,同樣也繼承mmap函數(shù)的返回地址,這樣,父子進(jìn)程就可以通過映射區(qū)域進(jìn)行通信了。



  • 2、UNIX System V共享內(nèi)存機(jī)制

  • IPC的共享內(nèi)存指的是把所有的共享數(shù)據(jù)放在共享內(nèi)存區(qū)域(IPC shared memory region),任何想要訪問該數(shù)據(jù)的進(jìn)程都必須在本進(jìn)程的地址空間新增一塊內(nèi)存區(qū)域,用來映射存放共享數(shù)據(jù)的物理內(nèi)存頁面。

  • 和前面的mmap系統(tǒng)調(diào)用通過映射一個普通文件實現(xiàn)共享內(nèi)存不同,UNIX system V共享內(nèi)存是通過映射特殊文件系統(tǒng)shm中的文件實現(xiàn)進(jìn)程間的共享內(nèi)存通信。

  • 例子:設(shè)計兩個程序,通過unix system v共享內(nèi)存機(jī)制,一個程序?qū)懭牍蚕韰^(qū)域,另一個程序讀取共享區(qū)域。

  • 分析:一個程序調(diào)用fotk函數(shù)產(chǎn)生標(biāo)準(zhǔn)的key,接著調(diào)用shmget函數(shù),獲取共享內(nèi)存區(qū)域的id,調(diào)用shmat函數(shù),映射內(nèi)存,循環(huán)計算年齡,另一個程序讀取共享內(nèi)存。

  • (fotk函數(shù)在消息隊列部分已經(jīng)用過了,

  • 根據(jù)pathname指定的文件(或目錄)名稱,以及proj參數(shù)指定的數(shù)字,ftok函數(shù)為IPC對象生成一個唯一性的鍵值。)





帶你剖析Linux內(nèi)核IPC機(jī)制(含內(nèi)核源碼)的評論 (共 條)

分享到微博請遵守國家法律
留坝县| 手游| 望城县| 凌云县| 临洮县| 大姚县| 丰城市| 出国| 常熟市| 乌兰察布市| 偏关县| 浠水县| 永吉县| 隆回县| 泰顺县| 白水县| 长岛县| 湘阴县| 三亚市| 辛集市| 文化| 绥阳县| 万年县| 洛南县| 都昌县| 尼玛县| 祁东县| 嘉义市| 嘉兴市| 多伦县| 新密市| 吉安市| 漳浦县| 青河县| 突泉县| 搜索| 石台县| 噶尔县| 中卫市| 肥乡县| 正阳县|