高性能服务器程序框架知识梳理

服务器编程框架

服务器程序种类有很多,但是基本框架都一样,核心不同点在于逻辑处理单元。基本框架包含:I/O处理单元、逻辑单元、网络存储单元以及请求队列

  • I/O处理单元(主线程):服务器用来管理客户连接的模块。通常需要等待并接受客户连接,接受客户数据,将服务器响应返回给客户端。但是,数据的收发也可能在逻辑单元(工作线程)中完成。(数据收发在I/O单元上一个典型的事件处理模式就是模拟Proactor)
  • 逻辑单元:分析处理客户数据,将结果给I/O或者给客户端,服务器通常拥有多个逻辑单元实现对多个客户任务的并行处理
  • 网络存储单元可以是数据库、缓存或者文件,甚至是一台独立的服务器,也不是必须的比如ssh
  • 请求队列是各服务器之间预先建立的、静态的、永久的TCP连接,通常被设计为池的一部分,负责以上个单元的通信

I/O模型

  • 同步I/O模型:比如阻塞I/O、I/O复用,即I/O的读写操作都是由应用程序来完成的,也就是说同步IO模型要求用户代码自动执行IO操作(即将数据从内核缓冲区读入或者写入用户缓冲区)
  • 异步I/O模型:用户可以之间对IO执行读写操作,看起来是这样但是实际上用户只是处理了客户端的请求,没有真正执行IO操作,它实际上只告诉内核用户缓冲区的位置以及IO操作完成后如何通知应用程序进行剩下的逻辑处理,然后内核开始执行IO操作
  • 综上,对于应用程序来说,同步IO模型告诉他的是事件是否就绪的信息,异步IO则是告诉他事件被完成的消息

高效的事件处理模式

Reactor模式(同步IO模型):

         要求主线程(I/O处理单元)只负责监听fd上是否有事件发生,有的话立即将事件通知给工作线程(逻辑单元),逻辑单元进行读写数据(用户代码执行IO操作),接受新的连接以及处理客户请求,并将结果写入到socket上返回给客户。工作流程如下(以一次请求为例):

  1. 主线程往epoll注册socket上的读就绪事件
  2. 主线程调用epoll_wait监听,等待socket上有数据可读
  3. 当socket上有数据可读,epoll_wait通知主线程,主线程将事件放入请求队列唤醒工作线程处理
  4. 某个工作线程从socket读取数据,然后处理客户请求(协议解析 、处理业务逻辑比如数据库查询),并往epoll上注册socket上的写就绪事件
  5. 主线程调用epoll_wait监听写就绪事件
  6. epoll_wait通知主线程写就绪,主线程将写事件放入请求队列
  7. 请求队列上某个线程被唤醒,往socket写入客户请求的结果
Proactor(异步I/O模型):

        所有的I/O操作交给内核处理,工作线程负责处理业务逻辑,工作流程如下(以aio_read/aio_read为例):

  1. 主线程调用aio_read向内核注册读完成事件,并且告诉内核用户缓冲区的位置以及读操作完成后如何通知应用程序
  2. 主线程继续处理其他逻辑
  3. 当socket上的数据被读入用户缓冲区(这里说明一下,从socket的上读数据,本质上是通过系统调用从内核缓冲区读取到用户缓冲区)后,内核通知应用程序告诉他可用
  4. 应用程序选择一个工作线程进行业务处理比如协议解析、查询数据库、业务判断等,处理完之后调用aio_read向内核注册一个写完成事件,并告诉内核用户缓冲区的位置,以及写操作完成后如何通知应用成
  5. 主线程继续执行其他逻辑
  6. 当用户缓冲区被写入socket后,内核通知应用程序,结果已经发送完毕,应用程序选择一个工作线程进行善后,决定是否关闭socket

        综上,连接socket上的事件是由系统调用aio_read/aio_rea注册到内核的,主线程只调用epoll_wait只用来检测和监听socket上的连接请求事件

模拟Proator:

        这就是使用同步I/O模拟出Proator的方法,主线程“充当”内核,工作线程依旧只处理业务逻辑。主线程往socket上注册事件,主线程调用epoll_wait()检测和监听事件,主线程处理读写事件。

两种高效的并发模式(针对I/O密集型,比如经常读写数据或访问数据库)

       首先I/O模型中的同步和异步用来区分:

        第一,内核向应用程序通知的是何种IO事件,是就绪事件还是完成事件

        第二,由谁来完成IO读写操作,内核还是用户代码(应用程序)。

        在并发模式中,同步指的是程序完全按照代码的顺序去执行;“异步”只程序的执行由系统事件驱动。

