Linux epoll
- Linux网络服务器种类
- web服务器
- 邮件服务器
- 数据库服务器
- FTP服务器
- 游戏服务器
- etc ...
- 多路复用
- 所谓多路复用:一个进程,监听多个文件描述符(linux中,一切皆文件)
- select POSIX系统标准支持
- select的实现原理:有一个关注事件列表,selector扫描关注事件列表,生成一个新的数据,将其中就绪的事件置为1,未就绪的事件置为0, 事件处理进程只处理数组中置为1的事件
- 缺陷:
- 1、select最多只能处理1024个文件描述符(由FD_SETSIZE设置,包括linux进程自带的四个标准输入、标准输出、标注错误、except描述符)
- 2、select采用轮询机制(线性扫描),select需要时刻轮询关注列表
- 3、存在一个应用层数据拷贝到内核空间的过程
- poll
- 取消了select文件描述符1024个的限制,保留了select的轮询机制、内存拷贝机制
- select poll 都是同步IO
- epoll
- 它所支持的文件描述符上限是整个系统最大可以打开的文件数目
- EX:在1GB内存的机器上,这个限制的数量级为10万左右
- 特点:
- 1、每个fd上有callback函数,只有活跃的socket才会主动去调用callback函数,其他idle(闲置)状态的socket则不会。故epoll其实是一种异步通知机制
- 2、内核空间与用户空间共享mmap内存,省去了select poll 拷贝内存的资源消耗
- 3、epoll关注的 文件描述符和回调函数 挂载在红黑树上
- 4、epoll中有一个就绪的事件链表,红黑树中就绪的事件挂载在这个就绪事件链表上
- 它所支持的文件描述符上限是整个系统最大可以打开的文件数目
- epoll 的API
- int epoll_create(int size)
- 1、创建一个epoll句柄
- 2、当创建好epoll句柄后,它会占用一个fd值
- 3、使用完一个epoll后,必须调用close函数关闭fd,否则会导致fd耗尽
- int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
-
epoll control
-
epfd: epoll_create函数的返回句柄
-
op: 表示动作类型,有三个宏来表示:
-
- EPOLL_CTL_ADD 注册新的fd到epfd中
- EPOLL_CTL_MOD修改已经注册到fd的监听事件
- EPOLL_CTL_DEL 从epfd中删除一个fd
-
-
fd: 需要监听的文件描述符
-
event: 告诉内核需要监听什么事件
- EPOLLIN: 表示对应的文件描述符可读
- EPOLLOUT: 表示对应的文件描述符可写
- EPOLLPRI: 表示对应的文件描述符有紧急数据可读(带外数据)
- EPOLLERR: 表示对应的文件描述符有错误
- EPOLLHUP: 表示对应的文件描述符被挂断
- EPOLLET: 将epoll设置为边缘触发(EDGE Trigger)
- EPOLLLT: 将epoll设置为水平触发(LEVEL Trigger)
-
- int epoll_wait(int epfd, struct epoll_event *events, int masevents, int timeout)
- 等待事件的产生,类似于select调用
- epfd: 创建的epoll文件描述符
- events: 用来从内核得到的事件集合,等待的事件集合
- maxevents: 表示每次能处理的最大事件数,告诉内核这个events有多大,maxevents的值不能大于创建 epoll_create()时的size
- timeout: 超时时间(毫秒)(-1,阻塞的;0, 立即返回,非等待的)
- int epoll_create(int size)
- epoll工作模式
- ET模式(Edge Triggered,边缘触发)
- 高速模式,仅状态发生变化时才会获得通知。该模式假定开发者在收到一次通知后,会完整的处理该事件,因此内核将不再通知这一事件
- 注意:缓冲区中还有未处理的数据不能说是状态变化,故在ET模式下,开发者如果只读取了一部分数据,也不会再次得到通知
- LT模式(Level Triggered,水平触发)
- 如果缓冲区存在数据,wait函数就会不停的发送通知
- ET模式(Edge Triggered,边缘触发)
本文链接:
/archives/linuxepoll
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
北溟鱼的博客!
喜欢就支持一下吧