您的位置:首页 > 编程语言 > Java开发

Java NIO基本概念

2015-12-12 00:00 211 查看
I/O就是把数据移入/出缓冲区,用户(JVM,针对操作系统来说)进程执行IO操作的大约步骤如下:
JVM进程向操作系统发出请求,让操作系统把缓冲区里的数据排干(写),或把数据填满缓冲区(读),进程使用这一机制处理所有数据进出操作。

缓冲区操作图



用户空间是常规进程所在区域,JVM就是常规进程,驻守于用户空间,用户空间是非特权区域,在用户空间执行的代码不能访问硬件设备;
内核空间是操作系统所在区域,内核代码的特别的权力,能与设备控制器通讯(DMA),控制着用户区域进程的运行状态,所有的IO都直接或间接通过内核空间。
当进程请求IO的时候,它执行一个系统调用,将控制权移交给内核,C/C++调用的底层函数open(),read(),write(),close()就是建立或执行的系统调用,如果内核空间没有数据,则进程先挂起,内核要先把数据读进内存。
磁盘基于块存储,Java I/O使用字符/字节流进行操作(切分块)。

虚拟内存
所有现代操作系统都使用虚拟内存。虚拟内存意为使用虚假(或虚拟)地址取代物理(硬件RAM)内存地址。

磁盘块大小512字节,操作系统把内存地址空间划分为页,即固定大小的字节数组,内存页的大小总是磁盘块大小化倍数,通常为2次幂,这样可以简化寻址操作,典型的内存页为1,024、2,048、4,096字节,虚拟和物理内存页的大小总是相同的。

操作系统分页技术
内存页的大小为磁盘块的整数倍,这样内核就可直接向磁盘控制器发布命令,把内存页写入磁盘扇区,在需要的时候再装入。同时也叫内存页面调度或交换。所有的IO都是通过页面调度完成的,磁盘扇区与内存页都可以通过数组来访问。

MMU内存管理单元
CPU包含一个MMU,逻辑上位于CPU与物理内存之间,MMU负责映射虚拟内存与物理内存。

操作系统也有个页的概念,大小与基本内存页一致,或是基倍数,典型的操作系统页从2,048至8,192不等,且始终是基本内存页大小的倍数。

操作系统页(整数倍<=)虚拟内存页物理内存页(^2 <=)磁盘块(扇区)512Byte
文件I/O属于文件系统范畴,文件系统是更高层次的抽象,其操作磁盘;我们所写代码无法与磁盘打交道,所有都与文件系统交互。

文件预读
大多数操作系统假设进程会继续读取文件剩余部分,因而会预读额外的文件系统页,如果内存争用情况不严重,这些文件系统页可能在相当长的时间内继续有效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: