# kqueue ## 定義 **kqueue** は FreeBSD・NetBSD・macOS が提供するスケーラブルな汎用イベント通知機構である。`kqueue()` でリスニングオブジェクトを作成し、`kevent()` で監視対象の追加・変更・取得を行う。[[epoll]] の BSD/macOS 版に相当するが、ソケット以外にも**ファイル・シグナル・I/O 完了・タイマー・プロセスイベント**を統一的に監視できる点でより汎用的。 ## 歴史 - **FreeBSD 4.1(2000)** — Jonathan Lemon が初期実装を FreeBSD に導入。BSDCon 2000 で発表。 - **NetBSD** — NetBSD-current(2002年10月頃)で採用。 - **macOS** — Darwin カーネルが kqueue をサポート。macOS の Grand Central Dispatch(GCD)の基盤でもある。 ## API ```c // kqueue インスタンス作成 int kq = kqueue(); // 変更セット: 監視追加(EVFILT_READの読み込み監視) struct kevent change; EV_SET(&change, sockfd, EVFILT_READ, EV_ADD | EV_CLEAR, 0, 0, NULL); // ↑ EV_CLEAR でエッジトリガ相当 // 変更適用 + イベント取得(タイムアウトは NULL で無限) struct kevent events[MAX_EVENTS]; int n = kevent(kq, &change, 1, events, MAX_EVENTS, NULL); ``` ## フィルタ種別 | フィルタ | 対象 | |---------|------| | `EVFILT_READ` | ソケット・パイプの読み込み可能 | | `EVFILT_WRITE` | ソケット・パイプの書き込み可能 | | `EVFILT_VNODE` | ファイルシステムイベント(変更・削除等) | | `EVFILT_PROC` | プロセスイベント(終了・fork 等) | | `EVFILT_SIGNAL` | シグナル受信 | | `EVFILT_TIMER` | タイマー発火 | | `EVFILT_AIO` | AIO 完了 | ## epoll との比較 | 項目 | [[epoll]] | kqueue | |-----|---------|--------| | 対象 OS | Linux | BSD / macOS | | 監視対象 | ソケット中心 | ソケット・ファイル・シグナル等 | | トリガモード | レベル / エッジ(`EPOLLET`) | レベル / エッジ(`EV_CLEAR`) | | API | create + ctl + wait(3関数) | kqueue + kevent(2関数) | ## 現代の利用 libevent・libuv(Node.js)・Tokio(Rust)・Python asyncio が macOS/BSD 上で kqueue をバックエンドに使用。[[nginx]] も kqueue をサポート。 ## 関連 - [[C10K問題]] — kqueue が解決した問題 - [[epoll]] — Linux 向けの相当機構 - [[C10K-Problem]] — 原典