首页 > 试题广场 >

epoll原理

感觉写的很不错,牛客网YYDS
发表于 2022-06-03 14:03:12 回复(0)
epoll是一种高效地IO多路复用技术。调用epoll_create()会创建一个结构体数据,里面包含一个用于遍历扫描文件描述符状态的红黑树和一个就绪列表。调用epoll_ctr()可以进行增删改要监听的文件描述符及事件。调用epoll_wt()就会让内核检测就绪事件,将就绪事件到该表列表返回。epoll有两种触发机制。水平触发:当文件描述符状态改变时就立即进行IO操作,如果不进行处理将继续通知。边沿触发:是高速工作方式。该机制默认你已经知道了状态描述符改变,再你改变IO状态后描述状态改变后不会通知。该种方式减少了epoll的重复触发次数,提升了效率。必须使用非阻塞接口防止因一个文件描述符阻塞读写其他任务饿死。
编辑于 2022-06-20 20:42:04 回复(0)
epoll是一种更加高效的IO复用技术,epoll的使用步骤及原理如下:先调用epoll_create()在内核创建 epoll对象,其中有两个重要的成员,一个是需要检测的文件描述符的信息struct_rootrbr(红黑树),还有一个是就绪列表struct_list_head_rdlist,存放检测到数据发送改变的文件描述符信息(双向链表); 再调用epoll_ctrl()可以向epoll对象中添加,删除,修改要监听的文件描述符及事件, 再调用epoll_wait()可以让内核去检测就绪的事件,并将就绪的事件放到就绪列表中并返回,通过返回事件数组做进一步的事件处理。 epoll有两种工作模式:LT 模式(水平触发)level_Triggered 是缺省的工作方式,能同时支持Block 和 Nonblock Soceket, 在这种做法中,内核检测到一个文件描述符就绪了,然后可以对这个就绪的fd进行io操作,如果不作任何操作,内核还是会继续通知。 2 ET(边沿触发)模式(Edge-Triggered)是高速工作方式,只支持Nonblock socket. 这种模式下,当描述符从未就绪变成就绪时,内核通过epoll检测到,然后它会假设你知道文件描述符已经就绪,并且不会再为那个文件描述符发送更多的就绪通知,直到你做了某些操作导致那个文件描述符不再为就绪状态了,但是如果一直不对这个fd进行io操作(从而导致它再次变成未就绪状态了),内核不会发送更多的通知(only once),ET 模式很大程度上减少epoll事件被重复触发的次数,因此效率比LT 模式要高, epoll 工作再ET模式下的时候必须使用非阻塞套接字,以避免一个文件描述符的阻塞读/阻塞写操作把 处理多个文件描述符的任务饿死。
发表于 2022-06-06 18:18:27 回复(0)
1.epoll 是一种更加高效的 IO 复用技术
2.epoll 的两种工作模式:
1. LT 模式(水平触发) LT(Level - Triggered)是缺省的工作方式,并且同时支持 Block 和 Nonblock Socket。
2. ET 模式(边沿触发) ET(Edge - Triggered)是高速工作方式,只支持 Nonblock socket。
发表于 2023-02-16 11:55:12 回复(0)
epoll是多路IO复用的一种实现方式,底层通过使用红黑树加链表的实现形式。通过一个进程对所有的文件描述符进行监听和管理,当有事件请求来时,先去红黑树对文件描述符进行查找,找到之后放到就绪列表中,返回用户态做进一步处理。通过dispch进行事件分发,并调用相关进程对事件进行处理。
发表于 2022-11-09 11:11:56 回复(0)
🤪
发表于 2023-06-07 20:24:37 回复(0)
1.调用epoll_create()会在内核中创建一个eventpoll结构体数据,称为epoll对象.这个结构体重有两个重要成员: 一个是需要检测的文件描述符的信息struct_root rbr(红黑数),还有一个是就绪列表struct list_head rdlist,存放检测到数据 发生改变的文件描述符信息(双向链表结构) 2.调用epoll_ctrl()可以对epoll对象中增删改要监听的文件描述符以及事件 3,调用epoll_wt()可以让内核去检测就绪事件,并将就绪事件放在就绪列表中并返回,通过返回的数组做进一步处理
发表于 2023-02-09 15:58:50 回复(0)
这种问题想说明白,文字流程图加图片代码注释加起来都难,更别说用口述,我觉得也就提一下epoll的数据结构,三个方法,优势及关键设计就够了。epoll流程这方面就很难解释
发表于 2022-09-20 18:06:56 回复(0)
epoll是一种高效的IO复用模式,通过调用epoll_create()方法返回一个文件描述符对象,然后调用epoll_ctr()方法将一个socket以及相关的socket信息写入文件描述符对象,达到监听socket的目的,通过调用epoll_wait()方法来阻塞一些事件,等待事件发生,当客户端三次握手建立完毕或者服务器端要发送、接受数据或者关闭时,调用epoll_event_callback()方法向双向链表中添加一个结点。
发表于 2022-09-06 21:47:14 回复(0)
epoll是一种更加高效的IO复用技术,epoll的使用步骤及原理如下:先调用epoll_create()在内核创建epoll对象,其中有两个重要的成员,一个是需要检测的文件描述符的信息struct_rootrbr(红黑树),还有一个是就绪列表struct_rdlist,存放检测到数据发送改变的文件描述符信息(双向链表);再调用epoll_ctrl()可以想epoll对象中添加、删除、修改要监听的文件描述符及事件,再调用epoll_wait()可以让内核去检测就绪的事件,并将就绪的事件放到就绪列表中并放回,通过返回事件数组做进一步的事件处理。epoll有两种工作模式:LT(水平触发)level_Triggered是缺省的工作方式,能同时支持Block和No你block Socket,在这种做法中,内核检测到一个文件描述符就绪了,然后可以对这个就绪的fd进行io操作,如果不作任何操作,内核还是会继续通知。ET(边沿触发)模式是高速工作方式,只支持Nonblock Socket,这种模式下,当描述符从未就绪变成就绪时,内核通过epoll检测到,然后它会假设你知道文件描述符已经就绪,并且不会再为哪个文件描述符发送更多的就绪通知,直到你做了某些操作导致哪个文件描述符不再为就绪状态了,如果一直不对这个fd进行io操作,内核不会发送更多的通知。
发表于 2022-07-18 11:34:07 回复(0)