以下内容均为本人学习笔记,若有不当,欢迎指出
在前面学习了解的 select 、 polll 、epoll 编程模型
【select 】 【 poll】
抱歉,差两个链接
IO模型 | select | poll | epoll |
---|---|---|---|
fd数量 | 少 | 多 | 多 |
支持的文件描述符数量 | 受限于fd_set大小 | 取决于用户分配pollfd结构体数组的大小 | 取决于用户分配epoll_event结构体数组的大小 |
拷贝开销 | 中 | 多 | 少 |
传参时拷贝开销 | 每次都需要将fd集合从用户态拷贝到内核态 | 每次都需要将pollfd结构体从用户态拷贝到内核态 | 调用epoll_wait时需要将就绪事件从内核拷贝到用户态 |
遍历 | 要 | 要 | 不要 |
是否需要遍历文件描述符集合来获取就绪文件描述符 | 内核监听时和用户准备读写时都需要遍历fd集合来获取文件描述符 | 内核监听时和用户准备读写时都需要遍历pollfd结构体数组来获取文件描述符 | 因为返回的epoll_event结构体数组中都是就绪的事件,不用全部遍历一边,只遍历有效个 |
接口 | 复杂不明确 | 明确 | 方便明确 |
调用的接口是否明确简单 | 1.因为fd_set既做输入参数又输出参数,每次会破坏输入参数,需要自己维护一个第三方变量保存输入参数 2.参数太多 |
pollfd结构里面有events(输入的集合) 和revents(输出的集合) | 1.将其拆分为3个接口 2.事先告诉内核要监听哪些文件及什么类型的事件 3.epoll_wait以O(1)时间复杂度监视文件描述符 |
完。