一、异步IO
异步最大的特点是,应用程序不需自己去触发,数据从内核空间叫用户空间的拷贝。应用程序是无法主动访问内核空间的。那么有两种处理方式,有两种方式:
**1、内核主动拷贝数据到应用程序中 **
2、等待应用程序通过 Selector 来查询,当数据就绪后,应用程序再发起一个 read 调用,这时内核再把数据从内核空间拷贝到用户空间。
数据准备好后,数据从内核拷贝到用户空间的这一段时间,应用程序还是阻塞的。
二、异步IO与同步IO的区别
**异步IO:**通过注册的回调函数,内核会主动通知数据。调用readAPI时需要告诉内核2件事情: 1、数据准备好后存储在哪个buffer,以及应用程序指定的回调函数。
三、Nio2EndPoint
- Nio2EndPoint与 NIoEndPoint最大的区别是 前者没有Poller组件,也就是没有Selector,因为不许需要应用程序去主动读取数据,内核会将准备好的数据回调。
3.1 SocketProdes是何如获取数据的?
Http11Processor调用Channle获取数据时应该会立马异步返回结果的,如果读取到数据的?
Http11Processor 是通过 2 次 read 调用来完成数据读取操作的。
- 第一次read获得连接;注册回调函数准备第二次read;SocketProcess被回收
- 第二次read创建新的SocketProcessor处理数据,持有原来的 Nio2SocketWrapper(它是作为附近传递)
参考
极客时间-深入理解Tomcat