当前位置: 首页 > news >正文

【Linux Network】高级IO

目录

前言

五种IO模型

阻塞IO

非阻塞IO

信号驱动IO

IO多路转接

异步IO

小结

同步通信 vs 异步通信

阻塞 vs 非阻塞

其他高级IO

非阻塞IO

fcntl函数

代码测试



 高级IO🌷

 前言

IO:所谓的I便是 input,所谓的O便是 output,简单点来说,我们平常使用键盘打字便是I,内容显示到显示器上便是O ;
我们知道我们打字的速度相对于计算机的CPU来说是非常慢的,因此CPU执行的业务如果IO
操作非常多的话,那么CPU在很长时间都是处于等待状态的;
可能大家对IO的整个过程不是特别了解,我将在此画一张图帮助大家更好的理解IO的大体过程;

可能大家会有这样一个误区:我们使用write系统调用接口是直接将数据发送至网络中的,使用read系统调用接口是直接从网络中取数据的,但其实不是如此;

在传输层中是存在着发送缓冲区和接收缓冲区的,我们使用read/recv系统调用接口是从发送缓冲区中读取数据的,使用write/send等系统调用接口是将数据先存到发送缓冲区中的;
发送缓冲区和接收缓冲区是存在水位线的,当发送缓冲区的数据超过水位线时,数据将被发送至网络,当接收缓冲区的数据超过水位线时,数据将被上层应用所读取;
实际上:IO=等+拷贝;
高级IO的本质:减少等待的时间;

五种IO模型

同步IO:
  1. 阻塞IO;
  2. 非阻塞IO;
  3. 信号驱动IO;
  4. IO多路转接;
异步IO:

阻塞IO

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

非阻塞IO

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

信号驱动IO

信号驱动IO:内核将数据准备好的时候, 使用SIGIO信号通知应用程序进行IO操作.

IO多路转接

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

异步IO

异步IO: 由内核在数据拷贝完成时, 通知应用程序;
(而信号驱动是告诉应用程序何时可以开始拷贝数据).

小结

  • 任何IO过程中, 都包含两个步骤. 第一是等待, 第二是拷贝. 而且在实际的应用场景中, 等待消耗的时间往往都远远高于拷贝的时间. 让IO更高效, 最核心的办法就是让等待的时间尽量少.

同步通信 vs 异步通信

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

阻塞 vs 非阻塞

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

其他高级IO

非阻塞 IO ,纪录锁,系统 V 流机制, I/O 多路转接(也叫 I/O 多路复用) ,readv writev 函数以及存储映射IO( mmap ),这些统称为高级 IO.
我们下篇博客重点讨论的是 I/O 多路转接;

非阻塞IO

一个文件描述符 , 默认都是阻塞 IO;
我们要想其是非阻塞IO,便要使用到 fcntl 函数;

fcntl函数

fcntl函数可以改变已打开的文件性质。针对cmd的值,fcntl能够接受第三个参数int arg。

函数原型如下:
#include <unistd.h>
#include <fcntl.h>int fcntl(int fd, int cmd, ... /* arg */ );

参数:

  • fd:要修改的文件描述符;
  • cmd:传入的cmd的值不同, 后面追加的参数也不相同;
  • ... /* arg */:在此不做讨论;
返回值:
  • fcntl的返回值与命令有关。如果出错,所有命令都返回-1,如果成功则返回某个其他值。
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);
我们此处只是用第三种功能 , 获取 / 设置文件状态标记 , 就可以将一个文件描述符设置为非阻塞;

实现函数SetNoBlock

基于 fcntl, 我们实现一个 SetNoBlock 函数 , 将文件描述符设置为非阻塞;
void SetNoBlock(int fd) 
{ int fl = fcntl(fd, F_GETFL); if (fl < 0) { perror("fcntl");return; }fcntl(fd, F_SETFL, fl | O_NONBLOCK); 
}
  • 使用F_GETFL将当前的文件描述符的属性取出来(这是一个位图).;
  • 然后再使用F_SETFL将文件描述符设置回去. 设置回去的同时, 加上一个O_NONBLOCK参数;

