@Yano
2017-08-19T08:20:01.000000Z
字数 1316
阅读 1627
Netty
系列文章:http://www.jianshu.com/p/594441fb9c9e
本文完全参考自《Netty权威指南(第2版)》,李林峰著。
Linux内核将所有的外部设备都看做文件来操作,对文件的读写会调用内核的系统命令,返回一个file descriptor(fd,文件描述符)。而对一个socket的读写也会有相应的描述符,称为socketfd(socket描述符),指向内核中的一个结构体。
UNIX提供了5种I/O模型:
select/poll
,进程将一个或多个fd传递给select/poll系统调用,阻塞在select操作上。select/poll顺序扫描fd是否准备就绪,而且支持的fd数量很有限。epoll是基于事件驱动方式代替循环扫描,性能更高;当有fd就绪时,立即回调函数rollback。在整个操作完成后
通知我们。与信号驱动模型的主要区别:信号驱动I/O由内核通知我们何时可以开始一个I/O操作;异步I/O模型由内核通知我们I/O操作何时已经完成。在I/O编程过程中,当需要同时处理多个客户端接入请求时,有两种处理方式:
那么I/O多路复用技术有什么好处呢?
把多个I/O的阻塞,复用到同一个select的阻塞上,从而使得系统通过单线程来同时处理多个客户端请求
,节省系统资源。
Java的I/O在1.4以前版本并不好,仅有非常基本的功能。
1.0 ~ 1.3 中的Java I/O类库相当原始,很多UNIX网络编程中的概念都没有体现出来。
JDK 1.4中,NIO正式随JDK发布,新增了java.nio包,提供了异步I/O开发的API和类库
。
将原来的NIO类库进行了升级,成为NIO 2.0。