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

谈谈各种IO模型

目前的IO模型有5种BIO(阻塞IO)、NIO(非阻塞IO)、IO多路复用、信号驱动IO、异步IO(AIO)

了解这些模型之前,我们需要先知道IO模型中的几个概念:阻塞&非阻塞、同步&异步

阻塞是一个线程的状态,也就是操作系统会将线程或者进程挂起,让线程处于阻塞状态,这时候线程就是一直等待的状态,然后必须由操作系统或者其他线程唤醒才能进入就绪态进而到运行态。

非阻塞那就是相反了,会立即返回,不会一直等待。

所以我们看是否阻塞其实就看是否会立即返回,有没有一直等待

看是异步还是同步,就是看最终读取的结果是不是全程由操作系统完成,如果需要应用程序参与的那就是同步。

那我们就拿网络通信,一个应用程序A向一个应用程序B进行消息传递。

我们都知道网络通信是TCP协议,那么这时候内存是有TCP的发送缓冲区和接收缓冲区的。

那么当应用程序A向应用程序B发送消息的时候,当消息到达应用程序B的接收缓冲区的时候,应用程序B就会发起recfrom系统调用,操作系统就会将数据从内存拷贝到应用程序B,那我们知道消息肯定是不间断的,应用程序B也不知道什么时候应用程序A会向其发送消息。

那么这里就是本文讲解IO模型的入口点。对啊?应用程序B怎么知道什么时候应用程序A会向其发送消息,所以

阻塞IO(BIO)就是:

当应用程序发起recfrom函数的时候,如果此时没有得到结果,那么操作系统就会想应用程序B的线程挂起,让其处于阻塞的状态,等有结果了,操作系统就会将应用程序B线程唤醒让其从就绪态进入运行态,然后再把结果返回给应用程序B。

具体流程是这样的。

非阻塞IO(NIO)就是                                                      

当没有得到结果返回时,也不会将应用程序挂起,而是操作系统会返回一个错误标识立即返回,不会让应用程序B一直等待,让其可以做其他事情。但是应用程序B需要自己不断的调用recvfrom询问操作系统是否有结果返回。

那么应用程序B一直询问操作系统有没有数据,一直需要调用recvfrom,那么如果在并发的情况下,有很多个请求同时向应用程序B发送消息,那么这时候应用程序就得开启N个线程,每个线程都得去recvfrom函数调用,线程是宝贵的资源,单独就干询问这一事,大大浪费了资源没有好好利用。所以能不能有一个结构可以作为监控,让应用程序B不用一直去询问操作系统,当有数据返回的时候,这个监控器就可以监控到,然后安排线程去读取呢?那么就是后面演化的IO多路复用

IO多路复用就是

复用,指的就是线程复用,一个线程可以处理多个IO请求,应用程序通过select/poll/epoll等系统调用,等某一个请求有数据就绪的时候,就可以分配线程去调用recvfrom函数去获取返回结果。select操作可能会阻塞,直到有某个请求数据就绪的时候才不会阻塞,但是阻不阻塞其实取决于timeout参数,值为0,那么就是没有请求数据就绪就直接返回,不用阻塞等待,可以干其他事情,

解决了一个线程可以处理多个并发IO请求的问题。

那么频繁的轮询是会增加cpu的负担的,因为有些轮询其实是空轮询。那么有没有什么办法可以不用轮询呢?那么就是接下要介绍的信号驱动型IO

信号驱动型IO就是

应用程序会调用sigaction函数为一个或多个IO请求设置信号处理函数,此操作是直接返回的,不会阻塞,可以继续干其他事情,当有请求IO数据准备就绪的时候,操作系统就会发送一个SIGIO信号,那么之前设置过信号处理函数就会被触发,应用程序就会收到通知,此时应用程序就会在信号处理函数里面通过recvfrom函数调用获取结操作系统结果。

这就是信号驱动型IO,我们发现信号驱动型IO是非阻塞的。

