Select、Poll、Epoll 之异同
参考:
一文看懂IO多路复用
https://zhuanlan.zhihu.com/p/115220699
几个概念:阻塞IO、非阻塞IO、同步IO、异步IO
一般情况,一次网络IO读操作会涉及两个系统对象:(1) 用户进程(线程)Process;(2)内核对象kernel。
并且对应两个处理阶段:
1、 Waiting for the data to be ready - 等待数据准备好
2、Copying the data from the kernel to the process - 将数据从内核空间的buffer拷贝到用户空间进程的buffer
IO模型的几种方式就是区分在这两个系统对象、两个处理阶段之上。
1、阻塞IO
首先,阻塞IO肯定是同步IO。
在数据没准备好的时候,process原地等待kernel准备数据。
kernel准备好数据后,process继续等待kernel将数据copy到自己的buffer。
kernel完成数据copy后process才会返回,即结束。
2、非阻塞IO
参考上面的阻塞原因,在第一阶段,如果数据没准备好,直接给process返回BLOCK错误,让其挂起,等待就绪后,再唤起。
3、异步IO
异步IO要求process在上面的两个处理阶段上都不能等待,遗憾的是,linux的网络IO中是不存在异步IO的,linux的网络IO处理的第二阶段总是阻塞等待数据copy完成的。真正意义上的网络异步IO是Windows下的IOCP模型。
所以常说的异步非阻塞,其实只是第一阶段不阻塞,也并非真正意义上的异步。
epoll原理示例
场景:家长来接孩子放学,但是孩子们正在考试,需要答完试卷才能放学。
阻塞模式
:A家长来问a同学,老师跑去挨个儿找一遍,发现a同学正在答题,于是就等着答完后再通知A家长。与此同时,B、C家长只能在一旁干等着。
select & poll 模式(轮询)
:A家长来问a同学,老师跑去挨个儿找一遍,发现a同学正在答题,于是就通知A家长在一旁候着。接着对接B家长,找b同学……A家长隔一会儿问一遍,直到a同学答完被接走。
epoll 模式
:ABC家长来问老师自己的孩子啥时候可以放学,老师拿个小本本记上(注册事件)。之后老师通知孩子们说,谁答完了直接来讲台。
a同学答完来到讲台,老师翻开小本本发现A家长在等,于是通知A家长带走孩子(回调),并在小本本上划掉a同学(删除监听)。
网友评论