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、一致性哈希总结哈希环存节点数据顺时针找节点虚拟节点均分压力扩容缩容不雪崩。