Linux基础------高级IO

news2024/11/15 0:05:43

文章目录

    • 阻塞IO
    • 非阻塞IO
    • 信号驱动
    • 异步IO
    • 多路转接(核心终点)

实际上 IO = “等” + 拷贝
等什么呢? -----> 等待的是内核将数据准备好。
拷贝-------> 数据从内核考到用户

IO话题: 无非就是 1 , 改变等的方式 2 , 减少等的比重。

阻塞IO

当内核没有将数据准备好的时候, 系统调用会一直阻塞。 (所有的套接字, 默认都是阻塞)
在这里插入图片描述

非阻塞IO

非阻塞IO: 如果内核还未将数据准备好, 系统调用仍然会直接返回, 并且返回EWOULDBLOCK错误码,
非阻塞IO往往需要程序员循环的方式反复尝试读写文件描述符, 这个过程称为轮询, 对CPU来说是低效的。

并且,在非阻塞的情况下, 出错 和 数据未就绪都是以 返回错误的形式。
那如何区分 真正的错误 和 未就绪的情况的呢? ———> 数据未就绪的情况 ----errno ——–> EAGAIN ==11
在这里插入图片描述

一个文件描述符fd默认是阻塞IO,如何设置未非阻塞呢?
在这里插入图片描述

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <iostream>
using namespace std;


 void SetNoBlock(int fd) 
 {
	 int fl = fcntl(fd, F_GETFL);  //获得这个文件描述符相关属性f1
	 if (fl < 0) 
	 {
		 perror("fcntl");
		 return;
		
	 }
	 fcntl(fd, F_SETFL, fl | O_NONBLOCK); //将非阻塞设置进该文件描述符fd
	
}

 int main() 
 {
	SetNoBlock(0);
	 while (1) 
	 {
		 char buf[1024] = { 0 };
		 ssize_t read_size = read(0, buf, sizeof(buf) - 1);
		 if (read_size < 0) 
		 {
			 cout << "未读到内容" << endl;
			 sleep(2);
			 continue;
			
		 }
		cout << "读到的内容为 : "  << buf << endl;
		
	}
	 return 0;	
}

运行结果:
在这里插入图片描述

信号驱动

内核将数据准备好以后,通过信号SIGIO信号去通知应用进程。
然后应用进程去调用接口去IO。

在这里插入图片描述

异步IO

当应用进程IO的时候, 内核完成了 等 + 拷贝 之后通知应用进程。

在这里插入图片描述

信号驱动和异步IO的区别:
内核在数据拷贝完成时, 通知应用程序(而信号驱动是告诉应用程序何时可以开始拷贝数据),
也就是说信号驱动是告诉进程什么时候可以进行IO, 而异步IO是告诉进程什么时候IO(等 + 拷贝都)完成了。

同步通信和异步通信:
同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回. 但是一旦调用返回,就得到返回值了
异步相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果;
当一个异步过程调用发出后,调用者不会立刻得到结果; 而是在调用发出后,被调用者通过状态、通知来通知调用
者,或通过回调函数处理这个调用.

多路转接(核心终点)

可以同时等待多个文件描述符。
在后面的博客分别详细解释select, poll, epoll。

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

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

相关文章

Linux中编译带kafka模块的搜狗workflow开源库

workflow依赖的第三方库 openssl https://github.com/openssl/openssl apt install libssl-dev zlib https://github.com/madler/zlib git clone https://github.com/madler/zlib.git./configuremake -j4 make install lz4 (版本>1.7.5) https://github.com/lz4/lz4 …

C语言:预处理(2)

宏通常被用于执行简单的运算。 宏相比于函数的优势&#xff1a; 1.用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多。所以宏比函数在程序的规模和速度方面更胜一筹。 2.更为重要的是函数的参数必须声明为特定的类型。所以函数只能在类型合适的…

Diffusion Model原理详解及源码解析

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;专栏推荐&#xff1a;深度学习网络原理与实战 &#x1f34a;近期目标&#xff1a;写好专栏的每一篇文章 &#x1f34a;支持小苏&#xff1a;点赞&#x1f44d;&#x1f3fc;、…

KubeSphere中间件部署

目录 &#x1f9e1;应用部署总览 &#x1f9e1;中间件部署 MySQL有状态副本集 &#x1f360;KubeSphere创建配置集 &#x1f360;KubeSphere创建存储卷 &#x1f360;KubeSphere创建有状态副本集 &#x1f360;集群访问 &#x1f49f;这里是CS大白话专场&#xff0c;让枯…

Entity Framework Core 代码自动化迁移

简述 文章内容基于&#xff1a;.NET6 Entity Framewor kCore 7.0.* 使用 EF Core 进行 Code First 开发的时候&#xff0c;肯定会遇到将迁移更新到生产数据库这个问题&#xff0c;大多数都是使用命令生成迁移 SQL&#xff0c;然后使用 SQL 脚本将更新迁移到生产数据库的方式&a…

【一起从0开始学习人工智能0x03】文本特征抽取TfidVectorizer

文章目录文本特征抽取TfidVectorizerTfidVecorizer--------Tf-IDFTF-IDF------重要程度文本特征抽取TfidVectorizer 前几种方法的缺点&#xff1a;有很多词虽然没意义&#xff0c;但是出现次数很多&#xff0c;会影响结果&#xff0c;有失偏颇------------关键词 TfidVecoriz…

一篇文章带你搞懂nodeJs环境配置

1、nodeJs下载地址&#xff0c;这里可以选择你想要的版本&#xff0c;我这里以14.15.1为例 2、下载完成后&#xff0c;直接傻瓜式安装即可。 3、打开命令行&#xff08;以管理员身份打开&#xff09;,输入node -v&#xff0c;出现以下版本号&#xff0c;代表node成功安装 4、在…

