webserver 同步 I/O 模拟 Proactor 模式的工作流程
服务器基本框架、I/O 模型、事件处理模式
一、服务器编程基本框架
二、五种 I/O 模型
![icon-default.png?t=N7T8](https://csdnimg.cn/release/blog_editor_html/release2.3.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=N7T8)
注意:
① 同步I/O: 阻塞I/O,非阻塞I/O,信号驱动I/O和I/O复用
- 指内核向应用程序通知的是就绪事件,比如只通知有客户端连接,要求用户代码自行执行 I/O操作
② 异步I/O
- 指内核向应用程序通知的是完成事件,比如读取客户端的数据后才通知应用程序,由内核完 成I/O操作
三、两种高效的事件处理模式
服务器程序通常需要处理三类事件:I/O 事件、信号及定时事件。
有两种高效的事件处理模式:Reactor 和 Proactor
- 同步 I/O 模型通常用于实现 Reactor 模式
- 异步 I/O 模型通常用于实现 Proactor 模式
① I/O 处理单元是服务器管理客户连接的模块。它通常要完成以下工作:
- 等待并接受新的客户连接,接收客户数据,将服务器响应数据返回给客户端。
- 但是数据的收发不一定在 I/O 处理单元中执行,也可能在逻辑单元中执行,具体在何处执行取决于事件处理模式。
② 一个逻辑单元通常是一个进程或线程。它分析并处理客户数据,然后将结果传递给 I/O 处理单 元或者直接发送给客户端(具体使用哪种方式取决于事件处理模式)。服务器通常拥有多个逻辑单元,以实现对多个客户任务的并发处理。
③ 网络存储单元可以是数据库、缓存和文件,但不是必须的。
④ 请求队列是各单元之间的通信方式的抽象。
I/O 处理单元接收到客户请求时,需要以某种方式通知一个逻辑单元来处理该请求。同样,多个逻辑单元同时访问一个存储单元时,也需要采用某种机制来协调处理竞态条件。请求队列通常被实现为池的一部分。
(1)Reactor 模式
要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将该事件通知工作线程(逻辑单元),将socket可读可写事件放入请求队列,交给工作线程处理。除此之外,主线程不做任何其他实质性的工作。读写数据,接受新的连接,以及处理客户请求均在工作线程中完成。使用同步 I/O(以epoll_wait为例)实现的Reactor模式的工作流程是
- 主线程往 epoll 内核事件表中注册 socket 上的读就绪事件
- 主线程调用 epoll_wait 等待 socket 上有数据可读
- 当 socket 上有数据可读时, epoll_wait 通知主线程。主线程则将 socket 可读事件放入请求队列
- 睡眠在请求队列上的某个工作线程被唤醒,它从 socket 读取数据,并处理客户请求,然后往epoll 内核事件表中注册该 socket 上的写就绪事件
- 当主线程调用 epoll_wait 等待 socket 可写
- 当 socket 可写时,epoll_wait 通知主线程。主线程将 socket 可写事件放入请求队列
- 睡眠在请求队列上的某个工作线程被唤醒,它往 socket 上写入服务器处理客户请求的结果
![](https://img-blog.csdnimg.cn/5f8463638d584010a400d3c5a1c4d708.png)
(2)Proactor 模式
Proactor 模式将所有 I/O操作都交给主线程和内核来处理(进行读、写),工作线程仅仅负责业务逻辑。使用异步I/O模型(以aio_read 和 aio_wirte 为例)实现的Proactor模式的工作流程是:
- 主线程调用 aio_read 函数向内核注册 socket 上的读完成事件,并告诉内核用户读缓冲区的位置,以及读操作完成时如何通知应用程序(这里以信号为例)。
- 主线程继续处理其他逻辑
- 当 socket 上的数据被读入用户缓冲区后,内核将向应用程序发送一个信号,以通知应用程序数据已经可用
- 应用程序预先定义好的信号处理函数选择一个工作线程来处理客户请求。工作线程处理完客户请求后,调用 aio_write 函数向内核注册 socket 上的写完成事件,并告诉内核用户写缓冲区的位置,以及写操作完成时如何通知应用程序
- 主线程继续处理其他逻辑
- 当用户缓冲区的数据被写入 socket 之后,内核将向应用程序发送一个信号,以通知应用程序数据已经发送完毕
- 应用程序预先定义好的信号处理函数选择一个工作线程来做善后处理,比如决定是否关闭 socket
![](https://img-blog.csdnimg.cn/56a399fe6f4944b698fc504e0ba25a39.png)
(3)同步 I/O 模拟 Proactor 模式
使用同步 I/O 方式模拟出 Proactor 模式。原理是:主线程执行数据读写操作,读写完成之后,主线程向工作线程通知这一”完成事件“。那么从工作线程的角度来看,它们就直接获得了数据读写的结果,接下来要做的只是对读写的结果进行逻辑处理。使用同步 I/O 模型(以 epoll_wait为例)模拟出的 Proactor 模式的工作流程如下:
- 主线程往 epoll 内核事件表中注册 socket 上的读就绪事件。
- 主线程调用 epoll_wait 等待 socket 上有数据可读。
- 当 socket 上有数据可读时,epoll_wait 通知主线程。主线程从 socket 循环读取数据,直到没有更多数据可读,然后将读取到的数据封装成一个请求对象并插入请求队列。
- 睡眠在请求队列上的某个工作线程被唤醒,它获得请求对象并处理客户请求,然后往 epoll 内核事件表中注册 socket 上的写就绪事件。
- 主线程调用 epoll_wait 等待 socket 可写。
- 当 socket 上有数据可写时,epoll_wait 通知主线程。主线程往 socket 上写入服务器处理客户请求的结果。
![](https://img-blog.csdnimg.cn/1059a9da59ff446f83e75e50b0fae659.png)
相关文章:
![](https://img-blog.csdnimg.cn/1059a9da59ff446f83e75e50b0fae659.png)
webserver 同步 I/O 模拟 Proactor 模式的工作流程
服务器基本框架、I/O 模型、事件处理模式 一、服务器编程基本框架 虽然服务器程序种类繁多,但其基本框架都一样,不同之处在于逻辑处理。 二、五种 I/O 模型 阻塞/非阻塞、同步/异步(网络IO)_呵呵哒( ̄▽ ̄)&…...
![](https://www.ngui.cc/images/no-images.jpg)
mysql8-基于docker搭建主从同步
一、环境信息 系统版本:CentOS Linux release 7.9.2009 (Core) cat /etc/centos-release Docker版本:Docker version 20.10.6, build 370c289 docker --version Docker-compose版本:Docker Compose version v2.10.2 docker-compose --versio…...
![](https://img-blog.csdnimg.cn/f2010bc4861545939b23d83e0fd28170.png)
智能水表远程控制系统:引领节水新时代
随着科技的不断发展,物联网技术逐渐融入到我们的日常生活中。其中,智能水表远程控制系统成为一项重要创新,对于提高水资源利用率、实现绿色节水具有重要意义。下面小编就来为大家介绍下智能水表远程控制系统吧! 一、智能水表远程控制系统定义…...
![](https://img-blog.csdnimg.cn/img_convert/7fa460da6c3282cf34879ced3578d069.png)
【FusionInsight 迁移】HBase从C50迁移到6.5.1(03)6.5.1上准备Loader
【FusionInsight 迁移】HBase从C50迁移到6.5.1(03)6.5.1上准备Loader HBase从C50迁移到6.5.1(03)6.5.1上准备Loader登录新集群FusionInsight 6.5.1的Manager准备Loader服务准备Loader Role准备Loader User HBase从C50迁移到6.5.1&…...
![](https://www.ngui.cc/images/no-images.jpg)
redis多线程操作
今天更新一个redis多线程操作, 可直接搬运 import redis, os, threading, queue import pandas as pd# 创建一个任务队列 task_queue queue.Queue()def read_excel(folder_path):total_list []for filepath, dirnames, filenames in os.walk(folder_path):for fi…...
![](https://www.ngui.cc/images/no-images.jpg)
OpenCV(十七):拉普拉斯图像金字塔
1.拉普拉斯图像金字塔原理 拉普拉斯图像金字塔是一种多尺度图像表示方法,通过对高斯金字塔进行差分运算得到。它能够提供图像在不同尺度上的细节信息,常用于图像处理任务如图像增强、边缘检测等。 下面是拉普拉斯图像金字塔的原理和步骤: 构…...
![](https://img-blog.csdnimg.cn/54b5c6c957e24fc484a3da8f5740e007.png)
OpenCL编程指南-10.2使用C++包装器API的矢量相加示例
选择OpenCL平台并创建一个上下文 建立OpenCL的第一步是选择一个平台。第2章介绍过,OpenCL使用了ICD模型,其中可以有多个OpenCL实现在一个系统上并存。类似于HelloWorld示例,这个矢量相加程序展示了选择OpenCL平台的一种最简单的方法…...
![](https://img-blog.csdnimg.cn/fac404e32a7446468ac469501a35a124.png)
mysql数据库,字符串使用双引号““导致报错,使用单引号‘‘不报错,Unknown column ‘user-test‘ in ‘where clause‘
文章目录 一、完整报错二、报错数据三、报错原因四、解决方式1、更改执行sql2、更改sql数据校验模式(改为默认校验) 一、完整报错 > 1054 - Unknown column user-test in where clause二、报错数据 SELECT * FROM config_info WHERE config_info.da…...
![](https://img-blog.csdnimg.cn/e78cf7bba4cf4244b80aaca2373f7902.png)
[华为云云服务器评测] 华为云耀云服务器 Java、node环境配置
系列文章目录 第一章 [linux实战] 华为云耀云服务器L实例 Java、node环境配置 文章目录 系列文章目录前言一、任务拆解二、修改密码三、配置安全规则四、远程登录并更新apt五、安装、配置JDK环境5.1、安装openjdk,选择8版本5.2、检查jdk配置 六、安装、配置git6.1、安装git6.2…...
![](https://img-blog.csdnimg.cn/6592ef3c485445a098524046e5282a6d.png)
中企绕道突破封锁,防不胜防 | 百能云芯
韩国的财经媒体Business Korea最新报道指出,尽管美方在《通胀削减法案》(IRA)的补贴中排除了中国,但中国企业正通过多种方式积极应对美国在半导体和电动汽车电池领域的封锁,这包括建立合资企业、设立生产基地以及开展技…...
![](https://img-blog.csdnimg.cn/img_convert/6c9feb33658225b29ce5492f974451c9.jpeg)
动手实践:从栈帧看字节码是如何在 JVM 中进行流转的
Java全能学习面试指南:https://www.javaxiaobear.cn/ 前面我们提到,类的初始化发生在类加载阶段,那对象都有哪些创建方式呢?除了我们常用的 new,还有下面这些方式: 使用 Class 的 newInstance 方法。使用…...
![](https://img-blog.csdnimg.cn/ec1a90a362464f6b881ba306be27a029.png)
PEX装机
目录 一、PXE是什么? 二、PXE的组件: vsftpd/httpd/nfs tftp dhcp 三、配置vsftpd 四、配置tftp 1.安装tftp-server 2.启动tftp 五、准备pxelinx.0文件、引导文件、内核文件 1.准备pxelinux.0文件 2.准备引导文件、内核文件 六、配置dhcp …...
![](https://img-blog.csdnimg.cn/img_convert/b593ca8f7c88b8587c016208ce7d7813.png)
异地远程访问内网BUG管理系统【Cpolar内网穿透】
文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…...
![](https://img-blog.csdnimg.cn/673b2b1677ec43df82a8ad5120e9b89d.png)
论文笔记:一分类及其在大数据中的潜在应用综述
0 概述 论文:A literature review on one‑class classification and its potential applications in big data 发表:Journal of Big Data 在严重不平衡的数据集中,使用传统的二分类或多分类通常会导致对具有大量实例的类的偏见。在这种情况…...
![](https://img-blog.csdnimg.cn/img_convert/abfc2748c59ea14b1e994b24b950f1f9.gif)
下单时如何保证数据一致性?
原创 哪吒 哪吒编程 2023-09-07 08:03 发表于辽宁 收录于合集#Redis11个 (给哪吒编程加星标,提高Java技能) 大家好,我是哪吒。 在前几篇文章中,提到了Redis实现排行榜、Redis数据缓存策略,让我们对Redis…...
![](https://img-blog.csdnimg.cn/45f932026d8e4c8dba735284a2eff7e4.gif#pic_center#pic_center)
【C++ Core Guidelines解析】深入理解现代C++的特性和原理
文章目录 👨⚖️《C Core Guidelines解析》的主要观点👨🏫《C Core Guidelines解析》的主要内容👨💻作者介绍 🌸🌸🌸🌷🌷🌷💐&a…...
![](https://www.ngui.cc/images/no-images.jpg)
Go语言高阶:Reflection反射与Files操作 详细示例教程
目录标题 一、Reflection反射1. What is reflection? 什么是反射2. Inspect a variable and find its type 检查变量并找到它的类型3. Reflect.Type and reflect.Value 反射类型和值4. Reflect.Kind 查看底层种类5. NumField() and Field() methods 字段数量和索引值方法6. In…...
![](https://img-blog.csdnimg.cn/img_convert/b3cb938780356fe7b027eed835437f18.png)
谷歌seo技术流
很多外贸企业和独立站都想从Google获得免费的流量,也就是SEO流量,但是在做SEO的过程中,总会面临这样或那样的问题。米贸搜谷歌推广将这些问题总结如下: 既然SEO看起来似乎很难,但还是有很多电商公司愿意投资SEO&#x…...
![](https://www.ngui.cc/images/no-images.jpg)
ReactiveUI MVVM框架(1)-Collections
ReactiveUI MVVM框架(1)-Collections ReactiveUI使用动态数据(DynamicData)用于集合的操作。 当对动态数据集合进行更改时,会产生更改通知,通知表示为ChangeSet,里面包含了更改信息࿰…...
![](https://img-blog.csdnimg.cn/b7c473b2755a43f9a665da03a5378262.png#pic_center)
【微服务】五. Nacos服务注册
Nacos服务注册 5.1 Nacos服务分级存储模型Nacos服务分级存储模型:服务集群属性:总结: 5.2 根据集群负载均衡总结 5.3 Nacos服务实例的权重设置总结: 5.6 环境隔离namespace总结 5.7 Nacos和Eureka的对比总结 5.1 Nacos服务分级存储…...
![](https://img-blog.csdnimg.cn/993a12f0ccef41eba0f69108c72551a6.png)
Lnmp架构-Redis
网站:www.redis.cn redis 部署 make的时候需要gcc和make 如果在纯净的环境下需要执行此命令 [rootserver3 redis-6.2.4]# yum install make gcc -y 注释一下这几行 vim /etc/redis/6739.conf 2.Redis主从复制 设置 11 是master 12 13 是slave 在12 上 其他节…...
![](https://www.ngui.cc/images/no-images.jpg)
Python 二进制数据处理与转换
不得不说,Python能火是有原因的,物联网开发中常用的数据处理方式,Python都有内置的函数或方法,相当方便,官方文档见二进制序列类型,下面是一些示例代码 string Hello World! # 字符串转二进制数据 data …...
![](https://img-blog.csdnimg.cn/img_convert/77c5aeeb7991413b31e89bb36b445e51.jpeg)
【LeetCode】297.二叉树的序列化与反序列化
题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序列化…...
![](https://img-blog.csdnimg.cn/31da7fa157434557a2c01ab0514e9b31.png)
Java HashSet
HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。 HashSet 允许有 null 值。 HashSet 是无序的,即不会记录插入的顺序。 HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的。 您必…...
![](https://img-blog.csdnimg.cn/75364124d304403ea3e5fb2fdd7882d6.png#pic_center)
在iPhone上构建自定义数据采集完整指南
在iPhone上构建自定义数据采集工具可以帮助我们更好地满足特定需求,提高数据采集的灵活性和准确性。本文将为您提供一份完整的指南和示例代码,教您如何在iPhone上构建自定义数据采集工具。 自定义数据采集工具的核心组件 a、数据模型 数据模型是数据采…...
![](https://www.ngui.cc/images/no-images.jpg)
Android MediaRecorder录音
1. 简介 在android中录制音频有两种方式,MediaRecorder和AudioRecord。两者的区别如下: MediaRecorder 简单方便,不需要理会中间录制过程,结束录制后可以直接得到音频文件进行播放;录制的音频文件是经过压缩的&#…...
![](https://img-blog.csdnimg.cn/img_convert/99c254e197fcc765a9d7b38b609d90db.jpeg)
软件提示vcruntime140_1.dll丢失的解决方法,以及丢失的原因总结
在运行某些程序时,可能会出现“vcruntime140_1.dll 丢失”的错误提示。这是因为 vcruntime140_1.dll 是 Visual C Redistributable 的一部分,它通常被安装在 Windows 操作系统上。如果该文件丢失或无法找到,可能会导致程序无法正常运行。在我…...
![](https://img-blog.csdnimg.cn/ac28e549c3a7416dbb9cab7881db07d3.png)
Datax抽取mysql的bit类型数据
背景:使用datax抽取mysql的一张表,里面有两个bit类型的字段,抽取出来显示如下: 需要在抽取reader里面进行处理配置 最终生成的datax的json文件reader的配置会转换为具体的数值 最终查询效果:...
![](https://img-blog.csdnimg.cn/b054d2813894465da0a50c0f9063b4e4.png)
git 后悔药
前言 自上而下,撤销可以分为从远程库撤销,从本地库撤销,从暂存库撤销。 例子:代码已经提交了三个记录到远程库,分别对应了记录1,内容1,记录2,内容2,记录3,内…...
![](https://img-blog.csdnimg.cn/e774f41eadae4609879aacb910eb91b8.png#pic_center)
vue-cli搭建一个新项目及基础配置
vue-cli搭建一个新项目及基础配置 一、安装步骤二、main.js配置三、router下的index.js 一、安装步骤 1.安装node环境:下载地址:Node.js 2.安装脚手架:npm install -g vue/cli 3.创建vue项目:vue create 项目名 4.进入项目&…...
![](https://img-blog.csdnimg.cn/20181201195738481.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1OTY1MDkw,size_16,color_FFFFFF,t_70)
网站建设时间计划/百度指数关键词未收录怎么办
最近在工作中会经常遇到关于中间件weblogic的一些操作和使用,公司里一般啊都会有统一的平台供大家使用,非常快速便捷,然而当我们自己想玩的时候,就需要在自己的电脑上安装weblogic,今天就给大家分享一下安装的详细步骤…...
![](/images/no-images.jpg)
dede网站后台导入文档/如何刷seo关键词排名
传送门:bzoj2989 题解 二进制分组-CA 欧几里得距离转成曼哈顿距离(x,y),(xy,x−y)(x,y),(xy,x-y)(x,y),(xy,x−y)之后问题就变成了每次给一个点1,询问某个矩形范围内的总值。 通常方法是cdqcdqcdq,二进制分组可以解决强制在线的限制。 具体来说&…...
![](https://s1.51cto.com/images/blog/201801/10/9fc3755bf145aa725f2b36a8e029f91b.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
小公司网站如何做/浙江seo技术培训
今天东哥想用Scorpio Pro 5查一下猪场某人邮箱的密码,发现不太好使。决定自己写个自己用。代码如下 #!/usr/bin/python #-*- coding:utf-8 -*- #输入这一条就可以在Python脚本里面使用汉语注释!此脚本可以直接复制使用;while True: …...
![](https://img-blog.csdnimg.cn/img_convert/db8246b8f210fc13cc2c09ef7ef96b2b.png)
深圳专业做网站排名公司哪家好/青岛seo网站排名优化
文|智能相对论 作者|沈浪 百年风雨,世事更迭。 当汽车作为全新的交通工具登上历史的舞台,那时候的我们还沉浸在盲目的封建自足之中,因此错失了一个时代的浪潮。自此,在往后的百年时间内,尽管中国奋力直追࿰…...
![](https://www.linuxidc.com/upload/2016_09/160927212571305.png)
网站建设方案及预算/搜狗关键词排名此会zjkwlgs
前言 记录一下Linux CentOS 7安装Tomcat7的完整步骤。 下载 首先需要下载tomcat7的安装文件,地址如下: http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.69/bin/apache-tomcat-7.0.69.tar.gz 安装与配置 安装之前需要确保已经安装JDK,…...
![](https://img-blog.csdnimg.cn/img_convert/e5d0dde96debf004d113a4b4c2dcc8a9.png)
北京智能网站建设制作/广州seo代理
上一篇我们主要学习了一维数组的操作,现实场景中,一维数组往往无法满足需要,本关将学习略微复杂的多维数组。多维数组一维数组只有行,二维数组相比一维数组多了列这个维度,而三维数组则类似多个二维数组堆叠在一起&…...