IO 多路复用? 什么是 IO 多路复用? 简单示例(日常生活)来解释 IO 多路复用 一看就懂! 大白话,可爱式(傻瓜式)教学! 保你懂!

简介: 本文通过日常生活中的简单示例解释了IO多路复用的概念,即一个线程通过监控多个socket来处理多个客户端请求,提高了效率,同时介绍了Linux系统中的select、poll和epoll三种IO多路复用的API。

一、IO多路复用可以简单用一句话诠释:

一个线程来处理多个 socket

更进一步地对上面那句话诠释:一个线程来调动服务器来轮流处理多个客户端发来的请求

针对 TCP 来说,服务器这边每次要服务一个客户端,都需要给这个客户端安排一个 socket

一个服务器服务多个客户端,同时就有很多个 socket

同一时刻,只有少数 socket 是活跃的(大部分情况)

    这些 socket 上都是无时无刻的在传输数据么?

    很多情况下,每个客户端和服务器之间的通信也没那么频繁

    此时这么多 socket 大部分时间都是 静默 的,上面是没有数据需要传输的

二、IO 多路复用的 API 及常用语言的 IO 多路复用的方式

IO 多路复用 => 一个线程来处理多个 socket

操作系统,给程序员提供的机制,提供了一套 API,内部的功能都是操作系统内核实现的

Linux 上提供的 IO 多路复用,主要是三套 API

  • select
  • poll
  • epoll

epoll 是运行效率最高的机制

C++ 可以直接使用 Linux 原生的 epoll api

java 可以使用 NIO(标准库提供的一组类,底层就是封装了 epoll)

三、简单示例(日常生活)来解释 IO 多路复用 一看就懂!

问题:

我楼下有个小摊,我们小区也有这样的小摊,然后今天晚上,我和妻子都不想做饭,于是我们商量着要在楼下小摊买点饭带回家吃

我想吃蛋炒饭

我妻子想吃肉夹馍

我女儿想吃饺子

都有什么实现方案呢?

第一种:

我自己去,先买蛋炒饭,等拿到了蛋炒饭后,再去买肉夹馍,再等肉夹馍好了后,去买饺子,等饺子好了,就全部搞定了!

效率最低的方案!!!

第二种:

我们三个人一起去,我去买蛋炒饭,妻子去买肉夹馍,女儿去买饺子,各等各的,然后都拿到后就全部搞定了

效率大大提升了,但是系统开销大了

第三种:

先去买蛋炒饭,等的过程中去买肉夹馍,还在等的过程中,去买饺子

这三份饭,哪个先做好了,对应的老板就可以喊我一嗓子,然后我都拿到后就全部搞定了!

此时就能让我一个线程同时做三件事

能高效地完成这三件事的前提是,这三件事的交互都不频繁,大部分时间都在等!!!

“对应的老板就可以喊我一嗓子” 这就叫 epoll 事件通知/回调机制

我的操作以及对应的场景就是 IO 复用!

四、IO 复用不适合的场景:

如果多个事件都是交互特别频繁的,还是老老实实多搞几个线程靠谱,一个线程就容易忙不过来

目录
相关文章
|
2月前
|
网络协议 安全 Linux
Linux C/C++之IO多路复用(select)
这篇文章主要介绍了TCP的三次握手和四次挥手过程,TCP与UDP的区别,以及如何使用select函数实现IO多路复用,包括服务器监听多个客户端连接和简单聊天室场景的应用示例。
98 0
|
7月前
|
存储 监控 Linux
【Linux IO多路复用 】 Linux下select函数全解析:驾驭I-O复用的高效之道
【Linux IO多路复用 】 Linux下select函数全解析:驾驭I-O复用的高效之道
1173 0
|
7月前
|
存储 Linux 调度
io复用之epoll核心源码剖析
epoll底层实现中有两个关键的数据结构,一个是eventpoll另一个是epitem,其中eventpoll中有两个成员变量分别是rbr和rdlist,前者指向一颗红黑树的根,后者指向双向链表的头。而epitem则是红黑树节点和双向链表节点的综合体,也就是说epitem即可作为树的节点,又可以作为链表的节点,并且epitem中包含着用户注册的事件。当用户调用epoll_create()时,会创建eventpoll对象(包含一个红黑树和一个双链表);
131 0
io复用之epoll核心源码剖析
|
2月前
|
存储 Linux C语言
Linux C/C++之IO多路复用(aio)
这篇文章介绍了Linux中IO多路复用技术epoll和异步IO技术aio的区别、执行过程、编程模型以及具体的编程实现方式。
106 1
Linux C/C++之IO多路复用(aio)
|
2月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
89 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
2月前
|
Linux C++
Linux C/C++之IO多路复用(poll,epoll)
这篇文章详细介绍了Linux下C/C++编程中IO多路复用的两种机制:poll和epoll,包括它们的比较、编程模型、函数原型以及如何使用这些机制实现服务器端和客户端之间的多个连接。
36 0
Linux C/C++之IO多路复用(poll,epoll)
|
2月前
|
Java Linux
【网络】高并发场景处理:线程池和IO多路复用
【网络】高并发场景处理:线程池和IO多路复用
58 2
|
3月前
|
消息中间件 NoSQL Java
面试官:谈谈你对IO多路复用的理解?
面试官:谈谈你对IO多路复用的理解?
55 0
面试官:谈谈你对IO多路复用的理解?
|
3月前
|
网络协议 Java Linux
高并发编程必备知识IO多路复用技术select,poll讲解
高并发编程必备知识IO多路复用技术select,poll讲解
|
5月前
|
缓存 网络协议 算法
【Linux系统编程】深入剖析:四大IO模型机制与应用(阻塞、非阻塞、多路复用、信号驱动IO 全解读)
在Linux环境下,主要存在四种IO模型,它们分别是阻塞IO(Blocking IO)、非阻塞IO(Non-blocking IO)、IO多路复用(I/O Multiplexing)和异步IO(Asynchronous IO)。下面我将逐一介绍这些模型的定义:
266 2