想要深刻了解MongoDB如何存儲數據以前,有一個概念必須清楚,那就是Memeory-Mapped Files。算法
Memeory-Mapped Files數據庫
下圖展現了數據庫是如何跟底層系統打交道的。app
內存映射文件是OS經過mmap在內存中建立一個數據文件,這樣就把文件映射到一個虛擬內存的區域;優化
虛擬內存對於進程來講,是一個物理內存的抽象,尋址空間大小爲2^64;spa
操做系統經過mmap來把進程所需的全部數據映射到這個地址空間(紅線),而後再把當前須要處理的數據映射到物理內存(灰線); (這能夠理解成,在數據聲明時數據是放在虛擬內存中的,數據聲明的做用就是說明進程中用哪些數據,但並不須要指定用到什麼樣的數據,這時只說明它的地址並不涉及到具體的數值,即並不進行實例化,而若是對象實例化,則會在虛擬內存中映射到物理內存中)
操作系統
當進程訪問某個數據時,若是數據不在虛擬內存裏,觸發page fault,而後OS從硬盤裏把數據加載進虛擬內存和物理內存;
對象
若是物理內存滿了,觸發swap-out操做,這時有些數據就須要寫回磁盤,若是是純粹的內存數據,寫回swap分區,若是不是就寫回磁盤。進程
有了內存映射文件,要訪問的數據就好像都在內存裏面,簡單化了MongoDB訪問和修改數據的邏輯內存
MongoDB讀寫都只是和虛擬內存打交道,剩下都交給OS打理map
虛擬內存大小=全部文件大小+其餘一些開銷(鏈接,堆棧)
若是journal開啓,虛擬內存大小差很少翻番
使用MMF的好處:
1:不用本身管理內存和磁盤調度
2:LRU策略
3:重啓過程當中,Cache依然在
使用MMF的壞處:
1:RAM使用會受磁盤碎片的影響,高預讀也會影響
2:沒法本身優化調度算法,只能使用LRU