最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux共享內(nèi)存實現(xiàn)機(jī)制的詳解

 更新時間:2017年07月10日 11:01:15   作者:ChaseRaod  
這篇文章主要介紹了Linux共享內(nèi)存實現(xiàn)機(jī)制的詳解的相關(guān)資料,需要的朋友可以參考下

Linux共享內(nèi)存實現(xiàn)機(jī)制的詳解

內(nèi)存共享: 兩個不同進(jìn)程A、B共享內(nèi)存的意思是,同一塊物理內(nèi)存被映射到進(jìn)程A、B各自的進(jìn)程地址空間。進(jìn)程A可以即時看到進(jìn)程B對共享內(nèi)存中數(shù)據(jù)的更新,反之亦然。由于多個進(jìn)程共享同一塊內(nèi)存區(qū)域,必然需要某種同步機(jī)制,互斥鎖和信號量都可以。

這里寫圖片描述

效率: 采用共享內(nèi)存通信的一個顯而易見的好處是效率高,因為進(jìn)程可以直接讀寫內(nèi)存,而不需要任何數(shù)據(jù)的拷貝。對于像管道和消息隊列等通信方式,則需要在內(nèi)核和用戶空間進(jìn)行四次的數(shù)據(jù)拷貝,而共享內(nèi)存則只拷貝兩次數(shù)據(jù)[1]: 一次從輸入文件到共享內(nèi)存區(qū),另一次從共享內(nèi)存區(qū)到輸出文件。實際上,進(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)機(jī)制

共享內(nèi)存是通過把同一塊內(nèi)存分別映射到不同的進(jìn)程空間中實現(xiàn)進(jìn)程間通信。而共享內(nèi)存本身不帶任何互斥與同步機(jī)制,但當(dāng)多個進(jìn)程同時對同一內(nèi)存進(jìn)行讀寫操作時會破壞該內(nèi)存的內(nèi)容,所以,在實際中,同步與互斥機(jī)制需要用戶來完成。
來看幾個系統(tǒng)調(diào)用函數(shù):

(1)創(chuàng)建共享內(nèi)存


這里寫圖片描述
參數(shù):key為輸出型參數(shù)
size:size的大小應(yīng)為1024整數(shù)倍(4k對齊)
shmflg:權(quán)限標(biāo)志

(2)將共享內(nèi)存映射到自己的內(nèi)存空間:shmat

shmat是空間映射,通過創(chuàng)建的共享內(nèi)存,在它能被進(jìn)程訪問之前,需要把該段內(nèi)存映射到用戶進(jìn)程空間。shmaddr是用來指定共享內(nèi)存映射到當(dāng)前進(jìn)程中的地址位置,要想改設(shè)置有用,shmflag必須設(shè)置為SHM_RND標(biāo)志。大多情況下,應(yīng)設(shè)置為空指針(void*)0,讓系統(tǒng)自動選擇地址,從而減小程序?qū)τ布囊蕾囆?。shmflag除了上面的設(shè)置外,還可以設(shè)置為SHM_RDONLY,使得映射過來的地址只讀。
返回值:調(diào)用成功則返回映射地址的第一個字節(jié),失敗返回-1。
(3)解除映射:shmdt


這里寫圖片描述
參數(shù)為要解除的地址空間。

(4)控制共享內(nèi)存
這里寫圖片描述
先來看第三個參數(shù)的結(jié)構(gòu)體:
這里寫圖片描述
這里寫圖片描述
第二個參數(shù)cmd的選項:IPC_STAT:得到共享內(nèi)存的狀態(tài),把共享內(nèi)存的shmid_ds結(jié)構(gòu)體復(fù)制到buf里

IPC_SET:改變共享內(nèi)存的狀態(tài),把buf所指的結(jié)構(gòu)體中的uid,gid,mode,復(fù)制到共享內(nèi)存的shmid_ds結(jié)構(gòu)體內(nèi)
IPC_RMID:刪除這塊共享內(nèi)存
BUF:共此內(nèi)存管理結(jié)構(gòu)體

代碼實現(xiàn):
這里寫圖片描述

這里寫圖片描述

這里寫圖片描述

共享內(nèi)存的特點:

(1)共享內(nèi)存就是允許兩個不想關(guān)的進(jìn)程訪問同一個內(nèi)存
(2)共享內(nèi)存是兩個正在運行的進(jìn)程之間共享和傳遞數(shù)據(jù)的最有效的方式
(3)不同進(jìn)程之間共享的內(nèi)存通常安排為同一段物理內(nèi)存
(4)共享內(nèi)存不提供任何互斥和同步機(jī)制,一般用信號量對臨界資源進(jìn)行保護(hù)。
(5)接口簡單

所有進(jìn)程間通信的特點:

(1)管道

管道分為命名管道和匿名管道。匿名管道只能單向通信,且只能在有親緣關(guān)系的進(jìn)程間使用,常用于父子進(jìn)程,當(dāng)一個進(jìn)程創(chuàng)建了一個管道,并調(diào)用fork創(chuàng)建子進(jìn)程后,父進(jìn)程關(guān)閉讀端,子進(jìn)程關(guān)閉寫端,實現(xiàn)單向通信。管道是面向字節(jié)流,自帶互斥與同步機(jī)制,生命周期隨進(jìn)程。
命名管道與匿名管道:命名管道允許毫不相干的兩個進(jìn)程之間

(2)信號量

