快速业务通道

Linux异步IO探讨

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-15

  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

Empire CMS,phome.net

  __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:%sn" , 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)

  {

  pr

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号