一、数据物理传输过程

数据首先通过物理连接方式收到数据:
通过网卡设备接收数据,然后拷贝到操作系统内部缓冲区,从缓冲区复制到应用程序的缓冲区,从应用程序缓冲区提取数据。

二、阻塞式IO

数据传输过程:

通过操作系统(大部分为Unix)调用函数查询数据是否准备好。
image.png

数据没有准备好,一直阻塞在内核中
数据准备好了,拷贝到内核的缓冲区,然后复制到应用程序缓冲区
image.png
返回数据到应用程序
image.png

三、非阻塞式IO

数据传输过程:

如果在系统调用后数据没有准备好,这是不会进行阻塞,会直接返回无数据,然后之后再次系统调用,在这样不断询问直到数据准备好为止,过程如图:
image.png

与阻塞的不同点:

显然,区别就是不再等待到数据准备好为止,而是不断发送查询直到数据准备好为止。

四、阻塞小结

对比NIO和BIO模型,这里就对应着非阻塞和阻塞模型。
不过请注意,这里的是NIO模型而非NIO具体实现,因为具体实现会涉及到Selector,将在后面具体分析。

五、IO多路复用

数据传输过程:

通过系统调用(select)查看数据是否准备就绪,若数据没有准备好,于是准备监听内核通道,等待直到数据准备好为止,返回可读信号(条件),然后再次系统调用,随后复制数据,最后成功返回。
image.png

何为多路?

应用程序可以不止监听一个IO,可以监听多个IO,当满足条件时,都可以返回条件,故为多路。

小结

如上所述,IO多路复用是NIO+Selector(IO多路复用器)的模型。

六、异步IO

不管是上述哪种模型,它们都属于同步模型,因为发起调用以后,无论数据准备好与否都会返回数据。

异步IO的过程:

和之前相同,若没有准备好数据的话会返回空数据,当数据准备好以后,会直接进行数据复制,当一切都准备好以后会递交信号给应用程序。
image.png
对应模型即AIO模型