linux io模型主要分为五种:阻塞IO、非阻塞IO、多路复用IO、异步IO、信号驱动IO。
网络IO请求的两个过程
1.等待数据准备好。网络上的数据会首先发往网卡
2.将数据从内核空间向进程(用户空间)复制数据
总的流程大概就是:用户进程发出系统调用,进入内核空间,内核通过网卡去发送/接收数据,然后将收到的数据复制到用户空间,用户进程就可以拿到数据进行操作了
阻塞IO

image.png
进程调用系统函数recvfrom,此时应用进程被阻塞,直到内核空间拿到数据放到用户空间,用户进程才开始运行
非阻塞IO

image.png
用户进程请求数据时,如果内核还未准备好就返回一个错误,进程进行轮询,直到数据准备好,此时,进程阻塞,内核将数据拷贝到用户空间,然后进行开始运行
IO复用模型

image.png
用户进程通过select/poll/epoll系统调用请求数据,当内核没有准备好数据时,进程被阻塞在当前系统调用,当数据准备好后,通过回调函数通知进程该请求数据。IO复用的好处就是一个进程可以处理多个socket。
异步IO

image.png
用户进程将请求告知内核后就可以去做别的事情了,等内核将数据放到用户空间再通知进程,用户进程就可以直接对数据进行操作了。
IO模型的比较

image.png
POSIX中的定义:
同步IO操作导致请求进程阻塞,直到IO操作完成
异步IO操作不导致请求进程阻塞
所以阻塞IO、非阻塞IO、IO复用模型都属于同步IO,异步IO模型属于异步IO
参考书籍:unix网络编程卷1:套接字联网API(第3版)