select
- 1、每次调用
select
需要把fd
集合从用户态拷贝到内核态,这个开销在fd
很多时会很大 - 2、每次调用
select
都需要在内核遍历传进来的fd
, 这个开销在fd
很多时也很大 - 3、
select
支持的文件描述符太少了,默认是 1024
epoll
-
epoll
提供了三个函数-
epoll_create
:创建句柄,内核在内核态开始准备存储要监控的句柄 -
epoll_ctl
:对指定文件描述符进行OP操作 -
epoll_wait
:等待事件的产生
-
- 1、针对第一个缺点:
epoll_ctl
会将fd
拷贝到内核中epoll
句柄对应的数据体,epoll
保证了每个fd
在整个过程中只会拷贝一次,避免了重复拷贝 - 2、针对第二个缺点:
epoll_ctl
会给 fd 注册回调函数,当设备就绪,执行回调函数会把 fd 添加到就绪列链表,epoll_wait
实际上只是从就绪链表中查询是否有就绪的fd
- 3、针对第三个缺点:
epoll
没有这个限制,他所支持的上限是最大可以打开的文件数目
网友评论