萌えハッカーニュースリーダー

2025/10/09 04:06 I/O Multiplexing (select vs. poll vs. epoll/kqueue)

出典: https://nima101.github.io/io_multiplexing
hakase
博士

やあ、ロボ子。今日はI/O多重化について話すのじゃ。

roboko
ロボ子

I/O多重化、ですか。複数の入出力を効率的に処理する技術ですよね。

hakase
博士

そうそう!`poll`や`select`みたいなシステムコールを使うやつじゃ。でも、もっとスケーラブルな`kqueue`や`epoll`があるのを知ってるかの?

roboko
ロボ子

`kqueue`はMacOSで、`epoll`はLinuxで使われるイベント通知メカニズムですね。Webサーバーで大量の同時接続を処理するのに適していると。

hakase
博士

その通り!昔は`select`が主流だったけど、あれはO(n)でファイル記述子を全部ループするから、効率が悪いのじゃ。しかも、`FD_SETSIZE`っていう上限があって、デフォルトだと1024までしか監視できない。

roboko
ロボ子

`select`の欠点を改良するために`poll`が登場したんですね。1024の制限をなくしたり、タイムアウトの単位をミリ秒にしたり。

hakase
博士

`poll`も全部ループするのは変わらないから、結局O(n)なのじゃ。そこで`kqueue`の登場!

roboko
ロボ子

`kqueue`は2000年に登場したんですね。スケーラブルで柔軟、信頼性も高いと。

hakase
博士

`kevent`構造体で`<ident, filter>`ペアを識別するのじゃ。`ident`はファイル記述子で、`filter`はイベントを処理するカーネルフィルター。`EVFILT_READ`とか`EVFILT_WRITE`とかがあるぞ。

roboko
ロボ子

読み込みや書き込みの準備ができたときに通知を受け取るんですね。フラグを使ってイベントの追加、削除、有効化、無効化ができると。

hakase
博士

`kqueue`は関心のあるイベントを全部保持して、`kevent()`システムコールでイベントを追加・変更・削除したり、発生したイベントを待ったりするのじゃ。既存のイベントを再度追加すると、パラメータが変更されるだけで重複はしない。

roboko
ロボ子

イベントが発生すると`kevent()`の呼び出しがブロック解除され、`evList`でイベントを受け取るんですね。それをループして処理すると。

hakase
博士

そういうことじゃ!`kqueue`や`epoll`を使うと、サーバーはたくさんの接続を効率的に処理できるのじゃ。例えば、チャットサーバーとか、リアルタイムゲームサーバーとかに使えるぞ。

roboko
ロボ子

なるほど。I/O多重化は、現代の高性能サーバーには欠かせない技術なんですね。

hakase
博士

そういうこと!ところでロボ子、`kqueue`って名前、なんか可愛いと思わないかの?

roboko
ロボ子

確かに、ちょっと響きが可愛いですね。でも、博士、それよりも`epoll`の方が、なんとなく強そうなイメージがあります。

hakase
博士

ふむ、確かに`epoll`は「エポック」って感じがして、時代を切り開く感じがするのじゃ。でも、私はやっぱり`kqueue`派じゃな!なぜなら、`kqueue`の方が…、キューだけに、行列に並んでるみたいで可愛いから!…って、オチになってないかの?

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search