#阻塞式I/O模型 BIO
阻塞,当进程在等待数据时,若该数据一直没有产生,则该进程将一直等待,直到等待的数据产生为止,这个过程中进程的状态是阻塞的。
非阻塞式I/O模型
在非阻塞式I/O模型中,当进程等待内核的数据,而当该数据未到达的时候,进程会不断询问内核,直到内核准备好数据。
NIO
IO多路复用模型,就是通过一种新的系统调用,一个进程可以监视多个文件描述符,一旦某个描述符就绪(一般是内核缓冲区可读/可写),内核kernel能够通知程序进行相应的IO系统调用。
NIO的包括三个核心概念:缓冲区(Buffer)、通道(Channel)、选择器(Selector)。
BIO与NIO
BIO与NIO之间的共同点是他们都是同步的。而非异步的。
BIO是阻塞的(当前线程必须等待感兴趣的事情发生), NIO是非柱塞的(事件选择,感兴趣的事情发生可以通知线程,而不必一直在哪等待);
BIO是面向流式的IO抽象(一次一个字节地处理数据), NIO是面向块的IO抽象(每一个操作都在一步中产生或者消费一个数据块(Buffer));
BIO的服务器实现模式为一个连接一个线程,NIO服务器实现模式为一个请求一个线程;
从IO到NIO
面向流 vs. 面向缓冲
Java IO是面向流的,每次从流(InputStream/OutputStream)中读一个或多个字节,直到读取完所有字节,它们没有被缓存在任何地方。另外,它不能前后移动流中的数据,如需前后移动处理,需要先将其缓存至一个缓冲区。
Java NIO面向缓冲,数据会被读取到一个缓冲区,需要时可以在缓冲区中前后移动处理,这增加了处理过程的灵活性。但与此同时在处理缓冲区前需要检查该缓冲区中是否包含有所需要处理的数据,并需要确保更多数据读入缓冲区时,不会覆盖缓冲区内尚未处理的数据。
AIO
真正”的异步IO需要操作系统更强的支持。在IO多路复用模型中,事件循环将文件句柄的状态事件通知给用户线程,由用户线程自行读取数据、处理数据。而在异步IO模型中,当用户线程收到通知时,数据已经被内核读取完毕,并放在了用户线程指定的缓冲区内,内核在IO完成后通知用户线程直接使用即可。
AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞的IO模型。异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。
AIO 是异步IO的缩写,虽然 NIO 在网络操作中,提供了非阻塞的方法,但是 NIO 的 IO 行为还是同步的。对于 NIO 来说,我们的业务线程是在 IO 操作准备好时,得到通知,接着就由这个线程自行进行 IO 操作,IO操作本身是同步的。
/**
* 联系作者扫描以下二维码:
* <p>
* █████████████████████████████████████
* █████████████████████████████████████
* ████ ▄▄▄▄▄ █▀█ █▄▄▀▀ ▀▄█ █ ▄▄▄▄▄ ████
* ████ █ █ █▀▀▀█ ▀▀ ████▄█ █ █ ████
* ████ █▄▄▄█ █▀ █▀▀▄▀▀▄ ▀█ █ █▄▄▄█ ████
* ████▄▄▄▄▄▄▄█▄▀ ▀▄█▄▀▄█ ▀ █▄▄▄▄▄▄▄████
* ████ ▄ ▄ ▀▄ ▄▀▄▀▄ █ █▀ █ ▀ ▀▄█▄▀████
* ████▄ ▄ ▄▄██▄█▀▄ ▄▄▀█ ▄▀ ▀█▀█████
* ████ ▀▄▄█ ▄▄▄ ▄█▄▄▀▄▄█▀ ▀▀▀▀▀▄▄█▀████
* █████ ▀ ▄ ▄▄█▀ ▄██ █▄▄▀ ▄ ▀▄▄▀█████
* ████▀▄ ▄▀▄▄█▄▀▄▀█▄▀▀ ▄ ▀▀▀ ▀▄ █▀████
* ████ ██▄▄▄▄█▀▄▀█▀█▀▄▀█ ▀▄▄█▀██▄▀█████
* ████▄███▄█▄█▀▄ █▄▀▄▄▀▄██ ▄▄▄ ▀ ████
* ████ ▄▄▄▄▄ █▄█▄ ▄▄ ██▄ █▄█ ▄▄▀█████
* ████ █ █ █ ▀█▄ ▀ ▄▄▀▀█ ▄▄▄▄▀ ▀ ████
* ████ █▄▄▄█ █ ▄▀███▀▄▄▄▄▄ █▄▀ ▄ █████
* ████▄▄▄▄▄▄▄█▄███▄█▄▄▄▄▄██▄█▄▄▄▄██████
* █████████████████████████████████████
* █████████████████████████████████████
* <p>
* Lightbatis 基于规范约定的快速数据操作层
*
* @Author lifei114@126.com
*/