Linux内核开发之异步通知与异步I/O(三)

Linux 设备驱动中的 I/O模型(二)—— 异步通知和异步I/O 阻塞和非阻塞访问、poll() 函数提供了较多地解决设备访问的机制,但是如果有了异步通知整套机制就更加完善了。       异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上“中断”的概念,比较准确的称谓是“信号驱动的异步I/O”。信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一 阅读详情

   小王,听说过AIO没?外国人,就这样,总是爱简写,简写的结果是咱们都不认识了。所谓AIO就是Asynchronous Input/Output异步输入/输出,基本思想是允许进程发起很多的I/O操作,而不用阻塞或等待任何操作的完成,稍后或在接收到I/O操作完成的通知时,进程就可以检索I/O操作的结果。

“得得,你咋又跟我上起课来了呢,不是说好,今天CS吗?是不是跟我讲课特自信啊“小王抱怨到。

“啊?不是吧,为啥这样呢,那你到底听不听,别到时面试叫天天不灵叫地地不应的,别再找我哈”我气愤的说。

"唉,你都这样说了,我也只能竖起耳朵好好听听了"看着小王极不情愿的表情,我也觉得很可怜啊。

  在异步非阻塞IO中,我们是可以同时发起多个传输操作。这需要每个操作都有一个唯一的上下文,这样才能在它们完成时区分到底是哪个传输操作完成了。在AIO中,

通过aiocb(AIO IO control Block)结构体进行区分,这个结构体如下:

struct aiocb {
	int		aio_fildes;	/* File descriptor */
	off_t		aio_offset;	/* File offset */
	volatile void *	aio_buf;	/* Location of buffer */
	size_t		aio_nbytes;	/* Length of transfer */
	int		aio_reqprio;	/* Request priority offset */
	struct sigevent	aio_sigevent;	/* Signal number and value */
	int		aio_lio_opcode;	/* Operation to be performed */
};

从上边我们可以看到,这个结构体包含了有关传输的所有信息,包括数据准备的用户缓冲区。在产生IO通知时,aiocb结构就被用来唯一标识所完成的IO操作。

AIO系列API中主要有下边几个函数:

1.int aio_read(struct aiocb *aiocbp)

   该函数请求对一个有效的文件描述符进行异步读操作。在请求进行排队之后会立即返回,如果执行成功,返回值就为0,错误则返回-1并设置errno的值。

2.int aio_write(struct aiocb *aiocbp)
   该函数请求一个异步写操作,它会立即返回说明请求已经进行排队,成功返回0,失败返回为-1,并设置相应的error值。

3.int aio_error(struct aiocb *aiocbp)

   该函数用来确定请求的状态,可以返回EINPROGRESS(说明请求尚未完成),ECANCELLED(请求被应用程序取消了),-1(说明发生了错误,具体错误原因由error记录)。

4.ssize_t aio_return(struct aiocb *aiocbp)

   由于并没有阻塞在read调用上,所以我们不能立即返回这个函数的返回状态,这是就要使用这个函数了,需要注意的是只有在aio_error调用确定请求已经完成(可能

已经完成,也可能发生了错误)之后,才能调用这个函数,这个函数的返回值就相当于同步情况下read或write系统调用的返回值(所传输的字节数,如果发生错误,则返回-1)。

5.int aio_suspend(const struct aiocb *const cblist[], int n ,const struct timespec *timeout)

   用户可以通过这个函数来来挂起(或阻塞)调用进程,直到异步请求完成为止,此时会产生一个信号,或者发生其他超时操作。调用者提供了一个aiocb引用列表,其中任何一个完成都会导致给函数返回。

6.int aio_cancel(int fd ,struct aiocb *aiocbp)

   该函数允许用户取消对某个文件描述符执行的一个或所有的IO请求。

   如果要取消一个请求,用户需提供文件描述符和aiocb引用,如果这个请求被成功取消了,则返回AIO_CANCELED,如果该请求完成了,返回AIO_NOTCANCELED.

   如果要取消对某个给定文件描述符的所有请求,用户需要提供这个文件的描述符以及一个aiocbp的NULL引用,如果所有请求被成功取消了,则返回AIO_CANCELED

,只要至少有一个没被取消,这个函数就返回AIO_NOT_CANCELED.如果没有一个请求可以被取消,该函数就会返回AIO_ALLDONE.

   然后,可以使用aio_error来验证每个AIO请求,如果某个请求已经被返回了,那么aio_error就返回-1,并且error会被设置为ECANCELED.

