kqueue

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

Kqueueは、2000年7月にFreeBSD 4.1で導入されたスケーラブルなイベント通知インターフェースであり、 [1] [2] NetBSDOpenBSDDragonFly BSD、およびmacOSでもサポートされていますKqueueは、2000年にJonathan Lemonによって作成され[1] [2]、その後FreeBSDコアチームに参加しました。Kqueueを使用すると、nginxなどのソフトウェアでc10k問題を解決できます[3] [4]

Kqueueは、カーネルユーザーランドの間に効率的な入力および出力イベントパイプラインを提供します。したがって、メインイベントループの反復ごとに1つのシステムコールのみを使用しながら、イベントフィルタを変更したり、保留中のイベントを受信したりすることができます。これは、特に多数のファイル記述子のイベントをポーリングする場合に、効率が低い などの古い従来のポーリングシステムコールとは対照です。kevent(2)poll(2)select(2)

Kqueueは、ファイル記述子イベントを処理するだけでなく、ファイル変更の監視信号非同期I / Oイベント(AIO)、子プロセスの状態変更の監視、ナノ秒の解決をサポートするタイマーなど、他のさまざまな通知にも使用されます。さらに、kqueueは方法を提供します。カーネルによって提供されるイベントに加えて、ユーザー定義のイベントを使用します。

LinuxepollWindowsSolarisI/O完了ポートなど、従来はサポートされていたが現在はより効率的なポーリングの代替手段を提供している他のオペレーティングシステムselect(2)poll(2)

libkqueueはのユーザースペース実装でありkqueue(2)、オペレーティングシステムのネイティブバックエンドイベントメカニズムへの呼び出しを変換します。[5]

API [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カーネルサブシステムです。

参照

  1. ^ a b ジョナサンレモン(2000)。「kqueue、kevent —カーネルイベント通知メカニズム」BSD相互参照FreeBSDOpenBSDNetBSDDragonFlyBSD
  2. ^ a b ジョナサンレモン(2001-05-01)。Kqueue:汎用的でスケーラブルなイベント通知機能(PDF)FREENIXトラックの議事録:2001USENIX年次技術会議USENIX(2001年6月25〜30日公開)。
  3. ^ 「接続処理方法」nginx.org_
  4. ^ Andrew Alexeev(2012)。"§14.nginx"エイミーブラウンで; グレッグウィルソン(編)。オープンソースアプリケーションのアーキテクチャ、ボリュームII:構造、規模、およびいくつかの大胆不敵なハックLulu.comISBN 9781105571817
  5. ^ GitHublibkqueue
  6. ^ kqueue(2)  –FreeBSD システムコールマニュアル

外部リンク