`
uule
  • 浏览: 6334403 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

I/O多路复用机制(Epoll)

 
阅读更多

IO多路复用之select、poll、epoll详解

 

I/O多路复用机制(Epoll) 

多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉。当有一个或多个流有 I/O事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流)并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。 

 

这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。

采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且 Redis在内存中操作数据的速度非常快,也就是说内存内的操作不会成为影响Redis性能的瓶颈,主要由以上几点造就了 Redis 具有很高的吞吐量。

 

(1)网络IO都是通过Socket实现Server在某一个端口持续监听客户端通过Socket(IP+Port)与服务器建立连接(ServerSocket.accept),成功建立连接之后,就可以使用Socket中封装的InputStream和OutputStream进行IO交互了。针对每个客户端,Server都会创建一个新线程专门用于处理 

 

(2) 默认情况下,网络IO是阻塞模式,即服务器线程在数据到来之前处于【阻塞】状态等到数据到达,会自动唤醒服务器线程,着手进行处理。阻塞模式下,一个线程只能处理一个流的IO事件 

 

(3) 为了提升服务器线程处理效率,有以下三种思路

 

a、非阻塞【忙轮询】:采用死循环方式轮询每一个流,如果有IO事件就处理,这样可以使得一个线程可以处理多个流,但是效率不高,容易导致CPU空转

 

b、Select代理(无差别轮询):可以观察多个流的IO事件,如果所有流都没有IO事件,则将线程进入阻塞状态,如果有一个或多个发生了IO事件,则唤醒线程去处理。但是还是得遍历所有的流,才能找出哪些流需要处理。如果流个数为N,则时间复杂度为O(N)

 

c、Epoll代理:Select代理有一个缺点,线程在被唤醒后轮询所有的Stream,还是存在无效操作。 Epoll会哪个流发生了怎样的I/O事件通知处理线程,因此对这些流的操作都是有意义的,复杂度降低到了O(1)

 

 

多路复用机制打一个比方:



 

下面类比到真实的redis线程模型,如图

所示多路复用:

 

 

 

 

  • 大小: 34.3 KB
  • 大小: 85.8 KB
分享到:
评论

相关推荐

    网络io与io多路复用select/poll/epoll 服务器并发代码实现

    本文将深入探讨网络I/O的基本概念,以及select、poll和epoll这三种I/O多路复用机制,并通过实际代码示例展示其在服务器并发中的应用。 首先,理解网络I/O。在网络通信中,数据传输通常涉及发送(output)和接收...

    Linux I/O多路复用详解及实例

    3. `epoll`是Linux特有的、更为高效的I/O多路复用机制,它使用`epoll_create`创建一个事件池,`epoll_ctl`用于添加、修改或删除要监视的描述符。`epoll_wait`函数在有事件发生时返回,而且支持水平触发和边缘触发两...

    unix平台下I/O聚集和分离的一种方案

    Unix系统提供了多种I/O模型,如阻塞I/O、非阻塞I/O、I/O多路复用(如select、poll、epoll)、信号驱动I/O以及异步I/O。I/O聚集通常指的是在一个系统调用中处理多个文件描述符,而I/O分离则是在不同时间或通过不同...

    I:O多路复用(多路转接)1

    I/O多路复用是一种操作系统提供的机制,允许程序同时监视多个文件描述符(FDs),等待它们准备就绪以便进行I/O操作,而无需为每个描述符创建单独的线程或进程。这种技术在处理大量并发连接时尤其有用,如在服务器...

    Unix I/O 小结

    I/O多路复用技术如poll和select允许监听多个文件描述符,当有描述符就绪时唤醒进程。select需要每次都设置描述符集,可能影响效率,而poll使用独立的pollfd结构,无需每次都设置。两者的共同问题是当描述符列表很大...

    IO多路复用1

    - epoll是Linux内核提供的一种更高级的I/O多路复用机制,它支持水平触发和边缘触发两种模式,且具有更低的延迟和更高的性能。 - epoll使用`epoll_create`创建一个epoll实例,`epoll_ctl`添加、修改或删除文件描述...

    I/O多路转接之select

    "准备工作代码"通常指的是为了使用select函数进行I/O多路复用而需要编写的初始化代码。这包括设置文件描述符集、定义超时时间以及调用select函数本身。下面,我们将详细讨论这个过程。 首先,你需要创建三个文件...

    linux 设备驱动中的阻塞与非阻塞 I/O

    而对于网络I/O,epoll等多路复用机制能提供高效的服务。 《Linux设备驱动开发详解》这本书由宋宝华编写,详细阐述了Linux设备驱动的各个方面,包括I/O模型的选择和实现,是学习Linux驱动开发的宝贵参考资料。通过...

    select和epoll实现多路复用.zip

    首先,`select`是较早的I/O多路复用机制,它允许程序监视多个文件描述符,等待它们中的任意一个变为可读、可写或出现错误状态。`select`函数会阻塞直到至少有一个描述符满足条件。在`select1.c`中,可以看到如何设置...

    netty实战指南

    在Linux中,select、pselect、poll和epoll是实现I/O多路复用的系统调用。epoll是Linux特有的,具有以下优势: 1. 不受最大文件描述符数限制,支持大量并发连接。 2. 高效性:I/O效率不会随文件描述符数量的增加而...

    套接字I/O模式的服务端客户通信的程序源代码

    `select`函数是Linux系统提供的一种I/O多路复用机制,它允许我们监视多个文件描述符(如套接字)的状态,等待任意一个准备好读写操作。当`select`返回时,我们可以知道哪些套接字已经准备就绪,从而避免了轮询检查的...

    epoll/iocp 比较

    不同的操作系统提供了不同的I/O多路复用机制,如Linux中的epoll和Windows上的IO完成端口(iocp)。这里我们将深入探讨这些机制,并对比它们的工作原理、性能特点以及适用场景。 1. **epoll** - **定义**:epoll是...

    socket 多路复用

    而在多路复用模式下,服务器不再为每个连接创建新线程,而是使用I/O多路复用函数(如select、poll或epoll)来监视所有待处理的连接。这些函数允许服务器注册一组socket到一个“描述符集”,然后阻塞等待这些socket中...

    多路IO复用-epoll,通过epoll实现事件通知,实现了水平(阻塞),边缘(非阻塞)触发

    `epoll`是Linux系统提供的一种I/O复用机制,它是I/O多路复用技术的一种优化实现,特别是在高并发场景下表现优秀。本篇将深入探讨`epoll`的工作原理、两种触发模式以及其在实际应用中的价值。 首先,理解`epoll`的...

    tcp服务器epoll的多种实现1

    I/O 多路复用是指使用一个进程来处理多个 I/O 事件的机制,例如,使用 select 或 poll 机制来监视多个文件描述符的 I/O 事件,并将其通知给应用程序,以便应用程序可以对这些事件进行处理。 在选择 I/O 模型时,...

    线程池epoll多路复用服务器c++

    epoll是Linux内核提供的一种I/O多路复用机制,它是select、poll的增强版本。在epoll中,可以注册多个文件描述符(如套接字),然后在一个单一的系统调用中检查它们的状态,而不是轮询检查每一个。当文件描述符上有可...

    epoll函数实现多客户端并发

    总结来说,`epoll`是Linux提供的一种高效、灵活的I/O多路复用机制,特别适合处理高并发的网络连接。通过理解和熟练运用`epoll`,开发者可以编写出性能优异、资源利用率高的网络服务程序。在实际项目中,结合C语言的...

    linux网络编程基础,包括tcp/upd,select/poll/epoll

    在Linux系统中,网络编程是实现跨机器通信的关键技术,主要涉及TCP(传输控制协议)和UDP(用户数据报协议)这两种传输层协议,以及I/O多路复用技术如select、poll和epoll。这些知识点是每一个资深的Linux程序员必须...

    linux系统下nginx高连接并发控制机制研究.pdf

    Nginx的高并发能力主要源于其对Linux内核I/O多路复用机制的充分利用,尤其是epoll事件模型。这种设计降低了系统资源的消耗,提升了服务器在高并发环境下的性能。相较于传统的多进程模型,I/O多路复用模型在处理大...

Global site tag (gtag.js) - Google Analytics