2012-01-07 38 views
41

似乎明白:Linux上POSIX AIO和libaio的區別?

POSIX AIO API的原型在<aio.h>和您鏈接與librt(-lrt)程序,而在<libaio.h>libaio API和你的程序與libaio的(-laio)鏈接。

我想不通:

1.Does內核來處理的這兩種方法的不同?

2.是否必須使用O_DIRECT這兩個標誌中的任何一個?

正如this post提到的,libaio的使用libaio .Okay時沒有O_DIRECT工作正常,理解,但:

根據R.Love的的Linux系統編程書,Linux支持AIO(我假設是POSIX AIO)只有如果用O_DIRECT打開。但是我編寫的一個小程序(使用aio.h,與-lrt鏈接),在沒有O_DIRECT標誌的情況下打開的文件上調用aio_write可以正常工作。

回答

51

在linux上,兩個AIO實現有着根本性的不同。

POSIX AIO是一個用戶級的實現,它在多個線程中執行正常的阻塞I/O,因此給出了I/O異步的錯覺。主要理由這樣做是:

  1. 它適用於任何操作系統上的任何文件系統
  2. 它的工作原理(基本)(請記住,GNU的libc的是便攜式)
  3. 它的工作原理上的文件與緩衝啓用(即沒有O_DIRECT標誌)

的主要缺點是,你的隊列深度(即未完成的操作,你可以在實踐中號)是由你選擇有,這也線程數限制意味着一個磁盤上的緩慢操作可能會阻止正在進行的操作到另一個磁盤。它也影響內核和磁盤調度程序看到的I/O(或多少)。內核AIO(即io_submit()et.al.)是對異步I/O操作的內核支持,其中io請求實際上在內核中排隊,按照您擁有的任何磁盤調度程序進行排序,可能大部分它們被作爲異步操作(使用TCQ或NCQ)轉發(按照人們希望的某種最佳順序)到實際磁盤。這種方法的主要限制是,並非所有的文件系統都能夠很好地使用異步I/O或使用異步I/O(並且可能回退到阻塞語義),文件必須用O_DIRECT打開,而O_DIRECT帶有許多其他的限制I/O請求。如果你無法用O_DIRECT打開你的文件,它可能仍然「工作」,因爲你獲得了正確的數據,但它可能不是異步完成的,但會回落到阻塞語義。

另外請記住,在某些情況下,io_submit()實際上可以阻塞磁盤。

+0

感謝您的回覆。所以對於POSIX AIO來說,O_DIRECT是*不是強制性的,但是對於kerenel AIO來說,這是(確保沒有回退發生)?這似乎與本書中提到的內容相矛盾。在內核代碼中,VFS具有這些aio_read/write通過aio_read/write系統調用(它是POXIS AIO而不是內核AIO)調用函數(?)。 – itisravi 2012-01-09 01:49:42

+1

沒有aio_ * syscalls(http://linux.die.net/man/2/syscalls)。您在vfs中看到的aio_ *函數可能是內核aio的一部分。 *用戶級別* aio_ *函數不會將1:1映射到系統調用。 – Arvid 2012-01-09 18:56:04

+1

@Arvid請你詳細說明io_submit()阻塞的情況。 (你提到有時它可能會阻塞磁盤) – ARH 2013-03-08 21:29:36

相關問題