linux epoll解析

2018-04-04  本文已影响0人  MagicDong

linux epoll

引言

高性能网络编程避免不了与epoll打交道,epoll是一种IO多路复用技术,可以非常高效的处理数以百万计的socket句柄,比起以前的select和poll效率高很多,那么,它到底为什么可以高速处理这么多并发连接呢?

三个关键函数

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);
  1. 在调用epoll_create时,内核除了帮我们在epoll文件系统里建了个file结点。
  2. 在内核cache里建了个红黑树用于存储以后epoll_ctl传来的socket。
  3. 再建立一个list链表,用于存储准备就绪的事件。
  1. 当我们执行epoll_ctl时,除了把socket放到epoll文件系统里file对象对应的红黑树上之外,
  2. 还会给内核中断处理程序注册一个回调函数,告诉内核,如果这个句柄的中断到了,就把它放到准备就绪list链表里。
  3. 所以,当一个socket上有数据到了,内核在把网卡上的数据copy到内核中后,就把socket插入到准备就绪链表里了。
static int __init eventpoll_init(void) { 
    ... ... 
    /* Allocates slab cache used to allocate "struct epitem" items */ 
    epi_cache = kmem_cache_create("eventpoll_epi", sizeof(struct  epitem), 0, SLAB_HWCACHE_ALIGN| EPI_SLAB_DEBUG|SLAB_PANIC, NULL, NULL); 
    /* Allocates slab cache used to allocate "struct eppoll_entry" */ 
    pwq_cache = kmem_cache_create("eventpoll_pwq", sizeof(struct eppoll_entry), 0, EPI_SLAB_DEBUG|SLAB_PANIC, NULL, NULL); 
    ... ...

ET/LT模式:

LT模式:

  1. 读模式
  1. 写模式

ET模式:

  1. 读模式:
  1. 写模式

总结:LT模式是epoll默认的工作方式,ET模式为边沿触发,意思是说当只有在数据到来时,触发中断事件;LT模式为水平触发,只要缓存区有数据,触发中断事件。

参考:

上一篇 下一篇

猜你喜欢

热点阅读