首页 > 编程语言 >【muduo】常见的并发网络服务程序设计方案

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

时间:2023-08-29 12:32:40浏览次数:39  
标签:muduo 网络服务 epoll 并发 IO poll 连接 select Reactor



文章目录

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

二、单线程Reactor

【muduo】常见的并发网络服务程序设计方案_事件处理


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

  • 向Reactor注册程序感兴趣的事件;
  • Reactor通过IO复用接收新连接,并唤醒事件处理器handler去处理事件;
  • 事件处理程序执行实际的读取操作,并进行处理,然后重新声明关注的 I/O 事件,并将控制权返回给调度程序。

三、Reactor + ThreadPool

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

  • 将Handler处理器的执行放入线程池,多线程进行业务处理;
  • 而对于Reactor而言,可以仍为单个线程。如果服务器为多核的CPU,为充分利用系统资源,可以将Reactor拆分为两个线程。

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

四、Multiple Reactors(one loop per thread)

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


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


标签:muduo,网络服务,epoll,并发,IO,poll,连接,select,Reactor
From: https://blog.51cto.com/u_6526235/7274969

相关文章

  • 【muduo】TCP分包和Buffer类的设计
    文章目录一、TCP分包问题1、长连接和短连接2、长连接和短连接的分包方法3、长连接和短连接的应用场景二、TCP粘包问题三、Buffer类的设计与使用1、为什么需要应用层buffer?2、如何设计并使用应用层Buffer?3、Buffer类的设计一、TCP分包问题在TCP这种字节流协议上做应用层分包是网络......
  • Java并发编程的挑战与解决方案
    Java并发编程是一个复杂而重要的主题,开发者在处理并发场景时经常面临各种挑战。本文将讨论Java并发编程中的一些重要概念和问题,并提供实际的代码示例和解决方案。一、Java并发编程的基本概念线程与进程的区别并发和并行的概念共享资源与竞态条件线程安全性与数据同步二、Java......
  • 深入探究Java中的多线程并发与同步
    在后端开发中,多线程编程是一项关键技术,能够充分利用多核处理器,提高系统性能和响应能力。然而,多线程编程涉及到并发与同步问题,可能引发复杂的线程安全难题。本篇博客将深入探讨Java中的多线程编程,重点关注并发问题和同步机制。并发与多线程并发是指多个任务在同一时间段内执行,而多线......
  • Go语言并发编程实践
    Go语言是一门现代化的编程语言,以其独特而强大的并发模型而著名。Go通过轻量级的协程(goroutine)和通信机制(channel)实现了高效的并发编程。本篇博客将介绍Go语言的并发模型,讨论并发编程的基本概念和常用模式,并探索如何利用Go的并发特性来提升程序性能和开发效率。并发编程的重要性......
  • 移动应用高级语言开发——并发探索
     本文转载自 OpenHarmony TSC 官方微信公众号《峰会回顾第9期 | 移动应用高级语言开发——并发探索》演讲嘉宾 | 李勇彪回顾整理 | 廖   涛排版校对 | 李萍萍嘉宾简介李勇彪,OpenHarmony项目群技术指导委员会编程语言TSG成员,华为OpenHarmony虚拟机编译器专......
  • 高并发实战总结02
    一、秒杀系统......
  • 面试类-Java并发编程(三)
    39.CountDownLatch(倒计数器)了解吗?CountDownLatch,倒计数器,有两个常见的应用场景[18]:场景1:协调子线程结束动作:等待所有子线程运行结束CountDownLatch允许一个或多个线程等待其他线程完成操作。例如,我们很多人喜欢玩的王者荣耀,开黑的时候,得等所有人都上线之后,才能开打。   ......
  • 淘宝app商品详情原数据接口API(支持高并发请求/免费测试)
    item_get_app-获得淘宝app商品详情原数据 进入API测试一、引言随着移动互联网的迅速发展,移动电商应用的需求也在不断增长。淘宝作为中国最大的电商平台之一,每天需要处理大量的商品数据和用户访问请求。为了提供更加优质的用户体验,淘宝开放了商品详情原数据接口API,支持开发者在淘......
  • Android并发编程高级面试题汇总(含详细解析 十)
    Android并发编程高级面试题汇总最全最细面试题讲解持续更新中......
  • 一口气看完java并发编程
    JUC进程与线程进程程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理IO的当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程......