epoll模式是对select和poll的改进,它提供了三个函数:
创建epoll结构体
执行epoll_ctl将fd添加到epoll的红黑树中,等待fd就绪
fd就绪后将对应的fd添加到list_head(就绪列表)中,然后执行epoll_wait方法
执行epoll_wait的时候程序会去检查list_head(就绪列表)
用户空间的空数组events是用来接收内核空间就绪列表数据的,当epoll_wait执行完成返回就绪fd数量时会把list_head里的fd数据拷贝到events中这样用户空间就可以知道是那些fd就绪了
相比于select,epoll对于要监听的fd只需要把其添加到内核空间的红黑树就行,而且对于添加过的fd不会删掉会一直保留避免了重复添加fd的问题减少了用户空间到内核空间的拷贝(减少了用户态到内核态的转换)
对于内核空间只拷贝就绪fd集合到用户空间使其确保events中的每一个fd都是就绪的,不用像select和poll还需要在遍历一遍找出就绪的fd
select模式存在的三个问题:
poll模式的问题:
epoll模式中如何解决这些问题的?
评论