Java NIO之—什么是I/O?

来源:互联网 发布:灰度数据像素 编辑:程序博客网 时间:2024/06/05 02:02
本笔记来自《Java NIO》(译本,来自互联网)和原著《Java NIO》(Ron Hitchens,O'Reilly)。更详细的内容请参考这两本书。

先谈谈现状

  • 程序员往往热衷于调试代码,优化处理效率,而不关注I/O的性能
  • 实际上,I/O效率的提升相比处理时间的优化反而可能大大提升吞吐率(Throughput)
  • 现代的JVM优化已经做得非常好了,这意味多数Java 应用程序已不再受CPU的束缚(把大量时间用在执行代码上),而更多时候是受I/O 的束缚(等待数据传输)
  • 传统的JVM I/O类喜欢操作小块数据操作系统送来整缓冲区的大块数据,导致传统的JVMI/O方面效率欠佳

NIO的面世

  • Java1.4提供了java.nio软件包就是ChannelSelector它们提供了使用I/O 服务的通用API

快速回顾I/O基本概念

  • 缓冲区操作(Buffer handling )
  • 内核空间与用户空间(Kernel versus user space)
  • 虚拟内存( Virtual memory )
  • 分页技术(Paging )
  • 文件I/O和流I/O(File-oriented versus stream I/O)
  • 多工I/O(就绪性选择)(Multiplexed I/O (readiness selection) )

缓冲区操作

  • 缓冲区以及缓冲区如何工作,是所有I/O 的基础。所谓“输入/输出”讲的无非就是把数据移进或移出缓冲区。
  • 进程执行I/O 操作,归结起来,也就是向操作系统发出请求,让它要么把缓冲区里的数据排干(写),要么用数据把缓冲区填满(读)进程调用read()系统调用时I/O缓冲区操作简图                                      

                                图  进程调用read()系统调用时I/O缓冲区操作简图

所有I/O 都直接(如这图所述)通过内核空间。在数据往来于用户空间与存储设备的过程中,内核负责数据的分解、再组合的工作,因此充当着中间人的角色。


虚拟内存

  • 利用一个以上的虚拟地址可指向同一个物理内存地址的操作系统特性,可以把内核空间地址与用户空间的虚拟地址映射到同一个物理地址。这样DMA硬件就可以填充对内核与用户空间进程同时可见的缓冲区,省去了如上图所示内核与用户空间的往来拷贝

内存空间多重映射


内存页面调度

  • 虚拟内存分页又称交换,基于虚拟内存空间可大于实际可用的硬件内存这个特性。
  • 所有I/O 都是通过请求页面调度完成的,仅发生于磁盘扇区与内存页之间。分页区指从物理内存置换出来存储于磁盘上的内存页面。从本质上说,物理内存充当了分页区的高速缓存。比如下图ABCD四个进程都有属于自己的虚拟内存空间。进程A有五个页面,其中两个装入内存,其余存储于磁盘用于分页区高速缓存的物理内存
  • MMU(内存管理单元)是CPU的子系统,逻辑上位于CPU和物理内存之间,包含虚拟地址(虚拟页号)向物理内存地址(物理页号)转换时所需映射信息。CPU向MMU发起引用内存地址的请求,然后由MMU做页号转换
    1. 如果不存在有效的物理地址,MMU向CPU提交页错误,然后内核负责把缺失的页读到物理内存
    2. 如果不存在有效的虚拟地址,MMU向CPU提交段错误,然后内核通常强制进程关闭


文件I/O

  • 文件系统是比用扇区存储数据的磁盘更高层次的抽象,是组织、解释磁盘数据的一种独特方式。
  • 内存映射I/O建立了从用户空间到可用文件系统页的虚拟内存映射,允许用户进程最大限度地利用面向页的系统I/O 特性,完全摒弃了文件系统页与用户缓冲区之间的拷贝

用户内存到文件系统页的映射


流I/O

  • 前面讲的文件I/O是面向块的
  • 也有流I/O,传输一般比块设备慢,经常用于间歇性输入。有非块模式和就绪性选择(readiness selection)模式.
  • 就绪性选择:由操作系统查看流是否就绪,进程就可以使用相同代码和单一线程,实现多活动流的多路传输。这一技术广泛用于网络服务器领域

0 0
原创粉丝点击