- [[Linux]]の[[非同期I/O]]用システムコール - 従来のread/writeは同期API - readを呼び出す→コンテクストスイッチが起こる→読み込みが終わるまでスレッドはブロックされる - [[epoll]]: 従来の非同期I/O - epoll_wailt() → 読み取りが準備完了したことを通知→read - diskは常に読み取りができるから使えない。ネットワークだけ。 - readをし直す必要がある - 依然コンテクストスイッチは起こる - io_uring: - カーネルとユーザー空間が2つのリングバッファを共有する - [[Submission Queue|SQ]]: 依頼を積む - [[Completion Queue|CQ]]: 結果が入ってくる - システムコールを介さずにI/Oができる ``` [User Space] [Kernel Space] | | (1) Push request (SQE) | | | v | [ Submission Queue (SQ) ] =====Shared Memory====> | | (2) Fetch SQE & perform I/O | [ Completion Queue (CQ) ] <====Shared Memory===== | ^ | | | (3) Post result (CQE) (4) Pop result (data ready) | ``` - `io_uring_enter`: CQに最低1件入るまで寝て待つシステムコール 参考: - https://man7.org/linux/man-pages/man7/io_uring.7.html