7.int lio_listio(int mode ,struct aiocb *list[], int nent ,struct sigevent *sig)

  这个操作使得用户可以在一个系统调用(一次内核上下文切换中启动大量的I/O操作)。其中,mode参数可以是LIO_WAIT或LIO_NOWAIT,前者会阻塞这个调用,直到所有的IO都完成为止,在操作进行排队之后,LIO_NOWAIT就会返回,list是一个aiocb引用的列表,最大元素的个数有nent定义的。如果list的元素为NULL,lio_lis

tio()将被忽略。

光说理论也不行,是不?现在来点实际点的:

a)用户空间读例程:

#include <aio.h>
..
int fd, set;
struct aiocb my_aiocb;

fd = open("file.txt", O_RDONLY);
if( fd <0 )
{
    perror("open");
}
//清零aiocb结构体
bzero((char *) &my_aiocb, sizeof(struct aiocb));
//为aiocb请求分配数据缓冲区
my_aiocb.aio_buf = malloc(BUFSIZE + 1);
if(!my_aiocb.aio_buf)
    perror("malloc");
//初始化aiocb的成员
my_aiocb.aio_fildes = fd;
my_aiocb.aio_nbytes = BUFSIZE;
my_aiocb.aio_offset = 0;

ret = aio_read(&my_aiocb);
if(ret < 0)
    perror("aio_read");
while(aio_error(&my_aiocb) == EINPROGRESS)
;
if((ret = aio_return(&my_iocb)))
{
    // 获得异步读的返回值
}
else
{
  读失败,分析errror
}

b)用户空间异步IO aio_suspend()函数使用例程

struct aioct *cblist(MAX_LIST)
//清零aioct结构链表
bzero((char *)cblist, sizeof(cblist));
//将一个或更多的aiocb放入aioct结构体链表
cblist[0] = &my_aiocb;
ret = aio_read( &my_aiocb);
ret = aio_suspend( cblist, MAX_LIST, NULL);

c)用户空间异步IO lio_list()函数使用例程

struct aiocb aiocb1,aiocb2;
struct  aiocb *list[MAX_LIST];
...
//准备第一个aiocb
aiocb1.aio_fildes = fd;
aiocb1.aio_buf = malloc(BUFSIZE +1);
aiocb1.aio_nbytes = BUFSIZE;
aiocb1.aio_offset = next_offset;
aiocb1.aio_lio_opcode = LIO_READ;//异步读操作
...//准备多个aiocb
bzero((char *)list, sizeof(list));
//将aiocb填入链表
list[0] = &aiocb1;
list[1]   = &aiocb2;
...
ret = lio_listio(LIO_WAIT, list, MAX_LIST, NULL); //发起大量IO操作

“涛哥,你说了这么多,好像也咋没和你说的驱动扯上关系呢”小王抱怨道。

“小王,不要急吗,我不是正打算说吗,瞧你着急性子,这样吧,你把今天的好好看看,我们下集再说”…


 


 

Linux驱动开发 异步通知实现详解 信号(signal)使用 POSIX 信号机制,设备可以向进程发送信号,通知某个事件发生。常用的信号包括SIGIO(用于异步 I/O 通知)、SIGUSR1SIGUSR2等。信号适用于简单的通知模型,例如设备可用、读写完成等。poll和select通过poll和select系统调用,用户进程可以监视文件描述符的状态变化,如可读、可写等。设备可以通过改变文件状态来通知用户进程 I/O 操作已经完成。适合需要监视多个文件描述符的情况,如网络服务器的实现。异步 I/O(AIO)使用。 阅读详情

相关推荐

Linux中如何使用异步I/O 技术

本节将探索 Linux 的异步 I/O 模型,从而帮助我们理解如何在应用程序中使用这种技术。在传统的 I/O 模型中,有一个使用惟一句柄标识的 I/O 通道。在 UNIX® 中,这些句柄是文件描述符(这对等同于文件、管道、套接字等等)。在阻塞 I/O 中,我们发起了一次传输操作,当传输操作完成或发生错误时,系统调用就会返回。Linux 上的 AIOAIO 在 2.5 版本的内核中首次出现,现在已经是 2.6 版本的产品内核的一个标准特性了。在异步非阻塞 I/O 中,我们可以同时发起多个传输操作。

j简说Linux的博客 1004

