Epoll 模型
相比于 select,epoll 最大的好处在于它不会随着监听 fd 数目的增长而降低效率。因为在内
核中的 select 实现中,它是采用轮询来处理的,轮询的 fd 数目越多,自然耗时越多。并且,
在 linux/posix_types.h 头文件有这样的声明:
#define __FD_SETSIZE 1024
表示 select 最多同时监听 1024 个 fd,当然,可以通过修改头文件再重编译内核来扩大这个
数目,但这似乎并不治本。
常用模型的特点
Linux 下设计并发网络程序,有典型的 Apache 模型( Process Per Connection ,简称
PPC ), TPC ( Thread Per Connection )模型,以及 select 模型和 poll 模型。
1 、PPC/TPC 模型
这两种模型思想类似,就是让每一个到来的连接一边自己做事去,别再来烦我 。只是 PPC
是为它开了一个进程,而 TPC 开了一个线程。可是别烦我是有代价的,它要时间和空间啊,
连接多了之后,那么多的进程 / 线程切换,这开销就上来了;因此这类模型能接受的最大
连接数都不会高,一般在几百个左右。
2 、select 模型
1. 最大并发数限制,因为一个进程所打开的 FD (文件描述符)是有限制的,由 FD_SETSIZE
设置,默认值是 1024/2048 ,因此 Select 模型的最大并发数就被相应限制了。自己改改这
个 FD_SETSIZE ?想法虽好,可是先看看下面吧 …
2. 效率问题, select 每次调用都会线性扫描全部的 FD 集合,这样效率就会呈现线性下降,
把 FD_SETSIZE 改大的后果就是,大家都慢慢来,什么?都超时了??!!
3. 内核 / 用户空间 内存拷贝问题,如何让内核把 FD 消息通知给用户空间呢?在这个问
题上 select 采取了内存拷贝方法。
3、 poll 模型
基本上效率和 select 是相同的, select 缺点的 2 和 3 它都没有改掉。
Epoll 的提升
Epoll 的改进之处。
1. Epoll 没有最大并发连接的限制,上限是最大可以打开文件的数目,这个数字一般远大于
2048, 一般来说这个数目和系统内存关系很大 ,具体数目可以 cat /proc/sys/fs/file-max 察
看。
2. 效率提升, Epoll 最大的优点就在于它只管你“活跃”的连接 ,而跟连接总数无关,因
此在实际的网络环境中, Epoll 的效率就会远远高于 select 和 poll 。
3. 内存拷贝, Epoll 在这点上使用了“共享内存 ”,这个内存拷贝也省略了。
Epoll 为什么高效
Epoll 的高效和其数据结构的设计是密不可分的。
首先回忆一下 select 模型,当有 I/O 事件到来时, select 通知应用程序有事件到了快去处
理,而应用程序必须轮询所有的 FD 集合,测试每个 FD 是否有事件发生,并处理事件。
评论0