亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Linux共享內存實現機制的詳解

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

Linux共享內存實現機制的詳解

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

這里寫圖片描述

效率: 采用共享內存通信的一個顯而易見的好處是效率高,因為進程可以直接讀寫內存,而不需要任何數據的拷貝。對于像管道和消息隊列等通信方式,則需要在內核和用戶空間進行四次的數據拷貝,而共享內存則只拷貝兩次數據[1]: 一次從輸入文件到共享內存區(qū),另一次從共享內存區(qū)到輸出文件。實際上,進程之間在共享內存時,并不總是讀寫少量數據后就解除映射,有新的通信時,再重新建 立共享內存區(qū)域。而是保持共享區(qū)域,直到通信完畢為止,這樣,數據內容一直保存在共享內存中,并沒有寫回文件。共享內存中的內容往往是在解除映射時才寫回 文件的。因此,采用共享內存的通信方式效率是非常高的。

共享內存實現機制

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

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


這里寫圖片描述
參數:key為輸出型參數
size:size的大小應為1024整數倍(4k對齊)
shmflg:權限標志

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

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


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

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

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

代碼實現:
這里寫圖片描述

這里寫圖片描述

這里寫圖片描述

共享內存的特點:

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

所有進程間通信的特點:

(1)管道

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

(2)信號量

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

(3)消息隊列

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

(4)共享內存

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

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

相關文章

  • Shell腳本生成Go的程序包的實現步驟

    Shell腳本生成Go的程序包的實現步驟

    通過編寫Shell腳本,我們可以大大簡化Golang項目的打包和部署流程,本文就來介紹一下Shell腳本生成Go的程序包的實現步驟,感興趣的可以了解一下
    2024-01-01
  • linux?shell字符串截取的詳細總結(實用!)

    linux?shell字符串截取的詳細總結(實用!)

    在開發(fā)的時候經常會自行寫一些小的腳本,其中就用到截取字符串的操作,這篇文章主要給大家介紹了關于linux?shell字符串截取的詳細方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • shell監(jiān)控系統(tǒng)資源并通過短信報警的腳本

    shell監(jiān)控系統(tǒng)資源并通過短信報警的腳本

    這篇文章主要介紹了shell監(jiān)控系統(tǒng)資源并通過短信報警的腳本,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • shell對比文件內容腳本分享

    shell對比文件內容腳本分享

    這篇文章主要介紹了shell 對比文件內容腳本,找出兩個文件不同的數據,需要的朋友可以參考下
    2014-03-03
  • shell sleep睡眠命令的具體使用

    shell sleep睡眠命令的具體使用

    本文主要介紹了shell sleep睡眠命令的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • Shell腳本查看網卡實時流量

    Shell腳本查看網卡實時流量

    這篇文章主要介紹了Shell腳本查看網卡實時流量,本文直接給出實現代碼,需要的朋友可以參考下
    2014-12-12
  • linux下保留文件系統(tǒng)下剩余指定數目文件的shell腳本

    linux下保留文件系統(tǒng)下剩余指定數目文件的shell腳本

    本文介紹下,用于保留文件系統(tǒng)下剩余指定數量的文件的一個shell腳本,感興趣的朋友可以參考下
    2013-11-11
  • Linux下使用Shell腳本實現進程監(jiān)控的流程

    Linux下使用Shell腳本實現進程監(jiān)控的流程

    這篇文章主要介紹了Linux下使用Shell腳本實現進程監(jiān)控,在 Linux 平臺下,shell 腳本監(jiān)控是一個非常簡單、方便的工具,它可以有效的對服務器、進程進行監(jiān)控,對系統(tǒng)開發(fā)以及進程維護人員非常有幫助,需要的朋友可以參考下
    2023-02-02
  • Linux下is not in the sudoers file的解決方案

    Linux下is not in the sudoers file的解決

    當我們使用sudo命令切換用戶的時候可能會遇到提示以下錯誤:用戶名 is not in the sudoers file.本文給大家分享原因分析及解決方案,感興趣的朋友跟隨小編一起看看吧
    2023-02-02
  • Linux下使用Shell腳本實現ftp的自動上傳下載的代碼小結

    Linux下使用Shell腳本實現ftp的自動上傳下載的代碼小結

    如何實現在ftp自動上傳下載文件腳本呢?想必還有很多朋友都不太了解吧,下面是ftp自動上傳下載文件腳本方法,希望對朋友們有些幫助
    2013-02-02

最新評論