免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Linux 異步IO機(jī)制
 
Linux 異步IO機(jī)制

Linux的I/O機(jī)制經(jīng)歷了一下幾個階段的演進(jìn):
1. 同步阻塞I/O: 用戶進(jìn)程進(jìn)行I/O操作,一直阻塞到I/O操作完成為止。
2. 同步非阻塞I/O: 用戶程序可以通過設(shè)置文件描述符的屬性O(shè)_NONBLOCK,I/O操作可以立即返回,但是并不保證I/O操作成功。
3. 異步事件阻塞I/O: 用戶進(jìn)程可以對I/O事件進(jìn)行阻塞,但是I/O操作并不阻塞。通過select/poll/epoll等函數(shù)調(diào)用來達(dá)到此目的。
4. 異步時間非阻塞I/O: 也叫做異步I/O(AIO),用戶程序可以通過向內(nèi)核發(fā)出I/O請求命令,不用等帶I/O事件真正發(fā)生,可以繼續(xù)做
           另外的事情,等I/O操作完成,內(nèi)核會通過函數(shù)回調(diào)或者信號機(jī)制通知用戶進(jìn)程。這樣很大程度提高了系統(tǒng)吞吐量。
          
下面就AIO做詳細(xì)介紹:
要使用aio的功能,需要include頭文件aio.h,在編譯連接的時候需要加入POSIX實時擴(kuò)展庫rt.下面就aio庫的使用做介紹。
1. AIO整個過程所使用的數(shù)據(jù)存放在一個結(jié)構(gòu)體中,struct aiocb,aio control block.看看頭文件中的定義:
/* Asynchronous I/O control block.  */
struct aiocb
{
  int aio_fildes;               /* File desriptor.  */ 需要在哪個文件描述符上進(jìn)行I/O
  int aio_lio_opcode;           /* Operation to be performed.  */ 這個是針對批量I/O的情況有效,讀寫操作類型
  int aio_reqprio;              /* Request priority offset.  */ 請求優(yōu)先級(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.  */ 具體內(nèi)容,數(shù)據(jù)緩存
  size_t aio_nbytes;            /* Length of transfer.  */ 數(shù)據(jù)緩存的長度
  struct sigevent aio_sigevent; /* Signal number and value.  */ 用于異步I/O完成后的通知。
 內(nèi)部實現(xiàn)使用的數(shù)據(jù)成員。
  /* 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);
異步讀操作,向內(nèi)核發(fā)出讀的命令,傳入的參數(shù)是一個aiocb的結(jié)構(gòu),比如
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);
異步寫操作,向內(nèi)核發(fā)出寫的命令,傳入的參數(shù)仍然是一個aiocb的結(jié)構(gòu),當(dāng)文件描述符的O_APPEND
標(biāo)志位設(shè)置后,異步寫操作總是將數(shù)據(jù)添加到文件末尾。如果沒有設(shè)置,則添加到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;
}
4. int aio_error(const struct aiocb *aiocbp);
如果該函數(shù)返回0,表示aiocbp指定的異步I/O操作請求完成。
如果該函數(shù)返回EINPROGRESS,表示aiocbp指定的異步I/O操作請求正在處理中。
如果該函數(shù)返回ECANCELED,表示aiocbp指定的異步I/O操作請求已經(jīng)取消。
如果該函數(shù)返回-1,表示發(fā)生錯誤,檢查errno。
5. ssize_t aio_return(struct aiocb *aiocbp);
這個函數(shù)的返回值相當(dāng)于同步I/O中,read/write的返回值。只有在aio_error調(diào)用后
才能被調(diào)用。
6. int aio_cancel(int fd, struct aiocb *aiocbp);
取消在文件描述符fd上的aiocbp所指定的異步I/O請求。
如果該函數(shù)返回AIO_CANCELED,表示操作成功。
如果該函數(shù)返回AIO_NOTCANCELED,表示取消操作不成功,使用aio_error檢查一下狀態(tài)。
如果返回-1,表示發(fā)生錯誤,檢查errno.
7. int lio_listio(int mode, struct aiocb *restrict const list[restrict],
             int nent, struct sigevent *restrict sig);
使用該函數(shù),在很大程度上可以提高系統(tǒng)的性能,因為再一次I/O過程中,OS需要進(jìn)行
用戶態(tài)和內(nèi)核態(tài)的切換,如果我們將更多的I/O操作都放在一次用戶太和內(nèi)核太的切換中,
減少切換次數(shù),換句話說在內(nèi)核盡量做更多的事情。這樣可以提高系統(tǒng)的性能。
用戶程序提供一個struct aiocb的數(shù)組,每個元素表示一次AIO的請求操作。需要設(shè)置struct aiocb
中的aio_lio_opcode數(shù)據(jù)成員的值,有LIO_READ,LIO_WRITE和LIO_NOP。
nent表示數(shù)組中元素的個數(shù)。最后一個參數(shù)是對AIO操作完成后的通知機(jī)制的設(shè)置。
8. 設(shè)置AIO的通知機(jī)制,有兩種通知機(jī)制:信號和回調(diào)
(1).信號機(jī)制
 首先我們應(yīng)該捕獲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 );
 信號處理函數(shù)的實現(xiàn):
 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). 回調(diào)機(jī)制
需要設(shè)置:
myaiocb.aio_sigevent.sigev_notify = SIGEV_THREAD
my_aiocb.aio_sigevent.notify_function = aio_handler;
回調(diào)函數(shù)的原型:
typedef void (* FUNC_CALLBACK)(sigval_t sigval);
AIO機(jī)制為服務(wù)器端高并發(fā)應(yīng)用程序提供了一種性能優(yōu)化的手段。加大了系統(tǒng)吞吐量。

本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/eroswang/archive/2009/04/20/4095163.aspx
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Linux內(nèi)核開發(fā)之異步通知與異步I/O(三)
信號和AIO
深入淺出:Linux設(shè)備驅(qū)動之異步通知和異步I/O
Linux 設(shè)備驅(qū)動中的異步通知與異步 I/O(2)
十三、Linux驅(qū)動程序開發(fā)(8) - 高級字符驅(qū)動程序(2)
Linux設(shè)備驅(qū)動程序之異步通知與異步I/O
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服