001 仿muduo库实现高性能服务器组件_项目简介

​🌈个人主页:Fan_558
🔥 系列专栏:仿muduo
🌹关注我💪🏻带你学更多知识

文章目录

  • 一、项目简介
  • 二、所需知识储备
  • 三、什么是muduo
  • 四、Reactor模式
      • 单Reactor单线程:单I/O多路复⽤+业务处理
      • 单Reactor多线程:单I/O多路复⽤+线程池(业务处理)
      • 多Reactor多线程:多I/O多路复⽤+线程池(业务处理)
  • 小结

一、项目简介

我们知道通过socket可以实现一个简单的tcp服务器,可以进行简单的通信,但是如果有很多的客户端同时进行请求,那么很明显效率不高,该项目目标就是设计出是⼀个⾼并发服务器组件,可以简洁快速的完成一个高性能的服务器搭建,在此服务器的基础上,使用者可以添加各种应用层协议,由此实现多种功能的服务器,例如:HTTP服务器、FTP服务器、SSH服务器…
本项目则实现较为常见的HTTP服务器,即搭建出服务器组件后,只需要在应用层添加HTTP协议支持,便可完成一个服务器的搭建。
本项目核心集中在实现高并发高性能服务器组件(80%),通过该组件的设计可以学到Reactor的事件驱动处理模式的设计思想,其次20%在应用层协议支持上。
本项目服务器组件的设计代码量在1300行左右,HTTP协议支持代码量在600行左右,另外的本项目不包含任何的业务逻辑,具体要让服务器进行怎样的业务逻辑处理,得看组件使用者,组件使用者也只需要添加业务逻辑处理的接口即可。

二、所需知识储备

Linux:多线程、socket套接字编程、多路转接技术(epoll)、网络协议了解
C++:类和对象、多态、继承。一些C++11以及C++17的新特性:比如function、bind、智能指针(shared_ptr、weak_ptr)、mutex、regex正则表达式、any。

三、什么是muduo

Muduo 是一个用于 Linux 多线程服务器的 C++ 非阻塞网络库,由陈硕所写。它主要设计用于需要高性能网络通信的服务器端应用程序,特别适合于构建高并发的在线服务和分布式系统。Muduo 的设计哲学强调简单、高效和可靠,它提供了一套丰富的 API 来简化网络编程的复杂性,同时保持高性能。

四、Reactor模式

Reactor 模式是一种事件处理的设计模式,用于异步IO。这种模式通过将请求处理分配给不同的处理器来响应并处理IO事件,特别适用于高并发环境下的网络服务器。Reactor 模式能有效地管理和处理大量并发输入/输出操作,减少系统资源消耗,提高应用性能。
简单理解就是使用 io多路复用统⼀监听事件,收到事件后分发给处理进程或线程,是编写高性能网络服务器的必备技术之一。
Reactor模型可以分为三种类型:① 单Reactor单线程,② 单Reactor多线程,③ 多Reactor多线程。

单Reactor单线程:单I/O多路复⽤+业务处理

  1. 通过IO多路复⽤模型进⾏客⼾端请求监控
  2. 触发事件后,进⾏事件处理
    a. 如果是新建连接请求,则获取新建连接,并添加⾄多路复⽤模型进⾏事件监控。
    b. 如果是数据通信请求,则进⾏对应数据处理(接收数据,处理数据,发送响应)。
    优点:所有操作均在同⼀线程中完成,思想流程较为简单,不涉及进程/线程间通信及资源争抢问题。
    缺点:所有的事件监控以及业务处理都是在一个线程中完成的,⽆法有效利⽤CPU多核资源,很容易达到性能瓶颈。
    适⽤场景:适⽤于客⼾端数量较少,且处理速度较为快速的场景。(处理较慢或活跃连接较多,会导致串⾏处理的情况下,后处理的连接⻓时间⽆法得到响应)
    在这里插入图片描述

单Reactor多线程:单I/O多路复⽤+线程池(业务处理)

  1. Reactor线程通过I/O多路复⽤模型进⾏客⼾端请求监控
  2. 触发事件后,进⾏事件处理
    a. 如果是新建连接请求,则获取新建连接,并添加⾄多路复⽤模型进⾏事件监控。
    b. 如果是数据通信请求,则接收数据后分发给Worker线程池进⾏业务处理。
    c. ⼯作线程处理完毕后,将响应交给Reactor线程进⾏数据响应
    优点:充分利⽤CPU多核资源
    缺点:多线程间的数据共享访问控制较为复杂,单个Reactor 承担所有事件的监听和响应,在单线程中
    运⾏,⾼并发场景下容易成为性能瓶颈

在这里插入图片描述