Linux设备驱动开发详解-Note(19)---Linux 设备驱动中的异步通知与异步 I/O(2)

Linux 设备驱动中的异步通知与异步 I/O(2) 成于坚持,败于止步 Linux 2.6 异步 I/O  AIO 概念与 GNU C 库函数  Linux 系统中最常用的输入/输出(I/O)模型是同步 I/O。在这个模型中,当请求发出之后,应用程序就会阻塞,直到请求满足为止。这是很好的一种解决方案,因为调用应用程序在等待 I/O 请求完成时不需要使用任何中央处理单元(CPU)。但是

Seal--学海无涯 4656

理解Linux五种I/O模型、同步I/O与异步I/O、阻塞与非阻塞

五种IO模型 、五种I/O模型的比较 、同步I/O与异步I/O

ZY-JIMMY 3266

Linux下异步I/0: Linux上的AIO简介

文章出处:http://blog.sina.com.cn/s/blog_6028e2630100y0d1.html 本节将探索 Linux 的异步 I/O 模型,从而帮助我们理解如何在应用程序中使用这种技术。 在传统的 I/O 模型中,有一个使用惟一句柄标识的 I/O 通道。在 UNIX® 中,这些句柄是文件描述符(这对等同于文件、管道、套接字等等)。在阻塞 I/O 中,我们发起了

我有一个梦想 1429

Linux异步I/O库:libaio深入解析与应用

Linux异步I/O库是支持异步I/O操作的一组API集合。本章我们将探讨其基本概念,介绍其发展历程,并解释为什么异步I/O在现代操作系统中变得至关重要。异步I/O允许应用程序发起多个I/O操作而无需阻塞或等待I/O操作完成。这与传统的同步I/O形成鲜明对比,同步I/O会导致程序在等待I/O操作完成时处于空闲状态。异步I/O模型的优势在于它提高了程序的效率和响应速度,特别是在高并发和I/O密集型的应用场景中。我们先从异步I/O的基本概念入手,包括I/O操作的分类和异步I/O的核心机制。

weixin_30838971的博客 1515

LightTools宏 vs Python API:光学仿真自动化方案选型指南

本文深入对比了LightTools光学仿真自动化中VBA宏与Python API两种方案。VBA宏内嵌易用,适合固定流程批处理;Python API生态强大,尤其在参数优化算法集成方面优势显著,便于构建复杂工作流。文章结合案例,为不同场景下的技术选型提供清晰指南。

garlic的博客 940

Linux驱动开发--异步通知与异步I/O

最后,在文件关闭时,即在设备驱动的 release() 函数中,应调用设备驱动的 fasync() 函数将文件从异步通知的列表中删除。从中可以看出,当用户输入一串字符串后,标准输入设备释放 SIGIO 信号,这个信号“中断”与驱使对应的应用程序中的 input_handler() 得以执行,并将用户输入显示出来。异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上“中断”的概念,比较准确的称谓是“信号驱动的异步I/O”。下面给出了释放信号的范例。

张哈哈的博客 1385

Oracle19c-集群节点重新添加

Oracle RAC集群在极端情况下,如硬件、主机,集群软件损坏,导致集群节点永久无法使用,需要对集群节点进行修复,删除节点集群信息并重新加入集群,以恢复集群原有的架构。 本文主要讲述一套两节点的Oracle19c RAC集群,节点一orcl01由于主机异常无法正常启动,在对主机进行重装之后,需要将orcl01节点重新加入集群的操作步骤。环境信息: 操作系统:Linux 7 RAC集群:19C 主机节点:orcl0...

sinat_36757755的博客 2351

Linux I/O编程:I/O多路复用与异步 I/O对比

本文将简要介绍 Linux 中的多路复用 I/O 和异步 I/O 模型,并编写示例代码简述。对于网络 I/O,特别是 UDP 和 TCP,多路复用 I/O(如 `select`、`epoll()`)通常是更好的选择。而异步 I/O(如 `libaio`)只建议用在文件和块设备的 I/O 操作。

Where there is life, there is hope. 1446

Rocky Linux 9 离线环境Docker部署实战:从依赖打包到服务启动

本文提供了一份详尽的Rocky Linux 9离线环境Docker部署实战指南。针对无法访问外网的生产或内网服务器,文章详细讲解了如何在联网跳板机上下载Docker二进制包及所有系统依赖RPM包,并完成打包。随后,手把手指导在离线服务器上进行依赖安装、二进制文件部署、systemd服务配置、SELinux与防火墙调优,最终实现Docker服务的成功启动与验证。