代码测试

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>void SetNonBlock(int fd)
{int f1 = fcntl(fd, F_GETFL);if(f1<0){perror("fcntl");return ;}fcntl(fd, F_SETFL, f1 | O_NONBLOCK);
}int main()
{//设置文件描述符:0为非阻塞SetNonBlock(0);while(1){char buffer[1024];ssize_t s = read(0, buffer, sizeof(buffer)-1);//读取到了数据if(s>0){buffer[s] = '\0';write(1, buffer, strlen(buffer));printf("read success, s: %d, errno: %d\n",s,errno);}else{//s==0:缓冲区中无数据if(errno ==EAGAIN || errno ==EWOULDBLOCK){printf("数据还没准备好,请等待!\n");sleep(1);}else {//读取失败printf("read failed, s: %d, errno: %d\n", s, errno);}}}return 0;
}

相关文章:

【Linux Network】高级IO

目录 前言 五种IO模型 阻塞IO 非阻塞IO 信号驱动IO IO多路转接 异步IO 小结 同步通信 vs 异步通信 阻塞 vs 非阻塞 其他高级IO 非阻塞IO fcntl函数 代码测试 高级IO&#x1f337; 前言 IO&#xff1a;所谓的I便是 input&#xff0c;所谓的O便是 output&#xff0c;简单点来说&a…...

Python语言基本控制结构

Python语言基本控制结构包括&#xff1a;条件语句&#xff1a;if、elif、else 循环语句&#xff1a;for、while 跳转语句&#xff1a;break、continue、return 下面是它们的基本用法&#xff1a; 条件语句 if condition1: statement1 elif condition2: statement2 else: stat…...

旅游网站版面设计方案

门户网站的页面设计&#xff1a;采用天蓝色为主色调、以红色、绿色为基调&#xff0c;突出网站的青春活波性。 网站风格尽量简单统一、容易让大多数上网者接受&#xff0c;个性化的网站&#xff0c;再者&#xff0c;网站有主体信息结构及布 word . . . . 局&#xff0c;它是总体…...

sudo unable to open read-only file system”的原因

此错误是由多种原因引起的&#xff0c;包括&#xff1a; 文件系统不一致。文件系统配置错误&#xff08;/etc/fstab 文件中的错误条目&#xff09;。由于各种原因&#xff08;包括突然断电或电缆损坏&#xff09;导致系统意外或突然关闭。在某些情况下&#xff0c;Windows 的双…...

Dynamics 365 DevOps CI/CD之WebResource

对于D365自身的发布&#xff0c;简单点来说就是Solution的发布&#xff0c;复杂一些会涉及周边集成接口等一系列的发布。如果是单纯的Solution的发布的Azure DevOps商店里有很多工具&#xff0c;比如Power DevOps Tools&#xff0c;这个我之前也有博文转载过相关文章&#xff0…...

Linux常用指令及基础配置

Linux常用指令及基础配置 Linux系统操作指令文件管理指令系统设置相关指令addr2line的运用 vim相关vim配置操作Vim功能操作分屏擦操作删除操作换行符转换操作&#xff1a;文件比较合并操作折叠指令 Linux系统操作指令 文件管理指令 find ./ -iname filename find ./ -name “…...

Linux 服务器上Nvidia相关指令

1、GPU驱动的内存常驻模式 1&#xff09;操作命令: 确保你具有root或sudo权限&#xff0c;以执行下面的命令。打开终端或命令行界面。运行以下命令来设置GPU驱动的内存常驻模式&#xff1a; nvidia-smi -pm 1这会将GPU驱动程序设置为内存常驻模式。 4. 验证设置是否成功。运…...

ChatGPT的工作原理是什么?

ChatGPT是美国OpenAI研发的聊天机器人程序&#xff0c;2022年11月30日发布。ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过理解和学习人类的语言来进行对话。 ChatGPT的原理 ChatGPT是一种基于人工智能技术的自然语言生成模型&#xff0c;它能够从大量…...

C++进阶——红黑树

C进阶——红黑树 概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过 对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出俩 倍&…...

什么是NTFS for Mac?2023新版本如何下载

在NTFS for Mac中包含了多种功能操作&#xff0c;促进软件更好地使用&#xff0c;可以进行全局设置&#xff0c;也可以针对某一各挂载的磁盘进行针对性设置。 本集小编主要向大家介绍它包含的一些基本功能&#xff0c;看看这款mac读写工具能够实现那些功能&#xff0c;全面了解…...

