当前位置: 首页 > 网络应用技术

Linux FD系列 - 什么是EventFD?

时间:2023-03-06 23:29:36 网络应用技术

  在对Linux Epoll池的最后一期深入了解的最后一期中,我刚刚提到了EventFD,这是下面的fd.let演讲。

  Linux是所有文件,但是此文件FD也是输入的。大多数人都知道“文件FD”,插座FD,甚至是管道FD。我可能不知道FD有这样的类型。

  看看它,事件FD是事件FD类型。因此,名称是专门用于事件通知的文件描述符(FD)。许多人可能使用太多,但使用它的人说:芬芳!

  引入了哪个版本?

  Linux 2.6.22

  代码位于:

  “事件传输”是通信。EventFD不仅可以用于过程之间的通信,还可以用于用户模式和内核通信。

  考虑一个小问题:我们知道保留了“文件”。由于EventFD对应于“文件”,因此此“文件”的内容是什么?

  要点:EventFD是相关的FD。有一个可读的事件不是零。如果要清除计数,则计数器将增加。

  您如何理解这一点?

  如先前的自制文件系统系列中所述:文件系统的“文件”是一个抽象概念,您看到的所有知识文件系统希望您看到您看到的内容。例如,我们没有写任何数据Hellofs,并将返回“ Hello World”的内容。这只是挂钩读/写的钩子,然后根据逻辑返回数据。

  EventFD是相同的。EventFD实现了读/写的呼叫,并且在调用中实现了计数器的逻辑。写入只是一个计数,读是读数,很明显。

  你看起来像什么?我找到了一个可以观察的过程。

  Linux的每个过程中都会有一个目录。目录名称是过程ID号。在此目录中,您可以看到使用的资源信息。有一个FD目录,所有文件都打开了。

  抬起栗子:

  efd = eventfd(0,0);

  if(efd == -1)

  hander_error(“ eventfd”);这样,创建了一个fd fd类型。您的目录中将有一个EventFD句柄。

  Eventfd New出来后,总而言之,您可以为此做四件事:

  我怎么知道这个知识点?

  因为在Linux内核代码中,我看到了它。EventFD实现了这些调用。

  显然,您可以看到上述呼叫都是EventFD的所有内容。

  EventFD的阅读和写作到底是什么?

  与EventFD相对应的文件的内容为8字节号,这是读/写操作维护的计数。

  首先,在写入时,计数计数,读取读取时进行计数并清除零。

  阅读和写作是读/写的。很容易理解此FD,但请注意,只有8个字节可以。本读和写作的内容实际上是在计算。

  拿栗子:如下,我们连续写3次

  你什么时候猜?

  值读数为6(因为1+2+3),请理解。

  概括:

  在对Linux Epoll池的深入了解中,并非所有FD类型都可以使用Epoll池聆听。只有实现的“文件” FD的实现才能通过Epoll.EventFD刚刚实现此接口进行管理。

  EventFD专门用于通过事件,Epoll池是专门用于管理事件的池。这两个组合很棒。

  我们知道Epoll正在听可读的事件。因此,您是否曾经考虑过EventFD的可读事件?

  “阅读和写作事件”是一个有趣的问题。我们可以分解,比较插座FD,文件fd:

  回到最初的问题:eventfd呢?什么是可读的事件?

  我们已经说过EventFD意识到计数函数。因此,EventFD计数不是0,那么FD是可读的。

  因为EventFD一直在写作(可以总是计算出来),所以有写作事件。

  那么,这里有什么隐藏的知识?

  如果EventFD使用Epoll聆听该事件,则是一个监视事件,因为监视和写作事件毫无意义。

  关闭FD以关闭此问题,不必理解,也就是说,您不需要此FD。积极称呼。当没有人使用它时,内核将发布FD资源。

  当我们知道FD的障碍物属性时,我们知道在阅读和写作FD时,我们可能会遇到阻塞。对于套接字FD,当没有数据读取时,它将阻止。编写缓冲区已满时,它将阻止。

  那么EventFD呢?它的障碍是什么?

  当读取EventFD时,如果计数器的值为0,则将阻止(这等同于NO“文件”的内容)。

  这种类型的FD可以将其设置为非烧烤类型。当您阅读它时,如果计数器为0,则可以返回Eagain,以使整个系统不会阻止整个系统。

  单独的EventFD似乎是平庸的,但实际上具有非常重要的应用程序。这里有一个很小的例子:

  我们之前已经说过,与Ext4的文件系统类似的文件FD不能由EPOLL管理,并且网络FD可以管理。由于磁盘文件已可以读取。

  文档在这里是自由的吗?不能使用事件机制吗?我只能同步IO吗?

  没有任何东西。Linux内核提供了一种称为Libaio的机制,可以同时向内核提交多个IO请求(此批次提交可以提高优化的概率。当大量IO累积到设备队列中时,内核CAN可以发挥IO调度算法的优点,例如IO调度算法的优势,例如Apmered IO等)。

  AIO请求完成后,异步事件通知。此事件通知的原则是绑定事件FD的上下文和AIO。AIO完成后,将在EventFD中写入计数以触发可读事件。

  QEMU可以将VM的特定地址与EventFD相关联,以监视它。当来宾执行IO操作出口到KVM时,KVM可以确定此出口是否在此特定地址中发生。对于IO操作,此方法可以节省一些时间。

  最简单的例子是,一个消费者和多个生产商可以使用EventFD来完成优雅的事件通知。

  生产者:

  它是多个线程,将请求发送到列表,然后唤醒生产者。

  消费者:

  这是一个线程,后台循环处理。请使用epoll收听EventFD的可读事件,因此一旦有加入团队的请求,消费者就会立即醒来。

  哈哈,Qi yi想写Linux的手柄的类型,您如何看待?您想看到哪种类型的手柄?