首页 > 其他分享 >【Proactor模型】事件驱动模型 - Proactor模型简述

【Proactor模型】事件驱动模型 - Proactor模型简述

时间:2023-07-08 22:22:33浏览次数:45  
标签:异步 Reactor read 模型 事件驱动 内核 Proactor 数据

Proactor模型

Reactor是非阻塞同步网络模式,而Proactor是异步网络模式。

阻塞I/O:当程序执行read,线程会被阻塞,一直等到内核数据准备好,并把数据从内核缓冲区拷贝到应用程序的缓冲区中,当拷贝过程完成,read才会返回。阻塞等待的是"内核数据准备好"和"数据从内核态拷贝到用户态"这两个过程。

img

非阻塞I/O:非阻塞I/O的read请求在数据未准备好的情况下立即返回,可以继续向下执行,此时应用程序不断轮询内核,直到数据准备好,内核将数据拷贝到应用程序缓冲区,read调用才回去到结果。

img

这里最后一次read调用,获取数据的过程,是一个同步的过程,是需要等待的过程。这里的同步是指从内核态的数据拷贝到用户程序的缓存区这个过程

socket不做任何设置的话,默认是阻塞I/O,当设置了O_NONBLOCK彪子,就表示使用的是非阻塞I/O的方式访问。

而无论read和send是阻塞I/O,还是非阻塞I/O,都是同步调用,因为在read调用时,内核将数据从内核空间拷贝到用户空间都是需要等待的,这个过程是同步的,如果内核实现的拷贝效率不高,read调用就会在这个同步过程中等待比较长的时间。

异步I/O:真正的异步I/O应该是内核数据准备好数据从内核态拷贝到用户态这两个过程都不用等待

当发起aio_read(异步I/O)之后,就立即返回,内核会自动从内核空间拷贝到用户空间,这个拷贝过程同样是异步的,内核自动完成的,和前面的同步操作不一样,应用程序不需要主动发起拷贝动作。

img

Proactor正是采用了异步I/O模型,所以被称为异步网络模型。

Proactor模型和Reactor模型的异同

  • Reactor是非阻塞同步网络模式,感知的是就绪可读写事件。在每次感知到有事件后,就需要应用进行主动调用read方法来完成数据的读取,也就是要应用进程主动将socket接收缓存中的数据读到应用进程内存中,这个过程是同步过程,读完数据后应用进程才能处理数据。

  • Proactor是异步网络模式,感知的是已完成的读写事件。再发起异步读写请求时,需要传入数据缓冲区的地址(用于存放结果数据)等信息,这样系统内核才可以自动把数据的读写工作完成,这里的读写工作全部由操作系统来做,并不需要像Reactor那样还需要应用进程主动发起read/write来读写数据,操作系统完成读写工作后,会通知应用进程直接处理数据。

Reactor模式可以理解为:来了事件操作系统通知应用进程,让应用进程来处理。

Proactor模式可以理解为:来了事件操作系统来处理,处理完再通知应用进程。

无论是Reactor,还是Proactor都是一种基于事件分发的网络编程模式,区别在于Reactor模式是基于待完成的I/O事件,而Proactor模式是基于已完成的I/O事件。

Proactor模式示意图:

img

Proactor模式的工作流程:

  • Proactor Initiator 负责创建 Proactor 和 Handler 对象,并将 Proactor 和 Handler 都通过 Asynchronous Operation Processor 注册到内核;
  • Asynchronous Operation Processor 负责处理注册请求,并处理 I/O 操作;
  • Asynchronous Operation Processor 完成 I/O 操作后通知 Proactor;
  • Proactor 根据不同的事件类型回调不同的 Handler 进行业务处理;
  • Handler 完成业务处理;

但是Linux下的异步I/O是不完善的,aio系列函数是由POSIX定义的异步操作接口,不是整整的操作系统级别支持的,而是在用户空间模拟出来的异步,并且仅仅支持基于本地文件的aio异步操作,网络编程中的socket是不支持的,这也使得基于Linux的高性能网络程序都是使用Reactor方案。

而 Windows 里实现了一套完整的支持 socket 的异步编程接口,这套接口就是 IOCP,是由操作系统级别实现的异步 I/O,真正意义上异步 I/O,因此在 Windows 里实现高性能网络程序可以使用效率更高的 Proactor 方案。