信號量是一個計數(shù)器,可以用來控制多個線程對共享資源的訪問,它不是用于交換大批數(shù)據(jù),而用于多線程之間的同步,常作為一種鎖機(jī)制,防止某進(jìn)程在訪問資源時其他進(jìn)程也來訪問,因此,主要作為進(jìn)程間以及同一進(jìn)程的不同線程間的同步手段。

(3)消息隊列

消息隊列是消息的鏈表,存放在內(nèi)核中并由消息隊列標(biāo)識符標(biāo)識,消息隊列克服了信號傳遞信息少,管道只能承載無格式字節(jié)流以及緩沖區(qū)受限等特點。消息隊列是UNIX下不同進(jìn)程之間可以實現(xiàn)資源共享的 一種機(jī)制,UNIX允許不同進(jìn)程將格式化的數(shù)據(jù)流以消息隊列形式發(fā)送給任意進(jìn)程,對消息隊列具有操作權(quán)限的進(jìn)程都可以使用msgget完成對消息隊列的操作控制,通過使用消息類型,進(jìn)程可以按順序讀信息,或為消息安排優(yōu)先級順序。

(4)共享內(nèi)存

共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問的內(nèi)存,這段共享內(nèi)存由一個進(jìn)程創(chuàng)建,但多個進(jìn)程都可以訪問,共享內(nèi)存是最快的IPC方式,它是針對其他IPC方式運行效率低而專門設(shè)計的,它往往與其他機(jī)制,如信號量,配合使用,來實現(xiàn)進(jìn)程間的同步。

    以上就是Linux共享內(nèi)存實現(xiàn)機(jī)制的內(nèi)容詳細(xì)介紹,大家可以參考下,如果有疑問的可以到本站留言,進(jìn)行討論。感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • shell編程中的字符串截取方法小結(jié)

    shell編程中的字符串截取方法小結(jié)

    這篇文章主要介紹了shell編程中的字符串截取方法小結(jié),本文講解了截取字符變量的前8位的方法、按指定的字符串截取方法、按照指定要求分割方法等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • shell 遞歸遍歷目錄下的所有文件并統(tǒng)一改名的方法

    shell 遞歸遍歷目錄下的所有文件并統(tǒng)一改名的方法

    今天小編就為大家分享一篇shell 遞歸遍歷目錄下的所有文件并統(tǒng)一改名的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Linux 中fork的執(zhí)行的實例詳解

    Linux 中fork的執(zhí)行的實例詳解

    這篇文章主要介紹了Linux 中fork的執(zhí)行的實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Shell腳本實現(xiàn)監(jiān)控MySQL主從同步

    Shell腳本實現(xiàn)監(jiān)控MySQL主從同步

    這篇文章主要介紹了Shell腳本實現(xiàn)監(jiān)控MySQL主從同步,此腳本應(yīng)該能適應(yīng)各種各樣不同的內(nèi)外網(wǎng)環(huán)境,并同時監(jiān)控MySQL運行狀態(tài),需要的朋友可以參考下
    2015-01-01
  • Linux中sftp常用命令整理

    Linux中sftp常用命令整理

    sftp命令是一款交互式的文件傳輸程序,不僅對傳輸?shù)乃行畔⑹褂胹sh加密,它還支持公鑰認(rèn)證和壓縮等功能。這篇文章整理了Linux中sftp的常用命令,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • shell 腳本中常用的內(nèi)置變量(Bash 內(nèi)置變量)

    shell 腳本中常用的內(nèi)置變量(Bash 內(nèi)置變量)

    在 Bash 解釋器中,內(nèi)置了許多變量,這些變量的功能是解釋器自帶的,我們在編寫shell腳本時如果能靈活的使用它們,對腳本的編寫效率以及差錯大有幫助, 下面一一介紹這些變量,一起看看吧
    2021-05-05
  • Linux find 命令完全指南及核心用法

    Linux find 命令完全指南及核心用法

    find 是 Linux 系統(tǒng)最強(qiáng)大的文件搜索工具,支持 嵌套遍歷、條件篩選、執(zhí)行動作,下面給大家介紹Linux find 命令完全指南,感興趣的朋友一起看看吧
    2025-03-03
  • Linux中的host命令應(yīng)用實例詳解

    Linux中的host命令應(yīng)用實例詳解

    這篇文章主要介紹了Linux中的host命令應(yīng)用舉例的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • shell中set?-e的具體使用

    shell中set?-e的具體使用

    set?-e?是一個?Shell?命令,它用于在腳本運行時自動退出,本文主要介紹了shell中set?-e的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • Linux下自動刪除過期備份和自動異地備份的腳本

    Linux下自動刪除過期備份和自動異地備份的腳本

    這篇文章主要介紹了Linux下自動刪除過期備份和自動異地備份,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09

最新評論

博兴县| 乐山市| 宁晋县| 赤城县| 唐山市| 台北县| 德保县| 阜新市| 高密市| 观塘区| 东城区| 泰兴市| 固阳县| 安徽省| 沈丘县| 古浪县| 容城县| 天祝| 同江市| 镇远县| 仙游县| 阳东县| 厦门市| 土默特右旗| 娄烦县| 石林| 邯郸市| 屏边| 南充市| 福清市| 葫芦岛市| 河南省| 海淀区| 茂名市| 观塘区| 进贤县| 隆子县| 东源县| 临洮县| 扶余县| 宣汉县|