[英]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操作將永遠不會阻塞,但如果無法立即完成操作,則會返回EAGAIN
或EWOULDBLOCK
。 一些更具體的操作,如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,因為你所描述的並不是絕對必要的。
編輯:
另一方面,由於您使用了“管道”和“套接字”這兩個詞,您是否了解vmsplice和splice ? 這些是向套接字/管道發送數據或從套接字/管道發送數據的最有效的函數。 不幸的是,這是另一個模糊記錄的,難以理解的黑客有着難以捉摸的陷阱。 您自行承擔風險,已收到警告。
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.