html+css设计两个摆动的大灯笼

实现效果 新年马上就要到了&#xff0c;教大家用htmlcss设计两个大灯笼&#xff0c;喜气洋洋。 html代码&#xff1a; html代码部分非常简单&#xff0c;将一个灯笼分成几部分进行设计&#xff0c;灯笼最上方部分&#xff0c;中间的线条部分和最下方的灯笼穗。组合在一起就…

docker系列教程:docker图形化工具安装及docker系列教程总结

通过前面的学习,我们已经掌握了docker-compose容器编排及实战了。高级篇也算快完了。有没有相关,我们前面学习的时候,都是通过命令行来操作docker的,难道docker就没有图形化工具吗?答案是肯定有的。咱们本篇就来讲讲docker图形化工具及使用图形化工具安装Nginx及docker系列…

读书系列2022(下)读书纪录片

目录 一、认知类 二、纪录片 一、认知类 《蓝海战略》&#xff1a; 让你(企业/个人)在竞争中产生错位竞争&#xff0c;获得优势 《认知盈余》&#xff1a;“人们实际上很喜欢创造并分享”&#xff0c; 参与是一种行为 将人们的自由时间和特殊才能汇聚在一起&#xff0c;共同…

移动Web【字体图标、平面转换[位移,旋转,转换原点,多重转换]、渐变】

文章目录一、字体图标1.1 图标库1.2 下载字体包&#xff1a;1.3 使用字体图标&#xff1a;1.4 使用字体图标 – 类名&#xff1a;1.5 案例&#xff1a;淘宝购物车1.6 上传矢量图&#xff1a;二、平面转换2.1 位移2.1 位移-绝对定位居中2.3 案例2.4 旋转2.5 转换原点2.6 多重转换…

2022年终总结:不一样的形式,不一样的展现

Author&#xff1a;AXYZdong 硕士在读 工科男 有一点思考&#xff0c;有一点想法&#xff0c;有一点理性&#xff01; 定个小小目标&#xff0c;努力成为习惯&#xff01;在最美的年华遇见更好的自己&#xff01; CSDNAXYZdong&#xff0c;CSDN首发&#xff0c;AXYZdong原创 唯…

你真的了解表达式求值吗?

表达式求值大家很熟悉特别是整型十进制的表达式求值。那么char类型的表达式求值是怎么样的&#xff1f;Eg&#xff1a;#include <stdio.h>int main() {char a 127;char b 3;char c a b;printf("%d %d %d\n",a,b,c);return 0; }上面程序输出的结果是多少&am…

2022跟学尚硅谷Maven入门(一)纯命令行

2022跟学尚硅谷Maven入门 一 纯命令行Maven从小白到专家应用场景开发过程自动部署私有仓库课程介绍小白目标普通开发人员目标资深开发人员目标第一章:Maven 概述第一节 为什么要学习MavenMaven 作为依赖管理工具(1)jar包的规模(2)jar 包的来源(3)jar包之间的依赖关系Maven 作为…

APSIM练习:播种作物练—高粱作物模拟

在本练习中&#xff0c;您将观察作物在一个季节内的生长情况。您将更多地了解如何使用 APSIM 对施肥率进行“假设”实验。这些技能不仅可以用来试验施肥率&#xff0c;还可以用来试验变量&#xff0c;例如&#xff1a; 种植时间。播种率。作物比较和不同的起始土壤水分条件。 …

C++之异常

文章目录一、C 语言传统的处理错误的方式二、C 异常概念三、异常的使用1.异常的抛出和捕获2.异常的重新抛出3.异常安全4.异常规范四、自定义异常体系五、C 标准库的异常体系六、异常的优缺点一、C 语言传统的处理错误的方式 传统的错误处理机制&#xff1a;   ① 终止程序&a…

JUC(十)-线程池-ThreadPoolExecutor分析

ThreadPoolExecutor 应用 & 源码解析 文章目录ThreadPoolExecutor 应用 & 源码解析一、线程池相关介绍1.1 为什么有了JDK提供的现有的创建线程池的方法(Executors类中的方法),然而还需要自定义线程池ThreadPoolExecutor 提供的七个核心参数大致了解JDK提供的几种拒绝策…

一辆适合长途出行的电动跑车 奥迪RS e-tron GT正式上市

作为奥迪品牌电动化发展的先锋力作&#xff0c;奥迪RS e-tron GT不止是前瞻科技的呈现&#xff0c;在e-tron纯电技术的加持下&#xff0c;更传递着RS的情怀&#xff0c;承载着人们对GT豪华休旅生活的向往。 2022年12月30日&#xff0c;伴随着Audi Channel第九期直播节目盛大开播…

MySQL存储引擎介绍以及InnoDB引擎结构理解

目录存储引擎概述各个存储引擎介绍InnoDBMySIAMMemeory其他引擎引擎有关的SQL语句InnoDB引擎逻辑存储结构架构内存部分磁盘部分后台线程InnoDB三大特性存储引擎概述 数据引擎是与数据真正存储的磁盘文件打交道的&#xff0c;它的上层&#xff08;服务层&#xff09;将处理好的…

我的Python学习笔记:私有变量

一、私有变量的定义 在Python中&#xff0c;有以下几种方式来定义变量&#xff1a; xx&#xff1a;公有变量_xx&#xff1a;单前置下划线&#xff0c;私有化属性或方法&#xff0c;类对象和子类可以访问&#xff0c;from somemodule import *禁止导入__xx&#xff1a;双前置下…