趣谈IO多路复用的本质

简介: 趣谈IO多路复用的本质

《轻松搞懂5种IO模型》中,我发起了一个投票。

 

答案是【同步IO多路复用】。目前,60%的朋友答对了。原因这里解释一下。

 

同步和异步的概念区别

 


同步:线程自己去获取结果。(一个线程)


异步:线程自己不去获取结果,而由其他线程送结果。(至少两个线程)

 

异步执行如下图所示,除非不需要知道结果,否则一般会有一个回调方法。


1112728-20220219150828335-432402630.png


IO多路复用的本质

 


为了彻底理解IO多路复用是同步还是异步,咱们探究一下IO多路复用的本质。

 

I/O多路复用,复用的IO监听等待这条路。实际上就是用select/poll/epoll监听多个io对象,当io对象有变化(有数据)的时候就通知用户进程。好处就是单个进程可以处理多个socket。

 

select/poll/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。

 

对于每一个socket,一般都设置成为non-blocking,但是,整个用户的process其实是一直被阻塞的。只不过process是被select这个函数阻塞,而不是被socket IO给阻塞。


1112728-20220219150853061-90714050.png


I/O多路复用的流程如上图所示:

 

(1)当用户进程调用了select,那么整个进程会被阻塞;


(2)而同时,内核会“监视”所有select负责的socket;


(3)当任何一个socket中的数据准备好了,select就会返回;


(4)这个时候用户进程再调用read/accept/write操作,做一些数据从内核拷贝到用户进程这样的事情。

 

所以,I/O 多路复用的特点是通过一种机制一个进程能同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,select()函数就可以返回。

 

事实上,I/O 多路复用有时候性能比同步阻塞IO还更差一些。因为这里需要使用两个系统调用(select 和 recvfrom),而同步阻塞IO只调用了一个系统调用(recvfrom)。但是,用select的优势在于它可以同时处理多个连接。所以,如果处理的连接数不是很高的话,可能延迟还更大。

 

总结

 


打个比方:行军打仗讲究粮草先行。诸葛亮比较牛,他打仗只带少量粮草,其他靠敌军送。这天他又派了暗探去查看敌军粮草的守卫情况。如果敌人守备松懈,则趁机偷粮。如果这个暗探只偷一袋粮食,那效率最高的是不是他看到敌军守备松懈就直接进去偷粮(同步阻塞IO)?但是他要偷的是十万大军的粮食,那他就要先回去汇报一声:“守备松懈啦”。然后百人小分队一起去把粮草偷出来(I/O 多路复用)。当然啦,以诸葛亮的一贯作风而言,最后他还得放一把火。

 

暗探在同步阻塞模式下,打探敌情也是他,偷粮也是他。在诸葛亮团队中,暗探在打探敌情时最终暗探是第一个获取到结果的。暗探在偷粮时也是第一个自己知道结果的。(同步)

 

暗探在I/O 多路复用模式下,打探敌情也是他,偷粮是百人小分队。在诸葛亮团队中,暗探在打探敌情时最终执行者暗探是第一个获取到结果的。百人小分队在偷粮时也是百人小分队自己先知道结果的。(同步)

 

综上,IO多路复用是同步的。

相关文章
|
25天前
|
网络协议 安全 Linux
Linux C/C++之IO多路复用(select)
这篇文章主要介绍了TCP的三次握手和四次挥手过程,TCP与UDP的区别,以及如何使用select函数实现IO多路复用,包括服务器监听多个客户端连接和简单聊天室场景的应用示例。
83 0
|
6月前
|
存储 监控 Linux
【Linux IO多路复用 】 Linux下select函数全解析:驾驭I-O复用的高效之道
【Linux IO多路复用 】 Linux下select函数全解析:驾驭I-O复用的高效之道
992 0
|
25天前
|
存储 Linux C语言
Linux C/C++之IO多路复用(aio)
这篇文章介绍了Linux中IO多路复用技术epoll和异步IO技术aio的区别、执行过程、编程模型以及具体的编程实现方式。
66 1
Linux C/C++之IO多路复用(aio)
|
25天前
|
Linux C++
Linux C/C++之IO多路复用(poll,epoll)
这篇文章详细介绍了Linux下C/C++编程中IO多路复用的两种机制:poll和epoll,包括它们的比较、编程模型、函数原型以及如何使用这些机制实现服务器端和客户端之间的多个连接。
20 0
Linux C/C++之IO多路复用(poll,epoll)
|
28天前
|
Java Linux
【网络】高并发场景处理:线程池和IO多路复用
【网络】高并发场景处理:线程池和IO多路复用
38 2
|
30天前
|
监控 网络协议 Java
IO 多路复用? 什么是 IO 多路复用? 简单示例(日常生活)来解释 IO 多路复用 一看就懂! 大白话,可爱式(傻瓜式)教学! 保你懂!
本文通过日常生活中的简单示例解释了IO多路复用的概念,即一个线程通过监控多个socket来处理多个客户端请求,提高了效率,同时介绍了Linux系统中的select、poll和epoll三种IO多路复用的API。
62 2
|
2月前
|
消息中间件 NoSQL Java
面试官:谈谈你对IO多路复用的理解?
面试官:谈谈你对IO多路复用的理解?
45 0
面试官:谈谈你对IO多路复用的理解?
|
2月前
|
网络协议 Java Linux
高并发编程必备知识IO多路复用技术select,poll讲解
高并发编程必备知识IO多路复用技术select,poll讲解
|
4月前
|
缓存 网络协议 算法
【Linux系统编程】深入剖析:四大IO模型机制与应用(阻塞、非阻塞、多路复用、信号驱动IO 全解读)
在Linux环境下,主要存在四种IO模型,它们分别是阻塞IO(Blocking IO)、非阻塞IO(Non-blocking IO)、IO多路复用(I/O Multiplexing)和异步IO(Asynchronous IO)。下面我将逐一介绍这些模型的定义:
178 1
|
4月前
|
存储 Java Unix
(八)Java网络编程之IO模型篇-内核Select、Poll、Epoll多路复用函数源码深度历险!
select/poll、epoll这些词汇相信诸位都不陌生,因为在Redis/Nginx/Netty等一些高性能技术栈的底层原理中,大家应该都见过它们的身影,接下来重点讲解这块内容。