推荐阅读
Linux IO模式及 select、poll、epoll详解
补充:epoll的回调机制
epoll是对select系统调用的改善,适用于同时关注文件比较多的时候的一个中优化方法,例如一个具有大量连接的系统。
那么select的缺点在哪里呢?当select被唤醒的时候,它并不知道是被哪个或者哪些文件唤醒的,所以它要对位图中所有的文件进行遍历查询(调用该文件的poll接口)。 可以想象,如果select的文件比较多,并且大部分文件都是不活跃的,那么这些select中的大部分poll将会没有任何意义。
所以epoll就使用一个相对智能的回调机制:当某个文件准备好之后要唤醒等待线程时,它不是简单的把等待者设置为可运行,它还会进一步在等待者的结构中刻上“XXX到此一游”,这样,当线程被唤醒之后,它就可以通过这些留言看到是谁唤醒了自己,而不是逐个询问刚才是谁把我唤醒了。
这里就体现了软件中比较常用的“回调机制”(callback),当然有些比较通俗的叫法就叫做“钩子”(hook),也就是在某些事件发生的时候知会一些实体,知会的方法就是调用对方提供的钩子函数。因为可能某一个实体对一个事件的发生很感兴趣,但是这个事件并不是随时随地都会发生的,而具体在什么时候发生只有"体制内"流程才知道。比方说你去一个地方找一个同事A,但是他不在,你可能会给他附近的同事B说:“如果他回来的话你告诉我一声”。这就是一个回调机制,当一个自己不知道的事情发生的时候通过一种机制马上通知到自己。
- 对于epoll系统调用,当poll唤醒等待者时,epoll顺势记录了唤醒者的信息到红黑树。
- 对于select调用来说,它只是简单的唤醒,很傻很天真,也就是头脑相对比较简单一些,这个简单的代价就是在do_select函数中有一个罕见的三重for循环。
来源:CSDN
作者:肖肖肖肖小小
链接:https://blog.csdn.net/weixin_42012911/article/details/104406244