epoll模型与select模型的区别

Nginx  --->epoll模型

Apache --->select模型

处理大量连接的读写时,Apache所采用的select网络I/O模型比较低,用两个通俗的比喻来解释二者的区别:

  • 第一个比喻:

例如你在大学读书,住的宿舍楼有很多房间,你的朋友要来找你,select版宿管大妈就会

带着你的朋友到各个房间挨个去找,直到找到为止。而epoll版宿管大妈会先记下每位入住同学的房间号码,当你朋友来找你时,只需告诉你的朋友你住在哪个房间?不用亲自带着你的朋友满宿舍的找。如果同时来了100个人,都要找自己住这栋楼的同学,select版宿管大妈和epoll版宿管大妈说的效率高,就很明显了。

  • 第二个比喻:

select调用复杂度是线性的,即O(n)。举个例子,一个保姆照看一群孩子,如果把孩子是否需要尿尿比作网络I/O事件,select的作用就好比这个保姆挨个询问每个孩子“你要尿尿吗?”,如果孩子的回答是,保姆则把孩子领出来放到另外一个地方。当所有孩子询问完之后,保姆领着这些需要尿尿的孩子去上厕所(处理网络I/O事件)。而epoll机制下,保姆不再需要挨个询问每个孩子,取而代之的是,约定好的地方是否有孩子。如果有,则领着孩子去上(处理网络I/O事件),因此,这种机制能够高效的处理成千上万的并发连接,而且性能不会随着连接数增加而下降太多。

时间: 2024-10-06 16:04:34

epoll模型与select模型的区别的相关文章

linux下多路复用模型之Select模型

Linux关于并发网络分为Apache模型(Process per Connection (进程连接) ) 和TPC , 还有select模型,以及poll模型(一般是Epoll模型) Select模型极其作用:这文章讲述的很好,没必要重述已有的东西,就直接给链接 http://blog.csdn.net/turkeyzhou/article/details/8609360 我的理解: 1 /* According to POSIX.1-2001 */ 2 #include <sys/selec

Socket I/O模型之select模型

socket网络编程中有多种常见的I/O模型: 1.blocking阻塞 2.nonblocking非阻塞 3.I/O multiplexing复用 4.signal driven 5.asynchronous I/O异步 这里我们主要介绍I/O multiplexing模型中的代表select模型:select模型将多个套接字放在一个集合里,然后统一检查这些套接字的状态,每次调用套接字后会更新这些套接字的状态,然后做判断,如果套接字可读,就执行read操作.这样就巧妙地避免了阻塞,达到同时处理

比较一下Linux下的Epoll模型和select模型的区别

一. select 模型(apache的常用) 1. 最大并发数限制,因为一个进程所打开的 FD (文件描述符)是有限制的,由 FD_SETSIZE 设置,默认值是 1024/2048 ,因此 Select 模型的最大并发数就被相应限制了.自己改改这个 FD_SETSIZE ?想法虽好,可是先看看下面吧 … 2. 效率问题, select 每次调用都会线性扫描全部的 FD 集合,这样效率就会呈现线性下降,把 FD_SETSIZE 改大的后果就是,大家都慢慢来,什么?都超时了. 3. 内核 / 用

Winsock IO模型之select模型

之所以称其为select模型是因为它主要是使用select函数来管理I/O的.这个模型的设计源于UNIX系统,目的是允许那些想要避免在套接字调用上阻塞的应用程序有能力管理多个套接字. int select( int nfds,                                                 // 忽略,仅是为了与Berkeley套接字兼容 fd_set* readfds,                                  // 指向一个套接字集合,

I/O模型之Select模型

刚刚又看了一下I/O模型的相关知识做了一下总结,与大家一同交流. Selct 模型说的就是在套接字集合fd_set中的操作(可将多个套接字连在一起,形成套接字集合) 套接字集合呢,又分为了3中形态,对应表示的关系如下: 套接字集合 有事件发生   到底啥事呢 readfds    select函数等待   有未决连接请求 或 数据可读  或   连接关闭/重启/中断 writefds     select函数等待连接成功(调用connect)  或 数据可写 exceptfds   select

Select 模型1

Select模型原理 利用select函数,判断套接字上是否存在数据,或者能否向一个套接字写入数据.目的是防止应用程序在套接字处于锁定模式时,调用recv(或send)从没有数据的套接字上接收数据,被迫进入阻塞状态. select参数和返回值意义如下: int select ( IN int nfds,                           //0,无意义 IN OUT fd_set* readfds,      //检查可读性 IN OUT fd_set* writefds,  

Select模型原理

Select模型原理 利用select函数,推断套接字上是否存在数据,或者是否能向一个套接字写入数据.目的是防止应用程序在套接字处于锁定模式时,调用recv(或send)从没有数据的套接字上接收数据,被迫进入堵塞状态. select參数和返回值意义例如以下: int select ( IN int nfds,                           //0,无意义 IN OUT fd_set* readfds,      //检查可读性 IN OUT fd_set* writefds

[转]IO模型及select、poll、epoll和kqueue的区别

(一)首先,介绍几种常见的I/O模型及其区别,如下: blocking I/O nonblocking I/O I/O multiplexing (select and poll) signal driven I/O (SIGIO) asynchronous I/O (the POSIX aio_functions)—————异步IO模型最大的特点是 完成后发回通知. 阻塞与否,取决于实现IO交换的方式.      异步阻塞是基于select,select函数本身的实现方式是阻塞的,而采用sel

libevent for qt网络模块,直接替换qt的select模型,支持epoll,select,pool.使用非常简单,无需修改以前的代码结构

最近在开发im服务器,需要大并发链接.QT默认的是使用select模型的,这种轮询方式非常慢.在高并发连接,我们需要epoll才能发挥linux服务器的性能.而且使用简单,整个服务端代码架构无需修改,设置QT的分发事件就可以使用了,只要在main里面添加 : int main(int argc, char *argv[]) {   #ifdef Q_OS_LINUX     QCoreApplication::setEventDispatcher(new EventDispatcherLibEv