[Linux][网络][高级IO][一][五种IO模型][同步通信][异步通信][非阻塞IO]详细讲解

news2024/7/6 18:21:20

目录

  • 0.预备知识 && 思考问题
  • 1.五种IO模型
    • 0.形象理解五种模型
    • 1.阻塞IO
    • 2.非阻塞IO
    • 3.信号驱动IO
    • 4.多路转接/多路复用
    • 5.异步IO
  • 2.高级IO重要概念
    • 1.同步通信 vs 异步通信
    • 2.阻塞 vs 非阻塞
  • 3.非阻塞IO
    • 1.fcntl()
    • 2.实现SetNonBlock


0.预备知识 && 思考问题

  • 网络通信本质:IO
  • IO效率问题:效率一定是非常低下的
  • IO为什么低效?
    • 在read/recv时,如果底层缓冲区没有数据,recd/recv会怎么办?
      • 阻塞 --> 等
    • 在read/recv时,如果底层缓冲区有数据,read/recv会怎么办?
      • 拷贝数据
    • 综上:IO = 等 + 数据拷贝
  • 何为低效的IO?
    • 单位时间内,大部分时间IO类接口都处于等的状态
  • 如何提高IO效率,使之高效?
    • 单位时间内,让等的比重变得越低,IO的效率就越高

1.五种IO模型

0.形象理解五种模型

  • 将五种模型抽象为钓鱼中的五种模式
    • **阻塞IO:**一直盯着鱼竿,直到鱼上钩
    • **非阻塞IO:**没事看两眼,看到有鱼就拉杆,其余时间做自己的事情
    • **信号驱动IO:**鱼竿上放个铃铛,若有鱼上钩,则铃铛会响,听到铃铛响则拉杆,其余时间做自己的事情
    • **多路转接:**一次性布置100个钓竿,同时吊,哪里上钩则到哪里拉杆
    • **异步IO:**让别人帮自己钓鱼,自己直接拿别人的成果
  • 其中效率最高的是多路转接
    • 单位时间内,等的比重是非常低的
  • **同步IO和异步IO区别:**有没有参与IO细节 --> [参与等/参与拷贝/同时都参与]
    • 除了异步IO,其余的都是同步IO

1.阻塞IO

  • 在内核将数据准备好之前,系统调用会一直等待,所有的套接字,默认都是阻塞方式
  • 阻塞IO是最常见的IO模型

请添加图片描述

2.非阻塞IO

  • 如果内核还未将数据准备好,系统调用仍然会直接返回,并且返回EWOULDBLOCK错误码
  • 非阻塞IO往往需要程序员以循环的方式反复尝试读写文件描述符,这个过程称为轮询
    • 这对CPU来说是较大的浪费,一般只有特定场景下才使用
      请添加图片描述

3.信号驱动IO

  • 内核将数据准备好的时候,使用SIGIO信号通知应用程序进行IO操作
    请添加图片描述

4.多路转接/多路复用

  • 虽然从流程图上看起来和阻塞IO类似,实际上最核心在于IO多路转接能够同时等待多个文件描述符的就绪状态
    请添加图片描述

5.异步IO

  • 由内核在数据拷贝完成时,通知应用程序(而信号驱动是告诉应用程序何时可以开始拷贝数据)
    请添加图片描述

2.高级IO重要概念

1.同步通信 vs 异步通信

  • 同步和异步关注的是消息通信机制
    • 所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回,但是一旦调用返回,就得到返回值了
      • 换句话说,就是由调用者主动等待这个调用的结果
    • 异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果
      • 换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果
      • 而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用
  • 另外,在讲多进程多线程的时候,也提到同步和互斥,这里的同步通信和进程之间的同步是完全不相干的概念
    • 进程/线程同步也是进程/线程之间直接的制约关系
    • 是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调他们的工作次序而等待、 传递信息所产生的制约关系,尤其是在访问临界资源的时候

2.阻塞 vs 非阻塞

  • 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态
    • 阻塞调用是指调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会返回
    • 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程

3.非阻塞IO

1.fcntl()

  • **功能:**控制一个文件描述符,默认都是阻塞IO
  • 原型:int fcntl(int fd, int cmd, … / arg / );
  • 参数:
    • **fd:**要设置的文件描述符
    • **cmd:**要做什么
    • **arg:**要设置什么状态
  • 返回值:
    • 具体返回值取决于命令操作
    • 失败返回-1,同时errno被设置
  • fcntl()有5种功能
