在对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的手柄的类型,您如何看待?您想看到哪种类型的手柄?