共享內存的實現機制


  進程間通信的只要方式有,管道,有名管道,消息隊列,共享內存,socket等方式,共享內存是最高效的

進程間通信的方式,因為把同一塊物理內存的地址空間映射到不同進程的地址空間當中,那么不同的進程之間

通信,通過直接修改地址空間當中的內存即可,該機制的實現只需要兩次拷貝即可實現,不需要像其它的進程

通信機制那樣將數據從用戶空間拷貝到內核,然后在從內核拷貝到用戶空間,實行四次拷貝操作,因此使用共

享內存通信比較高效。

  使用共享內存的話,需要對共享的進程對共享內存的訪問進行同步,防止訪問對於共享數據的破壞。

  共享內存的實現方式:

         一 基於物理內存實現的shm_get()實現的共享內存

  1 shm_get()

    使用該系統調用來申請一塊共享內存,使用了該系統調用之后會返回一個共享內存的鍵值,進程可以

使用該key值來使用這塊共享內存。shm_get()操作會返回一個和key值關聯的shmid,其它的進程可以通過該

shmid將該貢獻內存添加到進程的地址空間里面。

  2 shmat(id,addr,flag)

  使用該系統調用將使用shm_get()獲得的共享內存掛載到當前進程的地址空間,addr參數可以選擇連接的

地址位置,通常設置為0,讓操作系統選擇合適的連接位置,flag也是設置為默認值0。

  3 shm_dt()

  可以刪除指定的共享內存,從當前的進程的地址空間當中刪除。通過shmat()返回的掛載的地址,將加到進程

地址空間當中的內存刪除。

  4 shm_ctl()

  對指定的共向內存空間進行操作。也是通過shm_get()返回的標識符來進行相關的操作。

  二 基於文件映射實現的mmap實現的共享內存

  進程通過將一個普通文件的內映射到每個進程的地址空間當中,對映射區的修改會被寫回到文件當中,其他

進程可以共享這些修改。將文件映射到了進程的地址空間之后,可以直接對該段虛擬地址空間進行讀寫操作,不需

使用read,write等系統調用來進行讀寫。

  mmap實現的共享內存,每個文件有自己的內存映射區,在munmap調用之后,會將修改的內容寫回文件當中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM