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

目录

  • 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.rhkb.cn/news/326726.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

了解 GaussDB SQL 中 CASE 表达式

一、前言 SQL 是用于访问和处理数据库的标准计算机语言。GaussDB 支持 SQL 标准&#xff08;默认支持 SQL2、SQL3 和 SQL4 的主要特性&#xff09;。 本系列将以《云数据库 GaussDB—SQL 参考》在线文档为主线进行介绍。 二、CASE Expression&#xff08;CASE 表达式&#x…

sCrypt受邀在中国人民大学举办《区块链与数字经济》课程讲座

4月17日&#xff0c;可一科技特邀美国sCrypt公司的开发工程师周全&#xff0c;在中国人民大学的《区块链与数字经济》课程上进行了讲座。周全讲解了区块链的分布式设计、不可篡改特性&#xff0c;以及智能合约的基本原理&#xff0c;利用“智能家居触发机制”等生动比喻&#x…

laravel 使用 MongoDB

MongoDB MongoDB是一个基于分布式文件存储的数据库。由C语言编写。MongoDB 提供了面向文档的存储方式&#xff0c;操作起来比较简单和容易&#xff0c;支持“无模式”的数据建模&#xff0c;可以存储比较复杂的数据类型&#xff0c;是一款非常流行的文档类型数据库 使用场景 …

IDEA中git的常用操作(保姆级教学)

IDEA中git的常用操作&#xff08;保姆级教学&#xff09; 以下是git的工作原理&#xff0c;觉得繁琐的可以跳过不看 Workspace&#xff1a;工作区 (平时存放代码的地方) Index / Stage&#xff1a;暂存区&#xff08;用于临时存放存放你的改动&#xff0c;事实上就是一个文件&…

OSPF虚链路

原理概述 通常情况下&#xff0c;一个OSPF网络的每个非骨干区域都必须与骨干区域通过ABR路由器直接连接&#xff0c;非骨干区域之间的通信都需要通过骨干区域进行中转。但在现实中&#xff0c;可能会因为各种条件限制&#xff0c;导致非骨干区域和骨干区域无法直接连接&#x…

Unity自定义动画-Animation动画数据-How is “fileIDToRecycleName“ generated

一般美术和程序分工明确的项目 fbx确实是和动画一一对应的&#xff1b; 但一些独立&#xff0c;或者小工作室的项目&#xff0c;就没法保证了&#xff0c;关键还是在于 Unity的 .meta 目录 查找和对比了一下 .fbx 和 .meta&#xff1a; 缓存和不缓存Animation 具体的Animat…

记录MySQL数据库查询不等于xxx时的坑

目录 一、背景 二、需求 三、方法 四、示例 一、背景 在使用MySQL数据库查询数据时&#xff0c;需要查询字段name不等于xxx的记录&#xff0c;通过where name ! xxx查询出来的记录不符合预期&#xff0c;通过检查发现少了name字段为null的记录&#xff0c;后经查询得知在My…

安全加固

目录 1.文件锁定管理 2.设置用户账户有效期 3.查看并清除命令历史记录 4.设置用户超时登出时间 5.用户切换 6.用户提权 7.禁用重启热键CtrlAltDel 8.设置单用户模式密码 9.调整BIOS引导设置 10.禁止root用户从本地登录&#xff1a; 11.禁止root用户通过ss…

IDM下载器激活

文章目录 1、Internet Download Manager简介2、Internet Download Managery应用3、Internet Download Managery下载 1、Internet Download Manager简介 Internet Download Manager (IDM) 是一款功能强大的下载管理软件&#xff0c;旨在帮助用户更高效地管理和加速其下载任务。它…

Hive JSON数据处理

Hive JSON数据处理 JSON&#xff08;JavaScript Object Notation&#xff09;文件格式是一种轻量级的数据交换格式&#xff0c;用于存储和传输结构化的数据。它基于JavaScript的语法&#xff0c;但是可以被多种编程语言所支持和解析&#xff0c;因此被广泛应用于各种场景。 J…

AWS云优化:实现性能和成本的最佳平衡