多Reactor多线程:多I/O多路复⽤+线程池(业务处理)

  1. 在主Reactor中处理新连接请求事件,有新连接到来则分发到⼦Reactor中监控
  2. 在⼦Reactor中进⾏客⼾端通信监控,有事件触发,则接收数据分发给Worker线程池
  3. Worker线程池分配独⽴的线程进⾏具体的业务处理
    a. ⼯作线程处理完毕后,将响应交给⼦Reactor线程进⾏数据响应
    优点:充分利⽤CPU多核资源,主从Reactor各司其职

在这里插入图片描述

项目定位

该项目要实现的是主从Reactor模型服务器,也就是主Reactor线程仅仅监控监听描述符,获取新建连接,保证获取新连接的⾼效性,提⾼服务器的并发性能。

主Reactor获取到新连接后分发给⼦Reactor进⾏通信事件监控。⽽⼦Reactor线程监控各⾃的描述符的读写事件进⾏数据读写以及业务处理。

One Thread One Loop的思想就是把所有的操作都放到⼀个线程中进⾏,⼀个线程对应⼀个事件处理的循环。

当前实现中,因为并不确定组件使⽤者的使⽤意向,因此并不提供业务层⼯作线程池的实现,只实现主从Reactor,⽽Worker⼯作线程池,可由组件库的使⽤者的需要⾃⾏决定是否使⽤和实现。
因此此项目真正要实现的是如下结构
在这里插入图片描述

小结

刚穿越回来,贴个下一篇的地址=》项目整体框架

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/18559.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言-02_变量与进制

文章目录 1.关键字2.标识符3.变量3.1 变量的声明与赋值3.2 变量的作用域3.3 变量按类型的分类 4.基本数据类型4.1 整数类型4.1.1 类型说明4.1.2 举例4.1.3 后缀4.1.4 整型的极限值 4.2 浮点类型4.2.1 类型说明4.2.2 举例 4.3 字符类型4.4 布尔类型 5.变量间的运算规则5.1 隐式类…

K8s证书过期处理

问题描述 本地有一个1master2worker的k8s集群,今天启动VMware虚拟机之后发现api-server没有起来,docker一直退出,这个集群是使用kubeadm安装的。 于是kubectl logs查看了日志,发现证书过期了 解决方案: 查看证书 #…

python数据处理中的类型检查与转换技巧

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、类型检查的重要性 二、类型检查与转换技巧 1. 识别数据类型不一致 2. 使用astype()方…

Epic Pen Pro v3 解锁版安装教程 (屏幕实时标记注释工具)

前言 Epic Pen是一款功能强大的屏幕标记工具,允许您在屏幕上绘图或书写,而无需在后台与软件交互。这意味着您几乎可以注释任何东西!使用我们流行的屏幕标记和Windows数字白板工具Epic Pen编写、绘制和突出显示,包括演示文稿软件&…

ClickHouse数据管理与同步的关键技术

2024年 5 月 18 日,ClickHouse官方首届杭州 Meetup 活动成功举行。本次活动由 ClickHouse 和阿里云主办,NineData 和云数据库技术社区协办。围绕ClickHouse的核心技术、应用案例、最佳实践、数据管理、以及迁移同步等方面,和行业专家展开交流…

idea中快速找到当前git地址

idea中快速找到当前git地址 然后双击就可以看到地址了

Linux漏洞SSL/TLS协议信息泄露漏洞(CVE-2016-2183) - 非常危险(7.5分) 解决办法!升级openssl

漏洞情况 详细描述 TLS是安全传输层协议,用于在两个通信应用程序之间提供保密性和数据完整性。 TLS, SSH, IPSec协商及其他产品中使用的IDEA、DES及Triple DES密码或者3DES及 Triple 3DES存在大约四十亿块的生日界,这可使远程攻击者通过Sweet32攻击&…

2023-2024中国区块链年度发展报告

来源:赛迪 近期历史回顾:2024社交媒体全球使用趋势报告.pdf 国际建造成本指数报告2024--产能角逐.pdf 2024可持续包装管理体系与最佳实践案例集.pdf 2024年专利诉讼报告.pdf 2024Q1保险业运行报告.pdf 2024年云指数报告.pdf 2024内容营销10大趋势-内容时…

pytorch-池化层

目录 1. pooling池化层1.1 down sample2.2 Max pooling1.3 Avg pooling1.3 pooling pytorch实现 2. up sample上采样2.1 up sample2.2 pytorch实现 3. ReLU 1. pooling池化层 1.1 down sample 见下图,隔行隔列采样 2.2 Max pooling 下图采用2x2的filter&#x…

拉格朗日插值法的推导

