I/O复用之select() poll() epoll()

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:只提醒一次,无论用户有没有处理完    非阻塞(只能是)
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章