计算机如何理解它可以切换到等待网络数据的进程?

How does computer understand that it can switch to the process that waits for data from the network?

假设我们有一台计算机,它除了等待来自网络的数据外什么都不做,并在接收到数据时对其进行一些计算。

目前我认为除了 定期检查一些处理器寄存器,指示数据已准备好,然后进行计算。在我的理解中,网卡在引擎盖下接收数据,将其放入内存并自行写入 cpu 寄存器,cpu 可以进行计算。下一个之后 定期检查处理器将计算东西。您能否详细解释实际发生的事情(在硬件和 os 中)。这个问题困扰了我好久!

也很高兴看到任何关于它的资料!

处理器周期性检查某些数据寄存器的问题中描述的方法被使用,它称为轮询。轮询通常用于较简单的系统,因为它易于实施,但它的缺点是浪费 cpu 周期检查可能存在或可能不存在的数据。

实际上,尽管大多数现代操作系统将使用称为 中断 的 cpu 硬件功能与 OS 的调度程序结合使用。在从网络获取数据的示例中,程序将使用一些阻塞读取调用来等待从网络接收数据。一旦进行了读取调用,调用程序将完全停止执行,OS 的调度程序将使程序保持挂起状态,直到接收到数据。

通常,程序发出信号表示它想要停止执行直到发生某事(例如接收到数据包)的方式是使用称为信号量(或类似的互斥机制)的软件结构。但是,在网络代码的情况下,程序员不会直接访问信号量。

当网卡接收到数据包时,网卡会将数据包存储到RAM 中的某处。完成后,网卡会触发 CPU 的中断。中断(通常)导致 CPU 停止执行当前可能 运行 的任何程序,并且 CPU 执行与处理网络相关的内核代码 activity。在这种情况下,它将接收到的数据包发送到等待接收数据的程序。

最后,内核使用信号量表示数据包已收到。然后内核有调度程序 "wake up" 等待来自网络的数据的程序。程序可以处理数据,然后等待来自网络的下一组数据。

如果您想了解更多信息,我建议您阅读关于中断、调度和信号量的操作。不过,这些技术不仅仅用于联网。许多其他 IO 设备都使用类似的方法访问。