linux aio进程简介,Linux AIO机制

article/2025/9/13 22:07:26

Linux的I/O机制经历了一下几个阶段的演进:

1. 同步阻塞I/O: 用户进程进行I/O操作,一直阻塞到I/O操作完成为止。

2. 同步非阻塞I/O: 用户程序可以通过设置文件描述符的属性O_NONBLOCK,I/O操作可以立即返回,但是并不保证I/O操作成功。

3. 异步事件阻塞I/O: 用户进程可以对I/O事件进行阻塞,但是I/O操作并不阻塞。通过select/poll/epoll等函数调用来达到此目的。

4. 异步时间非阻塞I/O: 也叫做异步I/O(AIO),用户程序可以通过向内核发出I/O请求命令,不用等带I/O事件真正发生,可以继续做另外的事情,等I/O操作完成,内核会通过函数回调或者信号机制通知用户进程。这样很大程度提高了系统吞吐量。

下面就AIO做详细介绍:

要使用aio的功能,需要include头文件aio.h,在编译连接的时候需要加入POSIX实时扩展库rt.下面就aio库的使用做介绍。

1. AIO整个过程所使用的数据存放在一个结构体中,struct aiocb,aio control block.看看头文件中的定义:

/* Asynchronous I/O control block.  */

struct aiocb

{

int aio_fildes;              /* File desriptor.  */ 需要在哪个文件描述符上进行I/O

int aio_lio_opcode;          /* Operation to be performed.  */ 这个是针对批量I/O的情况有效,读写操作类型

int aio_reqprio;              /* Request priority offset.  */ 请求优先级(If  _POSIX_PRIORITIZED_IO  is defined, and this file supports it, then the

asynchronous operation is submitted at a priority equal to that of the

calling process minus aiocbp->aio_reqprio.)

volatile void *aio_buf;      /* Location of buffer.  */ 具体内容,数据缓存

size_t aio_nbytes;            /* Length of transfer.  */ 数据缓存的长度

struct sigevent aio_sigevent; /* Signal number and value.  */ 用于异步I/O完成后的通知。

内部实现使用的数据成员。

/* Internal members.  */

struct aiocb *__next_prio;

int __abs_prio;

int __policy;

int __error_code;

__ssize_t __return_value;

#ifndef __USE_FILE_OFFSET64

__off_t aio_offset;          /* File offset.  */

char __pad[sizeof (__off64_t) - sizeof (__off_t)];

#else

__off64_t aio_offset;        /* File offset.  */ 文件读写偏移

#endif

char __unused[32];

};

2. int aio_read(struct aiocb *aiocbp);

异步读操作,向内核发出读的命令,传入的参数是一个aiocb的结构,比如

struct aiocb myaiocb;

memset(&aiocb , 0x00 , sizeof(myaiocb));

myaiocb.aio_fildes = fd;

myaiocb.aio_buf = new char[1024];

myaiocb.aio_nbytes = 1024;

if (aio_read(&myaiocb) != 0)

{

printf("aio_read error:%s/n" , strerror(errno));

return false;

}

3. int aio_write(struct aiocb *aiocbp);

异步写操作,向内核发出写的命令,传入的参数仍然是一个aiocb的结构,当文件描述符的O_APPEND

标志位设置后,异步写操作总是将数据添加到文件末尾。如果没有设置,则添加到aio_offset指定的

地方,比如:

struct aiocb myaiocb;

memset(&aiocb , 0x00 , sizeof(myaiocb));

myaiocb.aio_fildes = fd;

myaiocb.aio_buf = new char[1024];

myaiocb.aio_nbytes = 1024;

myaiocb.aio_offset = 0;

if (aio_write(&myaiocb) != 0)

{

printf("aio_read error:%s/n" , strerror(errno));

return false;

}

4. int aio_error(const struct aiocb *aiocbp);

如果该函数返回0,表示aiocbp指定的异步I/O操作请求完成。

如果该函数返回EINPROGRESS,表示aiocbp指定的异步I/O操作请求正在处理中。

如果该函数返回ECANCELED,表示aiocbp指定的异步I/O操作请求已经取消。

如果该函数返回-1,表示发生错误,检查errno。

5. ssize_t aio_return(struct aiocb *aiocbp);

这个函数的返回值相当于同步I/O中,read/write的返回值。只有在aio_error调用后

才能被调用。

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

取消在文件描述符fd上的aiocbp所指定的异步I/O请求。

如果该函数返回AIO_CANCELED,表示操作成功。

如果该函数返回AIO_NOTCANCELED,表示取消操作不成功,使用aio_error检查一下状态。

如果返回-1,表示发生错误,检查errno.

