一、名词解释
1.1 同步与异步
同步与异步主要是针对CPU来说的
- 同步:CPU必须等着结果返回,这期间不能干别的;
- 异步:CPU不必等着结果返回,这期间可以干别的;
1.2 阻塞与非阻塞
阻塞与非阻塞主要是针对I/O来说的
- 阻塞:I/O线程会挂起,需等待结果;
- 非阻塞:I/O线程不必挂起,不等待结果;
1.3 伪异步I/O
本质上还是同步阻塞I/O
不过是在服务器把socket链接封装成Task提交给线程池处理
因为有队列,所以可以突破C:S=1:1的比例
1.4 I/O多路复用
通过把多个I/O的阻塞复用到一个阻塞上,从而使得系统在单线程情况下可以处理多个客户端的请求。
类似于linux的epoll、select
1.5 多路复用器
Selector,核心是通过Selector来轮询注册在其上的Channel
当发现有Channel就绪就返回Channel的选择键集合,进行I/O操作;
二、不同I/O模型对比表格
| 对比项 | 同步阻塞I/O(BIO) | 伪异步IO | 非阻塞I/O(NIO) | 异步I/O(AIO) |
|:—–|:—–|:—–|:—–|:—–|:—–|
| 客户端个数:I/O线程数 | 1:1 | M:N(M>=N) | M:1 | M:O |
| I/O类型(是否同步) | 同步 | 同步 | 同步(I/O多路复用) | 异步 |
| I/O类型(是否阻塞) | 阻塞 | 阻塞 | 阻塞 | 非阻塞 |
| API使用难度 | 简单 | 简单 | 非常复杂 | 复杂 |
| 调试难度 | 简单 | 简单 | 复杂 | 复杂 |
| 可靠性 | 非常差 | 差 | 高 | 高 |
| 吞吐量 | 低 | 中 | 高 | 高 |
三、参考
- 《Netty权威指南 2th》