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属于文件系统范畴,文件系统是更高层次的抽象,其操做磁盘;咱们所写代码没法与磁盘打交道,全部都与文件系统交互。
文件预读
大多数操做系统假设进程会继续读取文件剩余部分,于是会预读额外的文件系统页,若是内存争用状况不严重,这些文件系统页可能在至关长的时间内继续有效。