上面4种都是同步型IO,也就是说都需要由应用程序参与等待操作系统将数据从内核拷贝到应用程序的过程。

最后一种是异步IO,什么是异步IO,

异步IO就是应用程序发起一个read或者write请求的时候,后面的事就完全不用参与了,此时如果数据还没准备就绪就会立即返回,不用阻塞等待,可以继续干其他事,如果数据准备就绪,那么操作系统会将数据从内存拷贝到应用程序,然后通过回调通知应用程序,应用程序就可以直接读取就行了,不用再由应用程序去自己参与拷贝了。也就是完成是一种“发出指令,坐享其成”。

总结:

IO模型就是5种,同步阻塞IO,同步非阻塞IO,IO多路复用,信号驱动型IO,异步IO

如何判断是同步还是异步:

是否需要由应用程序参与全部的过程。需要参与就是同步,不需要参与就是异步。

如何判断是阻塞还是非阻塞:

是否会立即返回,是否会一直等待。会一直等待就是阻塞,不会一直等待就是非阻塞。

相关文章:

谈谈各种IO模型

目前的IO模型有5种:BIO(阻塞IO)、NIO(非阻塞IO)、IO多路复用、信号驱动IO、异步IO(AIO) 了解这些模型之前,我们需要先知道IO模型中的几个概念:阻塞&非阻塞、同步&am…...

基于STM32、HAL库的ADAU1701JSTZ音频接口芯片驱动程序设计

一、简介: ADAU1701JSTZ 是 Analog Devices 公司推出的一款高性能、低功耗音频编解码器 (CODEC) 芯片。它专为便携式音频设备设计,集成了麦克风前置放大器、ADC、DAC、耳机放大器等功能模块,支持多种音频接口和采样率,非常适合与 STM32 微控制器配合使用。 主要特性: 24…...

Linux系统管理与编程20:Apache

兰生幽谷,不为莫服而不芳; 君子行义,不为莫知而止休。 做好网络和yum配置,用前面dns规划的www的IP进行。 #!/bin/bash #----------------------------------------------------------- # File Name: myWeb.sh # Version: 1.0 # …...

BFS算法篇——打开智慧之门,BFS算法在拓扑排序中的诗意探索(下)

文章目录 引言一、课程表1.1 题目链接:https://leetcode.cn/problems/course-schedule/description/1.2 题目分析:1.3 思路讲解:1.4 代码实现: 二、课程表||2.1 题目链接:https://leetcode.cn/problems/course-schedul…...

【入门】纸盒的最大体积是多少?

描述 在一张尺寸为 n * n 厘米的正方形硬纸板的四个角上,分别裁剪掉一个 m * m 厘米的小正方形,就可以做成一个无盖纸盒,请问这个无盖纸盒的最大体积是多少? 立方体的体积 v 底面积 * 高) 比如: n 5 &am…...

什么是Vim

Vim可是Linux中最强大、最受欢迎的文本编辑器之一,很多程序员、系统管理员都离不开它。要说清楚Vim的各种功能和用法,似乎有点长,但我会尽量用简单通俗的方式,把Vim的核心知识讲清楚,让你能一步一步开始使用它。 一、…...

QT5.14安装以及新建基础项目

进入qt中文网站:Qt | 软件开发全周期的各阶段工具 额,考虑新手可能还是找不到,我就分享一下我下载的的吧 通过网盘分享的文件:qt-opensource-windows-x86-5.14.2.exe 链接:https://pan.baidu.com/s/1yQTRp-b_ISje5B3UWb7Apw?pw…...

Java Spring MVC -01

SpringMVC 是一种基于 的实现 MVC 设计模式的请求驱动类型的轻量级 Web 框架,属于 Spring FrameWork 的后续产品,已经融合在 Spring Web Flow 中。 First:SpringMVC-01-SpringMVC 概述 SpringMVC 是 Spring 框架的一个模块,用于构建 Web 应…...

KV cache 缓存与量化:加速大型语言模型推理的关键技术

