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

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

image.jpeg

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

1、aio_read()

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

int aio_read(struct aiocb *aiocbp)

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

2.aio_write()

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

int aio_write(struct aiocb *aiocbp);

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

3.aio_error()

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

int aio_error(struct aiocb *aiocbp)

该函数的返回:

EINPROGRESS:说明请求尚未完成

ECANCELED:说明请求被应用程序取消了

-1:发生错误

4.aio_return()

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

但是在异步IO中,我们要用aio_return()函数,原型如下:

ssize_t aio_return(struct aiocb *aiocbp);

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

5.aio_suspend()

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

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

6.aio_cancel()

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

aio_cancel(int fd,struct aiocb *aiocbp)

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

7.lio_listio()

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

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

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

linux异步io 回调函数,Linux异步IO相关推荐

  1. linux线程切换回调函数,linux C线程退出回调函数

    待补充.................... 函数原型 void pthread_cleanup_push(void (*routine)(void*), void *arg); void pthr ...

  2. Promise 对象 异步 then 回调函数

    Promise 对象 概述 Promise 对象是 JavaScript 的异步操作解决方案,为异步操作提供统一接口.它起到代理作用(proxy),充当异步操作与回调函数之间的中介,使得异步操作具备同 ...

  3. js回调函数获取异步返回值

    js回调函数获取异步返回值 1.尝试获取异步返回值 function test(){var res = 0;setTimeout(function(){res = 1;},1000)return re ...

  4. html里的回调函数的作用域,异步与回调/函数的作用域链

    异步与回调/函数的作用域链 JavaScript 只在一个线程上运行,JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等待. 这种模式的好处是实现起来比较简单,执行环境相对单纯:坏 ...

  5. linux内核的延时函数,linux中内核延时函数 (转)

    第一类延时函数原型是:(忙等) void ndelay(unsigned long nsecs); void udelay(unsigned long usecs); void mdelay(unsi ...

  6. linux通过信号回调函数,信号机制的管理结构 - Linux内核中的信号机制_Linux编程_Linux公社-Linux系统门户网站...

    信号只是一个数字,数字为0-31表示不同的信号,如下表所示. 编号 信号名 默认动作 说明 1 SIGHUP 进程终止 终端断开连接 2 SIGINT 进程终止 用户在键盘上按下CTRL+C 3 SI ...

  7. js异步解决方案 --- 回调函数 vs promise vs generater/yield vs async/await

    javascript -- 深度解析异步解决方案 高级语言层出不穷, 然而唯 js 鹤立鸡群, 这要说道js的设计理念, js天生为异步而生, 正如布道者朴灵在 node深入浅出--(有兴趣的可以读一 ...

  8. javascript的回调函数 同步 异步

    后一个任务等待前一个任务结束再执行.程序执行顺序与任务排列顺序一致的,同步的. 参考: http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%B ...

  9. linux钩子函数和回调函数,Linux Kernel 学习笔记10:hook函数

    (本章基于: Linux -4.4.0-37) linux 内核中有一套hook函数机制,可在不同hook点位置监控网络数据包,并执行丢弃.修改等操作.网络防火墙就是通过此机制实现的. 注册注销hoo ...

最新文章

  1. CSS、JavaScript、PHP和Python编程合二为一
  2. HDLBits 系列(2)如何避免生成锁存器?
  3. AB1601继电器干扰问题
  4. 路径前缀是什么意思_Trie 树是什么样的数据结构?有哪些应用场景?
  5. Sass @at-root 指令用法示例
  6. 半兽人野性重新觉醒 当初掘金将其放弃 如今野兽感恩回报火箭
  7. 日志分析工具Awstats实战之Apache篇-多站点日志分析
  8. 【开源】个人发卡程序源码 带会员+分站+三级分销+对接易+码+免签支付+完美运营
  9. 未来的外科手术可能由气泡代劳
  10. 解决gitee/github上传图片数量受限
  11. 如何区分b ,B,KB,MB,GB?
  12. 物理环路造成网络风暴,无法访问交换机故障处理过程
  13. java 分页简单使用
  14. TF-IDF算法类毕业论文文献有哪些?
  15. 整理几个叮咚抢菜、美团买菜助手
  16. linux+查内存数量,检查 Linux 中内存使用情况的 8 条命令 | Linux 中国
  17. Fiddler工具使用与配置 【实例整理】
  18. 雨课堂知识点总结(九)
  19. python 操作excle和word
  20. d如何及为什么探测器

热门文章

  1. 基于Python的多功能本地视频播放系统
  2. JavaFx之使用指定字体样式(二十九)
  3. 软件开发工具与环境 (课程代码:07169)
  4. 燕山大学——软件用户界面设计(八)原型设计
  5. 【以太网数据包】OICQ数据包(QQ)
  6. vue项目——分类管理模块
  7. HEVC (H.265)介绍(转)
  8. 举例说明层次分析的三大原则_《搞定》一个境界、两个维度、三大原则让你轻松搞定繁重的事务...
  9. 对于RE文件管理器打开安卓手机的Sqlite文件速度很慢的解决办法
  10. MacOS Ventura 13.2 (22D49) 正式版带 OC 0.8.8 and winPE 双分区原版黑苹果镜像