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

Linux異步IO探討(二)

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

  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請求。

  如果該函數返回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;

  }

  (2). 回調機制

  需要設置:

  myaiocb.aio_sigevent.sigev_notify = SIGEV_THREAD

  my_aiocb.aio_sigevent.notify_function = aio_handler;

  回調函數的原型:

  typedef void (* FUNC_CALLBACK)(sigval_t sigval);

  AIO機制為服務器端高並發應用程序提供了一種性能優化的手段。加大了系統吞吐量。

Copyright © Linux教程網 All Rights Reserved