linux 下 异步IO
方法一:使用fcntl来置O_ASYNC位。
这个方法的效果是,当输入缓存中的输入数据就绪时(输入数据可读),内核向用F_SETOWN来绑定的那个进程发送SIGIO信号。此时程序应该用getchar等函数将输入读入。
1.首先,为SIGIO信号设置一个处理函数,用来读取并处理位于输入缓存中的数据。
signal ( SIGIO , void ( * getmyinput ) ( int signum ) );
2.设置一个用来接受SIGIO信号的进程。用fcntl函数。
fcntl ( my_fd , F_SETOWN, getpid() );
3.得到文件描述符的状态标志集,为该状态标志集添加一个O_ASYNC属性。
int flags = fcntl ( my_fd , F_GETFL);
fcntl ( my_fd , F_SETFL , flags | O_ASYNC);
第二种方法:使用 aio_read() 方法—— <aio.h>
air_read是异步非阻塞IO,是一种处理与I/O 重叠进行的模型。读请求(aio_read())会立即返回,说明读请求已经成功发起了。在后台完成读操作的同时时,应用程序然后会执行其他处理操作。当read
的响应到达时,就会产生一个信号或执行一个基于线程的回调函数来完成这次
I/O 处理过程。
类似于处理器三级指令流水线。在一个进程中为了执行"多个I/O 请求"而对"计算操作"和 "I/O处理"进行重叠处理的能力.
与O_ASYNC方法不同,aio_read()方法更复杂也更灵活,它可以控制每次想要读取的字节数,也可以控制当满足读取要求的字节数来到时,向进程发送的信号。
通过一个中间变量 struct aiocb 来作为缓存。、
当进程收到SIGIO信号,或其在aiocb.aio_sigevent.sigev_signo已经设置好的信号时,内核已经将输入读入到了指针aiocb.aio_buf 所指定的位置中了。
==================
(fromhttp://www.ibm.com/developerworks/cn/linux/l-async/#N10056)
原作者 M. TimJones (mtj@mtjones.com),顾问工程师,
Emulex
2006 年 9 月 28 日
Linux®
中最常用的输入/输出(I/O)模型是同步I/O。在这个模型中,当请求发出之后,应用程序就会阻塞,直到请求满足为止。这是很好的一种解决方案,因为调
用应用程序在等待
I/O请求完成时不需要使用任何中央处理单元(CPU)。但是在某些情况中,I/O请求可能需要与其他进程产生交叠。可移植操作系统接口(POSIX)异
步I/O(AIO)应用程序接口(API)就提供了这种功能。在本文中,我们将对这个 API概要进行介绍,并来了解一下如何使用它。
Linux 异步 I/O 是 Linux 内核中提供的一个相当新的增强。它是 2.6 版本内核的一个标准特性,但是我们在
2.4版本内核的补丁中也可以找到它。AIO 背后的基本思想是允许进程发起很多 I/O 操作,而不用阻塞或等待任何操作完成。稍后或在接收到I/O
操作完成的通知时,进程就可以检索 I/O 操作的结果。
I/O模型
在深入介绍 AIO API 之前,让我们先来探索一下 Linux 上可以使用的不同 I/O模型。这并不是一个详尽的介绍,但是我们将试图介绍最常用的一些模型来解释它们与异步 I/O 之间的区别。图 1给出了同步和异步模型,以及阻塞和非阻塞的模型。
图 1. 基本 Linux I/O模型的简单矩阵
每个 I/O 模型都有自己的使用模式,它们对于特定的应用程序都有自己的优点。本节将简要对其一一进行介绍。
同步阻塞I/O
最常用的一个模型是同步阻塞
I/O模型。在这个模型中,用户空间的应用程序执行一个系统调用,这会导致应用程序阻塞。这意味着应用程序会一直阻塞,直到系统调用完成为止(数据传输完
成或发生错误)。调用应用程序处于一种不再消费CPU 而只是简单等待响应的状态,因此从处理的角度来看,这是非常有效的。
图 2 给出了传统的阻塞 I/O模型,这也是目前应用程序中最为常用的一种模型。其行为非常容易理解,其用法对于典型的应用程序来说都非常有效。在调用read
系统调用时,应用程序会阻塞并对内核进行上下文切换。然后会触发读操作,当响应返回时(从我们正在从中读取的设备中返回),数据就被移动到用户空间的缓冲区中。然后应用程序就会解除阻塞(read
调用返回)。
图 2. 同步阻塞 I/O模型的典型流程
从应用程序的角度来说,read
调用会延续很长时间。实际上,在内核执行读操作和其他工作时,应用程序的确会被阻塞。
同步非阻塞I/O
同步阻塞 I/O 的一种效率稍低的变种是同步非阻塞 I/O。在这种模型中,设备是以非阻塞的形式打开的。这意味着 I/O操作不会立即完成,read
操作可能会返回一个错误代码,说明这个命令不能立即满足(EAGAIN
或EWOULDBLOCK
),如图 3 所示。
图 3. 同步非阻塞 I/O模型的典型流程
非阻塞的实现是
I/O命令可能并不会立即满足,需要应用程序调用许多次来等待操作完成。这可能效率不高,因为在很多情况下,当内核执行这个命令时,应用程序必须要进行忙
碌等待,直到数据可用为止,或者试图执行其他工作。正如图3 所示的一样,这个方法可以引入 I/O 操作的延时,因为数据在内核中变为可用到用户调用
read
返回数据之间存在一定的间隔,这会导致整体数据吞吐量的降低。
异步阻塞I/O
另外一个阻塞解决方案是带有阻塞通知的非阻塞 I/O。在这种模型中,配置的是非阻塞 I/O,然后使用阻塞select
系统调用来确定一个 I/O 描述符何时有操作。使
select
调用非常有趣的是它可以用来为多个描述符提供通知,而不仅仅为一个描述符提供通知。对于每个提示符来说,我们可以请求这个描述符可以写数据、有读数据可用以及是否发生错误的通知。
图 4. 异步阻塞 I/O 模型的典型流程(select)
select
调用的主要问题是它的效率不是非常高。尽管这是异步通知使用的一种方便模型,但是对于高性能的I/O 操作来说不建议使用。
异步非阻塞I/O(AIO)
最后,异步非阻塞 I/O 模型是一种处理与 I/O 重叠进行的模型。读请求会立即返回,说明 read
请求已经成功发起了。在后台完成读操作时,应用程序然后会执行其他处理操作。当
read
的响应到达时,就会产生一个信号或执行一个基于线程的回调函数来完成这次 I/O 处理过程。
图 5. 异步非阻塞 I/O模型的典型流程
在一个进程中为了执行多个 I/O 请求而对计算操作和 I/O 处理进行重叠处理的能力利用了处理速度与 I/O速度之间的差异。当一个或多个
I/O 请求挂起时,CPU 可以执行其他任务;或者更为常见的是,在发起其他 I/O 的同时对已经完成的I/O 进行操作。
异步 I/O 的动机
从前面 I/O 模型的分类中,我们可以看出 AIO 的动机。阻塞模型需要在 I/O操作开始时阻塞应用程序。这意味着不可能同时重叠进行处理和
I/O 操作。同步非阻塞模型允许处理和 I/O操作重叠进行,但是这需要应用程序根据重现的规则来检查 I/O 操作的状态。这样就剩下异步非阻塞
I/O 了,它允许处理和 I/O操作重叠进行,包括 I/O 操作完成的通知。
除了需要阻塞之外,select
函数所提供的功能(异步阻塞 I/O)与 AIO类似。不过,它是对通知事件进行阻塞,而不是对I/O 调用进行阻塞。
linux 下 异步IO的更多相关文章
- linux下异步IO的简单例子【转】
转自:http://blog.chinaunix.net/uid-24567872-id-87677.html 首先,贴一下异步IO中用的的一些结构体,因为平常很少用,整理起来方便查看. aio.h中 ...
- linux下的IO模型---学习笔记
1.linux文件系统和缓存 文件系统接口 文件系统-一种把数据组织成文件和目录的存储方式,提供了基于文件的存取接口,并通过文件权限控制访问. 存储层次 文件系统缓存 主存(通常时DRAM)的一块区域 ...
- Linux下的IO监控与分析
Linux下的IO监控与分析 近期要在公司内部做个Linux IO方面的培训, 整理下手头的资料给大家分享下 各种IO监视工具在Linux IO 体系结构中的位置 源自 Linux Performan ...
- Linux下的IO模式
对于一次IO访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间.所以说,当一个read操作发生时,它会经历两个阶段:1. 等待数据准 ...
- Linux下面的IO模型
1. Linux下的五种I/O模型 阻塞I/O模型: 一直阻塞 应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好. 如果数据没有准备好,一直等待….数据准备好了,从内核拷贝到用户空 ...
- Linux下控制器IO地址
在Linux下使用cat /proc/ioports可以查看控制器使用的IO地址范围
- linux下 文件IO 相关
linux下操作文件或设备,需要一个文件描述符 file descriptor,fd 来引用.fd是一个非负整数,实际上是一个索引值,指向文件的记录表,对文件的操作都需要fd.默认的几个:标准输入流 ...
- 【转载】Linux下的IO监控与分析
近期要在公司内部做个Linux IO方面的培训, 整理下手头的资料给大家分享下 各种IO监视工具在Linux IO 体系结构中的位置 源自 Linux Performance and Tuning G ...
- linux下java.io.IOException: Cannot run program "/opt/jdk/jre/bin/java": error=13, Permission denied
linux下启动jetty时报: [root@mv01 jetty-distribution-9.2.14.v20151106]# java -jar start.jar java.io.IOExce ...
随机推荐
- websocket 踩坑记录
ssh execute command error: can't connect str to butes ssh 发送下一次指令回传的是上一次指令的结果 ssh 始终停留在 root 目录内 ssh ...
- NOIP模拟赛 密室逃脱
密室逃脱(maze.*) 即使czhou没有派出最强篮球阵容,机房篮球队还是暴虐了校篮球队.为了不打击校篮球队信心,czhou决定改变训练后的活动.近来,江大掌门的徒弟徒孙们纷纷事业有成,回到母校为机 ...
- linux文件属性描述(inode,block)
1.ls -lhi 文字解释: 第一列:inode索引节点编号(人的身份证,全国唯一) 系统读取文件时首先通过文件名找到inode,然后才能读取到文件内容. 第二列:文件类型及权限(共10个字符, ...
- 怎么删除服务中的mysql服务
可以进WINDOWS的管理里查看MYSQL的服务,把它停止或以DOS下用命令停止1.如果要卸载MYSQL执行下面命令:DOS下>mysqld -remove mysql2.启动MYSQL: DO ...
- java 的多态(2013-10-11-163 写的日志迁移
java 的多态性:(所谓多态--就是指一个引用(类型)在不同情况下的多种状态) 1.方法的多态: 重载(overload) 重写(覆盖 override) 2.对象的多态性:(本人 ...
- GoF23种设计模式之结构型模式之享元模式
一.概述 运用共享技术有效地支持大量细粒度的对象. 二.适用性 1.当一个应用程序使用了大量的对象的时候. 2.由于使用大量的独享而造成很大的存储开销的时候. 3.对象的大多数状态都可变为外部状态的 ...
- (转)webView清除缓存
NSURLCache * cache = [NSURLCache sharedURLCache]; [cache removeAllCachedResponses]; [cache setDiskCa ...
- 水题:51Nod1095-Anigram单词
1095 Anigram单词 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 Description 一个单词a如果通过交换单词中字母的顺序可以得到另外的单词b,那 ...
- HDU 5399 数学 Too Simple
题意:有m个1~n的映射,而且对于任意的 i 满足 f1(f2(...fm(i))) = i 其中有些映射是知道的,有些是不知道的,问一共有多少种置换的组合. 分析: 首先这些置换一定是1~n的一个置 ...
- RQNOJ:PID30 / [stupid]愚蠢的矿工☆(树形背包)
PID30 / [stupid]愚蠢的矿工☆ 背景 Stupid 家族得知在HYC家的后花园里的中央花坛处,向北走3步,向西走3步,再向北走3步,向东走3步,再向北走6步,向东走3步,向南走12步,再 ...