半同步/半异步: 

        同步线程用于处理客户逻辑,异步线程用于处理I/O事件。异步线程监听到客户请求后,将其封装插入请求队列,请求队列通知某个工作在同步模式的线程读取并处理该请求对象。

        同属于该模式的还有:

  • 半同步/半反应堆(结合了Reactor模式):工作过程见Reacor模式。 当然了也可以结合模拟proactor,主线程完成IO操作
  • 主线程只负责管理监听socket,连接socket由工作线程来管理,并且该socket上的任何IO操作都由该工作线程负责,直到客户端关闭连接。简单来说,主线程监听到一个客户端的连接,就把一个客户端交给一个工作线程,就好像发任务一样,每个人对接一个客户,处理该客户的所有请求。所以,工作线程也是会维持自己的事件循环。
领导者/追随者

        多个工作线程轮流获得事件源,轮流监听,分发并处理事件。在任意时间点,程序都有一个线程成为领导者,负责监听I/O事件。当前的领导者如果监听到I/O事件,首先从线程池中推选新的领导者,然后自己处理事件。此时,新的领导者在监听,旧领导者在执行实现了并发

        当然了,领导者在监听到事件时指定一个追随者来处理事件,此时领导者不变,继续监听。

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

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

相关文章

【AI】从0开始玩转混元3D⼤模型,如何让一张静态实物图片一键转为3D实物图,大模型都表示服了,超级简单易上手,快来试试!

HAI 与 NVIDIA ,为开发者提供一键部署及生图的能力,让开发者体验3D 模型的同时,也了解云的便利性。 混元3D 2.0是腾讯推出的尖端3D⽣成模型,能够创建带有⾼分辨率纹理贴图的⾼保真3D资产 参赛报名:https://marketing.c…

电路图识图基础知识-电动机的保护电路保护方式(二十六)

电动机保护电路是确保电动机安全、可靠运行的关键技术之一。在工业和日常生活中,电动机被广泛应用于各种设备中,其安全运行对于保障生产效率和人身安全至关重要。本文将详细介绍电动机保护电路的重要性、保护方式以及具体的电路分析,以期为电…

【Pandas】pandas DataFrame droplevel

Pandas2.2 DataFrame Reshaping sorting transposing 方法描述DataFrame.droplevel(level[, axis])用于**从 DataFrame 的索引(行或列)中删除指定层级(level)**的方法 pandas.DataFrame.droplevel() pandas.DataFrame.droplev…

Delivering Arbitrary-Modal Semantic Segmentation(CVPR2023)任意模态语义分割论文阅读

文章目录 文章研究思路创建了DeLiVER任意模态分割基准数据集统计信息4种模态25个语义类 提出了任意跨模态分割模型CMNeXt自查询中心(Self-Query Hub,SQ-Hub)并行池化混合器(Parallel Pooling Mixer,PPX) 实…

进程控制

一. 进程创建 1.fork的概念与使用 在 Linux 中 fork 可以在一个进程中创建一个新的进程。这个新进程称为子进程&#xff0c;原进程为父进程。使用前需要包含头文件 #include <unistd.h> 。在调用 fork 函数时&#xff0c;子进程与父进程会共享数据和代码&#xff0c;此…

造轮子系列:从0到1打造生产级HTTP客户端,优雅封装OkHttp/HttpClient,支持异步、重试与文件操作

TechZhi HTTP Client Starter 源码特性快速开始1. 添加依赖2. 配置3. 使用 主要功能支持的HTTP方法文件操作功能高级功能配置示例 API使用示例基本请求自定义请求异步请求文件操作示例错误处理 构建和测试依赖说明 本文将介绍一款本人开发的高性能Spring Boot HTTP客户端Starte…

Java过滤器的基本概念

概述 Java 过滤器是 Java EE (Jakarta EE) 中的一种组件&#xff0c;用于在请求到达 Servlet 或 JSP 之前对其进行预处理&#xff0c;或者在响应返回客户端之前对其进行后处理。过滤器主要应用于以下场景&#xff1a; 请求参数过滤和转换字符编码处理身份验证和授权日志记录压…

gbase8s数据库获取jdbc/odbc协议的几种方式

PROTOCOLTRACEFILED:\sqltrace1.log;PROTOCOLTRACE5 jdbc 参数 &#xff0c;明文协议&#xff0c;并发时 会错乱&#xff0c;适合单线程调试 SQLIDEBUGC:\Users\lenovo\Desktop\sqlidebug.log1 jdbc参数&#xff0c;密文协议&#xff0c;需使用解密工具解析&#xff0c;解析…

