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

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

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

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

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

2:总结
任何 IO 过程中, 都包含两个步骤。 第一是等待, 第二是拷贝。而且在实际的应用场景中, 等待消耗的时间往往都远远高于拷贝的时间。让 IO 更高效, 最核心的办法就是让等待的时间尽量少。
同步通信(synchronous communication) vs 异步通信(asynchronous communication)
1. 同步(Synchronous IO):
就是在发出一个调用时, 在没有得到结果之前, 该调用就不返回。但是一旦调用返回, 就得到返回值了; 换句话说, 就是由调用者主动等待这个调用的结果;
2. 异步(Asynchronous IO):
调用在发出之后, 这个调用就直接返回了, 所以没有返回结果; 换句话说, 当一个异步过程调用发出后, 调用者不会立刻得到结果; 而是在调用发出后, 被调用者通过状态、 通知来通知调用者, 或通过回调函数处理这个调用。
同步(Synchronization)vs 互斥(Mutual Exclusion)
-
同步(Synchronization):
- 同步是指在多线程环境中,协调多个线程的执行顺序,使得它们能够按照预定的顺序执行。
- 同步通常用于确保线程之间的合作,例如,一个线程可能需要等待另一个线程完成某些任务后才能继续执行。
- 同步可以通过多种机制实现,如信号量(Semaphore)、事件(Event)、条件变量(Condition Variable)等。
-
互斥(Mutual Exclusion):
- 互斥是指在多线程环境中,确保同一时间只有一个线程能够访问某个特定的资源或代码段。
- 互斥主要用于防止竞争条件,即多个线程同时访问和修改共享数据,导致数据不一致的问题。
- 互斥可以通过锁(Locks)如互斥锁(Mutex)、读写锁(Read-Write Lock)等来实现。
常见的同步和互斥机制:
- 互斥锁(Mutex):一种基本的同步机制,用于保护临界区,确保同一时间只有一个线程可以进入临界区。
- 信号量(Semaphore):用于控制对共享资源的访问,可以允许多个线程同时访问,也可以限制访问数量。
- 事件(Event):用于线程之间的通信,一个线程可以等待事件被另一个线程触发。
- 条件变量(Condition Variable):用于线程之间的同步,允许线程在某些条件不满足时挂起,并在条件满足时被唤醒。
- 读写锁(Read-Write Lock):允许多个读操作同时进行,但写操作会独占锁,确保写操作的互斥。
同步与互斥的区别:
- 同步:关注的是线程之间的协调和合作,确保它们能够按照正确的顺序执行。
- 互斥:关注的是保护共享资源,防止多个线程同时访问同一资源,从而避免数据不一致。
阻塞(Blocking)vs 非阻塞(Non-blocking)
阻塞和非阻塞关注的是程序在等待调用结果(消息, 返回值) 时的状态。
-
阻塞(Blocking):
- 当一个线程执行一个阻塞操作时,它会停止执行,直到该操作完成。在等待期间,线程不会做任何其他工作。
- 阻塞操作通常用于简化编程模型,因为它们不需要额外的机制来处理并发和同步。
- 缺点是阻塞操作可能导致程序的响应性降低,特别是在等待时间较长的情况下。
-
非阻塞(Non-blocking):
- 非阻塞操作不会停止线程的执行。如果操作尚未完成,线程可以继续执行其他任务。
- 非阻塞操作通常需要额外的同步机制,如事件、回调或轮询,来处理操作的完成。
- 优点是可以提高程序的并发性和响应性,因为线程不需要等待就可以继续执行其他任务。
阻塞与非阻塞的比较:
-
性能:
- 阻塞操作可能导致线程资源的浪费,特别是在IO密集型应用中。
- 非阻塞操作可以提高资源利用率,因为线程可以在等待期间执行其他任务。
-
编程复杂性:
- 阻塞操作通常更容易理解和实现,因为它们遵循同步编程模型。
- 非阻塞操作可能更复杂,需要更多的同步和错误处理机制。
-
适用场景:
- 阻塞操作适用于简单的应用或那些不需要高并发的场景。
- 非阻塞操作适用于需要高并发和快速响应的系统,如服务器和网络应用。
实际应用中的阻塞与非阻塞:
-
文件IO:
- 阻塞式文件IO:当一个线程读取文件时,如果文件不可用,线程会等待直到文件可用。
- 非阻塞式文件IO:线程会立即返回,不会等待文件可用,而是定期检查文件状态。
-
网络IO:
- 阻塞式网络IO:当一个线程等待数据到来时,它会阻塞直到数据到达。
- 非阻塞式网络IO:线程会立即返回,不会等待数据,而是定期检查数据是否到达。
3:非阻塞IO举例
fcntl
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );
传入的 cmd 的值不同, 后面追加的参数也不相同。
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)。
轮询方式读取标准输入
#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <sys/select.h>int SetNoBlock(int fd)
{int flags = fcntl(fd, F_GETFL);if (flags == -1){perror("fcntl get flags");return 0;}else{int n = fcntl(fd, F_SETFL, flags | O_NONBLOCK);if (n == -1){perror("fcntl set flags");return 0;}}return 1;
}int main()
{if (!SetNoBlock(0)){perror("fcntl set fcntl!");return -1;}while (true){printf("Enter: ");fflush(stdout);char buffer[1024];ssize_t n = ::read(0, buffer, sizeof(buffer));// 如果是非阻塞,底层数据没有准备就绪,IO接口,会以出错的形式返回!// 区分 底层不就绪 与 真的出错了 ?// 底层没有就绪(错误码被设置):errno错误码:EWOULDBLOCK EAGAINif (n > 0){buffer[n] = 0;std::cout << buffer << std::endl;}else if (n == 0) //ctrl + d 读取输入结束{perror("read done");break;}else{if (errno == EWOULDBLOCK){sleep(1);// 轮询检测...// Do other things...printf("Do other things\n");continue;}else if (errno == EINTR) // 处理读取被中断{continue;}else{perror("read");break;}}sleep(1);}return 0;
}

相关文章:
Linux:五种IO模型
1:五种IO模型 1:阻塞IO 阻塞IO: 在内核将数据准备好之前,系统调用会一直等待.所有的套接字,默认 都是阻塞方式。 2:非阻塞 IO 非阻塞 IO: 如果内核还未将数据准备好, 系统调用仍然会直接返回, 并且返回EWOULDBLOCK 错误码。 非阻塞 IO 往往需…...
ansible企业实战
ansible最佳实践 优化ansible速度 开启SSH长连接 修改 /etc/ansible/ansible.cfg里面的参数 ssh_args -C -o ControlMasterauto -o ControlPersist5d ControlPersist5d这个参数是设置整个长连接保持时间设置为5天,如果开启,通过SSH连接过的设备都会…...
面向对象程序设计之模板进阶(C++)
在之前我出过一篇博客介绍了模版的初阶:面向对象程序设计(C)模版初阶,接下来我们将进行模版的进阶学习,介绍关于更多模版的知识 1.非类型模版参数 模板参数分类类型形参与非类型形参 类型形参即:出现在模板参数列表中,跟在class或…...
电巢科技携Ecosmos元宇宙产品亮相第25届中国光博会
第25届中国国际光电博览会(“CIOE中国光博会”)今日在深圳国际会展中心盛大开幕。本届博览会以“光电引领未来,驱动应用创新”为主题,吸引了全球超过3700家优质光电企业参展,展示了光电产业的最新成果和前沿技术。 电…...
Redis 入门 - 收官
《Redis 入门》系列文章总算完成了,希望这个系列文章可以想入门或刚入门的同学提供帮助,希望能让你形成学习Redis系统性概念。 当时为什么要写这个系列文章,是因为我自己就是迷迷糊糊一路踩坑走过来的,我踩完的坑就踩完了&#x…...
Windows技术栈企业基础底座(1)-为基于Windows的Nginx安装证书
企业的基础环境是一个组织的信息化数字化底座。传统企业基础环境多种系统,应用交杂,多种技术栈使得深入运维成本极大,且人员知识技能较难复用,造成资源浪费。本系列旨在尝试推动这一理念, 建立Windows, 或linux聚焦的技术栈的企业…...
ThreeJS入门(002):学习思维路径
查看本专栏目录 - 本文是第 002篇入门文章 文章目录 如何使用这个思维导图 Three.js 学习思维导图可以帮助你系统地了解 Three.js 的各个组成部分及其关系。下面是一个简化的 Three.js 学习路径思维导图概述,它包含了学习 Three.js 的主要概念和组件。你可以根据这个…...
基于ssm+vue+uniapp的新生报到系统小程序
开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…...
掌握 JavaScript ES6+:现代编程技巧与模块化实践
掌握 JavaScript ES6:现代编程技巧与模块化实践 一 . 变量声明 let二 . 声明常量 const三 . 模板字符串四 . 函数的参数默认值五 . 箭头函数六 . 对象初始化七 . 解构7.1 接收 JSON 对象7.2 接收数组 八 . 延展操作符九 . 导入和导出9.1 方式一9.2 方式二 这篇文章我…...
AttackGen - AI 网络安全事件响应测试工具,附下载链接
为了提高我们团队在安全活动中的响应效率,我关注到了一款叫 AttackGen 的工具,我们需要的是一个既能快速生成场景又能准确反映现实威胁的工具。 在红蓝对抗中,我们经常要模拟各种攻击场景,以测试我们的防御水平。这不仅仅是为了“…...
CAD2020安装方法
文章目录 下载安装包打开压缩包打开文件夹打开CAD2020文件夹双击运行Setup.exe点击安装选择我接受 点击下一步路径默认点击安装等待加载完成安装完成点击立即启动点击OK点击输入序列号点击我同意点击激活输入序列号和 产品钥密点击下一步选择我具有 Autodesk 提供的激活码以管理…...
ubuntu安装mongodb实操学习
一、系统环境 ubuntu 22.04 寻找合适的仓库 经过浏览器里搜索MongoDB Repositories发现这个目录下面有完整的安装包 二、添加到apt,并安装 1、wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | tee /etc/apt/trusted.gpg.d/server-6.0.asc 获取公…...
RabbitMQ 基础入门
文章内容是学习过程中的知识总结,如有纰漏,欢迎指正 文章目录 前言 1. 重要概念 1.1 Publisher 1.2 Message 1.3 Exchange 1.4 BindingKey 1.5 Routingkey 1.6 Queue 1.7 Consumer 1.8 Connection 1.9 Channel 1.10 Virtual Host 1.11Broker 2. RabbitMQ…...
Unity 特殊文件夹
文件夹名称Assets资产Editor编辑器Editor default resources编辑器资源Gizmos辅助图标Plugins插件Resources资源Standard Assets标准资产StreamingAssets流资产PersistentDataPath持久数据 Editor 编辑器文件夹 这个文件夹是专门用来做编辑器级别功能的,比如一些辅…...
Monster Sound FX Pack 2 怪物恶魔野兽声效包
这是受最新电影和游戏启发而创作的一系列超凡怪兽音效中的第二卷。Monster Sound FX Pack 2 包含精心设计的声音,充满个性,为听众带来新的体验。这些声音经过专业设计,是严肃的声音设计师和游戏开发者的必备品! 发现声音非常适合龙、野兽、外星人、兽人、地精、巨人、巨魔、…...
linux常用环境配置
nvm 用于管理不同版本node node版本管理工具 nvm install 18 #安装 nvm uninstall 18 #卸载 nvm use 18 #使用 nvm ls #查看当前有的node版本 nvm ls-remote #列出所有可用的node版本pyenv 在linux中管理多版本 python 常用命令: pyenv install 3.8.…...
SoapShell 更新 | 新增调用cmd执行系统命令
01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失…...
Ubuntu查看系统用户信息
0 Preface/Foreword 1 查看方式 1.1 查看系统用户 getent passwd getent: Get entries for Name Service Switch Libraries. 该命令会列出系统上所有用户的详细信息,包括用户名、密码、用户ID(UID)、组ID(GID)、用户描…...
入门AI绘画 | 手把手教学Stable Diffusion
前言 **Stable Diffusion(简称SD)**就是一个AI自动生成图片的软件,通过我们输入文字,SD就能生成对应的张图片,不再需要像以前一样要把图片“画“出来,或者是“拍“出来 安装非常简单 分为解压整合包和安装…...
基于SpringBoot+Vue+MySQL的热门网络游戏推荐系统
系统展示 用户前台界面 管理员后台界面 系统背景 基于SpringBootVueMySQL的热门网络游戏推荐系统,其背景主要源于当前网络游戏市场的蓬勃发展与用户需求的日益多样化。随着互联网的普及和技术的不断进步,网络游戏已成为人们休闲娱乐的重要方式之一。面对…...
像素幻梦快速上手指南:3步完成16-bit风格图像生成与内存流导出
像素幻梦快速上手指南:3步完成16-bit风格图像生成与内存流导出 1. 认识像素幻梦创意工坊 像素幻梦创意工坊(Pixel Dream Workshop)是一款基于FLUX.1-dev扩散模型构建的像素艺术生成工具。它采用明亮的16-bit像素风格界面设计,为…...
把 SAP ABAP CDS View Code Mapping 讲透:从 SEGW 映射到 SADL 运行时的关键机制与项目实践
很多 ABAP 开发者在第一次接触 CDS View Code Mapping 时,容易把它理解成一次普通的字段映射操作:左边是 CDS 字段,右边是 OData 属性,拖一拖、连一连,事情就结束了。真正进入项目以后,大家才会发现,这个动作背后牵动的是 SAP Gateway、SADL、DPC 运行时、关联导航,以及…...
英雄联盟智能助手完全指南:3分钟掌握LCU API自动化工具
英雄联盟智能助手完全指南:3分钟掌握LCU API自动化工具 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为英雄联盟…...
【实战指南】Spirent TCL 并发与新建连接测试全流程解析
1. Spirent TCL测试基础与环境搭建 第一次接触Spirent TestCenter时,我也被它强大的功能和复杂的界面吓到过。但实际用下来发现,只要掌握几个核心模块,就能完成大多数性能测试任务。这里先带大家快速搭建测试环境,为后续的并发和新…...
python小白福音:跟着快马生成的图文指南,轻松搞定vscode环境配置
作为一个刚开始学Python的小白,第一次打开VSCode时完全不知道从哪里下手。各种专业术语看得一头雾水,网上的教程要么太简单要么太复杂。直到发现了InsCode(快马)平台,它帮我生成了这份超级详细的配置指南,现在终于能愉快地写代码了…...
基于vue+springboot框架的社区居民诊疗健康管理系统设计与实现
目录技术选型与架构设计核心功能模块划分开发阶段规划关键问题解决方案测试与部署文档规范项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术选型与架构设计 前端框架:Vue 3(Composition APIÿ…...
基于深度学习的桥梁健康状态监测与预警系统设计与实现
基于深度学习的桥梁健康状态监测与预警系统设计与实现 1. 系统总体架构 本系统采用 B/S 架构,由数据采集层、数据处理层、深度学习模型层、Web后端层及前端可视化层组成。 后端框架:Django (负责ORM、API、用户认证) 深度学习:TensorFlow 2.x / Keras (构建LSTM-Autoencod…...
如何免费获取Microsoft Word APA第7版参考文献格式:完整安装指南
如何免费获取Microsoft Word APA第7版参考文献格式:完整安装指南 【免费下载链接】APA-7th-Edition Microsoft Word XSD for generating APA 7th edition references 项目地址: https://gitcode.com/gh_mirrors/ap/APA-7th-Edition 还在为学术论文的参考文献…...
计算机毕业设计springboot基于的突发事件信息共享系统 基于Spring Boot的应急事件协同处理平台 利用Spring Boot构建的突发状况信息交互系统
计算机毕业设计springboot基于的突发事件信息共享系统 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。在当今社会,各类突发事件频发,从自然灾害到公共卫生…...
【架构实战】数据库分库分表实战
一、为什么需要分库分表 当数据量超过单机数据库的承载能力时,分库分表成为必然选择: 单库数据量过亿:查询性能急剧下降单表数据量过大:索引效率降低,DML操作变慢连接数耗尽:数据库连接成为稀缺资源存储空间…...
