【muduo】常见的并发网络服务程序设计方案

一、IO复用

  目前常用的IO复用模型有三种:select,poll,epoll。

1、select模型

  说的通俗一点就是各个客户端连接的文件描述符也就是套接字,都被放到了一个集合中,调用select函数之后会一直监视这些文件描述符中有哪些可读,如果有可读的描述符那么我们的工作进程就去读取资源。select 在一个进程内可以维持最多 1024 个连接。

2、poll模型

  poll 和 select 的实现非常类似,本质上的区别就是存放 fd 集合的数据结构不一样。poll通过一个pollfd数组向内核传递需要关注的事件,故没有描述符个数的限制,pollfd中的events字段和revents分别用于标示关注的事件和发生的事件,故pollfd数组只需要被初始化一次。

  但 select 和 poll 方式有一个很大的问题就是,我们不难看出来 select 是通过轮训的方式来查找是否可读或者可写,打个比方,如果同时有100万个连接都没有断开,而只有一个客户端发送了数据,所以这里它还是需要循环这么多次,造成资源浪费。

3、epoll模型

  epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd)的,此时我们对这些流的操作都是有意义的。(复杂度降低到了O(1))。即Epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,Epoll的效率就会远远高于select和poll;

二、单线程Reactor

在这里插入图片描述
  Reactor的特点是 I/O 多路复用和事件驱动,它的关键在于将消息(IO事件)分发到用户提供的处理函数,并保持网络部分的通用代码不变,基本处理过程为:

  • 向Reactor注册程序感兴趣的事件;

  • Reactor通过IO复用接收新连接,并唤醒事件处理器handler去处理事件;

  • 事件处理程序执行实际的读取操作,并进行处理,然后重新声明关注的 I/O 事件,并将控制权返回给调度程序。

三、Reactor + ThreadPool

  在线程Reactor模式基础上,做如下改进:

  • 将Handler处理器的执行放入线程池,多线程进行业务处理;

  • 而对于Reactor而言,可以仍为单个线程。如果服务器为多核的CPU,为充分利用系统资源,可以将Reactor拆分为两个线程。

在这里插入图片描述

四、Multiple Reactors(one loop per thread)

在这里插入图片描述
  mainReactor负责accept连接,然后使用算法(muduo采用的是round-robin)把连接挂载到某个subReactor上,这样该连接的所有操作都在那个subReactor线程中完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~青萍之末~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值