最近偶尔会看到linux下IO多路复用的知识,就深入理解了一下,下面的文章讲的很清楚了,不再重复总结。
原文链接:https://segmentfault.com/a/1190000003063859
这里额外说明下epoll的底层数据结构:
epoll_create方法会创建eventpoll结构体:
struct eventpoll{
....
/*红黑树根节点,存储所有通过epoll_ctl添加到epoll中的事件*/
struct rb_root rbr;
/*双链表中存放满足条件的事件,用户使用epoll_wait获取对应事件*/
struct list_head rdlist;
....
};
红黑树可以高效识别出重复添加的事件,也就是说,使用epoll_ctl若重复添加同一个事件,这是会去重的,当事件就绪时,就绪链表中只会有一个就绪事件。