高并发网络服务的基石是 IO 多路复用:让一个线程等待一批文件描述符中的任意就绪事件。
select 与 poll
每次调用都要把整个描述符集合从用户态拷到内核态,返回后还要线性扫描找出就绪者。连接数一上万,开销就成为瓶颈。
epoll
在内核维护注册表,就绪事件通过回调挂入就绪链表,返回的只处理就绪的描述符。复杂度从 O(n) 降到 O(就绪数)。
编程模型
配合非阻塞 IO,单线程事件循环就能支撑海量连接,这是主流高性能网络框架的底座。
一个线程怎么同时监听几万个连接?三次演进分别解决了什么瓶颈。
高并发网络服务的基石是 IO 多路复用:让一个线程等待一批文件描述符中的任意就绪事件。
每次调用都要把整个描述符集合从用户态拷到内核态,返回后还要线性扫描找出就绪者。连接数一上万,开销就成为瓶颈。
在内核维护注册表,就绪事件通过回调挂入就绪链表,返回的只处理就绪的描述符。复杂度从 O(n) 降到 O(就绪数)。
配合非阻塞 IO,单线程事件循环就能支撑海量连接,这是主流高性能网络框架的底座。