The man page for select(2) says:
select()和pselect()允许程序监视多个文件 描述符,直到一个或多个文件描述符变为 对于某些类型的I / O操作为“就绪”(例如,可以输入)。一种 如果可以执行文件描述符,则认为文件描述符已准备就绪 相应的I / O操作(例如,无阻塞的read(2)或 足够小的write(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复用系统调用的所有进程,以等待套接字。