复制一个现有的描述符cmd=F_DUPFD
获得/设置文件描述符标记cmd=F_GETFD或F_SETFD
获得/设置文件状态标记cmd=F_GETFL或F_SETFL
获得/设置异步I/O所有权cmd=F_GETOWN或F_SETOWN
获得/设置记录锁cmd=F_GETLK,F_SETLK或F_SETLKW
  • 此处只使用第三种功能,获取/设置文件状态标记,就可以将一个文件描述符设置为非阻塞
    • 以后对所有的fd,都可以统一用这个接口来更改阻塞/非阻塞,更为统一且方便

2.实现SetNonBlock

  • 基于fcntl,实现SetNonBlock(),将文件描述符设置为非阻塞
    • 使用F_GETFL将当前的文件描述符的属性取出来(这是一个位图)
    • 然后再使用F_SETFL将文件描述符设置回去,设置回去的同时,加上一个O_NONBLOCK参数
bool SetNonBlock(int fd)
{
    int fl = fcntl(fd, F_GETFL); // 在底层获取当前fd对应的属性
    if(fl < 0)
    {
        return false;
    }

    // 设置非阻塞
    fcntl(fd, F_SETFL, fl | O_NONBLOCK); // 在老的标志位的前提下新增内容
    return true;
}

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

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

相关文章

华为认证存储HCIE有用吗?

首先&#xff0c;对于个人来说&#xff0c;获得华为存储认证可以证明其具备信息存储技术的专业能力 1.专业认可&#xff1a;获得华为存储认证&#xff0c;尤其是HCIE-Storage级别的证书&#xff0c;意味着持有者对信息存储技术有着全面深入的理解&#xff0c;能够设计、部署、…

不同品牌的SSL证书价格差异大吗?

在数字化时代&#xff0c;网络安全的重要性日益凸显&#xff0c;SSL证书作为保护网站和用户数据安全的重要工具&#xff0c;其价值不言而喻。SSL证书通过加密技术保障网站与用户之间的通信安全&#xff0c;防止敏感信息的泄露和篡改。对于网站运营者而言&#xff0c;了解SSL证书…

LearnOpenGL(十三)之网格

一、网格 组合模型的每个单独的形状就叫做一个网格(Mesh)。比如说有一个人形的角色&#xff1a;艺术家通常会将头部、四肢、衣服、武器建模为分开的组件&#xff0c;并将这些网格组合而成的结果表现为最终的模型。一个网格是我们在OpenGL中绘制物体所需的最小单位&#xff08;…

Android Compose 三:切换主题

1 先瞅瞅lightColorScheme / darkColorScheme 创建项目后 自带一个Theme.kt 判断了 使用哪个ColorScheme 下面看看LightColorScheme &#xff08;亮/暗主题差不多&#xff0c;就是颜色不一样罢了&#xff09; private val LightColorScheme lightColorScheme(primary Pur…

StackQueue+泛型简单理解

&#x1f341; 个人主页&#xff1a;爱编程的Tom&#x1f4ab; 本篇博文收录专栏&#xff1a;Java专栏&#x1f449; 目前其它专栏&#xff1a;c系列小游戏 c语言系列--万物的开始_ &#x1f389; 欢迎 &#x1f44d;点赞✍评论⭐收藏&#x1f496;三连支持一…

网络安全快速入门(十一)vi/vim

11.1 了解vi 前面我i们已经在基础命令中大致了解了vi&#xff0c;本章我们针对vi来细讲一下&#xff0c;vi和vim 11.1.1 什么是vi/vim&#xff1f; vi和vim&#xff0c;都是一个模块化的文本编辑工具&#xff0c;换句话讲&#xff0c;通过vi下的一系列的命令&#xff0c;可以实…

群晖NAS本地搭建Bitwarden密码管理服务并实现远程同步密码托管

文章目录 1. 拉取Bitwarden镜像2. 运行Bitwarden镜像3. 本地访问4. 群晖安装Cpolar5. 配置公网地址6. 公网访问Bitwarden7. 固定公网地址8. 浏览器密码托管设置 Bitwarden是一个密码管理器应用程序&#xff0c;适用于在多个设备和浏览器之间同步密码。自建密码管理软件bitwarde…

如何用时尚新姿讲好中国品牌故事?

品牌建设在推动高质量发展中扮演了双重角色&#xff0c;既是高质量发展的重要“承载者”&#xff0c;也是强有力的“助推器”。5月10日-11日&#xff0c;中国时尚品牌URBAN REVIVO&#xff08;以下简称UR&#xff09;以中国品牌日为起点&#xff0c;联合天猫超级品牌日&#xf…

