首页 > 试题广场 >

说一说 epoll 的原理

[问答题]
全互联网没有一个人能用大白话解释清楚
发表于 2022-09-20 19:10:59 回复(0)
epoll主要是用来进行io多路复用的,epoll_create用来创建epoll句柄,里面包含红黑树和双向链表两种结构,epoll_ctr用来添加需要监测的fd,epoll_wait用来将就绪的fd放大就绪列表中并返回
发表于 2022-06-26 09:36:15 回复(0)
在内核区构造一个红黑树和一个链表,监听和通信的文件描述符被加入到红黑树中,调用epoll_wait后,将有信息的文件描述符加入到链表,复制链表到用户区
发表于 2022-07-05 21:20:39 回复(0)
epoll是IO多路复用的一种方式,epoll分为LT和ET触发模式,epoll的实现就是把检测就绪队列和阻塞进程两步分离,每一个FD只会拷贝到内核中一次。epoll在创建时调用epoll_create,创建eventpoll结构体,这个结构体中包含保存绪队列的rdlist双向链表和监视FD的数据结构红黑树,epoll_clr添加需要监听的FD,epoll_wait用于检测等待队列,并将就绪的事件数组返回。 LT:水平触发,当有FD被添加到就绪队列时,就可以对FD进行IO操作,如果没有操作还是会继续通知 ET:边沿触发,当有FD被添加到就绪队列时,只会对该套接字通知一次,直到该套接字不再为就绪状态了,期间如果没有对该套接字执行IO操作,内核也不会继续通知,这种模式下仅支持非阻塞套接字
发表于 2022-08-29 20:33:03 回复(0)
https://www.cnblogs.com/Hijack-you/p/13057792.html这个讲的对我小白来说还挺友好的。
发表于 2022-09-26 15:28:42 回复(1)
1.epoll_create() 会在内核中创建一个 eventpoll 结构体数据,称之为 epoll 对象 -一个是需要检测的文件描述符的信息 struct_root rbr(红黑树) -就绪列表struct list_head rdlist,存放检测到数据发送改变的文件描述符信息(双向链表) 2.epoll_ctrl() 可以向 epoll 对象中添加、删除、修改要监听的文件描述符及事件; 3.调用 epoll_wt() 可以让内核去检测就绪的事件,并将就绪的事件放到就绪列表中并返回,通过返回的事件数组做进一步的事件处理。 epoll的两种模式: 1.ET边沿触发:epoll检测到文件描述符发生改变时只通知一次,不管你是不是对这个fd进行IO操作,内核不会发更多的通知 2.LT水平触发:epoll检测到文件描述符发生改变时通知用户,如果不对这个就绪的fd进行IO操作,内核会不断通知。
发表于 2023-07-25 16:05:56 回复(0)
1. epoll是一种IO多路复用,相比较于epoll和select、poll,epoll采用一组函数,而不是单个函数来完成IO多路复用; 2. 首先,调用epoll_create()在内核创建一颗红黑树,红黑树用于跟踪所有待监听的socket;被监听的socket是通过epoll_ctl()被注册到内核的红黑树上;epoll是事件驱动机制的,这些socket节点与网卡建立了回调关系,当有事件发生时,它们会被添加到一个就绪双向链表中,随后调用epoll_create,首先会检查就绪双向链表是否为空,如果不为空,则将其拷贝回用户态,并返回触发事件的数量。 3. epoll的优点是待监听的socket是注册在内核的,不需要像select那样每次将整个文件描述符集合在用户区和内核来回拷贝;并且epoll返回的有事件发生的socket,不需要遍历,因此更加高效;另外epoll还支持边缘触发,边缘触发一般要比水平触发更加高效
发表于 2023-10-22 20:13:48 回复(0)
调用 epoll_create() 会在内核中创建一个 eventpoll 结构体数据,称之为 epoll 对象,在这个结构体中有 2 个比较重要的数据成员,一个是需要检测的文件描述符的信息 struct_root rbr(红黑树),还有一个是就绪列表struct list_head rdlist,存放检测到数据发送改变的文件描述符信息(双向链表); 调用 epoll_ctrl() 可以向 epoll 对象中添加、删除、修改要监听的文件描述符及事件; 调用 epoll_wt() 可以让内核去检测就绪的事件,并将就绪的事件放到就绪列表中并返回,通过返回的事件数组做进一步的事件处理。
发表于 2022-09-11 14:35:37 回复(0)
先创建一个epoll句柄 然后 创建event结构体 为监听的socket准备事件 然后把事件加入epoll句柄 然后用epollwait函数 来检测就绪的事件 俩种工作模式 水平和边缘 水平触发就是文件就绪之后会不停的通知 边缘触发是就通知一次
发表于 2022-05-18 11:08:38 回复(0)
select是监听需求,读写或异常并反馈。poll支持监听更大量级的文件集合。epol通过二级索引+红黑树逻辑,以较高的效率支持更大量级。三者是步步优化的关系。
发表于 2024-05-13 10:11:42 回复(0)
epoll是用红黑树和链表实现
编辑于 2024-04-25 14:09:32 回复(0)
epoll是一种I\O多路复用技术。 1、调用epoll_create()会在内核中创建一个epoll对象,其中有两个比较重要的数据成员,一个是需要检测的文件描述符的信息红黑树(struct_root rbr),另一个是就绪列表,存放检测到数据发生改变的文件描述符的信息 2、epoll_ctrl()可以向epoll对象中添加、修改、删除要监听的文件描述符及事件 3、epoll_wt()可以让内核去检测就绪的事件,将就绪事件放入就绪队列中并返回,并根据返回的事件数组做处理。 epoll有两种工作方式:水平触发LT和边沿触发ET
编辑于 2024-04-08 19:20:33 回复(0)
epoll就是先调用epoll_create在内核中创建一个eventpoll结构体 称之为epoll对象,在这格结构体中有两个数据,一个是红黑树,一个是就绪列表就是存储检测到数据发送改变的文件描述符信息是一个链表 调用epoll_ctrl向epoll对象中添加、删除、修改要监听的文件描述符以及事件 调用epoll_wt可以让内核去检测就绪的事件,并将就绪的事件放到就绪列表中并返回,通过返回的事件数组做进一步的事件处理
编辑于 2024-03-24 15:12:04 回复(0)
底层双向链表加红黑树,每次只返回可操作的文件描述符列表,水平触发模式所以不用担心错过未处理事件,红黑树搜索时间logn。相关API:epoll_create()创建一个epollfd,epoll_ctl()操作一个epollfd,向里面添加、删除、修改要监听的文件描述符,epoll_wait()返回发生的事件数,事件存储在epoll_event结构体中,可以判断其中的fd字段判断是哪个文件描述符的事件
编辑于 2024-03-21 15:36:43 回复(0)
epoll多路复用,先通过epoll creat创造一个epoll对象,他是在内核暴露给用户的句柄 ,通过epollctl将监测的文件描述符添加到epoll树,再调用epollwait,发生变化的文件描述杜会被添加到(本质是用指针)就绪事件双向链表中,如果用et模式,那势必要每次都把事件处理完,比如读缓冲区数据都得读完,所以必须用非阻塞,否则会一直卡在那里读
编辑于 2024-03-03 13:37:48 回复(0)
Epoll 的原理可以分为以下几个步骤:1.创建 epoll 实例:通过调用 epoll_create 系统调用创建一个 epoll 实例。 2.注册事件:使用 epoll_ctl 系统调用将感兴趣的文件描述符添加到 epoll 实例中,并指定感兴趣的事件类型,例如可读事件、可写事件等。 3.等待事件:调用 epoll_wait 系统调用等待事件的发生。此时,程序将会阻塞,直到有一个或多个感兴趣的事件发生。 4.处理事件:当 epoll_wait 返回时,程序从返回的事件集合中获取到已经就绪的文件描述符,可以对这些文件描述符进行读写等操作。 5.反复循环:程序返回处理完当前事件后,可以再次调用 epoll_wait 系统调用等待下一个事件的发生,从而实现循环监听的功能。 较于其他 I/O 复用机制(如 select 和 poll),Epoll 采用了操作系统更为高效的事件通知机制,避免了遍历所有文件描述符的开销,同时支持较大规模的并发连接。
发表于 2023-10-09 21:12:00 回复(0)
epoll是一种更加高效的IO复用技术 原理: 1、首先调用epoll_create()函数,创建以epoll实例,其在内核中创建了一个结构体,这个结构体有两个重要的属性,分别是需要检测的文件描述符的信息(底层是红黑树),另一个是就序列表,里面存放着有事件发生的文件描述符的信息(底层是双链表) 2、调用epoll_ctl()函数,对epoll实例进行管理,对文件描述符进行添加、删除、修改的操作。 3、调用epoll_wait()函数,就是内核检测就绪事件的发生,将文件描述符存入就序列表中并返回,通过第二个参数数组来做后续操作。 两种工作模式: 1、LT(水平触发): LT模式是一种缺省的工作方式,支持阻塞和非阻塞,当检测到有就绪事件发生时,内核会告诉你要对这个文件描述符进行IO操作,如果你没有进行操作,内核会一直通知你。 2、ET(边沿触发): ET模式是一种高速工作模式,只支持非阻塞,当检测到有就绪事件发生时,内核会通过epoll告诉你要对这个fd进行IO操作,如果你没对其做任何操作的话,那么这个fd再次变为就绪事件之后,内核也不会通知你了,这种模式比LT模式效率高的多,大大减少了对epoll被触发时的通知次数。 注意:EL模式下必须要使用非阻塞接口,避免因为当前的fd发生读阻塞或写阻塞时,导致其他的fd无法进行IO的操作从而导致被饿死。
发表于 2023-06-13 18:51:58 回复(0)
epoll_create epoll_ctl epoll_wait; 红黑树 双向链表;LT 阻塞、非阻塞 写了一次加EPOLLOUT事件,写完,去除事件;ET 一直读,非阻塞 效率高(可能)
发表于 2023-02-23 10:34:21 回复(0)
可以管理的文件描述符没有上限,取决于系统的性能。 只需要将文件描述符的表从用户空间向内存空间拷贝一次。 不需要轮询,异步IO模式,文件描述符自带callback函数,当有事件产生时,会回调函数来处理事件。
发表于 2022-11-02 20:05:31 回复(0)
epoll_creat()创建一个event对象,包括一个用于检测文件描述符的结构体和一个返回就绪文件描述符的双向链表,epoll_ctl()通过add、mod、del关键字对文件描述符或者事件进行添加、修改、删除操作,然后epoll_wait()可以让内核去检测就绪的事件,并将就绪的事件放到就绪列表中并返回,通过返回的事件数组做进一步的事件处理。事件等待触发包括水平触发和边缘触发两种形式
发表于 2022-11-01 18:57:01 回复(0)