快速业务通道

Linux异步IO探讨

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-15
intf("aio_read error:%sn" , strerror(errno));

  return false;

  }

  4. int aio_error(const struct aiocb *aiocbp);

  如果该函数返回0,表示aiocbp指定的异步I/O操作请求完成.

  如果该函数返回EINPROGRESS,表示aiocbp指定的异步I/O操作请求正在处理中.

  如果该函数返回ECANCELED,表示aiocbp指定的异步I/O操作请求已经取消.

  如果该函数返回-1,表示发生错误,检查errno.

  5. ssize_t aio_return(struct aiocb *aiocbp);

  这个函数的返回值相当于同步I/O中,read/write的返回值.只有在aio_error调用后

  才能被调用.

  6. int aio_cancel(int fd, struct aiocb *aiocbp);

  取消在文件描述符fd上的aiocbp所指定的异步I/O请求.

Empire CMS,phome.net

  如果该函数返回AIO_CANCELED,表示操作成功.

  如果该函数返回AIO_NOTCANCELED,表示取消操作不成功,使用aio_error检查一下状态.

  如果返回-1,表示发生错误,检查errno.

  7. int lio_listio(int mode, struct aiocb *restrict const list[restrict],

  int nent, struct sigevent *restrict sig);

  使用该函数,在很大程度上可以提高系统的性能,再一次I/O过程中,OS需要进行

  用户态和内核态的切换,如果我们将更多的I/O操作都放在一次用户太和内核太的切换中,

  减少切换次数,换句话说在内核尽量做更多的事情.这样可以提高系统的性能.

  用户程序提供一个struct aiocb的数组,每个元素表示一次AIO的请求操作.需要设置struct aiocb

  中的aio_lio_opcode数据成员的值,有LIO_READ,LIO_WRITE和LIO_NOP.

  nent表示数组中元素的个数.一个参数是对AIO操作完成后的通知机制的设置.

  8. 设置AIO的通知机制,有两种通知机制:信号和回调

  (1).信号机制

  我们应该捕获SIGIO信号,对其作处理:

  struct sigaction sig_act;

  sigempty(&sig_act.sa_mask);

  sig_act.sa_flags = SA_SIGINFO;

  sig_act.sa_sigaction = aio_handler;

  struct aiocb myaiocb;

  bzero( (char *)&myaiocb, sizeof(struct aiocb) );

  myaiocb.aio_fildes = fd;

  myaiocb.aio_buf = malloc(BUF_SIZE 1);

  myaiocb.aio_nbytes = BUF_SIZE;

  myaiocb.aio_offset = next_offset;

  myaiocb.aio_sigevent.sigev_notify = SIGEV_SIGNAL;

  myaiocb.aio_sigevent.sigev_signo = SIGIO;

  myaiocb.aio_sigevent.sigev_value.sival_ptr = &myaiocb;

  ret = sigaction( SIGIO, &sig_act, NULL );

  信号处理函数的实现:

  void aio_handler( int signo, siginfo_t *info, void *context )

  {

  struct aiocb *req;

  if (info->si_signo == SIGIO) {

  req = (struct aiocb *)info->si_value.sival_ptr;

  if (aio_error( req ) == 0) {

  ret = aio_return( req );

  }

  }

  return;

  }

Empire CMS,phome.net

  (2). 回调机制

  需要设置:

  myaiocb.aio_sigevent.sigev_notify = SIGEV_THREAD

  my_aiocb.aio_sigevent.notify_function = aio_handler;

  回调函数的原型:

  typedef void (* FUNC_CALLBACK)(sigval_t sigval);

  AIO机制为服务器端高并发应用程序提供了一种性能优化的手段.加大了系统吞吐量.

Empire CMS,phome.net

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号