Midk9t's Blog

浅谈为什么进程阻塞时不占用CPU

内核接收数据流程 讨论这个问题,我们需要先大致回顾一下内核接收数据时的过程: 网卡接收数据后,通过DMA写入内核的ring buffer,然后通过软中断和硬中断通知内核有数据到达。 内核派出一个专门线程ksoftirqd 从ring buffer中获取数据帧,用sk_buff表示,然后传入网络协议栈进行处理。 协议栈按照MAC→IP→TCP/UDP的顺序逐层校验sk_buff的报文头,判断是否是发给本机用户程序的数据。 内核按照源目端口和源目IP四元组找到对应的Socket,把数据写入Socket的接收缓冲区。 用户进程对应的系统调用把内核Socket缓冲区的数据拷贝到应用层的缓冲区,然后唤醒用户进程。 Linux的进程调度 在Linux中,进程大致有7种状态: