当您调用select(2)时,内核如何确定套接字已准备就绪?

时间:2018-08-10 18:19:44

标签: linux sockets select networking kernel

The man page for select(2) says:

  

select()和pselect()允许程序监视多个文件          描述符,直到一个或多个文件描述符变为          对于某些类型的I / O操作为“就绪”(例如,可以输入)。一种          如果可以执行文件描述符,则认为文件描述符已准备就绪          相应的I / O操作(例如,无阻塞的read(2)或          足够小的write(2)。

在这段等待时间内,内核本身是否不断轮询套接字以查看它们是否准备就绪?观看套接字如何实现?

2 个答案:

答案 0 :(得分:1)

否,它在每个文件描述符的等待队列中注册,然后进入睡眠状态(直到发出信号)。纳尔逊·艾尔哈格(Nelson Elhage)在Quora上给出了一个非常简洁的答案,并提供了更多信息:

https://www.quora.com/Network-Programming-How-is-select-implemented

,您还可以深入研究source

答案 1 :(得分:1)

https://eklitzke.org/how-tcp-sockets-work回答了我的问题

  

当新的数据包进入网络接口(NIC)时,通过被NIC中断或通过轮询NIC的数据来通知内核。通常情况下,内核是中断驱动还是轮询模式取决于正在发生的网络流量。当NIC非常繁忙时,内核进行轮询的效率更高;但是,如果NIC不繁忙,则CPU周期可以通过使用中断来节省电源。 Linux将这种技术称为NAPI,实际上是“ New API”。

     

当内核从NIC获得数据包时,它将对数据包进行解码,并根据源IP,源端口,目标IP和目标端口确定与该数据包关联的TCP连接。此信息用于在与该连接关联的内存中查找struct sock。假设数据包是按顺序排列的,则将数据有效载荷复制到套接字的接收缓冲区中。此时,内核将唤醒执行阻塞read(2)或使用诸如select(2)或epoll_wait(2)之类的I / O复用系统调用的所有进程,以等待套接字。