簡體   English   中英

如何使用 mmap 和 shm_open 在多個獨立進程之間共享內存

[英]how to use mmap and shm_open to shared memory among multiple independent processes

我想在獨立運行而不是fork進程之間共享內存。

我已經閱讀了mmapshm_open的手冊頁,但仍然對用法感到困惑。

  1. 共享內存,在我看來,應該是不同進程之間映射虛擬內存空間的機制,但是為什么mmapfd參數呢? 這是否意味着內存實際上是通過文件共享的?
  2. 此外, shm_open似乎接受一個文件名作為它的參數,所以它實際上打開了一個文件?
  3. 既然我有多個獨立的進程,應該如何通知其他進程共享的物理內存地址?

誰能給出一些在兩個進程之間共享內存的示例代碼? 比如說,我們有進程producerconsumer進程,他們如何通過mmap共享的內存段進行通信?

  1. 本質上,是的 - 在 unix 上“一切都是文件”。 不完全是,它不必是磁盤文件,但實際上,如果需要,您可以使用磁盤文件。

  2. 正式shm_open接受在其自己的命名共享內存對象命名空間中的名稱。 它們需要以一個斜杠開頭,並且不應包含另一個斜杠。 您可以隨意命名它們,但由於它是一個全局命名空間,因此最好生成隨機名稱(正確使用O_CREAT|O_EXCL來檢查沖突)並通過其他渠道(如配置中商定的狀態目錄)傳達名稱應用程序實例使用的文件),這樣您就不會使其成為系統范圍的單例。 實際上,在 Linux 或其他常見系統上,共享內存命名空間只是一個目錄/dev/shm ,它通常作為非持久(內存中)文件系統類型掛載,以避免浪費地寫入磁盤。

  3. 沒有物理內存地址; 它可能會有所不同,有時可能根本不存在(如果換出或當頁面干凈且未觸及時)。 映射的共享內存對象的虛擬地址對於映射它的不同進程也不是通用的。 識別內存的是共享內存對象文件(由打開的文件描述符引用)其中的偏移量。 因此,為了使用獨立映射在不同進程地址空間中的共享內存,您需要使用基址的偏移量,而不是絕對指針,只要需要指針就將偏移量添加到基址(例如傳遞給同步原語)共享內存中的互斥體、條件變量、信號量等,或供您自己使用)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM