• linux epoll的实现原理


    1 linux的poll操作

    linux文件的poll操作有两个主要目的:第一,主动查看该文件上是否有读写事件;第二,提供操作waitqueue的接口给epoll等上层接口使用,比如epoll可以通过直接调用其所监视的文件的poll操作来注册自己的回调到该文件的waitqueue中,所谓的回调就是waitqueue entry中的function,这样的话,当epoll所监视的文件有数据到来的话,注册到waitqueue中的回调就回被调用,然后该文件就可以被放入epoll的rdllist中。

    2 ep_item_poll和ep_poll_callback

    ep_item_poll中将ep_poll_callback作为waitqueue entry的function注册给所监视的文件的waitqueue。

    3 rdllist和ovflist

    有读写事件的文件都放在rdllist这个队列中。在用户epoll_wait的时候,需要将rdllist拷贝到用户空间并且加锁,这个时候如果来了新的事件,就先放在ovflist中,在rdllist不忙的时候再放入其中。

    4 epoll_create、epoll_ctl和epoll_wait

    epoll_create是为当前线程创建一个epoll实体来监视所需要监视的文件,epoll_ctl是往epoll中加入需要监视的文件,epoll_wait是查看是否有事件到来,并且进行相应的处理,因为要一直监视,所以,需要一个死循环不断的进行epoll_wait。

    如果当前线程上没有读写事件,epoll_wait会被挂起,醒来策略和timeout时间的设置有关,如果是正的t,那么就等待这个时间t之后醒来,如果是0,那么立即返回,如果是负数,那么一直等到至少有一个事件到来,或者有error了醒来。

    之所以需要设置timeout,是因为epoll_wait如果没有发现事件会挂起的,如果没有信号没有事件到来,如果不弄一个timeout,线程就死在这里了。当然,有新的事件到来会唤醒它的。

  • 相关阅读:
    如何写好软件需求说明?
    怎么做,与为什么?[转]
    WCF学习中遇到的一些问题
    删除数据库中所有表、视图以及存储过程
    如何获取Repeater的当前行号
    Asp.Net 获取FileUpload控件的文件路径、文件名、扩展名
    IP地址通过WebService得到城市
    springboot、intellij与docker的结合
    开源GIS软件初探
    Statement接口提供的execute、executeQuery和executeUpdate之间的区别
  • 原文地址:https://www.cnblogs.com/hustdc/p/8310090.html
Copyright © 2020-2023  润新知