Kqueueは、2000年7月にFreeBSD 4.1で導入されたスケーラブルなイベント通知インターフェースであり、 [1] [2] NetBSD、OpenBSD、DragonFly BSD、macOSでもサポートされています。Kqueueは、2000年にJonathan Lemonによって最初に作成され、[1] [2]その後FreeBSDコアチームに参加しました。Kqueueにより、 nginxなどのソフトウェアがc10k問題を解決できるようになりました。[3] [4]「kqueue」という用語は、「カーネルイベントキュー」としての機能を指します[1] [2]
Kqueue は、カーネルとユーザーランド間の効率的な入出力イベント パイプラインを提供します。したがって、メインイベント ループの反復ごとに1 つのシステム コールのみを使用して、イベント フィルターを変更したり、保留中のイベントを受信したりすることができます。これは、特に多数のファイル記述子のイベントをポーリングする場合に効率が悪くなる、
やなどの従来の古いポーリングシステム コールとは対照的です。kevent(2)poll(2)select(2)
Kqueue はファイル記述子イベントを処理するだけでなく、ファイル変更の監視、シグナル、非同期 I/Oイベント (AIO)、子プロセスの状態変更の監視、ナノ秒の解像度をサポートするタイマーなど、さまざまな通知にも使用されます。さらに、kqueue はカーネルによって提供されるイベントに加えて、ユーザー定義のイベントを使用する方法も提供します。
他のオペレーティング システムでは、従来は のみをサポートしていましたselect(2)が、現在はLinuxのepollやWindowsおよびSolarisのI/O 完了ポートpoll(2)など、より効率的なポーリングの代替手段も提供しています。
libkqueueは、オペレーティングシステムのネイティブバックエンドイベントメカニズムへの呼び出しを変換する、のユーザー空間実装です。 [5]kqueue(2)
翻訳
関数のプロトタイプと型は[6]sys/event.hにあります。
int kqueue ( void );
新しいカーネル イベント キューを作成し、記述子を返します。
int kevent ( int kq 、const struct kevent * changelist 、int nchanges 、struct kevent * eventlist 、int nevents 、const struct timespec * timeout );
キューにイベントを登録し、その後、保留中のイベントを待機してユーザーに返すために使用されます。epollとは対照的に、 kqueue は同じ関数を使用してイベントを登録および待機し、1 回の呼び出しで複数のイベント ソースを登録および変更できます。changelist配列を使用して、イベント キューに変更 (待機するイベントの種類の変更、新しいイベント ソースの登録など) を渡すことができ、イベントの待機を開始する前に適用されます。 は、イベント キューからイベントを受信するために使用される、neventsユーザー指定の配列のサイズですeventlist。
EV_SET ( kev 、ident 、filter 、flags 、fflags 、data 、udata );
オブジェクトの便利な初期化に使用されるマクロstruct kevent。
参照
kqueue をサポートする OS に依存しないライブラリ:
他のプラットフォームでの Kqueue と同等のもの:
- Solaris、Windows、AIX の場合: I/O 完了ポート。完了ポートは、要求された操作が完了したときに通知しますが、
kqueueファイル記述子が I/O 操作を実行する準備ができたときにも通知できることに注意してください。 - Linuxの場合:
- epollシステム コールは、セマンティクスは似ていますが、同一ではありません。
- inotify は、ファイルシステムの変更を検出し、それをアプリケーションに報告する Linux カーネル サブシステムです。
参考文献
- ^ abc Jonathan Lemon (2000). 「 kqueue、kevent — カーネルイベント通知メカニズム」。BSD相互参照。FreeBSD 、OpenBSD、NetBSD、DragonFly BSD。
- 「kqueue、kevent -- カーネル イベント通知メカニズム」。FreeBSD マニュアル ページ。
- 「kqueue、kevent、EV_SET — カーネル イベント通知メカニズム」。OpenBSD マニュアル ページ サーバー。
- 「kqueue、kevent -- カーネル イベント通知メカニズム」。DragonFly オンライン マニュアル ページ。
- ^ abc Jonathan Lemon (2001-05-01). Kqueue: 汎用的でスケーラブルなイベント通知機能(PDF) . PROCEEDINGS of the FREENIX Track: 2001 USENIX Annual Technical Conference. USENIX (2001 年 6 月 25 ~ 30 日発行)。
- 「KQueue – 汎用的でスケーラブルなイベント通知機能」。Usenix。
- ^ 「接続処理方法」. nginx.org .
- ^ Andrew Alexeev (2012) 。「§14. nginx」。Amy Brown、Greg Wilson (編)。オープンソース アプリケーションのアーキテクチャ、第 2 巻: 構造、スケール、そして大胆なハック。Lulu.com。ISBN 9781105571817。
- ^ GitHubの libkqueue
- ^ – FreeBSDシステムコールマニュアル
