Linux网络IO模型

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版)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容