同步:发起一个调用后,被调用者未处理完请求之前,不返回
异步:发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但是被调用者并没有返回结果。此时可以处理其他请求,被调用者依靠事件、回调等机制来通知调用者告知其结果。
阻塞:发起请求后,等待结果返回,当前线程会被挂起,无法从事其他任务。
非阻塞:发起一个请求,调用者不需要等待结果直接返回。
BIO:同步阻塞IO
NIO:同步非阻塞IO,基于Reactor模式实现
AIO:异步非阻塞IO,基于Proactor模式实现
阻塞:read 阻塞调用 内核准备数据 内核准备好数据将数据拷贝到应用
非阻塞IO: read 多次询问内核数据是否准备好 内核准备好数据 同步从内核拷贝数据到应用
非阻塞IO在最后一步从内核拷贝数据时仍是同步的。
异步IO: read 直接返回 内核准备数据 内核准备好数据,从内核拷贝数据通知到应用 通知应用。
非阻塞IO和异步IO的区别在于,Reactor模型感知的是就绪可读写事件,Proactor模型感知的是可读写事件。
Reactor主要由Reactor和处理资源池两部分组成
- Reactor负责监听和分发事件,连接时间、读写事件
- 处理资源池负责处理事件 read -> 业务逻辑 -> send
优点:无线程竞争
缺点:无法利用多核性能、只要一个线程,处理业务时就无法处理其他连接事件
单单不适合计算密集型场景,只适用于业务处理非常快速的场景。
redis采用的单单,redis业务处理在内存完成,速度很快,性能瓶颈不在cpu。
单Reactor场景,只有一个Reactor监听和响应事件,高并发时容易成为性能瓶颈。
netty 和 memcache采用了这种