一.虛擬內存
- MMU:它是中央處理器(CPU)中用來管理虛擬存儲器、物理存儲器的控制線路,同時也負責虛擬地址映射為物理地址,以及提供硬件機制的內存訪問授權,多用戶多進程操作系統。
image.png
-
操作系統為每個進程都分配了一個頁表,CPU有一個專門的頁表基地址寄存器(PTBR)指向當前頁表的基地址,快速定位到該進程的頁表。
image.png 因為有頁表的存在,所以沒有必要把虛擬存儲器(存在在磁盤上的)的所以頁都緩存在內存當中,即便CPU訪問該虛擬存儲器的頁不存在在內存當中,那么系統會通過查表,把需要的頁從磁盤當中拷貝到內存當中,
頁命中的情況:如果虛擬頁已經緩存到了物理存儲器,直接從物理存儲器中直接讀取數據就好了。
缺頁的情況:MMU發現某個CPU需要的虛擬頁沒有緩存到內存中,會選擇已緩存到內存的一個犧牲頁,把它拷貝會虛擬存儲器的某個位置,再將命中的虛擬頁緩存到內存當中。虛擬內存:虛擬內存是一種邏輯上擴充物理內存的技術。基本思想是用軟、硬件技術把內存與外存這兩級存儲器當做一級存儲器來用。簡單的說就是將硬盤的一部分作為內存來使用。
-
總結: CPU在尋址的時候,是按照虛擬地址來尋址,然后通過MMU(內存管理單元)將虛擬地址轉換為物理地址。因為只有程序的一部分加入到內存中,所以會出現所尋找的地址不在內存中的情況(CPU產生缺頁異常),如果在內存不足的情況下,就會通過頁面調度算法來將內存中的頁面置換出來,然后將在外存中的頁面加入到內存中,使程序繼續正常運行。
image.png
參考:
虛擬地址與虛擬內存
妙趣橫生的虛擬存儲器
二.NIO內存映射文件
- 虛擬內存和內存映射文件都是加載一部分內容,另一部分放在磁盤上的一種機制;
虛擬內存使用硬盤只能是頁面文件,而內存映射使用的磁盤部分可以是任何磁盤文件 - 內存映射原理:簡單來說:將要映射的文件生成虛擬地址,若虛擬地址通過頁表查詢,若成功則直接讀取,若缺頁,則直接從硬盤中加載數據到內存。
image.png
- 內存映射為什么會比普通IO速度快
內存映射文件和之前說的 標準IO操作最大的不同之處就在于它雖然最終也是要從磁盤讀取數據,但是它并不需要將數據讀取到OS內核緩沖區,而是直接將進程的用戶私有地址空間中的一 部分區域與文件對象建立起映射關系,就好像直接從內存中讀、寫文件一樣,速度當然快了。
三.直接緩存區域非直接緩存區
- NIO是通過緩存區讀取數據的,那什么是緩存區呢?
-
直接緩存區:系統與應用程序均在系統物理內存中保存讀取數據。不過對于直接字節緩存區可以通過FileChannel 的 map() 方法將物理內存數據映射到各自的緩存中并返回MappedByteBuffer進行讀寫操作
image.png - 非直接緩存區:以讀取系統數據為例,數據首先將數據存儲于系統緩存(butter)中,而后將數據復制于JVM中,java應用程序讀取數據JVM中保存的數據
-
image.png