I/O多路复用与一致性哈希技术
2026/5/4 5:56:50 网站建设 项目流程

I/O多路复用 + ReactorProactor + 一致性哈希 最全面试完整版

一、I/O 多路复用 核心概念

I/O 多路复用:就是一个进程/一个线程,通过一次系统调用,在内核中同时监听多个文件描述符(socket、fd)

不需要多线程、不需要多进程,只用单线程就能管理成千上百个网络连接

核心思想:一次等待,多个事件,哪个就绪处理哪个

作用:高并发网络编程核心技术,解决单线程只能处理一个连接、多线程开销太大的问题。


二、select 详解(最早、性能最差)

1、工作原理

程序员把需要监听的所有 socket 文件描述符,放到fd 文件描述符集合中。

调用select()系统调用,把整个 fd 集合从用户态拷贝到内核态

内核采用全程轮询遍历所有fd,挨个检查每个 socket 是否有可读、可写、异常事件。

当检测到有事件就绪后,内核把所有fd再次拷贝回用户态

用户态程序需要自己再次全部遍历一遍fd集合,才能找到真正就绪的事件去处理。

2、select 三大缺点

1.最大文件描述符限制 1024,默认最多监听1024个socket,并发量上不去。

2.每次都要全部拷贝用户态↔内核态,拷贝开销大。

3.全程轮询遍历、就绪后还要遍历查找,效率极低,连接越多越慢。


三、poll 详解

1、poll 和 select 区别

底层原理和 select 一模一样,依旧是轮询遍历所有文件描述符

唯一改进:取消了 1024 文件描述符数量限制,支持更多连接。

2、poll 依旧存在的缺点

1. 仍然需要全部fd拷贝到内核

2. 内核依旧轮询遍历所有fd

3. 用户态依旧需要遍历全部fd找就绪事件

总结:只是解除数量限制,性能没有本质提升。


四、epoll 详解

1、epoll 底层数据结构

epoll 底层核心:红黑树 + 就绪双向链表

红黑树:存放所有需要监听的fd和事件,增删改查效率 O(logn)。

就绪链表:存放已经有事件触发、已经就绪的fd

2、epoll 三大函数

epoll_create:创建一个epoll对象,在内核生成一棵红黑树,返回一个epollfd。

epoll_ctl:对监听的socket进行增、删、改监听事件,把fd加入红黑树或移除。

epoll_wait:阻塞等待事件就绪,只返回活跃就绪的事件,不需要遍历全部fd。

3、epoll 为什么性能极高?

1.不需要每次全部拷贝fd,只在epoll_ctl时拷贝一次。

2.不是轮询遍历,内核事件就绪会主动回调,把就绪fd放入就绪链表。

3. epoll_wait只返回就绪的少量事件,用户态不需要遍历全部fd。

4.没有1024数量限制,支持十万、百万级高并发连接。

4、select/poll/epoll 一句话区别

select、poll:傻轮询,全拷贝,全遍历。

epoll:红黑树管理,事件回调,只处理活跃事件。


五、Reactor 反应堆模型(同步IO 模式)

1、核心思想

Reactor 是同步多路复用网络模型,所有读写业务都由用户线程处理,内核只负责通知事件就绪。

2、多Reactor多线程/多进程工作流程

1.主线程主Reactor:通过 select/epoll 只监听客户端连接事件

2. 当有新客户端连接到来,通过accept接受连接

3. 主线程把新连接 socket分配给子线程的子Reactor

4. 子线程把socket加入自己的epoll/select,监听读写事件。

5. 当连接有读写事件就绪,触发对应的handler事件处理器

6. 执行固定流程:read读数据 → 业务逻辑处理 → write响应返回

3、特点

IO操作和业务处理都在用户线程执行,属于同步非阻塞IO


六、Proactor 异步网络模型(异步IO模式)

1、核心思想

Proactor 是真正的异步网络模型,读写操作全部由内核完成,用户线程完全不等待。

2、工作原理

1. 用户线程只管提交读写任务给内核,不用等待。

2.内核自动完成read读取数据、自动完成write写数据

3. 内核把数据读完之后,再通知用户线程:数据已经准备好了。

4. 用户线程只需要直接处理业务逻辑,不需要管读写过程。

3、一句话区别

Reactor:内核只通知就绪,用户自己读写。

Proactor:内核帮你读写完,用户只管干活。


七、一致性哈希(分布式负载均衡核心)

1、为什么需要一致性哈希?

普通哈希取模:节点增减,全部数据重新分配,缓存雪崩、迁移巨大

一致性哈希:增减节点,只迁移少量数据,保证分布式集群稳定。

2、哈希环原理

一致性哈希固定对2^32 范围进行取模运算。

把整个哈希值空间想象成一个圆形哈希环,首尾相连。

3、一致性哈希两步核心流程

第一步:对所有存储节点(服务器IP)做哈希计算,映射到哈希环上固定位置。

第二步:对要存储/访问的数据key做哈希计算,也映射到哈希环。

数据按顺时针查找,遇到的第一个最近节点,就存储到该节点上。

4、虚拟节点作用(重点)

真实节点少的时候,哈希环分布不均匀,导致数据倾斜、负载不均衡

解决方案:引入虚拟节点

把每一个真实节点拆分成几十个、上百个虚拟节点,均匀分布在哈希环上。

好处:

1. 数据分布均匀,负载均衡

2. 新增/下线节点,只迁移少量数据

3. 避免缓存雪崩、集群震荡。

5、一致性哈希总结

哈希环存节点,数据顺时针找节点;虚拟节点均分压力,扩容缩容不雪崩。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询