Io
為什麼io_uring對送出隊列有一層間接性?
從關於 io_uring 的論文中,送出環包含送出數組的索引,送出事件本身儲存在其中。文件解釋了這個間接層如下:
一個重要的區別是,當 CQ 環直接索引 cqes 的共享數組時,送出端在它們之間有一個間接數組。因此,送出端環形緩衝區是這個數組的索引,而數組又包含了 sqes 的索引。這最初可能看起來很奇怪和令人困惑,但它背後有一些原因。一些應用程序可能會在內部資料結構中嵌入請求單元,這使他們能夠靈活地這樣做,同時保留在一次操作中送出多個 sqes 的能力。這反過來又允許將所述應用程序更輕鬆地轉換為 io_uring 介面。
但是我沒有遵循“應用程序可以在內部資料結構中嵌入請求單元”的含義,也沒有遵循關於間接層因此啟用什麼的直覺。
有人可以換句話說解釋這層間接的好處嗎?
我聯繫了論文的作者,並對此有所了解。
存在間接層的原因是因為某些應用程序可能希望將送出事件數據保存在其應用程序特定的資料結構中。通過讓數組保存事件,應用程序可以有效地獲得該數組中插槽的長期所有權,並從應用程序本身引用它。隨著時間的推移填充它。當準備好送出 IO 時,它可以將事件的索引放入環中。
然而,如果數組不存在,而環保存事件,則必須在 IO 送出期間將事件從應用程序的結構複製到環,因為環是按事件插入時間排序的,因此應用程序無法提前“預留”一個插槽供其使用。這是一堆可以通過數組避免的額外複製。