-
epoll 原理介绍:
epoll有三个系统调用,epoll_create,epoll_ctl,epoll_wait。
epoll_create是初始化数据结构,并且返回一个fd。
epoll_ctl可以添加或删除描述符。添加时,初始化一个epitem,包含监听的fd,监听事件,就绪链表。然后把对应的回调函数注册到就绪队列中。最后把这个epitem插入到epoll对象的红黑树中,方便后续查找。
事件被触发的时候,回调函数会被调用,将对应的epitem写入到就绪链表中。如果当前用户进程正在epoll_wait状态,会将进程唤醒。
epoll_wait是在不断轮询就绪链表是否为空,不为空时,将链表返回给用户态。 -
epoll和select对比:
epll监听的fd集合是常驻内核的,通过epll_wait可以多次监听同一个fd集合,只返回可以读写的部分。
select只有一个系统调用,每次监听都要将其从用户态拷贝到内核态,有事件时返回整个集合。如果fd集合很大,用户态和内核态之间数据复制的花销是很大的,所以select一般限制fd集合最大1024。
从使用上看,epoll返回的是可用的fd子集,select返回的是全部,需要用户遍历判断哪些可用。
epoll原理以及和select的区别
最新推荐文章于 2022-05-03 12:36:50 发布