Encapsulation is a good thing:
It partitions responsibility, hides implementation details, and promotes object reuse.
封装:按职责划分类,隐藏实现细节,提供对象重用。
IO Versus CPU Time
应用程序开发过程中,使用各种技巧将程序设计得更灵活,更优雅,更具扩展性是非常重要的。然而,很多人往往在其它方面花大力气,却忽视了另一个重要的方面:对IO操作没有给予足够的重视。
IO操作是否高效,将很大程度上影响系统的响应速度。
打个不是很恰当的比喻:
花100倍力气在程序(非IO)优化上,应用服务器吞吐量提高2倍
花10倍力气在IO程序优化上,应用服务器吞吐量提高100倍
应用IO非常耗时,稍微优化一点,性能就有上升很多。
所以,当发现程序完成一个功能,IO操作会占据很大一部分时间,那就需要去关注IO操作的优化了。否则,那些你精心设计的代码也只能空闲着(等待IO操作)。
No Longer CPU Bound
不要因为没有及时提供数据给CPU,而让CPU处于等待数据的状态,这是一种浪费。
比如:CPU希望一次处理一卡车的数据。
由于 传统IO的低效:面向流Stream,一个字节/一行代码(传统IO类提供的数据大小为一铲子的量),极度不满足CPU的需求,最终导致CPU很多时候都是处于“等待数据”的状态,不能有效的利用CPU的处理能力。(注意:传统IO也可以通过封装数据到缓冲区Buffer,一次提供一车数据给CPU,只是决定权在程序员那里!)
NIO的出现,解决了数据量的问题,一次装一卡车(a Buffer Object )数据给CPU,让CPU尽情的处理。NIO倡导通过卡车(Buffer)运输数据给CPU。
Getting to the Good Stuff
NIO包提供了新的抽象体系解决低效IO的问题。
Channel、Buffer、Selector构成了NIO的核心,为高效IO提供了丰富的API进行数据操作。
虽然NIO不能访问任何操作系统的底层代码,但是NIO所提供的高性能IO操作,在大多数商业操作系统上都是可用的。
Buffer Handling
消除将数据从Kernel Space 到User Space的拷贝过程,提供效率
实现原理:
1. More than one virtual address can refer to the same physical memory location.
2. A virtual memory space can be larger thanthe actual hardware memory available.
By mapping a kernel space address to the same physicaladdress as a virtual address in user space, the DMA hardware (which can access only physical memory addresses) can fill a buffer that is simultaneously visible to both the kernel and a user space process.
由内核地址空间映射到同一个物理地址作为用户空间的虚拟地址
DMA硬件(只能访问物理内存地址)仍然将数据装入到内核空间
该缓冲区(内核空间在内存中的映射地址所指内存区域)同时对内核和用户空间是可见的。这样,将数据写入内核也就变相的写入到了用户空间了,JVM直接访问用户空间的虚拟地址就可以拿到内核缓存区的数据。