这里记录下计算机接收数据的过程。
从硬件的角度看计算机接收网络数据
下图是一个典型的计算机结构图,计算机由CPU、存储器(内存)、网络接口等部件组成。
展示了网卡接收数据的过程:
1.网卡收到网线传来的数据
2.硬件电路的传输(这个过程涉及到DMA传输、IO通路选择等硬件有关的知识)
3.写入到内存中的某个地址上
通过硬件传输,网卡接收的数据存放到内存中。操作系统就可以去读取它们。
CPU如何知道接收了数据
要理解这个问题,要先了解一个概念——中断。
计算机执行程序时,会有优先级的需求。比如,当计算机收到断电信号时(电容可以保存少许电量,供CPU运行很短的一小段时间),它应立即去保存数据,保存数据的程序具有较高的优先级。
一般而言,由硬件产生的信号需要cpu立马做出回应(不然数据可能就丢失),所以它的优先级很高。cpu理应中断掉正在执行的程序,去做出响应;当cpu完成对硬件的响应后,再重新执行用户程序。中断的过程如下图,和函数调用差不多。只不过函数调用是事先定好位置,而中断的位置由“信号”决定。
以键盘为例,当用户按下键盘某个按键时,键盘会给cpu的中断引脚发出一个高电平。cpu能够捕获这个信号,然后执行键盘中断程序。下图展示了各种硬件通过中断与cpu交互。
现在可以回答本节提出的问题了:当网卡把数据写入到内存后,网卡向cpu发出一个中断信号,操作系统便能得知有新数据到来,再通过cpu执行网卡中断程序(网络设备驱动程序+内核网络设备处理程序)去处理数据。详见数据包收发流程。
参考
如果这篇文章说不清epoll的本质,那就过来掐死我吧!详见:https://zhuanlan.zhihu.com/p/63179839