[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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Poe是什么?怎样订阅Poe?

Poe&#xff08;全称“开放探索平台”&#xff0c;Platform for Open Exploration&#xff09;是一款由Quora开发的移动应用程序&#xff0c;于2022年12月推出。该应用程序内置建基于AI技术的聊天机器人&#xff0c;可供用户向机器人询问专业知识、食谱、日常生活&#xff0c;甚…

懒人网址导航源码v3.9

测试环境 宝塔Nginx -Tengine2.2.3的PHP5.6 MySQL5.6.44 为防止调试错误&#xff0c;建议使用测试环境运行的php与mysql版本 首先用phpMyAdmin导入数据库文件db/db.sql 如果导入不行&#xff0c;请直接复制数据库内容运行sql语句也可以 再修改config.php来进行数据库配置…

解决SpringBoot整合MyBatis和MyBatis-Plus,请求后不打印sql日志

问题发现 在整合springBootmyBatis时&#xff0c;发现请求不打印sql日志&#xff0c;示例代码如下&#xff1a; RestController public class MyController {AutowiredProductMapper productMapper;GetMapping("/test")public void test() {System.out.println(&qu…

使用Dockerfile配置Springboot应用服务发布Docker镜像-16

创建Docker镜像 springboot-docker模块 这个应用可以随便找一个即可&#xff0c;这里不做详细描述了。 pom.xml 依赖版本可参考 springbootSeries 模块中pom.xml文件中的版本定义 <dependencies><dependency><groupId>com.alibaba.cloud</groupId>…

[数据集][图像分类]杂草分类数据集17509张9类别

数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;17509 分类类别数&#xff1a;9 类别名称:["chineseapple","lantana","negatives","parkinsonia","part…

Nginx - location中的匹配规则和动态Proxy

文章目录 官网location 规则详解动态Proxy使用多个 if 指令指定不同的 proxy_pass根据参数选择不同的 proxy_pass 官网 https://nginx.org/en/docs/http/ngx_http_core_module.html#location location 规则详解 Nginx的location指令工作原理如下&#xff1a; 位置匹配&#…

虚拟机有线已连接但无法上网—·可能性之一

背景 VMware虚拟机&#xff0c;搭建了三台Linux服务器&#xff0c;组成Hadoop集群&#xff0c;由于在Hadoop102上有一些经常与Mysql数据库交互的任务&#xff0c;需要经常打开运行&#xff0c;而Hadoop103和104则经常处于关闭状态&#xff0c;一段时间后再次启动集群时候&…

【go项目01_学习记录11】

操作数据库 1 文章列表2 删除文章 1 文章列表 &#xff08;1&#xff09;先保证文章已经有多篇&#xff0c;可以直接在数据库中添加&#xff0c;或者访问链接: localhost:3000/articles/create&#xff0c;增加几篇文章。 &#xff08;2&#xff09;之前设置好了articles.ind…

C语言 | Leetcode C语言题解之第87题扰乱字符串

题目&#xff1a; 题解&#xff1a; struct HashTable {int key;int val;UT_hash_handle hh; };void modifyHashTable(struct HashTable** hashTable, int x, int inc) {struct HashTable* tmp;HASH_FIND_INT(*hashTable, &x, tmp);if (tmp NULL) {tmp malloc(sizeof(st…

树莓派对FPGA板子上的流水灯程序的控制

文章目录 一 树莓派使用教程二 树莓派串口代码三 Verilog代码四 quartus引脚绑定五 运行效果总结 分别在DE2-115开发板和树莓派上编写串口通信程序&#xff0c; 实现树莓派串口指令对FPGA板子上的流水灯程序的控制&#xff0c;控制方式自定。 一 树莓派使用教程 参考&#xff…

第187题| 快速学会“阿贝尔定理”| 无穷级数(十五)|武忠祥老师每日一题

解题思路&#xff1a;这道题没有告诉我们是多少&#xff0c;没办法求出收敛半径&#xff0c;所以我们只能根据题目给的两个条件来解题&#xff08;选项代入法&#xff09;。 1.x-1&#xff0c;说明收敛的中心点是1&#xff0c;观察下列选项&#xff0c;显然答案在C和D之中。 …

Linux中的网络隔离功能 netns

Network Namespace&#xff08;netns&#xff09; 是Linux内核提供的一项实现网络隔离的功能&#xff0c;它能隔离多个不同的网络空间&#xff0c;并且各自拥有独立的网络协议栈。通过 namespace 可以隔离容器的进程 PID、文件系统挂载点、主机名等多种资源&#xff0c;它可以为…

基于门控的循环神经网络:LSTM

之前我们介绍了循环神经网络的原理以及实现。但是循环神经网络有一个问题&#xff0c;也就是长期依赖问题。我们之前的01序列预测案例中可以看到&#xff0c;当序列长度到达10以上之后错误就会增多&#xff0c;说明简单的RNN记忆容量较小&#xff0c;当长度更大时就不怎么适用了…

可重构柔性装配产线:为工业制造领域注入了新的活力

随着科技的飞速发展&#xff0c;智能制造正逐渐成为引领工业革新的重要力量。在这一浪潮中&#xff0c;可重构柔性装配产线以其独特的技术优势和创新理念&#xff0c;为工业制造领域注入了新的活力&#xff0c;开启了创新驱动的智能制造新篇章。 可重构柔性装配产线是基于富唯智…

2024年一些值得关注的边缘计算招投标!中国移动、中国联通、中国铁塔大单来了!...

1.大单来了&#xff01;中国移动湖北公司算力设备采购(移动边缘云四期扩容)招标公告&#xff0c;3079万&#xff01; 项目名称&#xff1a;中国移动湖北公司算力设备采购(移动边缘云四期扩容)招标公告 本招标项目为(中国移动湖北公司算力设备采购(移动边缘云四期扩容)&#xff…

Cweek1

C语言学习 一.初识C语言 1.如何写C代码 ①创建工程 ②添加源文件&#xff1a;c文件&#xff1a;源文件&#xff0c;h文件&#xff1a;头文件 代码实例&#xff1a; main函数是程序的入口&#xff0c;有且仅有一个 在C语言中&#xff0c;#include <stdio.h> 是一个预…

Windows 11 下 kafka 的安装踩坑

安装 windows系统kafka小白入门篇——下载安装&#xff0c;环境配置&#xff0c;入门代码书写&#xff08;推荐&#xff09; kafka在windows下安装和使用入门教程 问题1 参考链接 运行kafka集成的zookeeper时&#xff0c;命令&#xff1a;bin\windows\zookeeper-server-star…

JavaEE初阶-多线程5

文章目录 一、线程池1.1 线程池相关概念1.2 线程池标准类1.3 线程池工厂类1.4 实现自己的线程池 二、定时器2.1 java标准库中的定时器使用2.2 实现一个自己的定时器2.2.1 定义任务类2.2.2 定义定时器 一、线程池 1.1 线程池相关概念 池这个概念在计算机中比较常见&#xff0c…

PXE+Kickstart无人值守安装安装Centos7.9

文章目录 一、什么是PXE1、简介2、工作模式3、工作流程 二、什么是Kickstart1、简介2、触发方式 三、无人值守安装系统工作流程四、实验部署1、环境准备2、服务端&#xff1a;关闭防火墙和selinux3、添加一张仅主机的网卡4、配置仅主机的网卡4.1、修改网络连接名4.2、配IP地址4…

​​​【收录 Hello 算法】5.3 双向队列

目录 5.3 双向队列 5.3.1 双向队列常用操作 5.3.2 双向队列实现 1. 基于双向链表的实现 2. 基于数组的实现 5.3.3 双向队列应用 5.3 双向队列 在队列中&#xff0c;我们仅能删除头部元素或在尾部添加元素。如图 5-7 所示&#xff0c;双向队列&#xff08…