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

Kha*_*zov 0 hardware operating-system cpu-architecture low-level

想象一下,我们有一台计算机,除了从网络等待数据外什么都不做,并在收到数据时进行计算.

现在我认为除了定期检查一些指示数据准备就绪然后进行计算的处理器寄存器之外,没有别的方法可以做到这一点.在我的理解下,网卡接收数据,把它放到内存中,并自己写入cpu寄存器,cpu可以做计算.在下一次定期检查后,处理器将计算内容.您能否详细解释实际发生的事情(在硬件和操作系统中).这个问题让我担心多年了!

也很高兴看到有关它的任何材料!

小智 6

使用处理器定期检查某些数据寄存器的问题中描述的方法,它称为轮询.轮询通常用于更简单的系统,因为它实现起来很简单,但它有浪费cpu周期检查可能存在或不存在的数据的缺点.

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

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

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

最后,内核使用信号量来发信号通知收到的数据包.然后内核让调度程序"唤醒"正在等待来自网络的数据的程序.程序可以处理数据,然后等待来自网络的下一组数据.

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