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

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

内容简介: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)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Effective JavaScript

Effective JavaScript

赫尔曼 (David Herman) / 黄博文、喻杨 / 机械工业出版社 / 2014-1-1 / CNY 49.00

Effective 系列丛书经典著作,亚马逊五星级畅销书,Ecma 的JavaScript 标准化委员会著名专家撰写,JavaScript 语言之父、Mozilla CTO —— Brendan Eich 作序鼎力推荐!作者凭借多年标准化委员会工作和实践经验,深刻辨析JavaScript 的内部运作机制、特性、陷阱和编程最佳实践,将它们高度浓缩为极具实践指导意义的 68 条精华建议。 本书共......一起来看看 《Effective JavaScript》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

MD5 加密
MD5 加密

MD5 加密工具

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

正则表达式在线测试