从事服务端开发,少不了要接触网路编程。epoll作为linux下高性能网路伺服器的必备技术至关重要,nginx、redis、skynet和大部分游戏伺服器都使用到这一多路复用技术。
文/罗培羽
因为epoll的重要性,不少游戏公司(如某某九九)在招聘服务端同学时,可能会问及epoll相关的问题。比如epoll和select的区别是什么?epoll高效率的原因是什么?如果只靠背诵,显然不能算上深刻的理解。
网上虽然也有不少讲解epoll的文章,但要不是过于浅显,就是陷入源码解析,很少能有通俗易懂的。于是决定编写此文,让缺乏专业背景知识的读者也能够明白epoll的原理。文章核心思想是:
要让读者清晰明白EPOLL为什么性能好。
本文会从网卡接收数据的流程讲起,串联起CPU中断、操作系统进程调度等知识;再一步步分析阻塞接收数据、select到epoll的进化过程;最后探究epoll的实现细节。目录:
一、从网卡接收数据说起
二、如何知道接收了数据?三、进程阻塞为什么不占用cpu资源?四、内核接收网路数据全过程五、同时监视多个socket的简单方法六、epoll的设计思路七、epoll的原理和流程八、epoll的实现细节九、结论
一、从网卡接收数据说起
下图是一个典型的计算机结构图,计算机由CPU、存储器(内存)、网路介面等部件组成。了解epoll本质的第一步,要从硬体的角度看计算机怎样接收网路数据。