Python泰裤辣丨520写一个自动换壁纸软件,将女友照骗放进去送给她

Python泰裤辣!520写一个自动换壁纸软件&#xff0c;将女友照骗放进去送给她! 准备工作1、环境2、使用的模块3、如何配置pycharm里面的python解释器?4、pycharm如何安装插件? 代码实战1、获取壁纸 自动更换壁纸程序最后 话说兄弟们&#xff0c;今天520你们都送给女朋友啥礼物了…...

CMake: 设置编译选项

CMake: 设置编译选项 导言编译器选项相关概念编译器选项设置补充 导言 上一篇我们学习了构建类型的相关内容&#xff0c;并且可以生成了不同构建类型的库&#xff0c;这一篇我们将介绍编译器选项的相关内容。 编译器选项相关概念 编译器选项是指在编译程序时&#xff0c;可以…...

美团Java开发一面凉经

目录 1.HashMap底层数据结构2.列举几个常见的线程安全容器3.HashMap线程问题4.concurrentHashMap5.ConcurrentModificationException6.Spring AOP、IOC、DI介绍下7.不使用依赖注入&#xff0c;使用传统方式的声明会有什么问题8.最左前缀原则9.TCP三次握手、四次挥手 1.HashMap底…...

Java面试知识点(全)-spring面试知识点二

Java面试知识点(全) 导航&#xff1a; https://nanxiang.blog.csdn.net/article/details/130640392 注&#xff1a;随时更新 Spring 事物 事务简介&#xff1a; 事务管理是企业级应用程序开发中必不可少的技术&#xff0c;用来确保数据的完整性和一致性 事务就是一系列的动作&…...

【音视频开发】基础知识:视频封装格式和编码格式

文章目录 一、封装格式与编码格式的关系视频编码格式视频封装格式MP43GPRM、RMVBAVI、WMVVOBFLVMKVWebMMOVTS 封装格式与编码格式对应 一、封装格式与编码格式的关系 视频编码格式和视频封装格式的关系及区别 这两者的关系好比酒与酒瓶的关系&#xff0c;编码格式好比酒瓶里的…...

OData Web API 一个开放标准的协议

OData Web API 是一个开放标准的协议&#xff0c;用于创建和使用基于 RESTful 的 Web API。它允许开发人员通过统一的方式来发布、查询、操作和管理数据资源。 OData Web API 基于 OData 协议&#xff0c;该协议定义了一组规范和约定&#xff0c;用于建立与数据源交互的标准化…...

PT100温度采集

1、信号采集的基本原理 PT100是将温度信号转换为电阻输出&#xff0c;其电阻值变化范围为0~200Ω。AD转换器只能对电压进行转换&#xff0c;无法采集直接采集温度&#xff0c;因此&#xff0c;需要一个1mA恒电流源给PT100供电&#xff0c;将电阻变化转换为电压变化。使用恒流源…...

ThinkSystem DM 全闪存阵列 —— 通过全闪存 NVMe 转型加速您的业务

ThinkSystem DM 全闪存阵列——通过全闪存 NVMe 转型加速您的业务 挑战 要缩短产品上市时间并提高客户满意度&#xff0c;企业必须不断改善关键业务运营的速度和响应能力。其中的一个关键要素是全闪存存储&#xff0c;它可以大幅加速关键工作负载。 不过&#xff0c;随着全闪…...

SpringCloud------代码demo(二)

SpringCloud------代码demo&#xff08;二&#xff09; 编码实操 以订单——支付微服务模块作为基础&#xff0c;开始逐渐扩充 微服务架构编码构建 1.约定 > 配置 > 编码 2.IDEA新建project工作空间 3.Rest微服务工程构建 总父工程 POM project module 首先创建maven项…...

TCL语法

目录 脚本、命令和单词符 置换 变量置换 命令置换 反斜杠置换 双引号和花括号 注释 脚本、命令和单词符 一个 TCL 脚本可以包含一个或多个命令。命令之间必须用换行符或分号隔开。 set a 1 set b 2 或者 set a 1&#xff1b;set b 2 都是合法的 TC…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...