服务器模型 Reactor 和 Proactor

2024-09-06 16:20

本文主要是介绍服务器模型 Reactor 和 Proactor,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Proactor

image.png

image.png

具体流程如下:

  1. 处理器发起异步操作,并关注 IO 完成事件;
  2. 事件分离器等待操作完成事件;
  3. 分离器等待过程中,内核并行执行实际的 IO 操作,并将结果存储入用户自定义的缓冲区,最后通知事件分离器读操作完成;
  4. IO 完成后,通过事件分离器呼唤处理器;
  5. 事件处理器处理用户自定义的缓冲区中的数据

Proactor 的所有 IO 操作都交给系统提供的异步 IO 接口去执行。工作线程值负责业务逻辑。在 Proactor 中,用户函数启动一个异步的文件操作。同时将这个操作注册到多路复用器上。多路复用器并不关心文件是否可读或可写,而是关系这个异步读操作是否完成步操作是操作系统完成,用户程序不需要关心。多路复用器等待直到有完成通知到来。当操
作系统完成了读文件操作将读到的数据复制到了用户先前提供的缓冲区之后,通知多路
复用器相关操作已完成。多路复用器再调用相应的处理程序,处理数据。

Reactor

image.png

Reactor 模式是处理并发 IO 必将常见的一种模式,用于同步 IO,中心思想是将所有要处理的 IO 事件都注册到一个中心 IO 多路复用器上,同时主线程/进程阻塞在多路复用器上;一旦有 IO 事件到来回事准备就绪,多路复用器返回并将事先注册的相应 IO 事件分发到对应的处理器中。

Reactor 模型有三个重要组件:

  • 多路复用器:由操作系统提供;
  • 事件分发器:将多路复用器中返回的就绪事件分到对应的处理函数中;
  • 事件处理器:负责处理特定事件的处理函数。

image.png

具体流程如下:

  1. 注册读就绪事件和相应的时间处理器;
  2. 事件分离器等待事件
  3. 事件到来,激活分离器,分离器调用事件对应的处理器;
  4. 事件处理器完成实际读操作,处理读到的数据,注册新事件,然后返还控制权。

Reactor 模式是编写高性能网络服务器的必备技术之一,它具有如下的优点:

  • 响应快,不必为单个同步时间所阻塞,虽然 Reactor 本身依然是同步的;
  • 编程相对简单,可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进
    程的切换开销;
  • 可扩展性,可以方便的通过增加 Reactor 实例个数来充分利用 CPU 资源;
  • 可复用性,reactor 框架本身与具体事件处理逻辑无关,具有很高的复用性;

在 Reactor 模式中,一个单独的线程(通常称为主循环或事件循环)负责处理所有的输入输出事件,并通过事件分发器将这些事件分派给相应的处理器。由于只有一个线程负责处理所有事件,因此在多核系统上使用 Reactor 模式可能会面临以下挑战:

  1. 线程同步问题:在多核系统上,不同的 CPU 核心可以同时执行不同的线程。当多个线程同时访问共享数据时,需要进行适当的同步机制来保证数据的一致性和避免竞态条件。
  2. 线程间切换开销:在多核系统上,如果使用 Reactor 模式实现时每个连接都对应一个线程,则可能会创建大量的线程。线程之间频繁地切换会引入额外的开销,并可能导致系
  3. 调度和负载均衡:在多核系统上使用 Reactor 模式时,需要考虑如何合理地分配任务给各个 CPU 核心以达到负载均衡。否则,某些 CPU 核心可能会过载而其他核心处于闲置状态。

这篇关于服务器模型 Reactor 和 Proactor的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1142512

相关文章

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

CentOS 7部署主域名服务器 DNS的方法

《CentOS7部署主域名服务器DNS的方法》文章详细介绍了在CentOS7上部署主域名服务器DNS的步骤,包括安装BIND服务、配置DNS服务、添加域名区域、创建区域文件、配置反向解析、检查配置... 目录1. 安装 BIND 服务和工具2.  配置 BIND 服务3 . 添加你的域名区域配置4.创建区域

Windows Server服务器上配置FileZilla后,FTP连接不上?

《WindowsServer服务器上配置FileZilla后,FTP连接不上?》WindowsServer服务器上配置FileZilla后,FTP连接错误和操作超时的问题,应该如何解决?首先,通过... 目录在Windohttp://www.chinasem.cnws防火墙开启的情况下,遇到的错误如下:无法与

Windows server服务器使用blat命令行发送邮件

《Windowsserver服务器使用blat命令行发送邮件》在linux平台的命令行下可以使用mail命令来发送邮件,windows平台没有内置的命令,但可以使用开源的blat,其官方主页为ht... 目录下载blatBAT命令行示例备注总结在linux平台的命令行下可以使用mail命令来发送邮件,Win

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

Ubuntu 22.04 服务器安装部署(nginx+postgresql)

《Ubuntu22.04服务器安装部署(nginx+postgresql)》Ubuntu22.04LTS是迄今为止最好的Ubuntu版本之一,很多linux的应用服务器都是选择的这个版本... 目录是什么让 Ubuntu 22.04 LTS 变得安全?更新了安全包linux 内核改进一、部署环境二、安装系统

nginx配置多域名共用服务器80端口

《nginx配置多域名共用服务器80端口》本文主要介绍了配置Nginx.conf文件,使得同一台服务器上的服务程序能够根据域名分发到相应的端口进行处理,从而实现用户通过abc.com或xyz.com直... 多个域名,比如两个域名,这两个域名其实共用一台服务器(意味着域名解析到同一个IP),一个域名为abc

pycharm远程连接服务器运行pytorch的过程详解

《pycharm远程连接服务器运行pytorch的过程详解》:本文主要介绍在Linux环境下使用Anaconda管理不同版本的Python环境,并通过PyCharm远程连接服务器来运行PyTorc... 目录linux部署pytorch背景介绍Anaconda安装Linux安装pytorch虚拟环境安装cu