IO 多路复用I/O Multiplexing一、今天的知识点今天记录一个非常经典但很多人一开始容易迷糊的概念IO 多路复用I/O Multiplexing。它是像 Redis、Nginx 这种高性能服务器能够用少量线程处理大量连接的关键技术。二、问题是什么假设服务器要同时处理 10000 个客户端连接。最朴素的方法是一个连接 - 一个线程问题来了线程非常消耗内存线程切换成本高CPU 会大量时间花在调度上于是人们就想有没有办法 一个线程同时监听很多连接这就是 IO 多路复用的诞生背景。三、核心原理一句话理解一个线程监听多个 IO当某个 IO 有事件发生再去处理。操作系统提供了三个经典机制技术说明select最早的 IO 多路复用poll改进版epollLinux 高性能方案其中epoll是现代高并发服务器最常用的方案。工作流程大概是程序把 socket 注册到 epollepoll 监听所有 socket某个 socket 有数据epoll 通知程序程序处理该连接于是1个线程 可以管理 上万个连接四、代码层面的感知虽然在 C# 中我们很少直接操作 epoll但异步 IO 的思想是一样的。例如awaitstream.ReadAsync(buffer,0,buffer.Length);本质上就是IO准备好 - 操作系统通知 - 线程继续执行这种模式叫事件驱动 IO五、一句话总结IO 多路复用的本质是让操作系统帮你监听大量 IO而不是让线程傻等。因此线程数量 ≠ 连接数量这也是为什么Redis 可以用 单线程处理十万级连接。总结IO 多路复用解决了“一个连接对应一个线程”导致的资源浪费问题核心是单线程监听多IO事件。epoll 是 Linux 下高性能的 IO 多路复用实现是高并发服务器的核心技术之一。异步 IO如 C# 的 ReadAsync本质上是事件驱动 IO和 IO 多路复用思想一致。
每日一个知识点 Day01:什么是 IO 多路复用?
IO 多路复用I/O Multiplexing一、今天的知识点今天记录一个非常经典但很多人一开始容易迷糊的概念IO 多路复用I/O Multiplexing。它是像 Redis、Nginx 这种高性能服务器能够用少量线程处理大量连接的关键技术。二、问题是什么假设服务器要同时处理 10000 个客户端连接。最朴素的方法是一个连接 - 一个线程问题来了线程非常消耗内存线程切换成本高CPU 会大量时间花在调度上于是人们就想有没有办法 一个线程同时监听很多连接这就是 IO 多路复用的诞生背景。三、核心原理一句话理解一个线程监听多个 IO当某个 IO 有事件发生再去处理。操作系统提供了三个经典机制技术说明select最早的 IO 多路复用poll改进版epollLinux 高性能方案其中epoll是现代高并发服务器最常用的方案。工作流程大概是程序把 socket 注册到 epollepoll 监听所有 socket某个 socket 有数据epoll 通知程序程序处理该连接于是1个线程 可以管理 上万个连接四、代码层面的感知虽然在 C# 中我们很少直接操作 epoll但异步 IO 的思想是一样的。例如awaitstream.ReadAsync(buffer,0,buffer.Length);本质上就是IO准备好 - 操作系统通知 - 线程继续执行这种模式叫事件驱动 IO五、一句话总结IO 多路复用的本质是让操作系统帮你监听大量 IO而不是让线程傻等。因此线程数量 ≠ 连接数量这也是为什么Redis 可以用 单线程处理十万级连接。总结IO 多路复用解决了“一个连接对应一个线程”导致的资源浪费问题核心是单线程监听多IO事件。epoll 是 Linux 下高性能的 IO 多路复用实现是高并发服务器的核心技术之一。异步 IO如 C# 的 ReadAsync本质上是事件驱动 IO和 IO 多路复用思想一致。