Linux

共享記憶體映射文件和共享記憶體區域是基於彼此實現的嗎?

  • October 12, 2018

共享記憶體映射文件和共享記憶體區域是基於彼此實現的嗎?以下兩句話似乎是這樣說的,對我來說似乎是一個雞蛋問題。

作業系統概念在下文中介紹了共享記憶體映射文件。多個程序是否通過共享保存文件內容的同一物理記憶體區域來共享同一文件?

可以允許多個程序同時映射同一個文件,以允許共享數據。任何程序的寫入都會修改虛擬記憶體中的數據,並且可以被映射文件相同部分的所有其他程序看到。鑑於我們之前對虛擬記憶體的討論,應該清楚記憶體映射部分的共享是如何實現的: **每個共享程序的虛擬記憶體映射指向物理記憶體的同一頁——該頁保存了記憶體的副本。磁碟塊。**這種記憶體共享如圖 9.22 所示。

在此處輸入圖像描述

下面還介紹了共享記憶體。

  • 多個程序是否通過共享記憶體映射文件來共享記憶體區域?
  • “記憶體映射文件”是否駐留在磁碟或主記憶體上?我認為它在磁碟上,但是“記憶體映射文件充當通信程序之間的共享記憶體區域”似乎意味著它駐留在主記憶體中。

很多時候,共享記憶體實際上是由記憶體映射文件實現的。在這種情況下,程序可以通過讓通信程序將同一文件記憶體映射到它們的虛擬地址空間來使用共享記憶體進行通信。記憶體映射文件用作通信程序之間的共享記憶體區域(圖 9.23)。

在此處輸入圖像描述

謝謝。

共享記憶體可以由正常文件、塊設備或交換來支持。這取決於如何創建記憶體區域。

當多個程序使用同一個共享記憶體區域時,它們各自的虛擬地址將指向同一個物理地址。一個程序的寫入可以直接對其他程序可見,而無需通過記憶體附加到的磁碟文件(如果有的話)。

如果共享記憶體後面有文件,核心偶爾會將更改的頁面從 RAM 同步到文件。使用記憶體的程序通常不需要知道何時發生這種情況,但如有必要,它們可以呼叫msync以使其更快發生。

如果共享記憶體後面沒有文件,核心可能會在需要釋放一些 RAM 時將頁面移動到交換位置,就像處理非共享程序記憶體一樣。當它們被換回時,它們會獲得一個新的物理地址,該地址可供所有映射共享記憶體的程序立即使用。

還有一件事讓我第一次看到它時感到困惑:如果您使用 映射文件mmapMAP_SHARED如果您想進行更改並將它們保存回文件,則必須使用,即使只涉及一個程序。起初我認為MAP_SHARED這個功能的名稱是錯誤的,但經過進一步思考,您正在與其他訪問文件的程序“共享”您的修改read,或者稍後將出現的程序和mmap它。所以這是有道理的,有點。

共享記憶體映射文件和共享記憶體區域是基於彼此實現的嗎?

幾乎,歸根結底/dev/shm 只是一個虛擬磁碟。

“記憶體映射文件”是否駐留在磁碟或主記憶體上?

是的!

被訪問的文件部分被(由交換器)複製到緩衝區 - 即 RAM。

對該記憶體的任何寫入都將立即在文件中可見,但在緩衝區同步或刷新之前不會寫入物理磁碟。

引用自:https://unix.stackexchange.com/questions/474946