paddle ocr v4 2.6.1实战笔记

目录 效果图&#xff1a; 安装 模型权重是自动下载&#xff0c;如果提前下载会报错。 识别orc&#xff0c;并opencv可视化结果&#xff0c;支持中文可视化 官方原版预测可视化&#xff1a; 效果图&#xff1a; 安装 安装2.5.2识别结果为空 pip install paddlepaddle-gpu…

操作系统实战(三)(linux+C语言实现)

实验目的 加深对进程调度概念的理解&#xff0c;体验进程调度机制的功能&#xff0c;了解Linux系统中进程调度策略的使用方法。 练习进程调度算法的编程和调试技术。 实验说明 1.在linux系统中调度策略分为3种 SCHED_OTHER&#xff1a;默认的分时调度策略&#xff0c;值为0…

弹幕播放器源码

下 载 地 址 &#xff1a; runruncode.com/php/19761.html 1. 将弹幕播放器的源码上传到服务器。 2. 通过访问你的域名/dmku/install/index.php来进行弹幕库的安装。 3. 修改播放器后台的密码&#xff0c;配置文件为/config.php&#xff0c;并配置json接口。 4. 后台账号为…

国内环境也可以开发好玩的LLM应用 - 环境准备篇

在开发基于LLM(大语言模型)的AI应用前, 我们首先要准备好必要的环境. 主要就是Python环境以及大模型应用开发部署环境. 01 Python开发环境准备 Python开发环境有如下四种, 根据个人喜好选其一即可: 本地安装Python及IDE, 适合学习测试开发; 本地安装Python环境, 使用Jupyter …

享元模式详解

享元模式 1 概述 定义&#xff1a; ​ 运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销&#xff0c;从而提高系统资源的利用率。 2 结构 享元&#xff08;Flyweight &#xff09;模式中存…

【卫星影像三维重建-全流程代码实现】点云Mesh重构

点云—>Mesh模型 1.介绍1.1 背景1.2 效果示意 2 算法实现2.1 依赖库2.2 实验数据2.3 代码实现2.4 实验效果 3.总结 1.介绍 1.1 背景 &#xff08;1&#xff09;本文主要内容是将三维点云&#xff08;离散的三维点&#xff09;进行表面重建生成Mesh网格&#xff0c;之前有篇…

UIKit常用API:Transform

需求 使用Transform系列的API&#xff0c;该API中提供了旋转、平移等功能。其中函数中带make的效果是只变化一次&#xff0c;不带make可变化多次。此外&#xff0c;还有恢复函数&#xff1a;CGAffineTransformIdentity。 代码实现 注意按钮绑定的是同一个响应事件&#xff0…

【AIGC】Mac Intel 本地 LLM 部署经验汇总(CPU Only)

书接上文&#xff0c;在《【AIGC】本地部署 ollama(gguf) 与项目整合》章节的最后&#xff0c;我在 ollama 中部署 qwen1_5-14b-chat-q4_k_m.gguf 预量化模型&#xff0c;在非 Stream 模式下需要 89 秒才完成一轮问答&#xff0c;响应速度实在是太慢&#xff0c;后续需要想办法…

Qt与QWebEngineView 交互-调试窗口-JS拓扑图完整示例参考

1&#xff1a;介绍&#xff1a; Qt与QWebEngineView的交互 简介之前文章解释过&#xff0c;链接在下面 传送门&#xff1a;Qt与QWebEngineView 交互完整示例参考_qt qwebview-CSDN博客 一般在使用这种方式时&#xff0c;可能会出现各种问题而不好调试&#xff0c;如果能够像…

【C++】继承相关(基类与派生类的继承关系以及细节整理)

目录 00.引言 01.继承的定义 02.基类和派生类对象 03.继承中的作用域 04.派生类的默认成员函数 05.友元、静态成员 00.引言 继承是面向对象编程中的一个重要概念&#xff0c;它的作用是创建一个新的类&#xff0c;该类可以从一个已存在的类&#xff08;父类/基类&#x…

sipeed 的 MaixCam显示图片

WiFi联网后&#xff0c;把固件升级到最新 一根tpyc-c连接线为MaixCam供电&#xff0c;点击液晶屏settings 在WiFi中设置确保联网&#xff0c;在更新MaixPy中升级固件 可以选择国内源加速&#xff0c;将固件升级到最新版 MaixVision的操作 1&#xff0c;在MaixVision左下角…

谷歌Gboard应用的语言模型创新:提升打字体验的隐私保护技术

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…