从效率角度, 而 Windows 里实现了一套完整的支持 socket 的异步编程接口,这套接口就是 IOCP,是由操作系统级别实现的异步 I/O,真正意义上异步 I/O,因此在 Windows 里实现高性能网络程序可以使用效率更高的 Proactor 方案。 不过,无论是 Reactor,还是 Proactor,都是一种基于「事件分发」的网络编程模式,区别在于 Reactor 模式是基于「待完成」的 I/O 事件,而 Proactor 模式则是基于「已完成」的 I/O 事件。












参考文章:

https://www.zhihu.com/question/26943938

标签:异步,Reactor,read,模型,事件驱动,内核,Proactor,数据
From: https://www.cnblogs.com/Wangzx000/p/17537989.html

相关文章

  • 【Reactor模型】事件驱动模型 - Reactor模型简述
    Reactor模式Reactor模式是非阻塞同步网络模式,主要由Reactor和处理资源池这两个核心部分组成,负责:Reactor负责监听和分发事件,事件类型包含连接事件,读写事件;处理资源池负责处理事件,如read->处理逻辑->sendReactor模式是灵活多变的,可以应对不同的业务场景,灵活在于:Reactor的数......
  • 用 AIGC 重构后的智能客服,能否淘到大模型时代的第一桶金?
    ChatGPT的诞生打响了现代AI军备竞赛的第一枪。以GPT-4、ChatGTP、Bard等为代表的大语言模型在全球各界引起了广泛关注。结合ChatGPT的底层技术逻辑,未来中短期内ChatGPT产业化的方向大致有四类:即智能客服、文字模态的AIGC应用、代码开发相关工作以及图像生成。其中,最适......
  • Meta 正式开源音乐生成模型 MusicGen
    导读Meta近日在Github上开源了其音乐生成模型MusicGen。据介绍,MusicGen主要用于音乐生成,它可以将文本和已有的旋律转化为完整乐曲。该模型基于谷歌2017年推出的Transformer模型。研发团队表示:“我们使用了20000小时的授权音乐来对训练该模型,并采用Meta的EnC......
  • C++之内存模型
    背景C++内存模型是C++程序中内存管理和数据存储的基础。了解C++内存模型的概念和运作机制对于编写高效、安全的C++代码至关重要。本文将详细介绍C++内存模型的基本概念、内存分配策略以及与其相关的代码示例。C++内存模型的基本概念C++内存模型主要包括以下几个部分:静态存储......
  • Cesium学习笔记3——加载倾斜摄影模型
    本地的3dtiles模型采用ContextCapture19生成. 利用Cesium实验室V3.08对OSGB格式转换到3dtiles,得到的结果加载时老是报TypeError:Cannotreadpropertiesofundefined(reading'updateTransform')错误。没搞明白为啥,不过3dtiles文件夹层级目录的命名应该从以前到现在发生了......
  • R语言时间序列TAR阈值自回归模型|附代码数据
    原文链接:http://tecdat.cn/?p=5231最近我们被客户要求撰写关于时间序列TAR阈值自回归的研究报告,包括一些图形和统计输出。为了方便起见,这些模型通常简称为TAR模型这些模型捕获了线性时间序列模型无法捕获的行为,例如周期,幅度相关的频率和跳跃现象。Tong和Lim(1980)使用阈值模型表......
  • 行行AI人才直播第8期:新加坡国立大学在读博士生张傲《多模态大语言模型(MLLM)的简介及
    随着ChatGPT在各领域展现出非凡能力,多模态大型语言模型(MLLM)近来也成为了研究的热点,它利用强大的大型语言模型(LLM)作为“大脑”,可以执行各种多模态任务。更让人感慨的是,MLLM展现出了传统方法所不具备的能力,比如能够根据图像创作故事,无需OCR的数学推理等,这为实现人工智能的通用......
  • 基于MRPC的BERT模型实战
    目录1.数据处理(1)对每句话进行分词操作(2)对每句话进行编码操作2.创建模型(1)定义模型(2)构建BERT模型embedding层(3)词根据uncased_L-12_H-768_A-12预训练模型把8*128=1024个词映射成768维向量(4)加入额外编码特征(type_id)(5)加入位置编码特征3.transformer结构(1)self-attention......
  • NLP应用 | 保存checkpoint模型
    需求描述:当我们训练模型的时候,我们要训练很多训练步数,我们想要保存训练到一定阶段的checkpoint模型参数,并把这些checkpoint模型保存到一个指定的文件夹下。在文件夹下我们最多保存keep_checkpoint_max个checkpoint模型的文件。保存到output文件夹下。每save_checkpoint_steps步去......
  • 可视化模型地址
    https://github.com/zhangti0708/bigdata-exampleshttps://github.com/iGaoWei/BigDataView......