引言 在大型语言模型(LLM)的推理过程中,KV 缓存(Key-Value Cache) 是一项至关重要的优化技术。自回归生成(如逐 token 生成文本)的特性决定了模型需要反复利用历史token的注意力计算结果&#…...

视频编解码学习十一之视频原始数据

一、视频未编码前的原始数据是怎样的? 视频在未编码前的原始数据被称为 原始视频数据(Raw Video Data),主要是按照帧(Frame)来组织的图像序列。每一帧本质上就是一张图片,通常采用某种颜色格式…...

[Java实战]Spring Boot 3 整合 Apache Shiro(二十一)

[Java实战]Spring Boot 3 整合 Apache Shiro(二十一) 引言 在复杂的业务系统中,安全控制(认证、授权、加密)是核心需求。相比于 Spring Security 的重量级设计,Apache Shiro 凭借其简洁的 API 和灵活的扩…...

Cursor 编辑器 的 高级使用技巧与创意玩法

以下是针对 Cursor 编辑器 的 高级使用技巧与创意玩法 深度解析,涵盖代码生成优化、工作流定制、隐藏功能等层面,助你将 AI 辅助编程效率提升至新高度: 一、代码生成进阶技巧 1. 精准控制生成粒度 行级控制: 在代码行内用 // > 指定生成方向(替代模糊注释)def merge_…...

mysql性能提升方法大汇总

前言 最近在开发自己的小程序的时候,由于业务功能对系统性能的要求很高,系统性能损耗又主要在mysql上,而业务功能的数据表很多,单表数据量也很大,又涉及到很多场景的数据查询,所以我针对mysql调用做了优化…...

C++标准流详解:cin/cout的绑定机制与cerr/clog的缓冲差异

在C中,标准错误流(cerr)、标准日志流(clog)与标准输入输出流(cin/cout)的行为差异主要体现在缓冲机制和绑定关系上。以下是详细解释,并结合cin和cout的关联性进行对比分析&#xff1…...

BlockMesh Ai项目 监控节点部署教程

项目介绍 BlockMesh 是一个创新、开放且安全的网络,允许用户轻松地将多余的带宽货币化。 它为用户提供了被动获利并参与人工智能数据层、在线隐私、开源和区块链行业前沿的绝佳机会。 此教程为Linux系统教程 教程开始 首先到这里注册账号,注册后保存…...

【Bluedroid】蓝牙 HID DEVICE 初始化流程源码解析

本文深入剖析Android蓝牙协议栈中HID设备(BT-HD)服务的初始化与启用流程,从接口初始化、服务掩码管理、服务请求路由到属性回调通知,完整展现蓝牙HID服务激活的技术路径。通过代码逻辑梳理,揭示服务启用的核心机制&…...

iOS创建Certificate证书、制作p12证书流程

一、创建Certificates 1、第一步得先在苹果电脑上创建一个.certSigningRequest的文件。首先打开钥匙串,使用快捷键【command空格】——输入【钥匙串】回车(找不到就搜一下钥匙串访问使用手册) 2、然后在苹果电脑的左上角菜单栏选择【钥匙串…...

curl发送数据不为null,但是后端接收到为null

curl -X POST http://localhost:8080/xiaozhi/test --header "Content-Type: application/json" -d "{\"age\":123}"经过检查发现注解导入错误 正确的应该是 import org.springframework.web.bind.annotation.RequestBody;...

blazor与硬件通信实现案例

在网页接入硬件交互通信方案这篇博客中,曾经提到了网页中接入各种硬件操作的方法,即通过Windows Service作为指令的中转,并建立websocket通信连接,进而实现接入硬件的各种操作。这篇博客就以实际的案例来讲解具体怎么实现。 一、建立Windows Service项目 比如我就建立了一…...

Linux下mysql的安装与远程链接

linux安装mysql 01下载依赖: 找到网址/download下: 最下面MySQL Community(mysql社区版) 选择MySQL Community Server 选择对应的mysql版本 操作系统版本选择 根据操作系统的版本选择具体版本号 下载离线版本 安装包详情 0…...