weixin_28363123的博客 138

NPC 三电平逆变器中点电位平衡算法详解

最常用:零序电压注入(简单、计算量小)最可靠:虚拟空间矢量调制(VSVPWM)及其改进形式(全范围平衡)趋势:结合模型预测控制(MPC)或智能算法(模糊、神经网络)进一步提升动态性能和鲁棒性。NPC 三电平逆变器中点电位平衡算法的 C# 实现示例(零序电压注入法 + 闭环补偿)在 NPC(Neutral Point Clamped)三电平逆变器中,中点电位平衡最常用且易于软件实现的方案是零序电压注入法。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 325

【Linux】【异步】设备驱动中的异步通知(Asynchronous Notifications)与异步I/O(Asynchronous I/O)

在Linux设备驱动程序设计中,异步通知与异步I/O机制是提高系统性能和响应性的关键手段。异步通知用于在事件发生时及时通知用户空间进程,而异步I/O则允许用户空间进程在等待I/O完成的同时继续执行其他任务。通过合理的异步通知与异步I/O机制设计和实现,可以有效提升设备驱动程序的性能和可靠性。

极客代码 1666

解决微信小程序长页面滚动到底部点击底部的输入框后输入框漂浮且页面滚动到顶部

一、问题描述 项目中有一个长页面上部展示部分信息下部为信息录入,页面长度为三屏幕(不同手机屏幕大小略有差异),当滚动到第二屏或者第三屏去填写信息时点击输入框后输入框漂浮起来了并且页面向上滚动了一段距离,回到了第一屏中展示的内容。效果如图。 滚动到第二屏,证件号输入。 点击输入框 可以看到证件号输入框漂浮了起来并且页面滚动到了第一屏展示的内容。 注意:小程序是2018年上线,在2020年4月份之前该页面从未出现过这种现象。推测:微信的后续更新中对微信小程序基础库进行了重构,导致点击输入框后页

仰望星空的代码 3258

Linux设备驱动中的异步通知与异步I/O

阻塞与非阻塞访问、 poll() 函数提供了较好的解决设备访问的机制, 但是如果有了异步通知, 整套机制则更加完整了。,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上“中断”的概念, 比较准确的称谓是“信号驱动的异步I/O”。信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。

ljl113的博客 983

【用unity实现100个游戏之16】Unity程序化生成随机2D地牢游戏1(附项目源码)

关于使用TileMap生成随机2D地图,其实之前已经有做过类似的,感兴趣可以看看 但是随着学习深入,发现之前做的比较粗糙和不够全面,最近又在外网看到

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2215

效果炸裂_安装midscene_copw基于midscene操作电脑_基于视觉的软件测试执行_MIDSCENE的安装和使用---AI大模型应用探索0012

摘要:本文介绍了如何通过安装MidSceneJS来增强Copaw的屏幕操作能力。首先需要安装Node.js和npm,并配置淘宝镜像源加速安装。然后全局安装MidScene CLI工具(npm install @midscene/cli -g)。接着配置视觉大模型服务,通过设置环境变量指定模型API密钥、名称、基础URL和家族类型(如qwen3.5-27b),配置文件需存放在C:\Users\Administrator.copaw目录。安装成功后,MidScene已能成功识别并操作屏幕,使用效果良好。文中还提

添柴程序猿的专栏 639

Linux内核开发之异步通知与异步I/O_fcntl

“小王,听说过锦上添花吧..”我拍拍下王的头说。 “还锦上添花你,为你上次提的几个东东,我是头上长包..”小王气愤地瞪着我。 “啊,为啥这样呢,本来还特意拒绝了MM的月份,抽出时间打算给你说点高级的东东,看来现在是不行了”我吃惊道,“这样吧,这次就给你讲些和前边有关的东西,也不失为锦上添花不是?”。 “好,我也是这么打算的,就是没好意思说,今天讲些啥呢?”小王暗淡的眼光总算闪了闪

gtkknd的专栏 982

分区补光与ISP图像调节技术

在安防监控场景中,逆光、强光、明暗不均(如门口 / 窗边的 “阴阳脸” 画面)是导致图像细节丢失的核心问题。分区补光技术通过对画面不同亮度区域精准补光,解决 “局部过曝 / 欠曝” 难题;ISP(图像信号处理器)图像调节技术则通过算法优化,提升画面色彩、对比度与细节。二者协同可实现 “硬件补光 + 算法优化” 的双重增强,是低功耗摄像机实现高清画质的关键技术组合。分区补光与 ISP 图像调节技术:原理、协同方案及安防监控应用案例。一、核心技术原理解析。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 730