1、插值的基本定义   设函数 y f ( x ) yf(x) yf(x)在区间 [ a , b ] [a,b] [a,b]上有定义&#xff0c;且已知它在 n 1 n1 n1个互异点 a ≤ x 0 < x 1 < . . . < x n ≤ b a\leq x_0<x_1<...<x_n\leq b a≤x0​<x1​<...<xn​≤b上的函数值 y 0 …

【Unity脚本】Unity中如何按类型查找游戏对象(GameObject)

【知识链】Unity -> 脚本系统 -> 访问游戏对象 -> 按类型访问游戏对象摘要&#xff1a;本文介绍了Unity中按类型查找游戏对象&#xff08;GameObject&#xff09;的五种方法&#xff0c;并提出了使用这些方法的最佳实践。 本文目录 一、访问游戏对象的方法二、如何按…

【个人博客搭建】(20)获取操作用户信息(IHttpContextAccessor)

IHttpContextAccessor在ASP.NET Core中扮演着至关重要的角色。它为开发者提供了一种方便的方式来访问和操作HttpContext对象&#xff0c;从而允许在整个应用程序中轻松地管理和使用HTTP请求和响应的相关信息。下面将深入探讨IHttpContextAccessor的作用、使用方法以及如何通过它…

[ue5]建模场景学习笔记(1)——混合材质

卷首&#xff1a;这部分会记录建模场景等相关学习内容&#xff0c;与ue引擎学习笔记不同的是&#xff0c;可能会略过一些基础内容&#xff0c;因为部分知识在blender中已经学习过了&#xff0c;不再继续记录。 1.需求分析&#xff1a; 想构建一个山地的场景&#xff0c;在ue5中…

解读vue3源码-1

提示&#xff1a;看到我 请让滚去学习 vue3渲染流程 文章目录 vue3渲染流程vue3的3个核心&#xff1a;1.响应式模块(Reactivity Module)--创建响应式数据2.编译模块(Compiler Module)--模版编译器将html转换为一个渲染函数3.渲染模块(Renderer Module) 渲染流程&#xff1a;1.首…

python办公自动化——(二)替换PPT文档中图形数据-柱图

效果: 数据替换前 &#xff1a; 替换数据后&#xff1a; 实现代码 import collections.abc from pptx import Presentation from pptx.util import Cm,Pt import pyodbc import pandas as pd from pptx.chart.data impo…

广东海上丝绸之路文化促进会正式批复荐世界酒中国菜的指导单位

广东海上丝绸之路文化促进会正式批复成为“世界酒中国菜”系列活动指导单位 近日&#xff0c;广东海上丝绸之路文化促进会近日正式批复荐酒师国际认证&#xff08;广州&#xff09;有限公司&#xff0c;成为备受瞩目的“世界酒中国菜”系列活动的指导单位。此举旨在通过双方的…

IDEA中各种Maven相关问题(文件飘红、下载依赖和启动报错)

错误情况 包名、类名显示红色、红色波浪线&#xff0c;大量依赖提示不存在&#xff08;程序包xxx不存在&#xff09; 工程无法启动 一、前提条件 1、使用英文原版IDEA 汉化版的可能有各种奇怪的问题。建议用IDEA英文版&#xff0c;卸载重装。 2、下载maven&#xff0c;配置环…

2024HW|常见红队使用工具

目录 什么是HW&#xff1f; 什么是网络安全红蓝对抗&#xff1f; 红队 常见工具 信息收集工具 Nmap 简介 漏洞扫描工具 Nessus简介 AWVS 简介 抓包工具 Wireshark简介 TangGo 简介 web 应用安全工具 Burpsuite 简介 SQLMap webshell 管理工具 蚁剑 冰蝎 后…

《PNAS》和《Nature Communications》仿章鱼和蜗牛的粘液真空吸附,赋予了机器人吸盘新的“超能力”

想象一下&#xff0c;如果机器人能够像章鱼一样牢牢吸附在粗糙崎岖的岩石上&#xff0c;或者像蜗牛那样在墙面上悠然负重爬行&#xff0c;那会是多么神奇的一幕&#xff01;近日&#xff0c;布里斯托大学机器人实验室的Jonathan Rossiter教授课题组就为我们带来了这样的“超能力…

Fastjson 反序列化漏洞[1.2.24-rce]

漏洞复现环境搭建请参考 http://t.csdnimg.cn/vSaaw kali切换jdk版本请参考 Kali安装JAVA8和切换JDK版本的详细过程_kali安装jdk8-CSDN博客 漏洞原理 Fastjson提供的com.sun.rowset.JdbcRowSetImpl类下的dataSourceName方法支持传入一个RMI/LDAP源&#xff0c;支持远程调用。…