当前位置: 首页 > news >正文

5.4、服务器编程基本框架和两种高效的事件处理模式

5.4、服务器编程基本框架和两种高效的事件处理模式

  • 1.服务器编程基本框架
  • 2.两种高效的事件处理模式
    • ①Reactor模式
    • ②Proactor模式
    • ③模拟Proactor模式

1.服务器编程基本框架

在这里插入图片描述

模块功能
I/O 处理单元处理客户连接,读写网络数据
逻辑单元业务进程或线程
网络存储单元数据库、文件或缓存
请求队列各单元之间的通信方式
  1. I/O 处理单元是服务器管理客户连接的模块。它通常要完成以下工作:等待并接受新的客户连接,接收客户数据,将服务器响应数据返回给客户端。但是数据的收发不一定在 I/O 处理单元中执行,也可能在逻辑单元中执行,具体在何处执行取决于事件处理模式。
  2. 一个逻辑单元通常是一个进程或线程。它分析并处理客户数据,然后将结果传递给 I/O 处理单元或者直接发送给客户端(具体使用哪种方式取决于事件处理模式)。服务器通常拥有多个逻辑单元,以实现对多个客户任务的并发处理。
  3. 网络存储单元可以是数据库、缓存和文件,但不是必须的。
  4. 请求队列是各单元之间的通信方式的抽象。I/O 处理单元接收到客户请求时,需要以某种方式通知一个逻辑单元来处理该请求。同样,多个逻辑单元同时访问一个存储单元时,也需要采用某种机制来协调处理竞态条件。请求队列通常被实现为池的一部分。

2.两种高效的事件处理模式

服务器程序通常需要处理三类事件:I/O 事件信号定时事件。有两种高效的事件处理模式:ReactorProactor,同步 I/O 模型通常用于实现 Reactor 模式,异步 I/O 模型通常用于实现 Proactor 模式。

①Reactor模式

要求主线程(I/O处理单元) 只负责监听文件描述符上是否有事件发生,有的话就立即将该事件通知工作线程(逻辑单元),将 socket 可读可写事件放入请求队列,交给工作线程处理。除此之外,主线程不做任何其他实质性的工作。读写数据,接受新的连接,以及处理客户请求均在工作线程中完成。

  • 使用同步 I/O(以 epoll_wait 为例)实现的 Reactor 模式的工作流程是:
    1. 主线程往 epoll 内核事件表中注册 socket 上的读就绪事件。
    2. 主线程调用 epoll_wait 等待 socket 上有数据可读。
    3. socket 上有数据可读时, epoll_wait 通知主线程。主线程则将 socket 可读事件放入请求队列。
    4. 睡眠在请求队列上的某个工作线程被唤醒,它从 socket 读取数据,并处理客户请求,然后往 epoll 内核事件表中注册该 socket 上的写就绪事件。
    5. 当主线程调用 epoll_wait 等待 socket 可写。
    6. socket 可写时,epoll_wait 通知主线程。主线程将 socket 可写事件放入请求队列。
    7. 睡眠在请求队列上的某个工作线程被唤醒,它往 socket 上写入服务器处理客户请求的结果。
      在这里插入图片描述

②Proactor模式

Proactor 模式将所有 I/O 操作都交给主线程和内核来处理(进行读、写),工作线程仅仅负责业务逻
辑。

  • 使用异步 I/O 模型(以 aio_readaio_write 为例)实现的 Proactor 模式的工作流程是:
    1. 主线程调用 aio_read 函数向内核注册 socket 上的读完成事件,并告诉内核用户读缓冲区的位置,以及读操作完成时如何通知应用程序(这里以信号为例)。
    2. 主线程继续处理其他逻辑。
    3. socket 上的数据被读入用户缓冲区后,内核将向应用程序发送一个信号,以通知应用程序数据已经可用。
    4. 应用程序预先定义好的信号处理函数选择一个工作线程来处理客户请求。工作线程处理完客户请求后,调用 aio_write 函数向内核注册 socket 上的写完成事件,并告诉内核用户写缓冲区的位置,以及写操作完成时如何通知应用程序。
    5. 主线程继续处理其他逻辑。
    6. 当用户缓冲区的数据被写入 socket 之后,内核将向应用程序发送一个信号,以通知应用程序数据已经发送完毕。
    7. 应用程序预先定义好的信号处理函数选择一个工作线程来做善后处理,比如决定是否关闭 socket
      在这里插入图片描述

③模拟Proactor模式

使用同步 I/O 方式模拟出 Proactor 模式。原理是:主线程执行数据读写操作,读写完成之后,主线程向工作线程通知这一”完成事件“。那么从工作线程的角度来看,它们就直接获得了数据读写的结果,接下来要做的只是对读写的结果进行逻辑处理。

  • 使用同步 I/O 模型(以 epoll_wait为例)模拟出的 Proactor 模式的工作流程如下:
    1. 主线程往 epoll 内核事件表中注册 socket 上的读就绪事件。
    2. 主线程调用 epoll_wait 等待 socket 上有数据可读
    3. socket 上有数据可读时,epoll_wait 通知主线程。主线程socket 循环读取数据,直到没有更多数据可读,然后将读取到的数据封装成一个请求对象并插入请求队列。
    4. 睡眠在请求队列上的某个工作线程被唤醒,它获得请求对象并处理客户请求,然后往 epoll 内核事件表中注册 socket 上的写就绪事件。
    5. 主线程调用 epoll_wait 等待 socket 可写。
    6. socket 可写时,epoll_wait 通知主线程。主线程往 socket 上写入服务器处理客户请求的结果。
      在这里插入图片描述

相关文章:

5.4、服务器编程基本框架和两种高效的事件处理模式

5.4、服务器编程基本框架和两种高效的事件处理模式 1.服务器编程基本框架2.两种高效的事件处理模式①Reactor模式②Proactor模式③模拟Proactor模式 1.服务器编程基本框架 模块功能I/O 处理单元处理客户连接,读写网络数据逻辑单元业务进程或线程网络存储单元数据库、…...

Flink主要有两种基础类型的状态:operator state。

Flink主要有两种基础类型的状态:keyed state 和operator state。 Operator State 对于Operator State(或者non-keyed state),每个operator state绑定到一个并行operator实例上。在Flink中,Kafka Connector是一个使用Operator State的很好的例…...

【vue2】使用vue-admin-template动态添加路由的思路/addRoutes的使用

😉博主:初映CY的前说(前端领域) ,📒本文核心:用原生js实现省市区联动 【前言】在通用的后台管理项目的开发中,不仅仅是会涉及到对表单数据等的增删改查操作还会涉及到一些关于权限管理的问题。我们将基于一个RBAC的思维…...

Python语言中的注释方法应用

Python语言中的注释方法 在Python编程中,与其他编程语言一样,有良好的注释部分,会让你的程序在后续的改进或优化中,变得便利。同时,给自己培养了良好的编程习惯。 在Python语言中,有两种注释方法。 1.单行…...

Google浏览器翻译无法正常使用解决

1.查找可用服务器地址 按WinR键打开运行→输入cmd回车,打开命令提示符→输入ping google.cn 回车。记录一下下图红框里的ip地址,一会要用到 最近自己ping出来的ip可能不能用了,可以尝试用下面的ip 142.251.163.90 142.250.113.90 142.251.…...

ETCD(三)操作指令

1. put put #将给定的key写入到存储 --ignore-lease[false] #使用当前租约更新key --ignore-value[false] #使用当前值更新key --lease"0" # 要附加到key的租约ID(十六进制) --prev-kv[false] # 返回修改前的上一个键值对2. get get #获取给…...

小白学Pytorch系列--Torch.optim API Base class(1)

小白学Pytorch系列–Torch.optim API Base class(1) torch.optim是一个实现各种优化算法的包。大多数常用的方法都已得到支持,而且接口足够通用,因此将来还可以轻松集成更复杂的方法。 如何使用优化器 使用手torch.optim您必须构造一个优化器对象&…...

flac格式如何转mp3,3招帮你搞定

flac格式如何转mp3,3招帮你搞定的方法来啦。当你的音频是flac格式是不是很头疼,又不知道怎么转mp3 。然后网上搜索出很多方法又不知道从哪个下手,是不是很疑惑?那今天就来看看小编推荐的方法吧,一定让你眼前一亮&#…...

Redis入门到入土(day01)

NoSQL概述 为什么用NoSQL 1、单机MySQL的美好年代 在90年代,一个网站的访问量一般不大,用单个数据库完全可以轻松应付! 在那个时候,更多的都是静态网页,动态交互类型的网站不多。 上述架构下,我们来看看…...

JVM垃圾回收GC 详解(java1.8)

目录 垃圾判断算法(你是不是垃圾?) 引用计数法 可达性算法 对象的引用 强引用 软引用 弱引用 虚引用 对象的自我救赎 垃圾回收算法--分代 标记清除算法 复制算法 标记整理法 垃圾处理器 垃圾判断算法(你是不是垃圾&…...

Mybatis-Plus -03 Mybatis-Plus实现CRUD

Mybatis-Plus实现CRUD 1 Insert增加2 ID生成策略3 Delete删除4 逻辑删除5 Update修改6 Select查询 Mybatis-Plus实现CRUD 通用 CRUD 封装**BaseMapper (opens new window)**接口,为 Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器参数 …...

综合能源系统中基于电转气和碳捕集系统的热电联产建模与优化研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

“智慧赋能 强链塑链”|工程物资供应链管理中的数字化应用

工程项目中的供应链管理至关重要 工程建设行业是国民经济的重要支柱之一,虽然在总产值上持续保持增长态势,但近年来行业的利润总额增速已连续多年呈现下降趋势。究其原因,可以大体从两个方面来看:一是行业盈利能力出现下降&#x…...

通过docker发布项目

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言例如:docker项目的发布方式 [docker发布的参考链接](https://www.cnblogs.com/emperorking/articles/11244253.html) 一、docker是什么?…...

为什么Spring和IDEA不推荐使用@Autowired注解?

在Spring开发中,Autowired注解是一个常用的依赖注入方式。但是,你可能会惊奇地发现,Spring和IDEA都不推荐使用Autowired注解。关于这个问题,其实答案相对统一,实际上用大白话说起来也容易理解。 官方答案 首先&#…...

windows下运行dpdk下的helloworld

打开“本地安全策略”管理单元,在搜索框输入secpol。 打开本地策略->用户权限分配->锁定内存页->添加用户或组->高级->立即查找 输入电脑用户名,选择并添加。点击确定后,重启电脑。 安装内核驱动,下载地址https://download.csdn.net/download/qq_36314864…...

【AI理论学习】深入理解Prompt Learning和Prompt Tuning

深入理解Prompt Learning和Prompt Tuning 背景Prompt Learning简介1. Prompt是什么?2. 为什么要使用Prompt?3. Prompt Learning的形式(举例)4. 有哪些Pre-training language model?5. 常见的Prompt Learning的方法 Pro…...

从Authy中导出账户和secret

本文转载于我的博客从Authy中导出账户和secret 前言 因为最近买了CanoKey,所以多算试一下CanoKey的TOTP功能,但是之前一直用的Authy并且它默认不支持导出功能 在网上找了一些文档,终于在github上找到了一个有效且简单的方法 目前网上大部分…...

图像锐度评分算法,方差,点锐度法,差分法,梯度法

图像锐度评分算法,方差,点锐度法,差分法,梯度法 图像锐度评分是用来描述图像清晰度的一个指标。常见的图像锐度评分算法包括方差法、点锐度法、差分法和梯度法等。 方差法:该方法是通过计算图像像素值的方差来评估图像…...

查询练习:连接查询

准备用于测试连接查询的数据: CREATE DATABASE testJoin;CREATE TABLE person (id INT,name VARCHAR(20),cardId INT );CREATE TABLE card (id INT,name VARCHAR(20) );INSERT INTO card VALUES (1, 饭卡), (2, 建行卡), (3, 农行卡), (4, 工商卡), (5, 邮政卡); S…...

3步破解微信记录管理难题:WeChatMsg如何重新定义数字记忆保存?

3步破解微信记录管理难题:WeChatMsg如何重新定义数字记忆保存? 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHu…...

7个必备OpenCore Legacy Patcher技巧:从基础安装到性能优化

7个必备OpenCore Legacy Patcher技巧:从基础安装到性能优化 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一款让老款…...

数聚智连转战港交所:年营收16亿 净利4340万 蓝标与险峰是股东

雷递网 雷建平 4月2日北京数聚智连科技股份有限公司(简称:“数聚智连”)日前递交招股书,准备在港交所上市。数聚智连曾向深交所创业板递交招股书,计划募资8亿元,最终IPO被终止,此番是数聚智连转…...

破解音乐格式限制:ncmdump让加密音频文件重获自由

破解音乐格式限制:ncmdump让加密音频文件重获自由 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump ncmdump是一款专注于网易云音乐加密格式转换的开源工具,能够将NCM格式文件高效转换为MP3、FLAC等通用音频格式…...

NXOpen 方式创建拉伸和预览

//用户代码 #include "ExtrudewithPreview.hpp" #include "NXOpen/Body.hxx" #include "NXOpen/Direction.hxx" #include "NXOpen/DisplayableObject.hxx" #include "NXOpen/DisplayModification.hxx" #include "…...

AgentCPM-Report部署教程:Pixel Epic在Ubuntu/CentOS下的环境配置

AgentCPM-Report部署教程:Pixel Epic在Ubuntu/CentOS下的环境配置 1. 项目介绍 Pixel Epic是一款基于AgentCPM-Report大模型构建的研究报告辅助终端,它将枯燥的科研工作转化为一场像素风格的RPG冒险体验。与传统AI工具不同,Pixel Epic采用了…...

intv_ai_mk11基础教程:打开即用的Llama文本生成器使用全流程详解

intv_ai_mk11基础教程:打开即用的Llama文本生成器使用全流程详解 1. 快速了解intv_ai_mk11 intv_ai_mk11是一个基于Llama架构的中等规模文本生成模型,特别适合日常办公和内容创作场景。想象一下,你有一个随时待命的文字助手,可以…...

远程工作事故树:一次误删库引发的跨国追责

远程协作下的“脆弱”系统深夜,伦敦办公室的数据库工程师在连续工作十二小时后,敲下了一条他以为指向“测试环境”的删除命令。与此同时,上海的测试团队正在为次日的上线进行最后一轮回归验证。六小时后,当阳光照进浦东的办公室&a…...

M2FP在虚拟试衣间的应用:快速识别人体部位,助力电商设计

M2FP在虚拟试衣间的应用:快速识别人体部位,助力电商设计 1. 虚拟试衣间的技术挑战 在电商领域,虚拟试衣技术正在改变用户的购物体验。传统试衣间面临诸多痛点: 用户无法直观看到服装上身效果退换货率高,增加运营成本…...

Ostrakon-VL扫描终端实操手册:档案上传与实时扫描切换技巧

Ostrakon-VL扫描终端实操手册:档案上传与实时扫描切换技巧 1. 像素特工终端简介 Ostrakon-VL扫描终端是一款专为零售与餐饮场景设计的智能图像识别工具。它基于Ostrakon-VL-8B多模态大模型开发,采用独特的8-bit像素艺术风格界面,将枯燥的数…...