epoll如何知道套接字在内核中准备好了?



我没有在epool源代码中找到任何关于epoll如何知道套接字为read/write准备好的提示。

  1. epoll是否在内核中注册了callback ?
  2. 是否为read/write在内核中注册了signal ?
  3. 还是别的什么?
许多谢谢。

简短回答

不仅对于epoll,而且通常对于"阻塞I/O"(例如,read()系统调用使用相同的机制),内核使用waitqueues(不要将它们与workqueues混淆,这是完全不同的机制)。如果你检查ep_poll()的实现,它甚至被记录在注释中。

一些不太有趣的细节

为了让当前线程在等待队列上进入睡眠状态,通常会使用wait_event_interruptible()调用。然而,epoll_wait没有这样做。相反,它通过使用__add_wait_queue_exclusive()将自己添加到等待队列中,使用set_current_state(TASK_INTERRUPTIBLE)将自己置于睡眠状态,并检查在循环中被唤醒的原因,从而重新实现了该调用将要做的事情。最终结果是相同的-当前线程将被置于可中断的睡眠状态,可以通过发送信号(在这种情况下epoll_wait将返回EINTR)或通过waitqueues机制被ep_poll_callback唤醒来终止。

最新更新