📚 分类
redis
🕵🏽‍♀️ 问题描述
IO模型都有哪几种(多路复用)?
👨‍🏫 问题讲解
I0多路复用:是利用单个线程来同时监听多个Socket,并在某个Socket可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。
❒ 阶段一:
✔ 用户进程调用select,指定要监听的Socket集合内核监听对应的多个socket
✔ 任意一个或多个socket数据就绪则返回readable
✔ 此过程中用户进程阻塞
❒ 阶段二:
✔ 用户进程找到就绪的socket依次调用recvfrom读取数据
✔ 内核将数据拷贝到用户空间
✔ 用户进程处理数据

❒ I0多路复用是利用单个线程来同时监听多个Socket ,并在某个Socket可读、可写时得到通知,从而避免无效的等待充分利用CPU资源。不过监听Socket的方式、通知的方式又有多种实现,常见的有:
✔ select
✔ poll
✔ epoll

❒ 三种多路复用的区别
✔ select和poll只会通知用户进程有Socket就绪,但不确定具体是哪个Socket,需要用户进程逐个遍历Socket来确认
✔ epoll则会在通知用户进程socket就绪的同时,把已就绪的Socket写入用户空间
🏳️‍🌈 问题总结
✔ select/poll 内核检测数据,可以知道有没有数据到,有没有客户端进行连接,但是具体是哪一个还需要轮循遍历。 但是这个遍历不再是遍历read或者recv函数,而是另外的。效率较比之前是有所提升的。
✔ epoll 内核检测,不仅能检测到是否有数据到,还能告诉你是那几个数据到了。在程序中只需要检测一次,实现多路复用为一路的。
📖 问题信息
📈 浏览次数:18 | 📅 更新时间:2025-12-03 18:12:52
📦 创建信息
🏷️ ID:23 | 📅 创建时间:2024-09-26 12:50:21