`

epoll为什么这么快?

阅读更多

转载:http://www.cppblog.com/converse/archive/2008/10/12/63836.html


epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,在开始讨论这个问题之前,先来解释一下为什么需要多路复用IO.

以一个生活中的例子来解释.

假设你在大学中读书,要等待一个朋友来访,而这个朋友只知道你在A号楼,但是不知道你具体住在哪里,于是你们约好了在A号楼门口见面.

如果你使用的阻塞IO模型来处理这个问题,那么你就只能一直守候在A号楼门口等待朋友的到来,在这段时间里你不能做别的事情,不难知道,这种方式的效率是低下的.

现在时代变化了,开始使用多路复用IO模型来处理这个问题.你告诉你的朋友来了A号楼找楼管大妈,让她告诉你该怎么走.这里的楼管大妈扮演的就是多路复用IO的角色.

进一步解释select和epoll模型的差异.

select版大妈做的是如下的事情:比如同学甲的朋友来了,select版大妈比较笨,她带着朋友挨个房间进行查询谁是同学甲,你等的朋友来了,于是在实际的代码中,select版大妈做的是以下的事情:



epoll版大妈就比较先进了,她记下了同学甲的信息,比如说他的房间号,那么等同学甲的朋友到来时,只需要告诉该朋友同学甲在哪个房间即可,不用自己亲自带着人满大楼的找人了.于是epoll版大妈做的事情可以用如下的代码表示:


在epoll中,关键的数据结构epoll_event定义如下:

可以看到,epoll_data是一个union结构体,它就是epoll版大妈用于保存同学信息的结构体,它可以保存很多类型的信息:fd,指针,等等.有了这个结构体,epoll大妈可以不用吹灰之力就可以定位到同学甲.

别小看了这些效率的提高,在一个大规模并发的服务器中,轮询IO是最耗时间的操作之一.再回到那个例子中,如果每到来一个朋友楼管大妈都要全楼的查询同学,那么处理的效率必然就低下了,过不久楼底就有不少的人了.

对比最早给出的阻塞IO的处理模型, 可以看到采用了多路复用IO之后, 程序可以自由的进行自己除了IO操作之外的工作, 只有到IO状态发生变化的时候由多路复用IO进行通知, 然后再采取相应的操作, 而不用一直阻塞等待IO状态发生变化了.

从上面的分析也可以看出,epoll比select的提高实际上是一个用空间换时间思想的具体应用.

分享到:
评论

相关推荐

    epoll为什么快

    ### epoll为什么快 #### 一、epoll的基本概念与应用场景 **epoll** 是 Linux 内核 2.6 版本引入的一种高效的 I/O 多路复用技术,相较于传统的 **select** 和 **poll** 方法,epoll 提供了更高效、更灵活的事件通知...

    EPOLL模型详解

    然而,值得注意的是,如果所有FD都处于活跃状态,EPOLL可能并不比select或poll更快,甚至在频繁调用`epoll_ctl`时,性能可能会稍有下降。但在模拟广域网环境,即大部分连接为非活跃状态时,EPOLL的效率优势明显。 ...

    epoll 详细介绍

    `epoll`是Linux内核提供的一种高效I/O事件通知机制,主要应用于高并发的网络编程场景,如服务器端的多路复用。相比于传统的`poll`和`select`,`epoll`在处理大量并发连接时表现出更好的性能。本文将深入探讨`epoll`...

    epoll详细工作原理.docx

    epoll 工作原理详解 epoll 是一种高效的 IO 多路复用技术,可以处理数以百万计的 socket 句柄。它的高效性来自于其巧妙的设计和实现。下面我们将深入探讨 epoll 的工作原理。 epoll_create epoll_create 是建立一...

    epoll 服务程序和测试程序

    标题中的"epoll 服务程序和测试程序"指的是在Linux操作系统环境下,使用C语言编写的一个高性能并发服务器程序,其中包含了epoll技术的应用。Epoll是Linux内核提供的一种I/O多路复用技术,它是select和poll的升级版,...

    linux epoll socket UDP通信的实现! 看清楚不是tcp哟.zip

    3. **设置epoll**:调用`epoll_create()`创建一个`epoll`实例,然后使用`epoll_ctl()`将刚才创建的UDP套接字添加到`epoll`实例中,设置为监听读事件。 4. **接收数据**:在主循环中,调用`epoll_wait()`阻塞等待事件...

    Linux下基于epoll_线程池高并发服务器实现研究

    Linux 下基于 epoll + 线程池高并发...本文提供了基于 Linux 系统的高并发服务器实现研究,涵盖了客户机/服务器模式、epoll 机制、线程池、网络编程基础等多方面的知识点,为读者提供了详细的技术指导和实践经验。

    linux 网络库 C++ epoll

    总的来说,这个网络库为Linux平台上的C++开发者提供了一个轻量级、高效的I/O管理工具,适用于开发高性能的服务器端应用,如WebSocket服务、TCP/UDP通信、实时数据传输等。其关键优势在于epoll的高效性和定时器的灵活...

    举源码实例来说明epoll之LT和ET模式的区别

    在这种模式下,当调用`epoll_wait`时,只要文件描述符上的事件状态为"有事件",就会一直返回该事件,直到该事件被处理或清除。例如,如果一个套接字上有数据待读,那么每次`epoll_wait`都会返回这个事件,直到读取完...

    基于Linux Epoll机制用电信息采集系统的设计.pdf

    【标题】:基于Linux Epoll机制的用电信息采集系统设计 【描述】:该文档讨论了如何利用Linux的Epoll机制构建一个用电信息采集系统,旨在适应...此外,该系统也为未来的智能电网建设和电力市场的进一步发展奠定了基础。

    Linux下基于epoll 线程池高并发服务器实现研究.pdf

    本文的研究结果表明,基于epoll+线程池技术设计出来的高并发服务器可以满足当前网络技术快速发展的需求,能够保证服务器和客户端之间的稳定高效的通信,为当前网络技术的发展提供了有价值的参考。 关键词:Linux...

    基于EPOLL机制的LINUX网络游戏服务器实现方法

    在传统的IO处理模型中,服务器会为每个连接创建一个线程或者进程,这在面对大量并发连接时,会导致系统资源的极大消耗和管理上的复杂性。而通过EPOLL,服务器可以在有限的线程或进程中高效地处理成千上万的并发连接...

    基于EPOLL机制的Linux网络服务器设计与实现.pdf

    "基于EPOLL机制的Linux网络服务器设计与实现" 本文介绍了基于EPOLL机制的Linux网络服务器设计与实现。EPOLL是一种高效的IO事件驱动机制,能够提高服务器的性能和可扩展性。在Linux操作系统中,EPOLL机制可以用来...

    Vpp epoll实现的代码解析.pdf

    在上行方向上(即从网络层到应用层),当事件队列中有新的报文事件(rx事件)到来时,app端通过epoll检测到这个事件,并将其标记为has_rx_evt=1,表示已经有数据准备好接收,此时app端就可以从event_q中读取数据。...

    epoll 原理剖析1

    `epoll`是Linux系统提供的一种高效I/O事件通知机制,尤其适用于高并发的网络服务。它基于事件驱动模型,可以显著提升服务器处理大量并发连接的性能。在传统的`select`或`poll`模型中,当监控大量描述符时,无论是否...

    epoll聊天室r.zip

    首先,我们要理解什么是I/O多路复用。在传统的网络编程中,我们通常采用轮询或者信号驱动的方式来处理多个连接的I/O操作,但这些方法在处理大量并发连接时效率低下。I/O多路复用技术则可以同时监控多个文件描述符,...

    cs_epoll.tar.gz

    4. 服务端接受新连接,获取到新的套接字,并将其加入epoll集合,同样设置为读事件。 5. 对于每个客户端连接,服务端可以在接收到数据时处理请求,或者在需要发送数据时设置写事件。 6. 当无事件发生时,`epoll_wait...

    epoll深入浅出源码分析

    Linux系统中epoll是一个高效的I/O事件通知机制,特别适用于处理大量文件描述符上的异步I/O事件。本文将深入浅出地分析Linux 2.6.9版本中epoll系统调用的源码,理解其内部工作机制。 ### 一、相关的数据结构 epoll...

Global site tag (gtag.js) - Google Analytics