区别
io nio 的本质区别实际上是阻塞和非阻塞的区别
一 概念
(1)阻塞
应用程序在获取网络数据的时候,如果网络数据传输速度过慢,那么就一直等待,知道数据传输完毕
(2)非阻塞
应用程序会从缓冲区去读取已经准备好的数据 不需要过多的等待
(3)同步
应用程序会直接参与io的读写操作,
如果数据没有获取到,那么io会采用轮询的方式去获取数据, 在等待的过程中,
不做其它事情
(4)异步
应用程序不会直接参与io的读写操作,而是由操作系统处理,
在此过程中 可以去处理其它的事情
而操作系统获取到数据之后会通知应用程序去拿取数据
二 IO
传统的io是 [同步阻塞的io]
传统的io去获取数据的时候,如果获取不到数据就会一直等待直到获取到数据.
而且他是面向流的, 每次从流中都会拿取一个或多个字节,直到全部取出,
没有缓冲区不能前后移动流中的数据
三 NIO
NIO 其实是为了解决io的缺点而诞生的, [NIO是同步非阻塞的IO]{.underline}
nio在读取的数据的时候,如果没有读取到数据会直接返回read()会立即返回0
所以不会阻塞,
四 多路复用器
他是nio编程的基础,[他提供了选择已经就绪的任务]
的能力,就是Selector会通过轮询的方式注册到通道上(Channel),如果某个通道发生了读写操作,这个通道就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以取得就绪的Channel集合,从而进行后续的IO操作。
其实就是 nio 会直接从缓冲区中拿取已经准备好的数据,这也是
io和nio的根本区别
五 AIO
在NIO基础上引入了异步通道的概念,并提供了异步文件异步套接字通道的实现。AIO不需要通过多路复用器对注册的通道进行轮询操作即可实现异步读写,从而简化了NIO变成模型。
但select,pselect,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。