Java内存映射原理与实现
Java內存映射原理與實現
- 01. 虛擬內存與內存映射文件
- 1.1. 概念
- 1.2 區別
 
- 02. 內存映射文件的原理
- 03. 內存映射文件的效率
01. 虛擬內存與內存映射文件
1.1. 概念
-  虛擬內存
 虛擬內存屬于硬盤的一部分,是計算機RAM與硬盤的數據交換分區。由于實際的物理內存遠小于進程的地址空間,這就需要把內存中暫時不用到的數據放到硬盤上一個特殊的地方,當請求的數據不在內存中時,系統產生卻頁中斷,內存管理器便將對應的內存頁重新從硬盤調入物理內存。 
-  內存映射文件
 內存映射文件是由一個文件到一塊內存的映射。應用程序可以通過內存指針對磁盤上的文件進行訪問,就如同訪問加載了文件的內存,因此內存文件映射非常適合于用來管理大文件。 
1.2 區別
-  磁盤文件
 虛擬內存使用的硬盤只能是頁面文件
 內存映射使用的磁盤可以是任何磁盤文件。
- 架構
引入原因:實際的物理內存運行程序所需的空間。即使現在計算機中的物理內存越來越大,程序的尺寸也在增長,將所有運行著的程序全部加載到內存中不經濟也非常不現實。
32位機地址空間只有4G,而某些大文件的尺寸可要要遠超出這個值,因此,用地址空間中的某段應用文件中的一部分可解決處理大文件的問題,在32中,使用內存映射文件可以處理2的64次(64EB)大小的文件.原因內存映射文件,除了處理大文件,還可用作進程間通信。
02. 內存映射文件的原理
“映射”就是建立一種對應關系,主要是指硬盤上文件的位置與進程邏輯地址空間中一塊相同區域之間一一對應。這種關系純屬是邏輯上的概念,物理上是不存在的,原因是進程的邏輯地址空間本身就是不存在的,在內存映射過程中,并沒有實際的數據拷貝,文件沒有被載入內存,只是邏輯上放入了內存,具體到代碼,就是建立并初始化了相關的數據結構,這個過程有系統調用mmap()實現,所以映射的效率很高。
 
 上面說到建立內存映射沒有進行實際的數據拷貝,那么進程又怎么能最終通過內存操作訪問到硬盤上的文件呢?
03. 內存映射文件的效率
了解過內存映射文件都知道,它比傳統的IO讀寫數據快很多,那么,它為什么會這么快,從代碼層面上來看,從硬盤上將文件讀入內存,都是要經過數據拷貝,并且數據拷貝操作是由文件系統和硬件驅動實現的,理論上來說,拷貝數據的效率是一 樣的。其實,原因是read()是系統調用,其中進行了數據拷貝,它首先將文件內容從硬盤拷貝到內核空間的一個緩沖區,如圖2中過程1,然后再將這些數據拷貝到用戶空間,如圖2中過程2,在這個過程中,實際上完成 了兩次數據拷貝 ;而mmap()也是系統調用,如前所述,mmap()中沒有進行數據拷貝,真正的數據拷貝是在缺頁中斷處理時進行的,由于mmap()將文件直接映射到用戶空間,所以中斷處理函數根據這個映射關系,直接將文件從硬盤拷貝到用戶空間,只進行了 一次數據拷貝 。因此,內存映射的效率要比read/write效率高。
 
總結
以上是生活随笔為你收集整理的Java内存映射原理与实现的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 计算机桌面图标损坏,Excel图标变成这
- 下一篇: Flutter自定义iconfont字体
