6

Kqueue ウィキペディアのページから:

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

それはいいです。私は自分のサーバーに FreeBSD をターゲットにしており、かなりの量のネットワーク ソケット fd を処理しています - それらすべてで select() を使用し、誰からデータを読み取るかを考え出しています。kevent() 呼び出しを使用してパフォーマンスを向上させたいと思います。それが目的だからです!

ここで FreeBSD の kevent の man ページを読みましたが、それは不可解であり、それを説明する適切なリソースが見つかりません。kevent を使用して select を置き換える例は、私の問題を解決し、kevent() の使用方法をよりよく理解するのにも役立ちます。

4

2 に答える 2

11

まず、新しい kqueue を作成します。

int kq=kqueue();

fd を kq に登録します。

struct kevent kev;
kev.ident=your_fd;
kev.flags=EV_ADD | EV_CLEAR;
kev.filter=EVFILT_READ;
kev.fflags=0;
kev.data=0;
kev.udata=&your_data;

int res=kevent(kq,&kev,1,0,0,0);

最後に、データがソケットに到着するのを待ちます。

struct kevent res_kevs[5];
int res=kevent(kq,0,0,res_kevs,5,0);

返された後res_kevs[i].ident、ソケットの記述子が含まれますres_kevs[i].data- 読み取る準備ができているバイト数。

詳細と機能については、man kevent を参照してください。

于 2011-04-25T13:36:00.070 に答える
-1

通常、libeventを使用すると、すべての詳細が処理されます。また、同様のことを行う別のスキーム (Linux や epoll など) を持つ別の OS にプログラムを移動できることも意味します。

于 2011-04-22T19:04:35.407 に答える