首页 > 编程语言 >C++ 知识要点:I/O 模型

C++ 知识要点:I/O 模型

时间:2024-09-21 13:24:10浏览次数:3  
标签:调用 socket epoll 模型 C++ 线程 事件 要点 wait

1. 使用同步 IO 模型实现的 Reactor 模式的工作流程(以 epoll_wait 为例)

在 Reactor 模式中,主线程(也称为事件循环或分发器)负责监听和分发事件,工作线程负责处理具体的业务逻辑。以下是使用 epoll_wait 实现 Reactor 模式的工作流程,详细描述了事件的处理过程:

1. 主线程往 epoll 内核事件表中注册 socket 上的读就绪事件
  • 主线程负责初始化并配置 epoll 实例,将服务器 socket 上的读就绪事件添加到 epoll 监听的事件列表中。
2. 主线程调用 epoll_wait 等待 socket 上有数据可读
  • 主线程执行 epoll_wait 函数,该函数会阻塞等待直到监听的事件列表中有事件发生(如 socket 上有数据可读)。
3. 当 socket 上有数据可读时,epoll_wait 通知主线程
  • 一旦有 socket 上发生读就绪事件(即客户端发送了数据),epoll_wait 会返回并通知主线程。
4. 主线程将 socket 可读事件放入请求队列
  • 主线程接收到事件后,将可读事件及其相关 socket 信息放入到一个线程安全的请求队列中。
5. 睡眠在请求队列上的某个工作线程被唤醒,它从 socket 读取数据,并处理客户请求
  • 工作线程通常会采用线程池的方式实现,它们会睡眠等待请求队列中的任务。当队列中有新任务时,工作线程被唤醒,从 socket 读取数据,处理客户请求。
  • 处理完成后,工作线程会往 epoll 内核事件表中注册该 socket 上的写就绪事件,准备发送响应。
6. 主线程调用 epoll_wait 等待写就绪事件
  • 类似于步骤 2,主线程再次调用 epoll_wait 等待 socket 上有写就绪事件发生。
7. 主线程将 socket 可写事件放入请求队列
  • 当 socket 变为可写(即可以向客户端发送数据时),epoll_wait 通知主线程,主线程将写就绪事件放入请求队列。
8. 睡眠在请求队列上的某个工作线程被唤醒,它往 socket 上写入服务器处理客户请求的结果
  • 工作线程被唤醒后,从请求队列中取出写就绪事件,向 socket 写入处理结果,完成响应。

2. 如何理解阻塞非阻塞与同步异步的区别

阻塞与非阻塞
  • 关注点:程序在等待调用结果(消息,返回值)时的状态。

  • 阻塞调用

    • 在调用结果返回之前,当前线程会被挂起。
    • 调用线程只有在得到结果之后才会返回,继续执行后续代码。
  • 非阻塞调用

    • 在不能立刻得到结果之前,该调用不会阻塞当前线程。
    • 调用会立即返回,并可能通过轮询、回调等方式通知调用者最终结果。
同步与异步
  • 关注点:消息通讯机制。

  • 同步

    • 在发出一个调用时,调用者会主动等待这个调用的结果。
    • 调用只有在得到结果后才会返回,调用者才能继续执行后续操作。
    • 调用者需要显式地等待结果。
  • 异步

    • 调用在发出之后,这个调用就直接返回了,不等待结果。
    • 调用者不会立刻得到结果,而是在未来某个时间点通过状态、通知或回调函数来处理调用结果。
    • 调用者不需要等待结果即可继续执行后续操作。

总结

  • 阻塞与非阻塞主要描述的是等待调用结果时的行为。
  • 同步与异步则关注的是调用者与被调用者之间的通讯机制,特别是结果返回的方式。

标签:调用,socket,epoll,模型,C++,线程,事件,要点,wait
From: https://blog.csdn.net/weixin_45264425/article/details/142028151

