0 前言
Linux网络编程中经常出现同步IO和异步IO这对概念。遗憾是的,在这之前我从没找到一个关于这两个概念的清晰定义和理解。今找到一点这方面的材料,特分享之。 在解释二者区别之前,先提出一个前置知识,也即同步IO和异步IO的场景: 在网络数据传输中,Linux内核进程将TCP/UDP等传输层协议传输来的数据首先存放在内核的内核空间(内核缓冲区)。用户应用进程根据需要或事件驱动,向内核空间发起IO请求,内核进程需要在内核空间(内核缓冲区)中完成数据IO的一系列准备工作(如果此时内核缓冲区中没有数据,内核进程需要等待),然后完成数据从内核空间到用户空间的转移。此即同步IO和异步IO的大前提。
1 同步IO
先解释同步IO。在Linux网络编程中,没有十分可用的异步IO接口,所以在Linux网络编程中,多用同步IO模型。 顾名思义,同步IO要求用户进程在向内核进程发起数据IO请求后,在内核进程读取内核缓冲区中的数据时(若此时内核缓冲区中没有数据,内核进程显然不能返回用户进程需要的数据),在这一过程中,用户进程需要等待,直到内核进程将数据返回给用户进程,然后用户进程才解除等待/阻塞。 这也是默认同步IO模式,也即同步IO阻塞模式。
1.1 同步IO阻塞
用户进程向内核进程发起IO请求后,需要等待内核进程完成一系列数据IO操作(甚至内核空间中没有数据,此时内核进程需要等待),等到内核进程将数据传送给用户进程,用户进程才能解除阻塞。
1.2 同步IO非阻塞
用户进程向内核线程发起IO请求后,如果内核空间中有数据,则内核线程"立即"将内核缓冲区中的数据发送给用户进程。在这个过程中用户进程不做等待。 如果内核空间中没有数据,则用户进程立即返回,不做等待,也即没有阻塞。
2 异步IO
异步IO充分利用DMA特性,用户进程向内核发起IO请求,由内核进程负责数据的IO处理,此时用户进程可以去处理别的事情(实际多为挂起)。等内核处理完之后(内核进程将数据主动推给用户进程)通过中断通知应用进程接收数据。
3 参考材料
https://www.bilibili.com/video/BV11b411q7zr?p=24
|