随着企业数字化转型的加速&#xff0c;对云计算平台的需求也不断增长。AWS作为云计算行业的领导者之一&#xff0c;提供了广泛的云服务和解决方案&#xff0c;帮助企业实现业务的创新和发展。在AWS云上部署应用程序和服务后&#xff0c;对其进行优化是至关重要的&#xff0c;以…

易图讯科技数字武装三维电子沙盘

深圳易图讯科技(www.3dgis.top)集成了高清卫星影像、地形数据、实景三维模型、基干民兵、普通民兵、重要目标、兵要地志、企业潜力 、行业潜力 、社会组织潜力 、特种装备器材潜力、敌情数据、现场环境数据、物联感知信息&#xff0c;构建一体化的数字孪生空间&#xff0c;实现…

【挑战30天首通《谷粒商城》】-【第一天】【10 番外篇】 解决docker 仓库无法访问 + MobaXterm连接VirtualBox虚拟机

文章目录 课程介绍 1、解决docker 仓库无法访问 2、 MobaXterm连接VirtualBox虚拟机 Stage 1&#xff1a;下载MobaXterm选择适合你的版本 Stage 2&#xff1a;vagrant ssh 连接&#xff0c;开启ssh访问 Stage 2-1&#xff1a;su获取root账号权限,输入密码&#xff08;默认vagra…

(done) 什么是马尔可夫链?Markov Chain

参考视频&#xff1a;https://www.bilibili.com/video/BV1ko4y1P7Zv/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 如下图所示&#xff0c;马尔可夫链条实际上就是 “状态机”&#xff0c;只不过状态机里不同状态之间的边上是 “…

2.数据类型与变量(java篇)

目录 数据类型与变量 数据类型 变量 整型变量 长整型变量 短整型变量 字节型变量 浮点型变量 双精度浮点型 单精度浮点型 字符型变量 布尔型变量&#xff08;boolean&#xff09; 类型转换 自动类型转换(隐式) 强制类型转换(显式) 类型提升 字符串类型 数据类…

Windows:管理用户账户,密码策略和安全配置

在Windows操作系统中&#xff0c;管理用户账户和密码策略是确保系统安全的关键步骤。本文将探讨如何通过PowerShell和其他Windows工具管理用户账户&#xff0c;包括查看和设置密码策略、检查用户状态&#xff0c;以及导出和导入安全策略。这些管理任务对于系统管理员尤其重要&a…

IT行业现状与未来趋势-技术创新日新月异

目录 一、引言 二、IT行业现状 技术创新日新月异 市场需求持续增长 人才竞争激烈 网络安全问题凸显 三、IT行业未来趋势 人工智能将更加普及 区块链技术将改变商业模式 网络安全将成为重要战略 数字化转型将加速推进 四、结语 一、引言 随着科技的飞速发展&#x…

大模型微调之 在亚马逊AWS上实战LlaMA案例(十)

大模型微调之 在亚马逊AWS上实战LlaMA案例&#xff08;十&#xff09; 训练数据集格式 SageMaker JumpStart 目前支持域适应格式和指令调整格式的数据集。在本节中&#xff0c;我们指定两种格式的示例数据集。有关更多详细信息&#xff0c;请参阅附录中的数据集格式化部分。 …

密探渗透工具v1.08测试版

目录 前言 免责声明 工具开发者: 工具项目地址: 1.作者做工具的缘起 2.功能介绍 3.工具的更新日志 4.安装与使用 4.1 工具下载 4.2 在jdk8环境下运行: 4.3 运行界面 4.4 资产测绘功能(fofa,鹰图和Quake) 4.5 指纹识别功能 ​编辑 4.6 敏感信息与接口扫描 4.7 文…

MinIO学习笔记

MINIO干什么用的&#xff1a; AI数据基础设施的对象存储 为人工智能系统提供数据支持&#xff0c;数据存储&#xff1b;对象存储&#xff08;Object Storage&#xff09;是一种数据存储架构&#xff0c;它以对象为单位来处理、存储和检索数据&#xff0c;每个对象都包含了数据本…