本博客所有内容均为原创,如有转载请注明作者和出处

[转载]使用异步 I/O 大大提高应用程序的性能

上一篇 / 下一篇  2008-04-24 11:55:16 / 个人分类:转载

 

使用异步I/O大大提高应用程序的性能

学习何时以及如何使用POSIX AIO API

 

http://www.ibm.com/developerworks/cn/linux/l-async/

 

级别:中级

M. Tim Jones(mtj@mtjones.com),顾问工程师, Emulex

2006928

Linux®中最常用的输入/输出(I/O)模型是同步I/O。在这个模型中,当请求发出之后,应用程序就会阻塞,直到请求满足为止。这是很好的一种解决方案,因为调用应用程序在等待I/O请求完成时不需要使用任何中央处理单元(CPU)。但是在某些情况中,I/O请求可能需要与其他进程产生交叠。可移植操作系统接口(POSIX)异步I/OAIO)应用程序接口(API)就提供了这种功能。在本文中,我们将对这个API概要进行介绍,并来了解一下如何使用它。

AIO简介

Linux异步I/OLinux内核中提供的一个相当新的增强。它是2.6版本内核的一个标准特性,但是我们在2.4版本内核的补丁中也可以找到它。AIO背后的基本思想是允许进程发起很多I/O操作,而不用阻塞或等待任何操作完成。稍后或在接收到I/O操作完成的通知时,进程就可以检索I/O操作的结果。

I/O模型

在深入介绍AIO API之前,让我们先来探索一下Linux上可以使用的不同I/O模型。这并不是一个详尽的介绍,但是我们将试图介绍最常用的一些模型来解释它们与异步I/O之间的区别。图1给出了同步和异步模型,以及阻塞和非阻塞的模型。

ITPUB个人空间"T]R z|'x;LgaU
1.基本Linux I/O模型的简单矩阵
r7C&R3tjzqxM8g0

每个I/O模型都有自己的使用模式,它们对于特定的应用程序都有自己的优点。本节将简要对其一一进行介绍。

同步阻塞I/O

I/O密集型与CPU密集型进程的比较

I/O密集型进程所执行的I/O操作比执行的处理操作更多。CPU密集型的进程所执行的处理操作比I/O操作更多。Linux 2.6的调度器实际上更加偏爱I/O密集型的进程,因为它们通常会发起一个I/O操作,然后进行阻塞,这就意味着其他工作都可以在两者之间有效地交错进行。

最常用的一个模型是同步阻塞I/O模型。在这个模型中,用户空间的应用程序执行一个系统调用,这会导致应用程序阻塞。这意味着应用程序会一直阻塞,直到系统调用完成为止(数据传输完成或发生错误)。调用应用程序处于一种不再消费CPU而只是简单等待响应的状态,因此从处理的角度来看,这是非常有效的。

2给出了传统的阻塞I/O模型,这也是目前应用程序中最为常用的一种模型。其行为非常容易理解,其用法对于典型的应用程序来说都非常有效。在调用read系统调用时,应用程序会阻塞并对内核进行上下文切换。然后会触发读操作,当响应返回时(从我们正在从中读取的设备中返回),数据就被移动到用户空间的缓冲区中。然后应用程序就会解除阻塞(read调用返回)。

ITPUB个人空间#HR f yV ?j\Kp!zv
2.同步阻塞I/O模型的典型流程ITPUB个人空间[dM Xh8}3i

从应用程序的角度来说,read调用会延续很长时间。实际上,在内核执行读操作和其他工作时,应用程序的确会被阻塞。

同步非阻塞I/O

同步阻塞I/O的一种效率稍低的变种是同步非阻塞I/O。在这种模型中,设备是以非阻塞的形式打开的。这意味着I/O操作不会立即完成,read操作可能会返回一个错误代码,说明这个命令不能立即满足(EAGAINEWOULDBLOCK),如图3所示。

ITPUB个人空间?.mZYC{F
3.同步非阻塞I/O模型的典型流程ITPUB个人空间 N-J:B%f@L

非阻塞的实现是I/O命令可能并不会立即满足,需要应用程序调用许多次来等待操作完成。这可能效率不高,因为在很多情况下,当内核执行这个命令时,应用程序必须要进行忙碌等待,直到数据可用为止,或者试图执行其他工作。正如图3所示的一样,这个方法可以引入I/O操作的延时,因为数据在内核中变为可用到用户调用read返回数据之间存在一定的间隔,这会导致整体数据吞吐量的降低。

异步阻塞I/O

另外一个阻塞解决方案是带有阻塞通知的非阻塞I/O。在这种模型中,配置的是非阻塞I/O,然后使用阻塞select系统调用来确定一个I/O描述符何时有操作。使select调用非常有趣的是它可以用来为多个描述符提供通知,而不仅仅为一个描述符提供通知。对于每个提示符来说,我们可以请求这个描述符可以写数据、有读数据可用以及是否发生错误的通知。


0~b(kx0M$qN5|X~0
4.异步阻塞I/O模型的典型流程(select)
+^ Bb4v1WJ&DIQ0

select调用的主要问题是它的效率不是非常高。尽管这是异步通知使用的一种方便模型,但是对于高性能的I/O操作来说不建议使用。

异步非阻塞I/OAIO

最后,异步非阻塞I/O模型是一种处理与I/O重叠进行的模型。读请求会立即返回,说明read请求已经成功发起了。在后台完成读操作时,应用程序然后会执行其他处理操作。当read的响应到达时,就会产生一个信号或执行一个基于线程的回调函数来完成这次I/O处理过程。

ITPUB个人空间N^,dwY9Yf
5.异步非阻塞I/O模型的典型流程ITPUB个人空间#a$`8GC9ts0[u7w

在一个进程中为了执行多个I/O请求而对计算操作和I/O处理进行重叠处理的能力利用了处理速度与I/O速度之间的差异。当一个或多个I/O请求挂起时,CPU可以执行其他任务;或者更为常见的是,在发起其他I/O的同时对已经完成的I/O进行操作。

下一节将深入介绍这种模型,探索这种模型使用的API,然后展示几个命令。

 

异步I/O的动机

从前面I/O模型的分类中,我们可以看出AIO的动机。这种阻塞模型需要在I/O操作开始时阻塞应用程序。这意味着不可能同时重叠进行处理和I/O操作。同步非阻塞模型允许处理和I/O操作重叠进行,但是这需要应用程序根据重现的规则来检查I/O操作的状态。这样就剩下异步非阻塞I/O了,它允许处理和I/O操作重叠进行,包括I/O操作完成的通知。

除了需要阻塞之外,

TAG:

引用 删除 junerjie   /   2008-05-04 13:54:59
您好,我是科博电脑技术服务公司的。
我们公司供应电脑设备及电脑耗材,还包括
电脑组装、升级、维修、局域网组建、监控
安装等一些服务。我们有专业的技术人才为
您上门服务,从中收取50元的服务费。如果
有需要帮忙的地方,请与我联系!
            联系电话:010-82614906/5798
            E-mail :tangxiujun89@gmail.com
            Q    Q :549577912
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-10-08  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 2252
  • 日志数: 28
  • 建立时间: 2008-01-07
  • 更新时间: 2008-08-29

RSS订阅

Open Toolbar