簡體   English   中英

Linux上的AIO支持

[英]AIO support on Linux

有誰知道在哪里可以獲得有關最新Linux內核上aio內核支持狀態的最新信息? Google搜索會顯示可能無可救葯地過時的網頁。

編輯:

更具體地說,我對非文件相關的描述符如管道和套接字感興趣。 網上的東西表明沒有支持,這仍然是這樣嗎?

Edit2:我正在尋找的東西類似於Windows OVERLAPPED IO

您不需要POSIX AIO(即man aio)異步使用套接字和管道。 根據man 3 aio它甚至不可能。 您應該使用非阻塞文件描述符 ,以及事件通知接口 ,例如select()poll()epoll epoll是Linux特有的,但比前兩個更好。

要在非阻塞模式下使用文件描述符,您必須在每個文件描述符上設置O_NONBLOCK標志:

fcntl(fd, F_SETFL, O_NONBLOCK)

文件描述符處於非阻塞模式后, read()write()等I / O操作將永遠不會阻塞,但如果無法立即完成操作,則會返回EAGAINEWOULDBLOCK 一些更具體的操作,如connect() ,必須以非阻塞模式以不同的方式使用; 請參閱相關手冊頁。

為了能夠正確使用非阻塞文件descritors,您的應用程序需要是事件驅動的 基本上,在main() ,您需要首先初始化東西,然后進入事件循環 事件循環重復等待事件(使用事件通知接口,例如epoll_wait() ),然后檢查發生了哪些事件,並響應它們。

現在當你說一個read() ,並且它失敗並使用EWOULDBLOCK ,你將它添加到文件描述符列表中以便於閱讀; 當事件提供者指示可讀性時,您再試一次。

類似地,如果您嘗試write()並且它使用EWOULDBLOCK失敗,您可能希望緩沖數據並在指示可寫性時再次嘗試。

Linux下有兩種 AIO。

一個是kernel-AIO。 它是丑陋的,有時根據文檔不符合行為(例如,它會在某些條件下同步運行而不能對它做任何事情,並且在某些條件下它不能正確取消飛行中的請求等,等等)。 不會在管道上工作。
這些是io_類型的功能。 請注意,您必須鏈接-laio ,您必須在某些系統上單獨安裝(例如Debian / Ubuntu)。

第二個是純用戶態實現(glibc),它根據需要生成線程來處理請求。 它有詳細記錄,工作得相當好,並且根據文檔,它幾乎適用於包含管道的文件描述符。
這些是aio_類的功能。 我明確建議使用這些,即使它們是“uncool userland實現” - 它們工作得很好。

同時使用eventfd作為通知機制,順便說一句,雖然內核版本上次我看起來仍然沒有記錄(但是函數在標題中)。

或者,正如Ambroz Bizjak指出的那樣,完全跳過AIO,因為你所描述的並不是絕對必要的。

編輯:
另一方面,由於您使用了“管道”和“套接字”這兩個詞,您是否了解vmsplicesplice 這些是向套接字/管道發送數據或從套接字/管道發送數據的最有效的函數。 不幸的是,這是另一個模糊記錄的,難以理解的黑客有着難以捉摸的陷阱。 您自行承擔風險,已收到警告。

splice允許您將數據從套接字(或任何文件描述符)傳輸到管道,或者相反。 vmsplice允許您在應用程序空間和管道之間傳輸數據。
具有諷刺意味的是, vmsplice理想地應該完成同樣的事情(重映射頁面,又名“玩VM”),一個特定的人在2006年作為爭論聲稱所有BSD開發人員都是白痴。

對於好消息來說,壞消息是你可以移動多少數據存在“秘密限制”。 據我記得它是64kB(但可以在/ proc中的某處配置)。 如果你有比這更多的數據,你必須工作幾個塊,可能有幾個管道緩沖區,填充一個而另一個讀取,並在完成后重用舊的管道緩沖區。
這就是它變得復雜的地方。 如果您瀏覽討論Kernel Trap,您會發現即使是Grand Master也不能100%確定在使用多個緩沖區時可以安全地覆蓋舊緩沖區。

另外,為了讓vmsplice 真正起作用(即重新映射頁面而不是復制),你需要使用“GIFT”標志,至少對我來說,從文檔中不清楚那些內存會變成什么樣。 按照文檔中的文檔,您需要泄漏內存,因為您永遠不會再次觸摸它。 當然不可能。 也許我只是愚蠢。

我最終放棄了這一點,並且剛剛決定使用epoll進行准備和非阻塞套接字以及普通的正常write 這種組合可能不是最優秀的表現者,但它有充分的記錄, 並且可以記錄下來

AIO支持已經包含在linux內核中。 這就是為什么谷歌的第一次打擊只提供2.4 Linux內核的補丁。 在2.6和3.0中,它已經在那里。

如果你簽出Linux內核源代碼,那就是fs / aio.c

GNU libc手冊中一些文檔 ,但請注意,所有類型的Linux文件描述符都不能使用aio。 大多數一般的“如何”文檔都是在2006年左右,這是合適的,因為那時Linux中的AIO成為頭條新聞。

請注意,POSIX.1b和Unix98標准沒有改變,所以你能否具體說明這些例子的“過時”性質?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM