webserver 同步 I/O 模拟 Proactor 模式的工作流程

news2024/12/22 22:35:12

一、服务器编程基本框架

虽然服务器程序种类繁多,但其基本框架都一样,不同之处在于逻辑处理。

二、两种高效的事件处理模式

服务器程序通常需要处理三类事件I/O 事件、信号及定时事件

有两种高效的事件处理模式:ReactorProactor

  • 同步 I/O 模型通常用于实现 Reactor 模式
  • 异步 I/O 模型通常用于实现 Proactor 模式

① I/O 处理单元是服务器管理客户连接的模块。它通常要完成以下工作:

  • 等待并接受新的客户连接,接收客户数据,将服务器响应数据返回给客户端。
  • 但是数据的收发不一定在 I/O 处理单元中执行,也可能在逻辑单元中执行,具体在何处执行取决于事件处理模式。

② 一个逻辑单元通常是一个进程或线程。它分析并处理客户数据,然后将结果传递给 I/O 处理单  元或者直接发送给客户端(具体使用哪种方式取决于事件处理模式)。服务器通常拥有多个逻辑单元,以实现对多个客户任务的并发处理。
③ 网络存储单元可以是数据库、缓存和文件,但不是必须的。
④ 请求队列是各单元之间的通信方式的抽象。

I/O 处理单元接收到客户请求时,需要以某种方式通知一个逻辑单元来处理该请求。同样,多个逻辑单元同时访问一个存储单元时,也需要采用某种机制来协调处理竞态条件请求队列通常被实现为池的一部分。

(1)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 上写入服务器处理客户请求的结果

(2)Proactor模式

Proactor 模式将所有 I/O操作都交给主线程和内核来处理(进行读、写),工作线程仅仅负责业务逻辑。使用异步I/O模型(以aio_readaio_wirte 为例)实现的Proactor模式的工作流程是:

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

(3)模拟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 上写入服务器处理客户请求的结果。
同步 I/O 模拟 Proactor 模式的工作流程

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

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

相关文章

视频监控汇聚平台EasyNVR安防视频平台如何利用视频监控与AI智能识别技术,实现铁塔基站机房的无人值守方案

安防监控EasyNVR可视化视频汇聚管理系统已在全国多地落地部署,视频集中存储EasyNVR平台可提供多协议(RTSP/RTMP/GB28181/海康Ehome/大华/海康SDK等)的设备视频接入、采集、处理、分发、AI智能检测等服务。平台可以有效解决通信铁塔各基站机房…

redhat7.6安装weblogic12c

目录 一、环境准备 二、使用root创建用户和组 三、创建部署目录 四、上传安装包 五、创建 oraInst.loc 文件 六、创建wls.rsp 响应文件 七、进行安装 八、使用 wlst.sh 离线模式创建一个域 九、启动服务 十、浏览器访问 一、环境准备 REDHAT版本:Redhat…

TheRouter 框架原理

TheRouter 框架入口方法 通过InnerTheRouterContentProvider 注册在AndroidManifest.xml中&#xff0c;在应用启动时初始化 <application><providerandroid:name"com.therouter.InnerTheRouterContentProvider"android:authorities"${applicationId}.…

基于SSM的医院门诊预约挂号系统的设计与

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着医院管理的日益复…

【2023最新版】DataGrip安装及使用教程

目录 一、Jetbrains学生认证 二、DataGrip下载及安装 1. 使用Jetbrains toolbox a. 安装Jetbrains toolbox b. 安装DataGrip 2. 直接安装 a. 官网下载 b. 安装 三、DataGrip的使用 1. 配置默认设置 2. 安装插件 一、Jetbrains学生认证 JetBrains学生认证是JetBrain…

LeetCode 1004.最大连续1的个数

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 硬往题目介绍上边去想的话其实非常困难&#xff0c;如果换种方式思考就会简单许多。 若我们将思想转化为&#xff0c;找出最长的子串(里面含有的0的数量最大为k)&#xff0c;然后返…

WebDAV之π-Disk派盘 + 天天

天天是一款非常简单实用的每日打卡助手,旨在帮助用户制定和跟踪每日或每周的打卡任务,同时提供了自由的选择空间以适应用户的不同需求和偏好。 以下是天天应用的一些主要特性和功能: 1. 优美简洁的用户界面:没有广告,无需网络,可以离线使用,应用大小极小,仅需不到1MB的…

【网络教程】GitHub搜索技巧大揭秘

文章目录 1. 使用关键词优化搜索2. 结合布尔运算符3. 利用星号扩展搜索4. 高级搜索语法5. 按照星标数量搜索6. 使用文件类型搜索7. 在特定分支上搜索8. 使用文件名搜索9. 搜索贡献者10. 使用标签筛选仓库在开发过程中,我们经常需要在GitHub上查找代码、库或相关文档。本文将介…

SNMP的监控

SNMP的监控 一、SNMP 介绍1.1 什么是SNMP1.2 SNMP的组件1.2.1 网络管理系统 NMS&#xff08;Network Management System&#xff09;1.2.2 代理进程&#xff08;Agent&#xff09;1.2.3 被管对象&#xff08;Managed Object&#xff09;1.2.4 管理信息库MIB&#xff08;Managem…

Vue3【Provide/Inject】

前言 自从使用了Provide/Inject代码的组织方式更加灵活了&#xff0c;但是这个灵活性的增加伴随着代码容错性的降低。我相信只要是真的在项目中引入Provide/Inject的同学&#xff0c;一定一定有过或者正在经历下面的状况&#xff1a; 注入名&#xff08;Injection key&#x…

第二证券:经济利好,联储“利空”

当地时刻9月6日&#xff0c;美股接连9月低迷局面&#xff0c;三大指数低开低走团体收跌。 宏观经济数据方面&#xff0c;美国8月ISM非制造业PMI意外升至半年新高&#xff0c;接连八个月扩张&#xff0c;工作指数升至2021年11月来最高&#xff0c;新订单指数也创六个月新高&…

NATAPP内网穿透之接口测试

下载 工具下载 下载对应系统版本的软件&#xff1a; NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 认证文件下载 使用本地配置文件config.ini - NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 解压完之后&#xff0c;将配置文件放到解压后的文件夹中 申请免费隧…

[Linux]文件系统

[Linux]文件系统 文件系统是操作系统的一部分&#xff0c;负责组织、存储和管理存储在外部设备上的文件和目录&#xff0c;也就是操作系统管理外设中的文件的策略。本文讲解的是Ext2文件系统。Linux操作系统使用的就是Ext系列的文件系统。 文章目录 [Linux]文件系统了解磁盘结构…

集美大学计算机改考408!福建省全面改考,仅剩一个自命题院校

9月5日&#xff0c;集美大学发布通知&#xff0c;0835软件工程、0854电子信息2024考试科目发生变更&#xff01;由822数据结构调整为408计算机学科专业基础 https://zsb.jmu.edu.cn/info/1532/4701.htm 直接由一门改为考四门&#xff0c;难度升级不小。 目前福建省内计算机考…

23年下半年软考系统集成(中项)报名已开始!

2023下半年软考考试报名今日播报如下&#xff1a; 【新增报名地区】宁夏 【正在报名地区】辽宁、江西、新疆、新疆兵团、内蒙古、河北、西藏、山东、云南、河南、河北、西藏、山东、云南、河南、江苏、黑龙江、大连、广东、海南、四川、宁夏 为什么现在报名系统集成项目管理工程…

redis 配置与优化

目录 一、关系数据库和非关系型数据库 二、关系型数据库和非关系型数据库区别 三、非关系型数据库产生背景 四、redis 1、概念 2、redis的优点 3、redis为什么这么快 五、redis安装与配置 一、关系数据库和非关系型数据库 关系型数据库&#xff1a;关系型数据库是一个结…

防雷检测的作用和意义

防雷检测是指对建筑物的雷电防护装置进行检测的活动&#xff0c;其目的是确定防雷装置是否符合国家标准或行业标准、设计文件的要求&#xff0c;查出事故隐患&#xff0c;防止或减少雷电灾害事故的发生。防雷检测是防雷工程的重要组成部分&#xff0c;也是保障建筑物安全运行的…

作为产品经理,有必要考PMP或者NPDP么?

产品经理的核心竞争力是什么? 三点&#xff1a;知识、能力和决策 懂得越多&#xff0c;能力越强&#xff0c;决策越正确&#xff0c;核心竞争力越强。一般来说&#xff0c;看的越多&#xff0c;做的越多&#xff0c;实践出经验才是王道&#xff0c;但是&#xff0c;总有看不…

postgresql数据库定时备份到远程数据库

postgresql数据库定时备份到远程数据库 1.老规矩&#xff0c;服务器目录结构: conf目录无内容 profile: # /etc/profile: system-wide .profile file for the Bourne shell (sh(1)) # and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).if [ "id -u"…

uView实现全屏选项卡

// 直接复制粘贴即可使用 <template><view><view class"tabsBox"><u-tabs-swiper ref"uTabs" :list"list":current"current"change"tabsChange":is-scroll"false"></u-tabs-swiper&g…