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