作業系統之非常重要的記憶體對映
阿新 • • 發佈:2018-12-12
前言
- 記憶體對映 在
Linux
作業系統中非常重要,因為其涉及到高效的跨程序通訊 & 檔案操作 - 今天,我將詳細講解作業系統中核心概念:記憶體對映
目錄
示意圖
1. 定義
關聯 程序中的1個虛擬記憶體區域 & 1個磁碟上的物件,使得二者存在對映關係
- 上述的對映過程 = 初始化該虛擬記憶體區域
- 虛擬記憶體區域被初始化後,就會在交換空間中換你來還去
- 被對映的物件稱為:共享物件(普通檔案 / 匿名檔案)
2. 作用
若存在上述對映關係,則具備以下特徵
- 在多個程序的虛擬記憶體區域 已和同1個共享物件 建立對映關係的前提下
- 若 其中1個程序對該虛擬區域進行寫操作
- 那麼,對於 也把該共享物件對映到其自身虛擬記憶體區域的程序 也是可見的
示意圖如下
- 假設程序1、2的虛擬記憶體區域同時對映到同1個共享物件;
- 當程序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. 特點
- 提高資料的讀、寫 & 傳輸的時間效能
- 減少了資料拷貝次數
- 使用者空間 & 核心空間的高效互動(通過對映的區域 直接互動)
- 用記憶體讀寫 代替 I/O讀寫
- 提高記憶體利用率:通過虛擬記憶體 & 共享物件
5. 應用場景
在Linux
系統下,根據記憶體對映的本質原理 & 特點,其應用場景在於:
- 實現記憶體共享:如 跨程序通訊
- 提高資料讀 / 寫效率 :如 檔案讀 / 寫操作
6. 例項講解
下面,我將詳細講解 記憶體對映應用在跨程序通訊 & 檔案操作的例項
6.1 檔案讀 / 寫操作
- 傳統的
Linux
系統檔案操作流程如下
示意圖
- 使用了記憶體對映的 檔案讀 / 寫 操作
示意圖
從上面可看出:使用了記憶體對映的檔案讀/寫 操作方式效率更加高、效能最好!
6.2 跨程序通訊
- 傳統的跨程序通訊
示意圖
- 使用了記憶體對映的 跨程序通訊
示意圖
從上面可看出:使用了記憶體對映的跨程序通訊 效率最高、效能最好!
7. 總結
-
本文全面講解了
Linux
作業系統中的記憶體對映
作者:Carson_Ho 連結:https://www.jianshu.com/p/719fc4758813 來源:簡書 簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。