日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java内存映射原理与实现

發布時間:2023/12/31 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java内存映射原理与实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java內存映射原理與實現

  • 01. 虛擬內存與內存映射文件
    • 1.1. 概念
    • 1.2 區別
  • 02. 內存映射文件的原理
  • 03. 內存映射文件的效率

01. 虛擬內存與內存映射文件

1.1. 概念

  • 虛擬內存
    虛擬內存屬于硬盤的一部分,是計算機RAM與硬盤的數據交換分區

    由于實際的物理內存遠小于進程的地址空間,這就需要把內存中暫時不用到的數據放到硬盤上一個特殊的地方,當請求的數據不在內存中時,系統產生卻頁中斷,內存管理器便將對應的內存頁重新從硬盤調入物理內存。

  • 內存映射文件
    內存映射文件是由一個文件到一塊內存的映射。

    應用程序可以通過內存指針對磁盤上的文件進行訪問,就如同訪問加載了文件的內存,因此內存文件映射非常適合于用來管理大文件。

1.2 區別

  • 磁盤文件
    虛擬內存使用的硬盤只能是頁面文件
    內存映射使用的磁盤可以是任何磁盤文件。
  • 架構
  • 虛擬內存是架構在物理內存之上。

    引入原因:實際的物理內存運行程序所需的空間。即使現在計算機中的物理內存越來越大,程序的尺寸也在增長,將所有運行著的程序全部加載到內存中不經濟也非常不現實。

  • 內存映射文件架構在程序的地址空間之上

    32位機地址空間只有4G,而某些大文件的尺寸可要要遠超出這個值,因此,用地址空間中的某段應用文件中的一部分可解決處理大文件的問題,在32中,使用內存映射文件可以處理2的64次(64EB)大小的文件.原因內存映射文件,除了處理大文件,還可用作進程間通信。

  • 02. 內存映射文件的原理

    “映射”就是建立一種對應關系,主要是指硬盤上文件的位置與進程邏輯地址空間中一塊相同區域之間一一對應。這種關系純屬是邏輯上的概念,物理上是不存在的,原因是進程的邏輯地址空間本身就是不存在的,在內存映射過程中,并沒有實際的數據拷貝,文件沒有被載入內存,只是邏輯上放入了內存,具體到代碼,就是建立并初始化了相關的數據結構,這個過程有系統調用mmap()實現,所以映射的效率很高。

    上面說到建立內存映射沒有進行實際的數據拷貝,那么進程又怎么能最終通過內存操作訪問到硬盤上的文件呢?

  • 調用mmap(),相當于要給內存映射文件分配了虛擬內存,它會返回一個指針ptr,這個ptr所指向的是一個邏輯地址,要操作其中的數據,必須通過MMU(Memory Management Unit,即內存管理單元)將邏輯地址轉換成物理地址,如圖1中過程2所示。
  • 建立內存映射并沒有實際拷貝數據,這時MMU在地址映射表中是無法找到與ptr相對應的物理地址的,也就是MMU失敗,將產生一個缺頁中斷,缺頁中斷的中斷響應函數會在swap(也就是交換分區)中尋找相對應的頁面,如果找不到(也就是該文件從來沒有被讀入內存的情況),則會通過mmap()建立的映射關系,從硬盤上將文件讀取到物理內存中,如圖1中過程3所示。
  • 如果在拷貝數據時,發現物理內存不夠用,則會通過虛擬內存機制(swap)將暫時不用的物理頁面交換到硬盤上,如圖1中過程4所示。
  • 03. 內存映射文件的效率

    了解過內存映射文件都知道,它比傳統的IO讀寫數據快很多,那么,它為什么會這么快,從代碼層面上來看,從硬盤上將文件讀入內存,都是要經過數據拷貝,并且數據拷貝操作是由文件系統和硬件驅動實現的,理論上來說,拷貝數據的效率是一 樣的。其實,原因是read()是系統調用,其中進行了數據拷貝,它首先將文件內容從硬盤拷貝到內核空間的一個緩沖區,如圖2中過程1,然后再將這些數據拷貝到用戶空間,如圖2中過程2,在這個過程中,實際上完成 了兩次數據拷貝 ;而mmap()也是系統調用,如前所述,mmap()中沒有進行數據拷貝,真正的數據拷貝是在缺頁中斷處理時進行的,由于mmap()將文件直接映射到用戶空間,所以中斷處理函數根據這個映射關系,直接將文件從硬盤拷貝到用戶空間,只進行了 一次數據拷貝 。因此,內存映射的效率要比read/write效率高。

    總結

    以上是生活随笔為你收集整理的Java内存映射原理与实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。