7. int lio_listio(int mode, struct aiocb *restrict const list[restrict],

int nent, struct sigevent *restrict sig);

使用该函数,在很大程度上可以提高系统的性能,因为再一次I/O过程中,OS需要进行

用户态和内核态的切换,如果我们将更多的I/O操作都放在一次用户太和内核太的切换中,

减少切换次数,换句话说在内核尽量做更多的事情。这样可以提高系统的性能。

用户程序提供一个struct aiocb的数组,每个元素表示一次AIO的请求操作。需要设置struct aiocb

中的aio_lio_opcode数据成员的值,有LIO_READ,LIO_WRITE和LIO_NOP。

nent表示数组中元素的个数。最后一个参数是对AIO操作完成后的通知机制的设置。

8. 设置AIO的通知机制,有两种通知机制:信号和回调

(1).信号机制

首先我们应该捕获SIGIO信号,对其作处理:

struct sigaction sig_act;

sigempty(&sig_act.sa_mask);

sig_act.sa_flags = SA_SIGINFO;

sig_act.sa_sigaction = aio_handler;

struct aiocb myaiocb;

bzero( (char *)&myaiocb, sizeof(struct aiocb) );

myaiocb.aio_fildes = fd;

myaiocb.aio_buf = malloc(BUF_SIZE+1);

myaiocb.aio_nbytes = BUF_SIZE;

myaiocb.aio_offset = next_offset;

myaiocb.aio_sigevent.sigev_notify = SIGEV_SIGNAL;

myaiocb.aio_sigevent.sigev_signo = SIGIO;

myaiocb.aio_sigevent.sigev_value.sival_ptr = &myaiocb;

ret = sigaction( SIGIO, &sig_act, NULL );

信号处理函数的实现:

void aio_handler( int signo, siginfo_t *info, void *context )

{

struct aiocb *req;

if (info->si_signo == SIGIO) {

req = (struct aiocb *)info->si_value.sival_ptr;

if (aio_error( req ) == 0) {

ret = aio_return( req );

}

}

return;

}

(2). 回调机制

需要设置:

myaiocb.aio_sigevent.sigev_notify = SIGEV_THREAD

my_aiocb.aio_sigevent.notify_function = aio_handler;

回调函数的原型:

typedef void (* FUNC_CALLBACK)(sigval_t sigval);

AIO机制为服务器端高并发应用程序提供了一种性能优化的手段。加大了系统吞吐量。

0b1331709591d260c1c78e86d0c51c18.png


http://chatgpt.dhexx.cn/article/YA4eIxO6.shtml

相关文章

关于aio

AIO 是异步非阻塞 同步意味着,在进行读写操作时,线程需要等待结果,还是相当于闲置 异步意味着,在进行读写操作时,线程不必等待结果,而是将来由操作系统来通过回调方式由另外的线程来获得结果 AIO的read方…

linux AIO

AIO 是 Linux 下的异步读写模型,它是 2.6 内核提供的一个标准增强特性。对于文件的读写,即使以 O_NONBLOCK 方式来打开一个文件,也会处于 “阻塞” 状态,因为文件时时刻刻处于可读状态,而从磁盘到内存所等待的时间是惊…

AIO模型

目录 AIO模型介绍 AsynchronousServerSocketChannel:AIO中网络通信服务端的socket 1、future方法 2、callback回调方式 AIO 的回调方式编程 BIO、NIO、AIO的比较 1、释义 BIO:同步阻塞IO模型 NIO:同步非阻塞IO模型 AIO:…

java中IO模型-AIO模型

AIO模型介绍 AIO(Asynchronous I/O) 异步非阻塞模型, 在javajdk.17版本开始支持AIO,AIO模型需要操作系统的支持。 AIO最大的特性是异步能力,对socket和I/O起作用。 异步IO模型类似的 与NIO模型不同,读写操…

架构解密从分布式到微服务:深入理解网络,AIO

AIO AIO是I/O模型里一个很高的层次,体现了大道至简的软件美学理念。与NIO相比,AIO的框架和使用方法相对简单很多。 AIO包括两大部分:AIO Files解决了文件的异步处理问题,AIO Sockets解决了Socket的异步处理问题。AIO的核心概念为应用发起非…

BIO,NIO,AIO区别

BIO,NIO,AIO 总结 Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。程序员在使用这些 API 的时候,不需要关心操作系统层面的知识,也不需要根据不同操作系统编写不同的代码。只需要使用Java的API就可以了。 在讲 BIO,NIO,…

Apache CXF - 快速指南

