2017-09-15 64 views
0

想象一下,我们有一台计算机除了等待来自网络的数据并且在接收到数据时对其进行计算之外什么都不做。计算机如何理解它可以切换到等待网络数据的进程?

现在我认为除了 定期检查一些处理器寄存器,指示数据已准备就绪,然后进行计算,我认为没有其他的方式来做到这一点。在我的理解之下,网卡接收到数据后,把它放到内存中,并自己写入到CPU可以执行计算的cpu寄存器中。在下一个 定期检查处理器将计算的东西。你能否详细解释实际发生的事情(在硬件和操作系统上)。这个问题让我担心了很久!

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

+0

中断或轮询,有太多易于访问的文档来列出任何特别的。这个话题太广泛了,而且信息很容易获得。 –

+0

另请参见[Wikipedia:Polling](https://en.wikipedia.org/wiki/Polling_(computer_science))和[Wikipedia:Interrupt](https://en.wikipedia.org/wiki/Interrupt) – xmojmr

回答

6

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

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

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

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

最后,内核使用信号量来表示数据包已收到。内核然后让调度程序“唤醒”正在等待网络数据的程序。程序可以处理数据,然后等待来自网络的下一组数据。

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

相关问题