相关文章

  • 存储论——报童问题(单周期)订货模型精解
    报童问题(NewsvendorProblem),最早由哈维·莫德里格利亚尼(HarveyM.Wagner)和托马斯·M·怀特(ThomasM.Whitin)于1958年提出,是运筹学中经典的库存管理问题。其名称源于报童的情境描述,即一个报童每天需要决定订购多少份报纸以最大化利润。报童每天面对报纸需求的不确定性,若订购量太少......
  • c++第3课
    #include<bits/stdc++.h>usingnamespacestd;intmain(){ inta=0; a=a+10; a=a+1; cout<<a; return0;}这叫累加,注意,cout<<a;这里不要加括号,不然输出结果会这样子:a这是因为加括号只输出a,而不加括号则输出11。1.取出4123的十位想要取出4123的十位就要用到/和%,......
  • c++算法 枚举———百钱白鸡问题
    前言枚举,是一种最基本的算法思想,通过穷举枚举出所有的可能,再加以比较。枚举算法适用于问题规模较小、解空间可穷举的情况。它的优点是简单直观,不需要复杂的数学推导,易于实现。但是,对于问题规模较大的情况,枚举算法的时间复杂度可能会非常高,效率较低。接下来会介绍两个百钱白......
  • Transformer模型-7- Decoder
    概述Decoder也是N=6层堆叠的结构,每层被分3层:两个注意力层和前馈网络层,同Encoder一样在主层后都加有Add&Norm,负责残差连接和归一化操作。Encoder与Decoder有三大主要的不同:第一层MaskedMulti-HeadAttention:采用Masked操作第二层Multi-HeadAttention:K,V矩阵是......
  • 【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
    文章目录C++类与对象前言读者须知RVO与NRVO的启用条件如何确认优化是否启用?1.按值传递与拷贝省略1.1按值传递的概念1.2示例代码1.3按值传递的性能影响1.3.1完全不优化1.4不同编译器下的优化表现1.4.1VisualStudio2019普通优化1.4.2VisualStudio2022激进......
  • ROS和ROS2借助智能大模型的学习和研究方法
    机器人相关知识的本身和价值-CSDN博客知识本身在智能时代毫无价值,需要基于知识应用和创新才有价值。 学历报废并非来自扩招,而是智能模型的快速发展。-CSDNblink-领先的开发者技术社区 2024年中秋,智能模型实力已经如此,但还有大量朋友笃定旧模-CSDNblink-领先的开发者技......
  • 窗口管理(Stage模型)
    基本概念窗口沉浸式能力:指对状态栏、导航栏等系统窗口进行控制,减少状态栏导航栏等系统界面的突兀感,从而使用户获得最佳体验的能力。沉浸式能力只在应用主窗口作为全屏窗口时生效。通常情况下,应用子窗口(弹窗、悬浮窗口等辅助窗口)无法使用沉浸式能力。悬浮窗:全局悬浮窗口是一种......
  • 前端开发转行AI大模型?应该如何准备面试?面试题+答案来了!!!
    一、初探大模型:起源与发展1、预热篇:解码注意力机制1.1注意力机制最早是在哪个领域得到应用的1.2以下哪些方法被用于处理序列数据?1.3以下方法被用于处理序列数据的是1.4注意力机制是什么2、变革里程碑:transformer的崛起2.1Transformer模型和注意力机制的关系2.......
  • fastsam_pytorch图像分割算法模型
    FastSAM论文FastSegmentAnything模型结构以yolov8-seg的instancesegmentation为基础,检测时集成instancesegmentation分支,主要分为两步全实例分割(allinstanceSegmentation)和基于prompt的mask输出(Prompt-guidedSelection),仅使用了2%的SA-1B数据集便得到了差不多的......
  • asr_onnxruntime语音识别模型,实现speech-to-text的转换
    asr_onnx论文无模型结构算法原理数据集无环境配置在光源可拉取推理的docker镜像,在光合开发者社区可下载onnxruntime安装包。asr_onnx推荐的镜像如下:dockerpullimage.sourcefind.cn:5000/dcu/admin/base/pytorch:2.1.0-ubuntu20.04-dtk24.04.1-py3.10cdasr_onn......