Apache CXF - 简介 在当今的环境中,您可以使用多个选项来创建 Web 服务应用程序。您可以使用多种标准和广泛接受的协议中的一种或多种进行通信。例如SOAP、XML/HTTP、RESTful HTTP和CORBA(通用对象请求代理架构,在过去非常流行,但…

java cxf 安全_CXF client在并发下的线程安全问题

这个是发生在上周周末的真实案例,因为cxf client 端线程安全导致的错误,总结出来希望其他使用cxf的兄弟注意。 首先描述一下背景,简单的说就是使用cxf作为web service的客户端,运行在weblogic上,连接外部的服务器。为了…

linux cxf服务端,Apache CXF 框架应用实战

一、概述 Apache CXF提供了用于方便地构建和开发WebService的可靠基础架构。它允许创建高性能和可扩展的服务,可以部署在Tomcat和基于Spring的轻量级容器中,也可以部署在更高级的服务器上,例如Jboss、WebSphere或WebLogic。 CXF提供了以下功能…

使用CXF调用WSDL

简介 时隔多年,再次遇到需要调用WebService的业务,对方给予的wsdl说明文档还是内网的链接,并且设有基础访问权限,即在浏览器打开wsdl链接时需要输入【用户名密码】登录后方可查看wsdl文档,这需要设置代理(我…

spring5.x cxf3.4.x 服务端和客户端 非maven版本

文章目录 一、资料准备1. 官网链接2. 解压3. 依赖梳理 二、spring集成cxf2.1.创建spring项目2.2. 创建接口2.3. impl2.4. spring-cxf.xml2.5. 客户端2.6. 开源项目 一、资料准备 1. 官网链接 http://cxf.apache.org/download.html 下载apache-cxf-3.4.5.zip 2. 解压 3. 依赖…

CXF实现WebService

一、CXF简介 Apache CXF Celtix XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding …

SpringBoot2 整合 CXF 服务端和客户端

文章目录 一、CXF服务端1. 导入依赖2. 创建service接口3. 接口实现类4. cxf配置类5. 查看wsdl结果 二、CXF客户端2.1. 客户端2.2. 断点调试2.3. 发起调用服务开源源码. 一、CXF服务端 1. 导入依赖 <properties><cxf.version>3.3.1</cxf.version></proper…

CXF客户端乱码

CXF客户端乱码 解决办法一&#xff0c;设置服务端代码&#xff1a; 在使用CXF与其他系统对接时&#xff0c;发现对方系统响应的汉字乱码&#xff0c;使用soapui调用测试就没有问题&#xff0c;但是程序里面调用就乱码&#xff0c;很奇怪&#xff0c;乱码如下&#xff1a; 由…

SpringBoot集成CXF

CXF入门篇https://blog.csdn.net/tongxin_tongmeng/article/details/126482362Server端项目结构 Server端pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"…

走进cxf

一、什么是cxf 有很多人认为cxf就是webservice&#xff0c;其实cxf只是发布调用webservice的工具而已 Apache CXF Celtix Xfire&#xff0c;开始叫 Apache CeltiXfire&#xff0c;后来更名为 Apache CXF 了&#xff0c;以下简称为 CXF。Apache CXF 是一个开源的 web Service…

NewSQL ---- Mysql.8.0 与 MemSQL 7.0 大数据量查询性能对比

目录 1测试环境以及测试用例设计 1.1测试环境 1.2测试用例设计 2 千万级数据量性能测试对比 2.1 MemSQL时间范围分页查询 2.1.1 性能测试数据 2.2任务信息查询 2.2.1 性能测试数据 2.3 执行批次范围查询 2.3.1 性能测试数据 2.4 批次任务查询 2.4.1 性能测试数据 …

memsql架构2

接上次的MemSQL分布式架构介绍(一)&#xff0c;原文在这里&#xff1a;http://docs.memsql.com/latest/concepts/distributed_architecture/ 首先上张图&#xff0c;是我根据自己的理解画的&#xff0c;如有错误还请大家指出 几个概念 1、MemSQL有两种类型的表&#xff1a; ref…

MemSQL性能测试结果

1.查询的SQL select count(subie.user_id) as count from sum_user_basic_info_exp subie join sum_user_lend_info_exp sulie on sulie.user_idsubie.user_id where subie.curr_user_role_cd1 and subie.reg_dt >2016-08-29 and subie.reg_dt <2016-08-29 结…

【MySQL】SQL优化

SQL优化 1 插入数据 1.1 insert优化 如果我们需要一次性往数据库表中插入多条记录&#xff0c;可以从以下三个方面进行优化。 insert into tb_test values(1,tom); insert into tb_test values(2,cat); insert into tb_test values(3,jerry); .....1.批量插入数据 Insert…