歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux異步IO探討(一)

Linux異步IO探討(一)

日期:2017/2/25 10:38:34   编辑:Linux教程

  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

  __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:%s\n" , 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)

  {

  printf("aio_read error:%s\n" , strerror(errno));

  return false;

  }

Copyright © Linux教程網 All Rights Reserved