前言

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时,不会再次响应应用程序并通知此事件。

 

参考

posted on 2017-05-10 15:19  Martin8866  阅读(332)  评论(0编辑  收藏  举报