- [[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