一、数据物理传输过程
数据首先通过物理连接方式收到数据:
通过网卡设备接收数据,然后拷贝到操作系统内部缓冲区,从缓冲区复制到应用程序的缓冲区,从应用程序缓冲区提取数据。
二、阻塞式IO
数据传输过程:
通过操作系统(大部分为Unix)调用函数查询数据是否准备好。
数据没有准备好,一直阻塞在内核中
数据准备好了,拷贝到内核的缓冲区,然后复制到应用程序缓冲区
返回数据到应用程序
三、非阻塞式IO
数据传输过程:
如果在系统调用后数据没有准备好,这是不会进行阻塞,会直接返回无数据,然后之后再次系统调用,在这样不断询问直到数据准备好为止,过程如图:
与阻塞的不同点:
显然,区别就是不再等待到数据准备好为止,而是不断发送查询直到数据准备好为止。
四、阻塞小结
对比NIO和BIO模型,这里就对应着非阻塞和阻塞模型。
不过请注意,这里的是NIO模型而非NIO具体实现,因为具体实现会涉及到Selector,将在后面具体分析。
五、IO多路复用
数据传输过程:
通过系统调用(select)查看数据是否准备就绪,若数据没有准备好,于是准备监听内核通道,等待直到数据准备好为止,返回可读信号(条件),然后再次系统调用,随后复制数据,最后成功返回。
何为多路?
应用程序可以不止监听一个IO,可以监听多个IO,当满足条件时,都可以返回条件,故为多路。
小结
如上所述,IO多路复用是NIO+Selector(IO多路复用器)的模型。
六、异步IO
不管是上述哪种模型,它们都属于同步模型,因为发起调用以后,无论数据准备好与否都会返回数据。
异步IO的过程:
和之前相同,若没有准备好数据的话会返回空数据,当数据准备好以后,会直接进行数据复制,当一切都准备好以后会递交信号给应用程序。
对应模型即AIO模型