问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Linux异步IO

发布网友 发布时间:2022-11-15 07:12

我来回答

1个回答

热心网友 时间:2023-11-15 05:57

Linux中最常用的IO模型是同步IO,在这个模型中,当请求发出之后,应用程序就会阻塞,直到请求满足条件为止。这是一种很好的解决方案,调用应用程序在等待IO完成的时候不需要占用CPU,但是在很多场景中,IO请求可能需要和CPU消耗交叠,以充分利用CPU和IO提高吞吐率。

下图描绘了异步IO的时序,应用程序发起IO操作后,直接开始执行,并不等待IO结束,它要么过一段时间来查询之前的IO请求完成情况,要么IO请求完成了会自动被调用与IO完成绑定的回调函数。

Linux的AIO有多种实现,其中一种实现是在用户空间的glibc库中实现的,本质上是借用了多线程模型,用开启的新的线程以同步的方式做IO,新的AIO辅助线程与发起AIO的线程以pthread_cond_signal()的形式进行线程间的同步,glibc的AIO主要包含以下函数:

1、aio_read()
aio_read()函数请求对一个有效的文件描述符进行异步读操作。这个文件描述符可以代表一个文件、套接字,甚至管道,aio_read()函数原型如下:

aio_read()函数在请求进行排队之后就会立即返回(尽管读操作并未完成),如果执行成功就返回0,如果出现错误就返回-1。参数aiocb(AIO I/O Control Block)结构体包含了传输的所有信息,以及为AIO操作准备的用户空间缓冲区。在产生IO完成通知时,aiocb结构就被用来唯一标识所完成的IO操作。

2.aio_write()
aio_write()函数用来请求一个异步写操作。函数原型如下:

aio_write()函数会立即返回,并且它的请求以及被排队(成功时返回值为0,失败时返回值为-1)

3.aio_error()

aio_error()函数被用来确定请求的状态,其原型如下:

该函数的返回:

4.aio_return()
异步IO和同步阻塞IO方式之间有一个区别就是不能立即访问函数的返回状态,因为异步IO没有阻塞在read()调用上。在标准的同步阻塞read()调用中,返回状态是在该函数返回时提供的。
但是在异步IO中,我们要用aio_return()函数,原型如下:

只有在aio_error()调用确定请求已经完成(可能成功、也可能发生了错误)之后,才会调用这个函数,aio_return()的返回值就等价于同步情况中read()或者write系统调用的返回值。

5.aio_suspend()
用户可以用该函数阻塞调用进程,直到异步请求完成为止,调用者提供了一个aiocb引用列表,其中任何一个完成都会导致aio_suspend()返回。函数原型如下:

6.aio_cancel()
该函数允许用户取消对某个文件描述符执行的一个或所以IO请求。

要取消一个请求,用户需要提供文件描述符和aiocb指针,如果这个请求被成功取消了,那么这个函数就会返回AIO_CANCELED。如果请求完成了,就会返回AIO_NOTCANCELED。

7.lio_listio()
lio_listio()函数可用于同时发起多个传输。这个函数非常重要,它使得用户可以在一个系统调用中启动大量的IO操作,原型如下:

mode参数可以是LIO_WAIT或者是LIO_NOWAIT。LIO_WAIT会阻塞这个调用,直到所有的IO都返回为止,若是LIO_NOWAIT模型,在IO操作完成排队之后,该函数就会返回。list是一个aiocb的列表,最大元素的个数是由nent定义的。如果list的元素为null,lio_listio()会将其忽略。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
手机为啥投屏不到电视上 投屏到电视机上为什么不行了呢? 什么是超买状态,如何看出—个股票处于超买状态了? 用电脑怎么弄表格在电脑上制作表格怎么制作 ...明细帐、财务报表,带公式,EXCELE格式的文件,能发给我吗谢_百度... 电脑出入库表格怎么做作为一个仓管员excel表格如何做出入库存库存电脑会... 你好,可以发下库存管理的EXCEL表格么?衣服面料辅料都要统计,谢谢!麻烦... 电脑怎么制作电子表格如何用电脑制作表格 你好,能给我发一份出纳excel 做账模板现金流水账表格 芝麻香鸡有什么值得推荐的做法? 揭秘中元节禁忌有哪些是真的吗 待会的拼音 台风鲇鱼对安徽有影响吗? 台风对苏泸杭的影响大约要持续到什么时候 台风尼伯特对宣城有没有直接影响 尼伯特台风对宣城的影响 今晚的台风能吹到宣城吗 安徽省宣城市四号有台风影响吗 车内空调不热什么原因 汽车空调暖风不热是什么原因? 汽车空调不热是什么原因及解决办法 车内空调不热怎么回事? EVD中的万利达,先科,金正,哪个品牌播放效果,质量更好呢,以及价格如何... 金正移动evd电视正品价格多少 番茄大虾的家常做法大全怎么做好吃视频 番茄大虾的家常做法 我的公积金能给父亲还房贷么 新手机第一次充电有必要充的时间长吗,多长时间合适呀? 火星没事tina阿姨谁演的? 火星没事有那些演员 阿伏伽德罗常数的练习 阿伏伽德罗常数一道选择题 有关阿伏伽德罗常数的一道题 关于阿伏伽德罗常数的化学题 发现很多有意思的民间谚语 自动挡下坡能用s挡吗 请教各位自动挡能否在下坡途中从D档切换到S档 鸟食鸡蛋小米的做法 百灵鸟的饲养怎样用小米鸡蛋怎样配! 2020年4月谷雨是哪三候 节气寓意是什么 鸦片战争相隔现在多少年了 鸦片战争开始到现在已经多少年了? 堂妹结婚几天了,再送祝福合适吗 堂妹结婚送什么礼物? 六月份主持会议开场白 九月主持稿的开场白 springboot + shiro 尝试登录次数限制与并发登录人数控制 歌唱祖国的歌有哪些 张丹峰在2019的春晚上唱的什么歌,粤语歌 有工作经验的跳槽到别的单位也有实习期吗