io select poll epoll 理解

1 篇文章 0 订阅




io 模式
read 操作发生时
1, 等待数据准备
2, 将数据冲内核拷贝到进程 
->由此产生的五种网络模式
1, 阻塞______
|___.同上
2, 非阻塞____
|___.用户进程需要不断的主动询问kernel数据好了没有。[ 有返回数据,没有返回error ,继续轮询 read ]
3, io多路复用
|___.select poll epoll会轮询所负责的所有socket,当某个socket数据到达了,就通知用户进程
4, 信号驱动io  (实际中不常用)
  5, 异步______
  |___.从kernel的角度,当它受到一个asynchronous read之后,首先它会立刻返回,所以不会对用户进程产生任何block。然后,
  |___.kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal,告诉它read操作完成了。








select poll epoll
select  
1024的限制 r + w + e 事件
poll
event 将要发生的事件 + revent 发生的事件 
epoll
____________________________________________________________________________________________________________________________________
mmap + rdr (red black root) + rdlist [ 文件fd状态改变,存储fd 对应的 epitem ]
epoll wait的工作流程:
(1) epoll_wait调用ep_poll,当rdlist为空(无就绪fd)时挂起当前进程,知道rdlist不空时进程才被唤醒。
(2) 文件fd状态改变(buffer由不可读变为可读或由不可写变为可写),导致相应fd上的回调函数ep_poll_callback()被调用。
(3) ep_poll_callback将相应fd对应epitem加入rdlist,导致rdlist不空,进程被唤醒,epoll_wait得以继续执行。
(4) ep_events_transfer函数将rdlist中的epitem拷贝到txlist中,并将rdlist清空。
(5) ep_send_events函数(很关键),它扫描txlist中的每个epitem,调用其关联fd对应的poll方法(图中蓝线)。
此时对poll的调用仅仅是取得fd上较新的events(防止之前events被更新),之后将取得的events和相应的fd发送到用户空间(封装在struct epoll_event,从epoll_wait返回)。
之后如果这个epitem对应的fd是LT模式监听且取得的events是用户所关心的,则将其重新加入回rdlist(图中蓝线),否则(ET模式)不在加入rdlist。
http://blog.chinaunix.net/uid-28541347-id-4273856.html
____________________________________________________________________________________________________________________________________
操作方法
EPOLL_CTL_ADD //新增
EPOLL_CTL_MOD //修改
EPOLL_CTL_DEL //删除
事件
EPOLLIN 表示对应的文件描述符可以读
EPOLLOUT 可以写
EPOLLPRI 有紧急的事件可以读
EPOLLERR 对应的文件描述符发生错误
EPOLLHUP 对应的文件描述符挂断
EPOLLET 将EPOLL 设置成边缘模式
EPOLLONESHOT 只监听一次,完后需要把socket再次加到EPOLL队列 
使用注意:
epoll并不是在所有的应用场景都会比select和poll高很多。
尤其是当活动连接比较多的时候,回调函数被触发得过于频繁的时候,epoll的效率也会受到显著影响!
所以,epoll特别适用于连接数量多,但活动连接较少的情况。




参考 
[ 初始参考 ] https://blog.csdn.net/u013679744/article/details/79188768
    [ 同步/异步 ] https://blog.csdn.net/scucscheng/article/details/51940552
[ 代码验证 ] https://www.cnblogs.com/lojunren/p/3856290.html
[ 深入内核 ] http://blog.chinaunix.net/uid-28541347-id-4273856.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值