epoll简单介绍

epoll里面有三个重要的函数epoll_create、epoll_wait、epoll_ctl,其中epoll_create会给你创建一个eventpoll对象,里面有两个重要的区域,一块是用来存放需要监听的socket文件描述符列表(监听列表),另一块存放的就是就绪的socket的信息即就绪队列。epoll_ctl可以根据eventpoll-id去增删改eventpoll对象的检查列表,就是监听socket的列表,去增加删除需要检查的socket列表的文件描述符。当程序执行到epoll_wait时,如果就绪队列已经引用了socket,那么epoll_wait直接返回,如果就绪队列为空,阻塞进程。

监听列表是通过epoll_ctl来维护的,就绪列表是通过什么来维护的呢,当我们调用epoll_ctl的时候,内核程序会将eventpoll对象添加到socket的等待队列里面去,当socket接受到数据后,网卡将数据写进内存,发起中断,cpu保存当前环境,将数据写进socket缓冲区,然后去检查socket队列,然后发现队列里面不是一个进程,而是eventpoll对象的引用,它会根据eventpoll的引用,将当前socket的引用追加到eventpoll的就绪列表末尾,eventpoll还有一个等待队列,这个等待队列保存的就是调用epoll_wait的进程,当把socket的信息加到就绪列表以后,就继续检查eventpoll对象的等待队列,如果有进程就会把进程转移到工作队列内,当进程获取cpu的时间片以后,然后调用epoll_wait函数返回到Java层面上 。epoll_wait函数的返回值是int类型,返回0表示没有就绪的socket,大于0就表示有几个就绪的socket,-1表示异常,那么如何知道哪个socket是就绪的呢,答:epoll_wait函数,它调用的时候会传入一个epoll_event事件数组指针,epoll_wait函数正常返回前,会将就绪的socket事件信息拷贝到数组里面,返回到上层程序里面去,这样就可以通过数组拿到就绪列表了。epoll_wait默认是阻塞的,但是也可以设置成非阻塞的,他有一个参数表示阻塞的时间,时间为0表示非阻塞,每次调用他就会去检查就绪列表。存放需要监视的集合信息的列表使用的数据结构是红黑树

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值