【NIO】Chapter 1. Introduction

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的拷贝过程,提供效率

 

磁盘数据拷贝到JVM内存中需要经历几个步骤:

 

实现原理:

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直接访问用户空间的虚拟地址就可以拿到内核缓存区的数据。

 

 

 

 

 

猜你喜欢

转载自just2learn.iteye.com/blog/2083442
今日推荐