Netty(1)
Netty 是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端。
BIO、NIO和AIO
采用烧水的例子:
BIO: 叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。
NIO: 叫一个线程不停的循环观察每一个水壶,根据每个水壶当前的状态去处理。
AIO: 每个水壶上装一个开关,当水开了以后会提醒对应的线程去处理。
BIO 方式:采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接**,**它接收到客户端连接请求之后为每个客户端创建一个新的线程进行链路处理没处理完成后,通过输出流返回应答给客户端,线程销毁。即典型的一请求一应答通用模型。
NIO方式: NIO提供了与传统BIO模型中的Socket和ServerSocket相对应的SocketChannel和ServerSocketChannel两种不同的套接字通道实现。
新增的着两种通道都支持阻塞和非阻塞两种模式。
缓冲区 Buffer 所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的;在写入数据时,也是写入到缓冲区中。任何时候访问NIO中的数据,都是通过缓冲区进行操作。
通道 Channel 数据的读取和写入要通过Channel,它就像水管一样,是一个通道。通道不同于流的地方就是通道是双向的,可以用于读、写和同时读写操作。
多路复用器 Selector Selector提供选择已经就绪的任务的能力:Selector会不断轮询注册在其上的Channel,如果某个Channel上面发生读或者写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取就绪Channel的集合,进行后续的I/O操作。
AIO方式:在NIO基础之上引入了异步通道的概念。并提供异步文件和异步套接字通道的实现,从而在真正意义上实现了异步非阻塞,之前我们学过的NIO只是非阻塞而非异步。而AIO它不需要通过多路复用器对注册的通道的进行轮训操作即可实现异步读写,从而简化了NIO编程模型。也可以称为NIO2.0,这种模式才是真正的属于异步非阻塞的模型。
零拷贝
传统IO
一共4次拷贝3状态切换
mmap零拷贝
一共3次拷贝3次状态切换
sendFile
一共3次拷贝2次状态切换
Linux2.4优化后
其实有一次cpu拷贝 kernel buffer ->socket buffer 拷贝信息很少,开销小可以忽略
一共2次拷贝2次切换