esp32硬件支持AT指令

步骤1:下载AT固件 从乐鑫官网或Git鑫GitHub仓库(https://github.com/espressif/esp-at)获取对应ESP32型号的AT固件(如ESP32-AT.bin)。 步骤2:安装烧录工具 使用 esptool.py(命令行工具&#…...

【HT周赛】T3.二维平面 题解(分块:矩形chkmax,求矩形和)

题意 需要维护 n n n \times n nn 平面上的整点,每个点 ( x , y ) (x, y) (x,y) 有权值 V ( x , y ) V(x, y) V(x,y),初始都为 0 0 0。 同时给定 n n n 次修改操作,每次修改给出 x 1 , x 2 , y 1 , y 2 , v x_1, x_2, y_1, y_2, v x…...

C++中的虚表和虚表指针的原理和示例

一、基本概念 1. 什么是虚函数(virtual function)? 虚函数是用 virtual 关键字修饰的成员函数,支持运行时多态(dynamic polymorphism)。通过基类指针或引用调用派生类重写的函数。 class Base { public:…...

qemu热迁移后内存占用突增问题

1.问题描述 虚拟机配置了memoryBackingmemfd的情况下&#xff0c;热迁移虚拟机后&#xff0c;在目的节点 qemu-kvm 进程占用 rss 会突增很多。 如果去掉这个配置没这个现象。 <memoryBacking><source typememfd/> </memoryBacking>2.问题现象 2.1 不配置…...

鸿蒙 Core File Kit(文件基础服务)之简单使用文件

查看常用的沙箱目录 应用沙箱文件访问关系图 应用文件目录结构图 查看常用的沙箱目录 Entry Component struct Index {build() {Button(查看常用的沙箱目录).onClick(_>{let ctx getContext() // UI下只能使用这个方法&#xff0c;不能 this.contextconsole.log(--应用缓存…...

AI 检测原创论文:技术迷思与教育本质的悖论思考

当高校将 AI 写作检测工具作为学术诚信的 "电子判官"&#xff0c;一场由技术理性引发的教育异化正在悄然上演。GPT-4 检测工具将人类创作的论文误判为 AI 生成的概率高达 23%&#xff08;斯坦福大学 2024 年研究数据&#xff09;&#xff0c;这种 "以 AI 制 AI&…...

基于Qt的app开发第七天

写在前面 笔者是大一下计科生&#xff0c;标题这个项目是笔者这个学期的课设&#xff0c;与学长共创&#xff0c;我负责客户端部分&#xff0c;现在已经实现了待办板块的新建、修改。 这个项目目前已经走上正轨了&#xff0c;博主也实现了主要功能的从无到有&#xff…...

目标检测任务常用脚本1——将YOLO格式的数据集转换成VOC格式的数据集

在目标检测任务中&#xff0c;不同框架使用的标注格式各不相同。常见的框架中&#xff0c;YOLO 使用 .txt 文件进行标注&#xff0c;而 PASCAL VOC 则使用 .xml 文件。如果你需要将一个 YOLO 格式的数据集转换为 VOC 格式以便适配其他模型&#xff0c;本文提供了一个结构清晰、…...

NLTK库: 数据集3-分类与标注语料(Categorized and Tagged Corpora)

NLTK库: 数据集3-分类与标注语料&#xff08;Categorized and Tagged Corpora&#xff09; 1.二分类语料 主要是电影语料&#xff0c;和情绪(积极消极、主观客观)有关&#xff0c;有以下2个语料&#xff1a; 1.1 movie_reviews: IMDb 影评 IMDb&#xff08;Internet Movie …...

uni-app学习笔记五-vue3响应式基础

一.使用ref定义响应式变量 在组合式 API 中&#xff0c;推荐使用 ref() 函数来声明响应式状态&#xff0c;ref() 接收参数&#xff0c;并将其包裹在一个带有 .value 属性的 ref 对象中返回 示例代码&#xff1a; <template> <view>{{ num1 }}</view><vi…...