前言
select、poll、epoll是3种实现IO多路复用的技术。
IO多路复用中的IO是指网络IO,复用是指在服务端使用1个线程处理多个网络IO,这里复用的是线程;
本文将研究以上3类网络IO处理模型的实现细节及优劣;
一、IO多路复用
IO多路复用技术是指使用1个Process同时处理N个网络连接的IO。
它的基本原理是使用select,poll,epoll这个function会不断的循环遍历所负责的socket列表,当某1个socket有数据到达了,就通知用户进程。
二、Select
Select底层采用数组存储被监控的Socket列表。
内核采用循环遍历的方式发现被监控的Socket列表中的Socket是否有读写事件;
将Socket列表不断地从用户空间Copy到内核空间;
三、Poll
Poll底层采用链表存储被监控的Socket列表,突破了Select可监控Socket的大小限制;
内核采用循环遍历的方式发现被监控的Socket列表中的Socket是否有读写事件;
将Socket列表不断地从用户空间Copy到内核空间;
四、Epoll
Epoll底层采用红黑树结构存储被监控的Socket列表,
Epoll使用红黑树存储1份文件描述符集合;
1个文件描述符只需在添加时传入1次,无需用户每次都重新传入;
解决了Select和Poll中fd_set 重复拷贝到内核的问题
内核采用基于事件监听的方式发现被监控的Socket列表中的Socket是否有读写事件;
Nginx和Redis都采用Epoll实现IO多路复用;
1.epoll工作模式
epoll对文件描述符的操作有2种模式:LT(level trigger)水平触发和ET(edge trigger)边缘触发。
LT水平触发模式是默认模式,LT水平触发模式与ET边缘触发模式的区别如下:
水平触发模式
当epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序如果不处理该事件,
下次调用epoll_wait时,还会再次响应应用程序并通知此事件。
Kubernetes架构就设计体现了水平触发的思想。
边缘模式
当epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序如果不处理该事件,下次调用epoll_wait时,不会再次响应应用程序并通知此事件。
参考