epoll 是 Linux 平台下特有的一种 I/O 复用模型实现,epoll版http服务器实现原理类似于select版服务器,都是通过某种方式对套接字进行检验其是否能收发数据等。
select和poll中采用的都是轮询的方式进行检测,轮询的方式数据越多效率越低,而epoll中则通过事件通知的方式来进行检测,从主动的去轮询检测到等着需要处理的事件来通知,其效率要更高,同时没有上限,但是epoll版http服务器只能在Linux系统中运行,因此这也是很多公司选择Linux系统做服务器的原因之一。
同时,轮询方式相对与epoll来说,实现起来非常简单,epoll实现起来相对要复杂很多。本文简单介绍了使用epoll编写http服务器的基本实现。
看代码详情:
值得注意的是:我们用字典的方式存储了socket,因为在for循环中我们得到的只是文件描述符而不是socket,鉴于后面的操作需要用到socket,因此采用字典进行存储socket。
另外需要说明的是select的三种模式:
EPOLLIN (可读)
EPOLLOUT (可写)
EPOLLET (ET模式)
epoll对文件描述符的操作有两种模式:LT(level trigger)和ET(edge trigger)。LT模式是默认模式,LT模式与ET模式的区别如下:
LT模式:当epoll检测到描述符事件发生并将此事件通知应用程序,应用程序可以不立即处理该事件。下次调用epoll时,会再次响应应用程序并通知此事件。
ET模式:当epoll检测到描述符事件发生并将此事件通知应用程序,应用程序必须立即处理该事件。如果不处理,下次调用epoll时,不会再次响应应用程序并通知此事件。
最后,本文中的代码请求的网页是在网上随便找的一个网页保存了下来,然后程序跑起来之后,通过访问localhost:7890即可访问到保存的网页。
参考链接:https://blog.youkuaiyun.com/darren573/article/details/85705464