标题: 【muduo】常见的并发网络服务程序设计方案
作者: lx青萍之末
原文链接: https://blog.csdn.net/daaikuaichuan/article/details/87796355

文章目录

  • 一、IO复用

    • 1、select模型
    • 2、poll模型
    • 3、epoll模型
  • 二、单线程Reactor
  • 三、Reactor + ThreadPool
  • 四、Multiple Reactors(one loop per thread)

一、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;

张三思评:

epoll的底层是如何做到的呢?在我看到一个讲解里,它是这么说的,如果有监听到事件发生,epoll机制会对我们传入的epoll_event数组(这个数组位于用户态和内核态共享空间里面)进行排序,把发生事件都放到最前面,然后返回给我们发生事件的数量,因此我们就可以直接遍历发生事件的套接字。

二、单线程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线程中完成。

张三思评:

什么是round-robin呢?

轮询调度(Round-Robin Scheduling)

轮询调度(Round Robin Scheduling)算法就是以轮询的方式依次将请求调度不同的服务器,即每次调度执行i = (i + 1) mod n,并选出第i台服务器。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。

轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数),然后重新开始循环。

作者:小程故事多
链接:https://www.jianshu.com/p/92666209041a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

张三思评博客:常见的并发网络服务程序设计方案相关推荐

  1. 我的架构设计~用层关系图说说mvc,mvvm,soa,ddd - 张占岭 - 博客园

    我的架构设计~用层关系图说说mvc,mvvm,soa,ddd - 张占岭 - 博客园

  2. 开源项目:张帅个人博客

    开源项目:张帅个人博客 [实战]如何通过html+css+mysql+php来快速的制作动态网页(以制作一个博客网站为列) 为完成学校的期末课程设计,花了将近两个月闲暇之余,制作了一个简单的博客网站. ...

  3. 张宴 vip mysql_MySQL_mysql下mysql-udf-http效率测试小记,看到张宴的博客上关于http/rest - phpStudy...

    mysql下mysql-udf-http效率测试小记 看到张宴的博客上关于"http/rest客户端的文章",怎样安装啥的直接都跳过,下面直接进入测试阶段,测试环境:虚拟机 复制代 ...

  4. Linux C/C++ 内存泄漏检测工具:Valgrind - 张宴的博客 - Web系统架构与底层研发

    Linux C/C++ 内存泄漏检测工具:Valgrind - 张宴的博客 - Web系统架构与底层研发 Linux C/C++ 内存泄漏检测工具:Valgrind - 张宴的博客 - Web系统架构 ...

  5. 张宴的博客nginx+php+mysql搭建篇

    [ 2010-3-4 20:10 | by 张宴 ] [文章作者:张宴 本文版本:v6.3 最后修改:2010.07.26 转载请注明原文链接:http://blog.zyan.cc/nginx_ph ...

  6. 张有为/开创博客营销-中小企业网上生态全景调查(节选)

    又到了烟花三月下扬州的季节,但 07 年的早春二月不同于以往,电子商务热潮正席卷着整个中国大地,回顾近三年来走过的日子,就像肖邦夜曲般恬静而激情澎湃 -- 万商网记者叶小姐来我公司做客采访,将我作为& ...

  7. 博客常见线条背景动效-JavaScript

    1.偶然在别人博客看到这个动效 真的挺奇妙 可以玩出无限种形状 效果演示 2. 3.GitHub地址

  8. CSDN写博客提交后的网络交互

    第一个blob请求对于博客保存作用不大: 第二个saveArticle的HTTP post是真正执行博客保存的请求: 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

  9. css 浮动 -张鑫旭博客笔记

    原创文章,转载请注明来自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com] 本文地址:http://www.zhangxinxu.com/wordpress/?p=594 1 ...

  10. [javaSE] 看博客学习java并发编程

    共享性 多线程操作同一个数据,产生线程安全问题 新建一个类ShareData 设计一个int 型的成员变量count 设计一个成员方法addCount(),把count变量++ 在main函数中开启多 ...

最新文章

  1. 浅谈C#中常见的委托Func,Action,Predicate(转)
  2. Single Number
  3. good helper for your math homework: https://www.wolframalpha.com/
  4. 2018 蓝桥杯省赛 A 组模拟赛(一)数列求值+推导
  5. matlab r2010a教程,MATLAB教程R2010a(十二五)
  6. win10 mysql5.7.21_win10下mysql5.7.21解压版安装教程
  7. java模拟JVM的GCRoots追踪算法,对象可达性分析
  8. 第四周课程总结&实验报告。
  9. VS2015 Visual Assist X破解版安装、禁用、卸载方法
  10. 阿里ACP考试题(只供参考)
  11. matlab中平稳性检验,基于Matlab的信号平稳性检验系统
  12. 仓库货位卡标识牌_怎样正确使用仓库货位卡?来看看这三点
  13. 浏览器播放RTSP、RTMP等几种编码格式视频流
  14. qt实现涂鸦板_Qt之旅--- 10 涂鸦板
  15. 计算机ps2定义,PS2通信协议说明及接口定义(键盘及鼠标).doc
  16. [pytorch] monai Vit 网络 图文分析
  17. 阿里大数据平台MaxCompute初窥
  18. 小米强制淘汰老破小,苹果华为带了好头
  19. 数据库日常运维操作手册
  20. 一、jSP简介(前置知识)

热门文章

  1. Simulink子系统
  2. 技术美术面试问题总结——数字天空
  3. 北京汇佳IB大考成绩公布
  4. 物联网-电力监控平台(汇总)
  5. workgroup无法访问。您可能没有权限使用网络资源……(解决方案)
  6. 用Qt实现Q-M算法化简逻辑表达式及Qt项目打包发布方法
  7. 地铁与日本移动互联网
  8. 新品“鸿鹄”获2020世界VR产业大会创新金奖!
  9. 马哥教育42期第二周作业
  10. Navicat备份sqlserver数据库