`
uule
  • 浏览: 6311520 次
  • 性别: 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多路复用之epoll——完整代码

    三种IO多路复用机制: 一:select 二:poll 三:epoll 以上三种IO多路复用的完整代码,皆可以在我的资源列表中获取下载: 资源列表:http://download.csdn.net/user/qiulanzhu

    IO多路复用select和epoll.md

    多路复用

    socket网络编程-epoll-水平触发和边缘触发源码

    (1)I/O多路复用技术用于监控多个TCP连接上的数据收发,而epoll就是一种在Linux上使用的I/O多路复用并支持高并发的典型技术。传统的select、poll也是I/O多路复用技术,但这2种技术受内部实现的限制,不支持高并发,...

    IO多路复用之epoll全面总结(必看篇)

    下面小编就为大家带来一篇IO多路复用之epoll全面总结(必看篇)。小编觉得挺不错的。现在就分享给大家。也给大家做个参考。一起跟随小编过来看看吧

    IO多路复用之epoll实例

    本示例演示了使用epoll函数处理多路IO复用。本示例在ubuntu + Qt下编译通过的,仅提供学习使用。

    Linux网络编程,包括tcp/upd,select/poll/epoll/pdf

    其中select/poll/epoll都是常用的多路复用技术,它们可以同时监视多个文件描述符,实现高效的I/O复用。 总之,Linux网络编程是一项重要的技能,它涉及到网络通信的基本原理以及多路复用技术的使用,对于开发网络...

    select和epoll实现多路复用.zip

    使用select和epoll实现多路复用,并使用jmeter进行测试。压缩包包含代码和学生使用的完整实验报告

    Libevent网络库

    Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点...支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。

    libevent-2.0.22 for linux 下载

    Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点...支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。

    libevent源码

    Libevent 是一个用C语言编写的、轻量级的开源高性能网络库,主要有以下几个亮点:...支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。

    从一万英尺外看 Libevent

    Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点...支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。

    libevent-2.0.10-stable.tar.gz

    libevent gz包 Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要...支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。

    ChatRoom:基于IO多路复用epoll实现的高并发在线聊天室

    ChatRoom基于I/O多路复用epoll实现的高并发在线聊天室featureepoll 实现高并发用类实现epoll针对Socket操作的封装(SocketEpoll类)日志功能通过文件加载配置效果To do处理由Ctrl+C引发的SIGINT等信号在客户端对终端...

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

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

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

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

    libevent_源码剖析

    支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。 Libevent 已经被广泛的应用,作为底层的网络库;比如 memcached、 Vomit、 Nylon、 ...

    linux内核select/poll,epoll实现与区别

    select,poll,epoll都是多路复用IO的函数,简单说就是在一个线程里,可以同时处理多个文件描述符的读写。 select/poll的实现很类似,epoll是从select/poll扩展而来,主要是为了解决select/poll天生的缺陷。 epoll在...

    select、poll、epoll的区别使用示例代码

    Linux系统编程——I/O多路复用select、poll、epoll的区别使用,相关教程如下: http://blog.csdn.net/tennysonsky/article/details/45745887

    网络连接 I/O复用 服务端代码

    网络连接 使用epoll,可以不使用多线程来完成多个客户端对服务端进行传输

    libevent参考手册(中文版P

    * 支持多种 I/O多路复用技术, epoll、poll、dev/poll、select 和kqueue 等; * 支持 I/O,定时器和信号等事件; libevent有下面几大部分组成: * 事件管理包括各种IO(socket)、定时器、信号等事件,也是...

Global site tag (gtag.js) - Google Analytics