1. 程式人生 > >作業系統之非常重要的記憶體對映

作業系統之非常重要的記憶體對映

前言

  • 記憶體對映Linux作業系統中非常重要,因為其涉及到高效的跨程序通訊 & 檔案操作
  • 今天,我將詳細講解作業系統中核心概念:記憶體對映

目錄

示意圖

1. 定義

關聯 程序中的1個虛擬記憶體區域 & 1個磁碟上的物件,使得二者存在對映關係

  1. 上述的對映過程 = 初始化該虛擬記憶體區域
  2. 虛擬記憶體區域被初始化後,就會在交換空間中換你來還去
  3. 被對映的物件稱為:共享物件(普通檔案 / 匿名檔案)

2. 作用

若存在上述對映關係,則具備以下特徵

  • 在多個程序的虛擬記憶體區域 已和同1個共享物件 建立對映關係的前提下
  • 若 其中1個程序對該虛擬區域進行寫操作
  • 那麼,對於 也把該共享物件對映到其自身虛擬記憶體區域的程序 也是可見的

示意圖如下

  1. 假設程序1、2的虛擬記憶體區域同時對映到同1個共享物件;
  2. 當程序1對其虛擬記憶體區域進行寫操作時,也會對映到程序2中的虛擬記憶體區域

示意圖

3. 實現過程

  • 記憶體對映的實現過程主要是通過Linux系統下的系統呼叫函式:mmap()
  • 該函式的作用 = 建立虛擬記憶體區域 + 與共享物件建立對映關係
  • 其函式原型、具體使用 & 內部流程 如下
/**
  * 函式原型
  */
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);

/**
  * 具體使用(使用者程序呼叫mmap())
  * 下述程式碼即常見了一片大小 = MAP_SIZE的接收快取區 & 關聯到共享物件中(即建立對映)
  */
  mmap(NULL, MAP_SIZE, PROT_READ, MAP_PRIVATE, fd, 0);

/**
  * 內部原理
  * 步驟1:建立虛擬記憶體區域
  * 步驟2:實現地址對映關係,即:程序的虛擬地址空間 ->> 共享物件
  * 注: 
  *    a. 此時,該虛擬地址並沒有任何資料關聯到檔案中,僅僅只是建立對映關係
  *    b. 當其中1個程序對虛擬記憶體寫入資料時,則真正實現了資料的可見
  */

4. 特點

  • 提高資料的讀、寫 & 傳輸的時間效能
    1. 減少了資料拷貝次數
    2. 使用者空間 & 核心空間的高效互動(通過對映的區域 直接互動)
    3. 用記憶體讀寫 代替 I/O讀寫
  • 提高記憶體利用率:通過虛擬記憶體 & 共享物件

5. 應用場景

Linux系統下,根據記憶體對映的本質原理 & 特點,其應用場景在於:

  1. 實現記憶體共享:如 跨程序通訊
  2. 提高資料讀 / 寫效率 :如 檔案讀 / 寫操作

6. 例項講解

下面,我將詳細講解 記憶體對映應用在跨程序通訊 & 檔案操作的例項

6.1 檔案讀 / 寫操作

  • 傳統的Linux系統檔案操作流程如下

示意圖

  • 使用了記憶體對映的 檔案讀 / 寫 操作

示意圖

從上面可看出:使用了記憶體對映的檔案讀/寫 操作方式效率更加高、效能最好!

6.2 跨程序通訊

  • 傳統的跨程序通訊

示意圖

  • 使用了記憶體對映的 跨程序通訊

示意圖

從上面可看出:使用了記憶體對映的跨程序通訊 效率最高、效能最好!

7. 總結

  • 本文全面講解了 Linux作業系統中的記憶體對映

作者:Carson_Ho 連結:https://www.jianshu.com/p/719fc4758813 來源:簡書 簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。