Linux高级IO之五种IO模型

文章目录

    • Linux高级IO之五种IO模型
      • IO的理解
      • 阻塞式IO
      • 非阻塞IO
      • 信号驱动式IO
      • IO多路转接
      • 异步IO
      • 同步和异步

Linux高级IO之五种IO模型

IO的理解

IO模型其实更像是网络部分的延伸和拓展,在学习完计算机网络之后,结合Linux系统,我们就该认识到,计算机网络所做的工作其实是将计算机的功能和性能无限扩大

因为进程间通信的本质没有变,网络将计算机之间的进程通信链接起来,相当于世界的计算机性能也能链接起来,只是受限于网络的性能和复杂度,速度远远达不到计算机总线的速度

进程处理数据自然有数据的处理和交换两个过程

处理部分就是我们所学的各种语言,面向对象思想,算法

而交换则对应了输入和输出两个部分,由于计算机网络的影响,IO也不应当狭义的理解为从内存中IO,而应当也扩展至从网络中IO,虽然设备上,是内存和网卡的区别,但是对于Linux来说他们都是文件,是没什么区别的
我们具体到IO本身上,因为外设的速度上远低于CPU处理的速度的,对于内存和网卡都是这样,因此IO一定是效率很低的事情

在IO时,一共做了两件事情,第一件事情是等待,等待缓冲区的文件,或是网卡上来,或是从内存中来,第二件事情是拷贝,将缓冲区数据拷贝到内存中

因此IO一共分成两个部分,等待+拷贝,其中拷贝使用才是我们希望他做的事情

类似于计算机发展的过程,计算机开始时是等待IO和处理数据两个过程,然后逐步演化为现在的并发情景,将等待IO的时间减少,处理数据的时间增加

我们对IO的期待也是这样,希望等待的时间减少,而IO拷贝的本身时间增加

所谓的IO模型就是提供解决这些问题的方案

阻塞式IO

阻塞式IO我们一开始学习语言的时候就在用,例如cin,scanf,都是阻塞式IO

当内核在数据准备好之前,系统调用会阻塞在读取步骤,一直等待,直到缓冲区中有有效数据

在这里插入图片描述

所有的套接字默认都是阻塞式IO,阻塞式IO也是最常见的模型

非阻塞IO

非阻塞IO就可以简单理解为不等待的IO,他在读取缓冲区时,发现没有数据,则会直接返回,跟读取出错的情况是很像的

但是我们需要区分这两种情况,利用全局变量errno,当他是读取发现无数据时,则设置为EWOULDBLOCK

非阻塞IO一般是需要反复尝试读写文件描述符,这个过程称之为轮询,对CPU来说是比较大的浪费,一般也只有在特定情况下才会使用

在这里插入图片描述

设置IO为非阻塞形式,需要使用系统调用fcntl,我们下一篇文章会介绍,这里只需要知道他可以将文件描述符设置为非阻塞状态

// 将指定fd设置为非阻塞
void SetNonBlock(int fd)
{int fl = fcntl(fd, F_GETFL);int (fl < 0){cerr << "fcntl error" << endl;exit(1);}fcntl(fd, F_SETFL, fl | O_NONBLOCK);
}int main()
{SetNonBlock(0); // 将标准输入设置为非阻塞while(true){char buffer[1024];ssize_t s = read(0, buffer, sizeof(buffer) - 1);if(s > 0) // 读取有数据{buffer[s] = '\0';cout << buffer << endl;}else if (s = 0) // 读到文件结尾{cout << "file end" << endl;break;}else{// 出错或者读取无数据if(errno == EWOULDBLOCK || errno == EAGAIN){// 缓冲区无数据cout << "buffer no status" << endl;cout << errno << endl;}else if(errno == EINTR){// 信号中断,但是不算read的错误cout << "IO interrupted by signal" << endl;}else{// 真的读取错误cout << "read error" << endl;break;}}sleep(1);}return 0;
}

实际上当缓冲区没有数据的时候,甚至是信号中断的时候,你可以在其中写其他的小型业务逻辑,while循环会一直在这里轮询

信号驱动式IO

缓冲区是操作系统管理的,因此当缓冲区中有数据时,操作系统是知道的,他就可以使用信号SIGIO通知进程进行IO拷贝操作

在这里插入图片描述

这就是信号驱动式IO,我们不用亲自动手去检查IO等待是否完成,而是交由操作系统去,他好了就会通知我们继续完成拷贝,这样我们就有更多的时间去做别的事情

IO多路转接