【android bluetooth 框架分析 04】【bt-framework 层详解 7】【AdapterProperties介绍】

前面我们提到了 蓝牙协议栈中的 Properties &#xff0c; 这篇文章是 他的补充。 【android bluetooth 框架分析 04】【bt-framework 层详解 6】【Properties介绍】 在 AOSP&#xff08;Android Open Source Project&#xff09;中&#xff0c;AdapterProperties 是一个 Java…

C盘瘦身?

突然发现回收站底部有横幅辣眼睛&#xff01; 点击深度清理跳转C盘瘦身 点击一键瘦身跳转支付 回收站右键还有菜单 回收站右键可以通过设置关闭 回收站底部横幅关不了&#xff01; 流氓没人管了吗&#xff1f;

用户通知服务,轻松实现应用与用户的多场景交互

用户在使用应用时&#xff0c;经常想要了解应用程序在执行的操作&#xff0c;如下载完成、新邮件到达、发布即时的客服支付通知等&#xff0c;这些通知除了携带基本的文本图片信息外&#xff0c;最好还可以支持文件上传下载进度场景下的进度条通知&#xff0c;以及点击通知栏可…

苹果获智能钱包专利,Find My生态版图或再扩张:钱包会“说话”还能防丢

苹果公司近日成功获批一项突破性专利&#xff0c;揭示了一种支持Find My网络的全新智能钱包设计方案。该钱包不仅能智能管理用户的信用卡、身份证等实体卡片&#xff0c;更具备了追踪定位和通过扬声器发声提醒的能力&#xff0c;有望成为苹果“查找”&#xff08;Find My&#…

当机床开始“思考”,传统“制造”到“智造”升级路上的法律暗礁

——首席数据官高鹏律师团队创作&#xff0c;AI辅助 一、被时代推着走的工厂&#xff1a;从“铁疙瘩”到“智能体”的阵痛 某汽车零部件厂的李厂长至今记得三年前的凌晨。为了赶上新能源车企的订单&#xff0c;厂里咬牙引进了两条智能生产线&#xff0c;可调试第三天&#xff…

概率基础——不确定性的数学

第05篇&#xff1a;概率基础——不确定性的数学 写在前面&#xff1a;大家好&#xff0c;我是蓝皮怪&#xff01;前几篇我们聊了统计学的基本概念、数据类型、描述性统计和数据可视化&#xff0c;今天我们要进入统计学的另一个重要基础——概率论。你有没有想过&#xff0c;为什…

爬虫遇到base64编码(非常规版)

一.特征 从 Base64 的核心特性入手&#xff0c;比如它的编码原理&#xff08;将二进制数据转换为 ASCII 字符集&#xff09;和字符集的组成&#xff08;A-Z、a-z、0-9、、/ 和 &#xff09;。这是 Base64 最基础的特点&#xff0c;几乎每个回答都应该包括这些内容。基于 64 个…

节拍定时器是什么?

节拍定时器是什么&#xff1f; 节拍定时器&#xff08;SysTick Timer&#xff09;是嵌入式系统中用于提供精确时间基准的核心硬件组件&#xff0c;尤其在ARM Cortex-M系列处理器中广泛应用。以下是其关键特性和应用的综合说明&#xff1a; ⚙️ 一、核心概念与工作原理 硬件基…

SDPA(Scaled Dot-Product Attention)详解

SDPA&#xff08;Scaled Dot-Product Attention&#xff09;详解 SDPA&#xff08;Scaled Dot-Product Attention&#xff0c;缩放点积注意力&#xff09;是 Transformer 模型的核心计算单元&#xff0c;最早由 Vaswani 等人在 2017 年的论文《Attention Is All You Need》提出…

java通过hutool工具生成二维码实现扫码跳转功能

实现&#xff1a; 首先引入zxing和hutool工具依赖 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.2</version></dependency><dependency><groupId>com.google.zxi…

数据库数据导出到Excel表格

1.后端代码 第一步&#xff1a;UserMapper定义根据ID列表批量查询用户方法 // 批量查询用户信息List<User> selectUserByIds(List<Integer> ids); 第二步&#xff1a;UserMapper.xml写动态SQL&#xff0c;实现批量查询用户 <!--根据Ids批量查询用户-->&l…

Altera系列FPGA基于ADV7180解码PAL视频,纯verilog去隔行,提供2套Quartus工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目Altera系列FPGA相关方案推荐我这里已有的PAL视频解码方案 3、设计思路框架工程设计原理框图输入PAL相机ADV7180芯片解读BT656视频解码模块图像缓存架构输出视频格式转…