select poll epoll io复用函数
n=select
n==-1 失败
n==0 超时
n>0 有n个描述符数据就绪
select 监听描述符上有没有用户关心的事件(读、写、异常)
poll() 同select
1、每次循环。都要给内核拷贝描述符和事件的集
2、轮询的方式检测描述符上是否有事件就绪 O(n)
3、返回后,遍历集合中就绪的 O(n)
epoll():把用户关心的文件描述符上的事件放在内核的事件表中,从而无须像select poll那样每次调用都要重复传入文件描述符集和事件集
epoll_create() 创建内核事件表 --红黑树
epoll_cti()向内核事件表中方添加 修改 移除
epoll_wait()获取有就绪事件的描述符(监听)
select poll
1、每次循环都要将描述符和事件传到内核空间
2、内核实现:轮询 O(n)
3、io函数返回后,需要遍历所有描述符,找到就绪的
select poll不适合epoll适合:
不适合描述符多的场景,尤其是描述符多,但每次就绪数目比较少的场景
sockfd上有数据:客户端connect服务器成功后,或说tcp客户端链接服务器时,sockfd上有读事件就绪
c上有数据: 对方客户端send发送数据,c有读事件就绪
epoll
LT:io函数反复提醒用户有数据(事件),直到用户处理完当前所有数 阻塞非阻塞(都可以)
ET:只提醒一次,无论用户有没有处理完 非阻塞(只能是)