IO多路转接是实际应用最为广泛的一种IO模式,因为上面的几种都是一次只管理一个文件描述符,为什么不直接管理一百个文件描述符呢

在这里插入图片描述

实际上是可行的,这需要借助select和recvfrom这两个系统调用,第一个是用来查看数据是否准备好,第二个是用来拷贝数据的,这种模式会在下一篇文章具体介绍

异步IO

上面所有的IO都是同步IO,说人话就是参与了等待或者拷贝这两个过程的

而异步IO则是都不参与,在拷贝完成之后,系统会通知进程可以处理使用了

与信号驱动IO不同,异步IO不需要参加拷贝的过程,直接进行使用

在这里插入图片描述

同步和异步

同步和异步是一种思想,是一种消息通信的机制

同步是在调用的时候,就一定要等待这个调用的结果

异步是在调用之后就直接返回,不一定有结果,调用发出之后,被调用者就会通过状态、通知、回调函数来处理这个调用的指令

在实际应用过程中,一定要考虑到业务逻辑适合用哪一种,服务器能否承担得起同步IO的代价

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

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

相关文章

[数据库实验三]安全性

目录 一、实验目的与要求&#xff1a; 二、实验内容&#xff1a; 三、实验小结 一、实验目的与要求&#xff1a; 1、设计用户子模式 2、根据实际需要创建用户角色及用户&#xff0c;并授权 3、针对不同级别的用户定义不同的视图&#xff0c;以保证系统的安全性 二、实验内…

SAP ABAP ‘‘ 和 `` 的区别

DATA(LV_01) 100. DATA(LV_02) 200.’ ’ 输出为 Char 输出为 String 如下直接定义赋值就会报错 DATA ls_value TYPE TABLE OF string. *ls_value VALUE #( ( A ) ). "报错行 ls_value VALUE #( ( A ) ).使用的场景&#xff1a;动态SQL取数 DATA OPTION TYPE STRI…

生成速度更快!AI绘画工具新版 SD WebUI Forge 保姆级安装教程,更低的显存更快的生成速度!

大家好&#xff0c;我是程序员晓晓 不知道平时经常使用 SD WebUI 的小伙伴发现没有&#xff0c;随着安装插件和模型越来越多&#xff0c;WebUI 时不时会出现卡顿或爆显存的情况&#xff0c;尤其在低显存的硬件上更加明显&#xff0c;只能不停的重启来解决。 估计是 WebUI 的作…

进击J8:Inception v1算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、实验目的&#xff1a; 了解并学习图2中的卷积层运算量的计算过程了解并学习卷积层的并行结构与1x1卷积核部分内容&#xff08;重点&#xff09;尝试根据模…

基于 Redis 实现滑动窗口的限流

⏳ 限流场景&#xff1a;突发流量&#xff0c;恶意流量&#xff0c;业务本身需要 基于 Redis 实现滑动窗口的限流是一种常见且高效的做法。Redis 是一种内存数据库&#xff0c;具有高性能和支持原子操作的特点&#xff0c;非常适合用来实现限流功能。下面是一个使用 Redis 实现…

浅拷贝和深拷贝(Java 与 JavaScript)

一、Java 浅拷贝和深拷贝 在Java中&#xff0c;浅拷贝和深拷贝的主要区别在于对对象的引用和内容的复制方式。 浅拷贝 Java 的类型有基本数据类型和引用类型&#xff0c;基本数据类型是可以由 CPU 直接操作的类型&#xff0c;无论是深拷贝还是浅拷贝&#xff0c;都是会复制出…

海外媒体投稿:提高效果的6个国内外媒体套餐内容方法

媒体推广已经成为每个企业形象宣传产品与服务关键方式之一。国内外媒体套餐内容推广方法提供了许多有效的办法&#xff0c;助力企业能够更好地推广自己的产品。下面我们就详细介绍这其中的6个方法&#xff0c;以帮助提升推广效果。 1.明确目标群体和产品定位在制订推广策略以前…

《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》例10-9

灰度共生矩阵的相关性 相关性&#xff08;Correlation&#xff09; 公式 Correlation ∑ i 1 N g ∑ j 1 N g ( i − μ x ) ( j − μ y ) P ( i , j ) σ x σ y \text{Correlation} \frac{\sum_{i1}^{N_g} \sum_{j1}^{N_g} (i - \mu_x)(j - \mu_y) P(i,j)}{\sigma_x \…

HTML【知识改变命运】02标签/元素说明