【Linux驱动开发】Linux 设备驱动中的异步通知与异步 I/O:原理、机制与实战

本文探讨Linux设备驱动中的异步通知与I/O机制,分析其原理、实现方法与适用场景。主要内容包括:1)通过wait_queue与.poll实现轮询式就绪检测;2)利用.fasync与kill_fasync()实现SIGIO信号驱动I/O;3)结合定时器/工作队列实现异步数据生产。文章详细解析了fasync内部数据结构(RCU链表)、poll/epoll内核路径及边沿触发语义,并以async_demo示例展示字符设备驱动的完整实现方案。针对不同需求场景(低频率事件/高吞吐I/O)提供了技术选型建议,同时指出内

love131452098的博客 1075

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Linux设备驱动中的异步通知与同步I/O

在设备驱动中使用异步通知可以使得对设备的访问可进行时,由驱动主动通知应用程序进行访问。因此,使用无阻塞I/O的应用程序无需轮询设备是否可访问,而阻塞访问也可以被类似“中断”的异步通知所取代。异步通知类似于硬件上的“中断”概念,比较准确的称谓是“信号驱动的异步I/O”。 9.1 异步通知的概念和作用 异步通知:一旦设备就绪,则主动通知应用程序,该应用程序无需查询设备状态 几种通知方式比较: 阻塞I/

zcj的博客 5391

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【Linux】Linux异步I/O -libaio

libaio是Linux内核提供的异步I/O库,通过io_submit提交请求后立即返回,内核通过完成队列通知结果。其核心特性包括零拷贝(结合O_DIRECT绕过内核缓冲区)和批量处理。使用O_DIRECT时需注意数据对齐要求,适合数据库等大文件连续I/O场景。主要API包括:io_setup创建上下文、io_submit提交请求、io_getevents获取完成事件,以及io_prep_pread/pwrite准备读写请求。libaio通过异步机制显著提升I/O性能,特别适合高并发存储应用。

Antonio915的博客 2485

突破性能瓶颈:Linux内核aio_complete异步I/O完成通知机制深度剖析

你是否还在为同步I/O操作阻塞进程而烦恼?是否想让应用程序在等待磁盘响应时仍能高效处理其他任务?本文将深入解析Linux内核中异步I/O(Asynchronous I/O,AIO)的核心完成通知机制——`aio_complete`,带你掌握如何利用内核提供的异步I/O能力提升应用性能。读完本文,你将理解`aio_complete`的工作原理、调用流程及在不同文件系统中的实现差异,并能通过实例代码正...

gitblog_00013的博客 742

设备驱动中的异步通知与异步I/O

在设备驱动中使用异步通知可以使得再进行对设备的访问时,由驱动主动通知用户程序进行访问。这样,使用非阻塞I/O的应用程序无需轮询机制查询设备是否可访问,而阻塞访问也可以被类似“中断”的异步通知所取代。除了异步通知以为,应用还可以在发起I/O请求后,立即返回。之后,在查询I/O完成情况,或者I/O完成后被返回。这个过程为异步I/O。 阻塞与非阻塞访问、poll函数提供了较好的解决设备访问机制,但是如...

weixin_42005898的博客 453

Linux设备驱动中的异步通知与异步I/O学习s

的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上”中断“的概念,比较准确的称谓是”信号驱动的异步I/O“。信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。

weixin_53042232的博客 813

Linux内核开发之异步通知与异步I/O(一)

“小王,听说过锦上添花吧..”我拍拍下王的头说。 “还锦上添花你,为你上次提的几个东东,我是头上长包..”小王气愤地瞪着我。 “啊,为啥这样呢,本来还特意拒绝了MM的月份,抽出时间打算给你说点高级的东东,看来现在是不行了”我吃惊道,“这样吧,这次就给你讲些和前边有关的东西,也不失为锦上添花不是?”。 “好,我也是这么打算的,就是没好意思说,今天讲些啥呢?”小王暗淡的眼光总算闪了闪。...

aolan7349的博客 94
上一篇: Linux内核开发之异步通知与异步I/O(二)
下一篇: Linux内核开发之异步通知与异步I/O(四)
wustdatamining
博客等级 码龄15年 12粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值