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

栏目: 后端 · 发布时间: 7年前

内容简介:I/O多路复用机制(Epoll)多路I/O复用模型是

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)


以上所述就是小编给大家介绍的《I/O多路复用机制(Epoll)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

老码识途

老码识途

韩宏 / 电子工业出版社 / 2012-8 / 56.00元

《老"码"识途:从机器码到框架的系统观逆向修炼之路》以逆向反汇编为线索,自底向上,从探索者的角度,原生态地刻画了对系统机制的学习,以及相关问题的猜测、追踪和解决过程,展现了系统级思维方式的淬炼方法。该思维方式是架构师应具备的一种重要素质。《老"码"识途:从机器码到框架的系统观逆向修炼之路》内容涉及反汇编、底层调试、链接、加载、钩子、异常处理、测试驱动开发、对象模型和机制、线程类封装、跨平台技术、插......一起来看看 《老码识途》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具