对于发生一次网络IO,可以分为两部分:
1、等待数据:
阻塞:线程一直阻塞等待数据。
非阻塞:线程发送请求后,不等待数据,通过轮询/信号量等方式去获取数据是否准备好。
2、将数据从内核复制到用户空间:
同步:线程自己把数据从内核复制到用户空间,期间不能做其它事情,一直等待数据复制完毕。
异步:系统内核把数据从内核复制到用户空间,然后再通知相应线程进行数据处理。
总结:阻塞/非阻塞:发生请求后,是否等待接收方处理好数据(是否等待数据处理好)。
同步/异步: 线程是否需要等待数据从内核复制到用户空间(是否等待数据复制)。(没有异步阻塞、异步非阻塞之分,异步必定非阻塞)
再结合以下的io模型图来理解:
同步阻塞IO:阻塞等待数据(阻塞),准备好数据后,等待数据从内核复制到用户空间(同步)

同步非阻塞IO:发生请求后,轮询数据是否准备好(非阻塞);准备好数据后,发送数据复制命令,等待数据从内核复制到用户空间(同步)

同步非阻塞IO(信号驱动IO):发生请求后,内核通过信号量标志数据是否准备好(非阻塞);准备好数据后,发送数据复制命令,等待数据从内核复制到用户空间(同步)

同步非阻塞IO(多路复用O):阻塞在select,发生请求后注册socket到select,select轮询多个socket数据是否准备好(非阻塞);准备好数据后,发送数据复制命令,等待数据从内核复制到用户空间(同步)

异步IO:发生请求后,不需等待数据是否准备好(非阻塞);准备好数据后,内核会把数据从内核复制到用户空间,然后发送信号通知数据已经复制完成(异步)

本文详细解析了网络IO的不同模型,包括同步阻塞、同步非阻塞、信号驱动IO、多路复用IO以及异步IO,通过实例和图示帮助理解数据请求、数据准备和内核复制过程的区别。
526

被折叠的 条评论
为什么被折叠?



