多路复用技术 epoll 分析


 ## 多路复用技术 epoll 分析  

epoll并没有使用共享内存 文中大部分人认为,epoll并没有使用mmap或共享内存

Linux下的I/O复用与epoll详解

epoll原理详解及epoll反应堆模型
epoll的操作
int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);
epoll_create: 建立一个epoll对象(在epoll文件系统中给这个句柄分配资源).
调用epoll_ctl向epoll对象中添加socket. 包含该socket的节点会被加入到一个红黑树上.
调用epoll_wait收集发生事件的连接. 触发了事件的链接会被放入一个双向链表.
epoll的结构与工作原理
红黑树. 用红黑树存储需要监听事件的socket.
epoll_ctl在向epoll对象中添加、修改、删除事件时,从rbr红黑树中查找事件也非常快
双向链表. 触发了监听事件的socket会被拷贝至此,等待用户处理。
所有添加到epoll中的事件都会与设备(如网卡)驱动程序建立回调关系,也就是说相应事件的发生时会调用这里的回调方法。这个回调方法在内核中叫做ep_poll_callback,它会把这样的事件放到上面的rdllist双向链表中。

 epoll 分析

epoll的两种触发模式

epoll有EPOLLLT和EPOLLET两种触发模式,水平触发和边缘触发. 此处略

总结

java nio是利用Selector多路复用来实现的.
linux2.x版本后,Selector是用epoll实现的.
通过建立一个Selector, 可以在其上监听socket. 通过建立一个epoll对象,可以在其上为socket注册监听事件.
linux epoll的常用函数是epoll_ctl, epoll_wait. 利用epoll_ctl可以为socket注册监听事件,并调用epoll_wait返回触发事件的socket.
epoll_ctl监听socket时,会将该socket放入红黑树
epoll_wait返回一个双向链表,其中包含了触发事件的socket.
所有添加到epoll中的事件都会与设备(如网卡)驱动程序建立回调关系,相应事件的发生时会调用回调方法ep_poll_callback.把socket放到rdllist双向链表中.
epoll与select poll的比较
select poll是采用轮询方式, epoll采用回调的方式
select poll每次等待socket事件,都需要把所有socket从用户态拷贝至内核态,epoll则只需将socket添加一次到红黑树上即可.
select用数组来存放socket, 因此受到数量限制. poll用链表存放, epoll用红黑树存放, 因此不受数量限制.
select、poll、epoll虽然都会返回就绪的文件描述符数量。但是select和poll并不会明确指出是哪些文件描述符就绪,而epoll会。造成的区别就是,系统调用返回后,调用select和poll的程序需要遍历监听的整个文件描述符找到是谁处于就绪,而epoll则直接处理即可。


文章作者: Jone
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jone !
评论
  目录