I/O就是把數據移入/出緩衝區,用戶(JVM,針對操做系統來講)進程執行IO操做的大約步驟以下:數組
JVM進程向操做系統發出請求,讓操做系統把緩衝區裏的數據排幹(寫),或把數據填滿緩衝區(讀),進程使用這一機制處理全部數據進出操做。
函數
緩衝區操做圖spa
用戶空間是常規進程所在區域,JVM就是常規進程,駐守於用戶空間,用戶空間是非特權區域,在用戶空間執行的代碼不能訪問硬件設備;操作系統
內核空間是操做系統所在區域,內核代碼的特別的權力,能與設備控制器通信(DMA),控制着用戶區域進程的運行狀態,全部的IO都直接或間接經過內核空間。進程
當進程請求IO的時候,它執行一個系統調用,將控制權移交給內核,C/C++調用的底層函數open(),read(),write(),close()就是創建或執行的系統調用,若是內核空間沒有數據,則進程先掛起,內核要先把數據讀進內存。內存
磁盤基於塊存儲,Java I/O使用字符/字節流進行操做(切分塊)。it
虛擬內存 內存管理
全部現代操做系統都使用虛擬內存。虛擬內存意爲使用虛假(或虛擬)地址取代物理(硬件RAM)內存地址。table
磁盤塊大小512字節,操做系統把內存地址空間劃分爲頁,即固定大小的字節數組,內存頁的大小老是磁盤塊大小化倍數,一般爲2次冪,這樣能夠簡化尋址操做,典型的內存頁爲1,02四、2,04八、4,096字節,虛擬和物理內存頁的大小老是相同的。硬件
操做系統分頁技術
內存頁的大小爲磁盤塊的整數倍,這樣內核就可直接向磁盤控制器發佈命令,把內存頁寫入磁盤扇區,在須要的時候再裝入。同時也叫內存頁面調度或交換。全部的IO都是經過頁面調度完成的,磁盤扇區與內存頁均可以經過數組來訪問。
MMU內存管理單元
CPU包含一個MMU,邏輯上位於CPU與物理內存之間,MMU負責映射虛擬內存與物理內存。
操做系統也有個頁的概念,大小與基本內存頁一致,或是基倍數,典型的操做系統頁從2,048至8,192不等,且始終是基本內存頁大小的倍數。
操做系統頁(整數倍<=) | 虛擬內存頁 | 物理內存頁(^2 <=) | 磁盤塊(扇區)512Byte |
文件I/O屬於文件系統範疇,文件系統是更高層次的抽象,其操做磁盤;咱們所寫代碼沒法與磁盤打交道,全部都與文件系統交互。
文件預讀
大多數操做系統假設進程會繼續讀取文件剩餘部分,於是會預讀額外的文件系統頁,若是內存爭用狀況不嚴重,這些文件系統頁可能在至關長的時間內繼續有效。