Linux核心開發之非同步通知與非同步I/O(三)

來源:互聯網
上載者:User

   小王,聽說過AIO沒?外國人,就這樣,總是愛簡寫,簡寫的結果是咱們都不認識了。所謂AIO就是Asynchronous Input/Output非同步輸入/輸出,基本思想是允許進程發起很多的I/O操作,而不用阻塞或等待任何操作的完成,稍後或在接收到I/O操作完成的通知時,進程就可以檢索I/O操作的結果。

“得得,你咋又跟我上起課來了呢,不是說好,今天CS嗎?是不是跟我講課特自信啊“小王抱怨到。

“啊?不是吧,為啥這樣呢,那你到底聽不聽,別到時面試叫天天不靈叫地地不應的,別再找我哈”我氣憤的說。

"唉,你都這樣說了,我也只能豎起耳朵好好聽聽了"看著小王極不情願的表情,我也覺得很可憐啊。

  在非同步非阻塞IO中,我們是可以同時發起多個傳輸操作。這需要每個操作都有一個唯一的上下文,這樣才能在它們完成時區分到底是哪個傳輸操作完成了。在AIO中,

通過aiocb(AIO IO control Block)結構體進行區分,這個結構體如下:

struct aiocb {intaio_fildes;/* File descriptor */off_taio_offset;/* File offset */volatile void *aio_buf;/* Location of buffer */size_taio_nbytes;/* Length of transfer */intaio_reqprio;/* Request priority offset */struct sigeventaio_sigevent;/* Signal number and value */intaio_lio_opcode;/* Operation to be performed */};

從上邊我們可以看到,這個結構體包含了有關傳輸的所有資訊,包括資料準備的使用者緩衝區。在產生IO通知時,aiocb結構就被用來唯一標識所完成的IO操作。

AIO系列API中主要有下邊幾個函數:

1.int aio_read(struct aiocb *aiocbp)

   該函數請求對一個有效檔案描述符進行非同步讀操作。在請求進行排隊之後會立即返回,如果執行成功,傳回值就為0,錯誤則返回-1並設定errno的值。

2.int aio_write(struct aiocb *aiocbp)
   該函數請求一個非同步寫操作,它會立即返回說明請求已經進行排隊,成功返回0,失敗返回為-1,並設定相應的error值。

3.int aio_error(struct aiocb *aiocbp)

   該函數用來確定請求的狀態,可以返回EINPROGRESS(說明請求尚未完成),ECANCELLED(請求被應用程式取消了),-1(說明發生了錯誤,具體錯誤原因由error記錄)。

4.ssize_t aio_return(struct aiocb *aiocbp)

   由於並沒有阻塞在read調用上,所以我們不能立即返回這個函數的返回狀態,這是就要使用這個函數了,需要注意的是只有在aio_error調用確定請求已經完成(可能

已經完成,也可能發生了錯誤)之後,才能調用這個函數,這個函數的傳回值就相當於同步情況下read或write系統調用的傳回值(所傳輸的位元組數,如果發生錯誤,則返回-1)。

5.int aio_suspend(const struct aiocb *const cblist[], int n ,const struct timespec *timeout)

   使用者可以通過這個函數來來掛起(或阻塞)調用進程,直到非同步請求完成為止,此時會產生一個訊號,或者發生其他逾時操作。調用者提供了一個aiocb引用列表,其中任何一個完成都會導致給函數返回。

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

   該函數允許使用者取消對某個檔案描述符執行的一個或所有的IO請求。

   如果要取消一個請求,使用者需提供檔案描述符和aiocb引用,如果這個請求被成功取消了,則返回AIO_CANCELED,如果該請求完成了,返回AIO_NOTCANCELED.

   如果要取消對某個給定檔案描述符的所有請求,使用者需要提供這個檔案的描述符以及一個aiocbp的NULL引用,如果所有請求被成功取消了,則返回AIO_CANCELED

,只要至少有一個沒被取消,這個函數就返回AIO_NOT_CANCELED.如果沒有一個請求可以被取消,該函數就會返回AIO_ALLDONE.

   然後,可以使用aio_error來驗證每個AIO請求,如果某個請求已經被返回了,那麼aio_error就返回-1,並且error會被設定為ECANCELED.

7.int lio_listio(int mode ,struct aiocb *list[], int nent ,struct sigevent *sig)

  這個操作使得使用者可以在一個系統調用(一次核心環境切換中啟動大量的I/O操作)。其中,mode參數可以是LIO_WAIT或LIO_NOWAIT,前者會阻塞這個調用,直到所有的IO都完成為止,在操作進行排隊之後,LIO_NOWAIT就會返回,list是一個aiocb引用的列表,最大元素的個數有nent定義的。如果list的元素為NULL,lio_lis

tio()將被忽略。

光說理論也不行,是不?現在來點實際點的:

a)使用者空間讀常式:

#include <aio.h>..int fd, set;struct aiocb my_aiocb;fd = open("file.txt", O_RDONLY);if( fd <0 ){    perror("open");}//清零aiocb結構體bzero((char *) &my_aiocb, sizeof(struct aiocb));//為aiocb請求分配資料緩衝區my_aiocb.aio_buf = malloc(BUFSIZE + 1);if(!my_aiocb.aio_buf)    perror("malloc");//初始化aiocb的成員my_aiocb.aio_fildes = fd;my_aiocb.aio_nbytes = BUFSIZE;my_aiocb.aio_offset = 0;ret = aio_read(&my_aiocb);if(ret < 0)    perror("aio_read");while(aio_error(&my_aiocb) == EINPROGRESS);if((ret = aio_return(&my_iocb))){    // 獲得非同步讀的傳回值}else{  讀失敗,分析errror}

b)使用者空間非同步IO aio_suspend()函數使用常式

struct aioct *cblist(MAX_LIST)//清零aioct結構鏈表bzero((char *)cblist, sizeof(cblist));//將一個或更多的aiocb放入aioct結構體鏈表cblist[0] = &my_aiocb;ret = aio_read( &my_aiocb);ret = aio_suspend( cblist, MAX_LIST, NULL);

c)使用者空間非同步IO lio_list()函數使用常式

struct aiocb aiocb1,aiocb2;struct  aiocb *list[MAX_LIST];...//準備第一個aiocbaiocb1.aio_fildes = fd;aiocb1.aio_buf = malloc(BUFSIZE +1);aiocb1.aio_nbytes = BUFSIZE;aiocb1.aio_offset = next_offset;aiocb1.aio_lio_opcode = LIO_READ;//非同步讀操作...//準備多個aiocbbzero((char *)list, sizeof(list));//將aiocb填入鏈表list[0] = &aiocb1;list[1]   = &aiocb2;...ret = lio_listio(LIO_WAIT, list, MAX_LIST, NULL); //發起大量IO操作

“濤哥,你說了這麼多,好像也咋沒和你說的驅動扯上關係呢”小王抱怨道。

“小王,不要急嗎,我不是正打算說嗎,瞧你著急性子,這樣吧,你把今天的好好看看,我們下集再說”…

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.