html 的标签/元素-说明 1:说明2&#xff1a;标签的使用注意点 1:说明 1&#xff1a;html标签在<>中 2&#xff1a;html标签一般是双标签&#xff0c;如起始标签 结束标签 3&#xff1a;html也有单标签&#xff0c;如 4&#xff1a;双标签之间的文本内容就是html的元素内…

开发微信记账本小程序之技术要点记录

我喜欢极简风格&#xff0c;所以我搭建了这款微信记账本小程序。在开发微信记账本小程序过程中&#xff0c;有一些值得关注的技术要点&#xff0c;我则简而记之。 1、空态界面 在没有数据时&#xff0c;我设计了空状态时的占位提示。 在框架中&#xff0c;我使用了 wx:if&qu…

C++安全密码生成与强度检测

目标 密码生成 // Function to generate a random password std::string generatePassword(int length, bool includeUpper, bool includeNumbers, bool includeSymbols) {std::string lower "abcdefghijklmnopqrstuvwxyz";std::string upper "ABCDEFGHIJKLM…

IP地址的打卡路径是什么?

众多周知&#xff0c;IP地址使我们浏览网站的“必需品”&#xff0c;他会在我们进行网络活动时起到通关文牒一般的作用。那么&#xff0c;放我们进行网络活动时&#xff0c;我们的“通关文牒”上面会在哪些地点留下痕迹&#xff0c;IP地址的流转路径是什么&#xff1f; 第一关…

企业如何选择合适的半导体设计小企业软件

在半导体行业日益精细化与智能化的今天&#xff0c;企业选择合适的半导体设计小企业软件&#xff0c;已成为提升研发效率、缩短产品上市周期、增强市场竞争力的关键。面对市场上琳琅满目的软件产品&#xff0c;企业需从多方面考量&#xff0c;以确保所选软件既能满足当前需求&a…

SpringMVC中出现的sql语句错误

1、原sql语句&#xff1a;select major_id AS majorId ,major_name AS majorName,tuition,dept_id as deptId from tb_major where major_id ? 出现问题&#xff1a;Request processing failed: org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQ…

java并发之并发关键字

并发关键字 关键字一&#xff1a;volatile 可以这样说&#xff0c;volatile 关键字是 Java 虚拟机提供的轻量级的同步机制。 功能 volatile 有 2 个主要功能&#xff1a; 可见性。一个线程对共享变量的修改&#xff0c;其他线程能够立即得知这个修改。普通变量不能做到这一点&a…

将Docker镜像推送到阿里云仓库,使用Docker-compose将mysql、redis、jar包整合在一起

进入阿里云&#xff1a; https://cr.console.aliyun.com 阿里云镜像控制台 选择个人实例 创建命名空间 创建镜像仓库 下一步之后&#xff0c;创建我们的本地仓库 创建好之后可以在个人实例里看到我们刚创建好的镜像仓库 点击我们的仓库进去里面&#xff0c;可以看到里面有我们…

4.5 了解大数据处理基本流程

文章目录 1. 引言2. 数据采集2.1 数据库采集2.2 实时数据采集2.3 网络爬虫采集 3. 数据预处理3.1 数据清洗3.2 数据集成3.3 数据归约3.4 数据转换 4. 数据处理与分析4.1 数据处理4.2 数据分析 5. 数据可视化与应用5.1 数据可视化5.2 ECharts框架5.3 课堂作业 6. 结语 1. 引言 …

信息安全工程师(17)密码体制分类

前言 密码体制&#xff0c;也称为密码系统&#xff0c;是信息安全领域中的一个重要概念&#xff0c;用于解决机密性、数据完整性、认证、身份识别、可控性及不可抵赖性等问题。根据加密和解密所使用的密钥是否相同&#xff0c;密码体制主要可以分为两大类&#xff1a;单钥体制&…

【Unity基础】Unity中跨平台使用SQLite(一)

一、概述 游戏中数据存储方案众多&#xff0c;在进行选择时&#xff0c;除了要考虑数据类型外&#xff0c;还要考虑对于跨平台的支持。 对于数据存储方案将在单独文章里介绍&#xff0c;下面只是总结了不同方案的特点。 方法跨平台支持读写能力适合场景特点Resources优秀只读…

c++ 使用 Graham 扫描的凸包(Convex Hull using Graham Scan)

先决条件&#xff1a; 如何检查两个给定的线段是否相交&#xff1f; c https://blog.csdn.net/hefeng_aspnet/article/details/141713655 java https://blog.csdn.net/hefeng_aspnet/article/details/141713762 python https://blog.csdn.net/hefeng_aspnet/article/details/…