面试项目说实现了一个后端多线程网络服务器框架应该怎样写

目录

 线程池引言

池分类

池化优势

用在何处

线程池组件

任务队列

线程队列

线程池

Reactor分解

何为Reactor

Reactor组件

网络IO处理分解

Reactor抛入线程池的方式

充分利用多核CPU,主从Reactor

面试项目书写小技巧 (文末彩蛋)


 线程池引言

池分类

  1. 线程池
  2. 数据库连接池
  3. 内存池
  4. 异步请求池

池化优势

缓冲, 重复利用, 大大减少重建,  节约资源, 提高效率, 提高利用率

核心优势在哪里? 

  1. 提前创建, 申请, 反复利用, 而不是重新创建, 申请.
  2. 反复利用所以利用率高, 也节约了资源
  3. 提前创建, 而不是临时创建, 省去了创建时间, 提高了效率 

用在何处

  1. 频繁需要申请释放处。  反正经常用, 我何不提前创建好, 等待你用, 用完我也不扔掉, 继续等你其他时候用. 
  2. 多线程处:均可以考虑抛入线程池, 减少线程频繁创建销毁
  3. 注意:频繁是核心.
  4. 生活例子: 蓄水池, 酒池肉林, 好处何在? 方便吧, 提前放好, 随用随取

线程池组件

线程队列: 
提前开启线程, 
多线程同步消费任务队列中的任务

多线程同步消费:加锁 + 条件消费,  同步等待, 一个线程需要消费必须同时具备两个条件, 1.获取锁 2. 满足条件  (存在任务) 

同步:核心在于条件等待, 等待着一个条件满足,然后同步触发一个事件, 阻塞函数, 同步等待. 

同步优势:对于共享资源的有序消费, 多线程之间互相等待, 互相同步, 稳定消费

任务队列

也可叫做阻塞队列:   blocking queue 学名

阻塞队列作用:异步解耦合, 任务放入任务队列中, 立刻返回, 在工作线程繁忙的时候,不至于需要等待线程空闲.

线程队列

组织成双向队列的多线程. 工作线程, 消费者线程, 提前开启, 等待处理任务

生活实例:办事窗口

线程池

将上述两大组件组合在一起   +  mutex锁 +  cond条件变量  实现同步消费  

 

Reactor分解

何为Reactor

反应堆, 事件反应堆, 反射堆:   将对io的操作封装成对事件的操作

Reactor组件

  1. 多路复用器 收集反应事件 epoll
  2. 事件处理器 回调处理机制
  3. 利用回调封装事件循环

网络IO处理分解

  1. io检测封装: epoll活跃io事件收集
  2. io操作封装, 读写io
  3. 对数据的解析操作封装, parser 业务逻辑

Reactor抛入线程池的方式

single reactor thread + worker threadpool

单线程reactor + 工作线程池

做法: 将业务逻辑处理单独抛入一个工作线程池进行处理.  实现网络IO跟业务的解耦合

使用场景:    相比IO, 业务逻辑处理耗时相当严重. 比如说写日志呀,  XML 文件的解析、数据库记录的查找、文件资料的读取和传输、计算型工作的处理等,它们会拖慢整个反应堆模式的执行效率。此时我们就可以将其单独抛到另外的Thread pool 中去执行业务需求.

好处:反应堆线程仅仅处理网络IO  而 decode、compute、enode 型工作放置到另外的线程池中, 两者解耦,在业务处理耗时情况下大大提高效率

充分利用多核CPU,主从Reactor

单Reactor的时候,  reactor 反应堆同时分发Acceptor 上的连接建立事件和已建立连接的 I/O 事件。这样对于客户端接入量不高的情况下是完全OK的.

但是一旦客户端接入量特别大的情况下, reactor既要分发连接建立,又分发已建立连接的 I/O,有点忙不过来,在实战中的表现可能就是客户端连接成功率偏低。

引出   ---   主从Reactor模式, 多Reactor模型, 将 acceptor 上的连接建立事件和已建立连接的 I/O 事件分离

核心思想:  main Reactor只负责分发连接建立事件, sub Reactor 来负责已经建立连接的事件的分发.

sub Reactor的数量设置:  依据CPU数量而定

优势:服务器稳定性大大提升, 客户端连接成功率大大提高

面试项目书写小技巧 (文末彩蛋)

对比书写, 分版本书写, 不同的版本优势是什么, 加入了什么技术, 带来了什么样的好处, 获益是什么

eg:本文中的reactor.

我在简历项目上书写, 实现了一个多线程reactor网络服务器框架

最开始使用什么样的技术, 实现了单线程reactor的框架, 然后对比单线程reacor跟多线程reactor, 表明加入线程池  +  主从reactor之后的优势所在.   带来了什么样的提升, 服务器稳定性提升呀, 性能抗压性提升等.                 (此处仅为小杰己见, 可能会有益处)  

如下是我在网上找到的一个大佬写的单Reactor + 线程池的实现, 我觉得写的很棒, 其中的代码很多都是特别值得我们去品味的

reactor: 一个使用c语言实现的“单Reactor多线程”的简易reactor模型。https://gitee.com/chenwifi/reactor

猜你喜欢

转载自blog.csdn.net/weixin_53695360/article/details/124651680
今日推荐