読者です 読者をやめる 読者になる 読者になる

脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

I/O多重化の方法(selectとepollの違い)

Linux

select

  • 監視するファイルディスクリプタのサイズに制限がある
  • 一件一件FDを確認する
  • kernel側でFDのstatus情報を保持していないので、毎回チェックする必要がある
I/O処理の流れ

1. select側で監視するFDのリストを持つ
2. I/O処理のリクエストをselectが受け付ける
3. FDのリストをkernel側へ送る
4. kernelが送られたFDのstatusを一件目から順番に確認して更新する (※FDの数が多くなるほどここのコストが高い)
5. 全件の確認・更新が終わったらその情報をselect側に返す
6. 返ってきた情報をチェックしてstatusがReady状態のFDをさがす
7. 見つけたReady状態のFDに対してI/O処理を行う

epoll

  • 監視するファイルディスクリプタのサイズに制限なし
  • kernelの方でFDのstatusをチェックして管理してくれてるので、どのFDがReady状態かわかる
I/O処理の流れ

1. epoll側から監視して欲しいFDのリストをkernelへ送る
2. kernel側でリスト内のFDを常時監視してstatusを保存する
3. I/O処理のリクエストをepollが受け付ける
4. epollがkernelにReady状態のFDを問い合わせる
  - FDリストは再度送らない
5. kernelがReady状態のFDリストを返す
  - statusを保存しているので、一件一件Loopして確認・更新する必要がない
6. 返ってきたFDに対してI/O処理を行う
  - Ready状態のFDのリストが直接帰ってくるので再検索の必要なし

結論

管理するFDの数が増えるほど顕著に差がでるので、特別な理由がない限りepollの方を使いましょう