mmap 以及MMKV 學習 一

2021-10-18 19:38:02 字數 1582 閱讀 5398

基於mmap 的 mmkv原始碼分析

mmap 是記憶體對映的縮寫(memory map), 什麼是記憶體對映?這是乙個來自linux 系統的概念。下面介紹什麼是mmap、以及如何使用mmap。

程序的位址空間

程序位址空間

虛擬位址空間:是對位址的編碼,相當於指標,通過mmu(memory manager unit) 可以將其對映到實體地址上,就好比通訊錄和人的關係,通訊錄裡存放著人物姓名,人就是具體的實體地址,拿到通訊錄(某個虛擬位址)通過手機(mmu)就可以和特定的人(具體的實體地址)進行對話(讀寫),虛擬記憶體就是乙個資料結構,

每個程序都有乙個虛擬位址空間,這個位址空間從0 - n,每個程序裡的位址空間都是一樣,這樣就將程序之間隔離開了。 程序位址空間大小,32位系統 232 = 4gb, 64位系統 4 * 232gb

虛擬位址空間由使用者空間和核心空間組成,核心空間在物理裝置和使用者空間起著橋梁的作用,使用者( 通常指開發者)無法直接調硬體資源,只能核心空間的介面去呼叫物理裝置,然後經核心空間將資訊傳遞到使用者空間。使用者空間有環境變數、棧空間、共享庫、bss空間、 data空間、 **空間、受保護位址空間 ,如下圖所示。

當使用者發起一次讀檔案操作時,首先在使用者空間呼叫read() 方法通知核心空間去磁碟讀取資料,核心空間收到指令後向磁碟控制器發起操作,磁碟控制器去磁碟讀取資料,磁碟控制器通過dma(不需要cpu控制)直接將資料拷貝到核心的緩衝區,核心空間收到緩衝區的資料後,又將資料拷貝到使用者空間。

當使用者發起一次寫檔案操作時,首先在使用者空間呼叫write() 方法,write 方法中會將使用者空間的資料拷貝到核心空間的緩衝區,然後再拷貝到磁碟。

普通的io操作都需要先將資料拷貝到核心緩衝區然後在將資料拷貝到目的空間, 需要2次拷貝操作

通過上面的講解可以知道,乙個程序的虛擬位址空間是非常大的尤其是64位系統,對應於記憶體位址的話就是0 - (226-1), 也就是264個位元組,大約180億gb,這裡180億並不是說程序有這麼大的物理空間,指的是可以最大表示到180億gb個位址。舉個例子,64bit = 8byte 可以表示0x0000000000000000 ~ 0xffffffffffffffff個位址,就好比可以存180億gb 個人的****(確切說是表示)。記憶體對映過程就是將虛擬位址中一段位址範圍對應到一段實體地址上,就像從通訊錄第n頁m行到通訊錄n+x頁m+y 行記錄乙個家族的人的****。

如圖所示,linux 系統中mmap() 介面對映過程,現在使用者空間呼叫mmap,然後再在核心空間呼叫mmap使得使用者空間虛擬位址sptr1- eptr2 對應到檔案a的 n個 連續的byte上。這樣操作虛擬位址指標,對指標所指向的位址進行讀寫就是對實際所指向的實體地址進行讀寫,當時實際讀寫的系統呼叫並不等同於簡單的指標讀寫,而是出發系統的缺頁中斷來實現。具體細節可以閱讀下面這條連線

linux 系統 mmap過程

微信MMKV原始碼分析 二 mmap對映

系列文章 void mmkv loadfromfile m metainfo.read m metafile.getmemory o rdwr 讀 寫開啟 o creat 若此檔案不存在則建立它。使用此選擇項時,需同時說明第三個引數mode,用其說明該新檔案的訪問許可權位。s irwxu 模式標誌 ...

Android開發之MMKV的不足以及線下除錯工具

先來介紹下mmkv的儲存結構,分了兩個檔案,乙個資料檔案,儲存結構如下 乙個校驗檔案,crc結尾,儲存結構如下 新版本擴充套件了一些位元組,圖是老的 這種設計最直接問題就是占用空間變大了很多,如下面的例子,只儲存了乙個字段,但是為了方便mmap對映,磁碟直接占用了8k的儲存,官方宣稱的protobu...

程序表結構以及malloc和mmap的區別

一 程序表的結構 程序表邏輯結構分為四個部分,邏輯位址從低到高依次是text段 段 data段 資料段 空閒空間 stack段 棧空間 1 text段 包含了程序的執行 以及許多編譯資訊 2 data段 包含了程序中的變數,堆在此段內,有預先分配的大小,可以存放程序執行過程中的變數 3 空閒空間 可...