AIO是2.6內核增加的一個主要的“企業級”特征。AIO讓用戶進程可以發起多個IO操作,無需等待任何一個操作完成;操作狀態可以隨後獲取。塊設備驅動和網絡驅動已經是完全異步的了,無需為支持這種新的異步操作而做特別的事情。然而,具有同步API的字符設備卻需要額外的工作才能支持AIO。對於大多數字符設備驅動,支持AIO並不能獲得太多好處。然而,在極少數情況下,讓用戶可以使用AIO可能是有利的。
1 AIO文件操作
為支持AIO而要做的第一步(除了包含外)是實現file_operations結構體中新增加的三個方法:
對於大多數驅動程序,真正的工作在aio_read()和aio_write()的實現中完成。這兩個函數與標准的read()和write()方法類似,但是有兩處不同:file參數被替換成了IO控制塊(iocb),並且函數(通常)不需要立即完成請求的操作。通常可以把iocb看作AIO子系統使用的不透明數據結構。然而,如果需要文件描述符的struct file指針,可以通過iocb->ki_flip獲取。
aio操作也可以是同步的。一個明顯的例子是,操作可以不阻塞地完成時。如果操作在aio_read()或者aio_write()返回前完成,則返回值應該是通常的狀態碼或者錯誤碼。所以,下面的aio_read()方法雖然沒有意義,卻是完全正確的:
某些情況可能確實要求同步行為。所謂的“同步iocb”使得需要時可以同步地使用AIO子系統。如果必須同步處理請求,則宏
將返回true。
然而,大多數情況下aio_read()和aio_write()是不能立即滿足IO請求的。此時,這些函數應該啟動操作,返回-EIOCBQUEUED。注意:必須在返回前完成任何必須在用戶進程上下文中完成的工作,因為隨後是不能訪問用戶進程上下文的。為訪問用戶緩沖區,可能需要在返回前建立DMA映射,或者將buffer指針轉換成一系列struct page指針。還應該牢記的是,任何時刻可能有多個活動的異步IO請求。實現AIO的驅動程序必須包含正確的鎖操作(以及可能的排隊),讓這些請求不會相互干擾。
IO操作完成時,必須調用aio_complete()通知AIO子系統:
當然,這裡的iocb就是發起請求時的IOCB。res是IO操作的通常結果:傳輸的字節數,或者負值的錯誤碼。res2是返回給用戶的第二個狀態值,當前(2.6.0-test9)內核中aio_complete()的調用者總是設置它為0。可以在中斷處理器中安全地調用aio_complete()。一旦調用aio_complete(),驅動程序就不再擁有IOCB或者用戶緩沖區了,不應該再觸碰它們。
aio_fsync()的目的與fsync()相同:確保所有未決的數據都寫入到磁盤了。一般來說,設備驅動程序不需要實現aio_fsync()。