解读 I/O 多路复用技术

前言

当我们要编写一个 echo 服务器程序的时候,需要对用户从标准输入键入的交互命令做出响应。在这种情况下,服务器必须响应两个相互独立的I/O事件:

1)网络客户端发起网络连接请求

2)用户在键盘上键入命令行

我们先等待哪个事件呢?没有哪个选择是理想的。

如果在 acceptor 中等待一个连接请求,我们就不能响应输入的命令。类似地,如果在 read 中等待一个输入命令,我们就不能响应任何连接请求。针对这种困境的一个解决办法就是 I/O 多路复用技术。基本思路就是使用 select 函数,要求内核挂起进程,只有在一个或多个 I/O 事件发生后,才将控制返回给应用程序。——《UNIX网络编程》

我们以书中的这段描述来引出我们要讲述的 I/O 多路复用技术。

I/O 多路复用概述

图1

I/O 多路复用,I/O 就是指的我们网络 I/O,多路指多个 TCP 连接(或多个 Channel),复用指复用一个或少量线程。串起来理解就是很多个网络 I/O 复用一个或少量的线程来处理这些连接。

现在大部分讲述 I/O 多路复用的文章用到的上面这张图是《UNIX网络编程》一书的。那么这也是当前我们理解 I/O 多路复用技术的基础知识。从这张图里面我们 GET 到哪些点呢?

个人理解有:

  • 1、怎么区分的应用进程与内核
  • 2、有两次系统调用分别是 select 和 recvfrom

This chapter requires login to view full content. You are viewing a preview.

Login to View Full Content

Course Curriculum

3

框架与 I/O:Spring、Netty 与 Web 容器

理解 Spring Boot 自动装配、AOP 与事务原理,掌握 Netty Reactor 模型及 Tomcat 连接处理机制,构建高内聚、易扩展的应用服务层。
4

高性能中间件:消息、缓存与存储

熟练运用 MySQL 索引/事务、Redis 缓存策略、Kafka/RocketMQ 消息可靠性,以及 ZooKeeper 分布式协调,搭建稳定、解耦的分布式数据底座。
6

云原生:容器化、可观测性与工程效能

通过 Docker/K8s 实现弹性部署,集成 Metrics/Logs/Traces 构建可观测体系,推动 DevOps 与自动化,让架构在云上持续交付与进化。