kqueue IO多重化の使用記録

2416 ワード

シングルパス:IOはスレッド処理を専門に開きます.マルチパス:複数のIOが1つのスレッド処理を多重化します.(スレッド、メモリの節約)
kqueueはunixの次のIO多重ライブラリです.
リファレンスヘッダファイル
#include 
#include 

kqueueを作成し、ハンドルkqを取得し、kqでkqueueを操作します.
int kq = kqueue();

kqueueに関心のあるイベントを追加
struct kevent evt;    //   
EV_SET(&evt, sock, EVFILT_READ, EV_ADD | EV_ENABLE, 0, 0, NULL);  //   
kevent(kq, &evt, 1, NULL, 0, NULL);    //   

上のコードはkeventが構造体であることを説明しています
struct kevent {
    uintptr_t   ident;      /* identifier for this event */
    int16_t     filter;     /* filter for event */
    uint16_t    flags;      /* general flags */
    uint32_t    fflags;     /* filter-specific flags */
    intptr_t    data;       /* filter-specific data */
    void        *udata;     /* opaque user data identifier */
};

/* ---   :--- */
ident        key,  socket    ,   socket   fd   
filter       ,  15  ,         
      EVFILT_READ   socket     
      EVFILT_WRITE  socket     
      EVFILT_SIGNAL  unix        
      EVFILT_TIMER       
      EVFILT_USER          
flags     ,EV_ADD   ,EV_DELETE   ,EV_ENABLE   ,EV_DISABLE    
fflags        ,NOTE_TRIGGER       
data int       ,socket             
udata        ,               。    

kevent()はkqueueにイベントを追加したり、イベントをリスニングしたりすることができます.kevent()は呼び出しをブロックします.
int kevent( int kq, 
const struct kevent *changelist, 
int nchanges, 
struct kevent *eventlist,
int nevents, 
const struct timespec *timeout);

/* ---   :--- */
kq    kqueue    
changelist   kevent    ,            
nchanges   changelist     

eventlist          ,     ,    kqueue     
nevents   eventlist     
   eventlist,kevent()              ,         eventlist     。

timeout        ,           ,    

kqueueでイベントの発生を傍受する
struct kevent events[Max_Event_Count];
int ret = kevent(kq, NULL, 0, events, Max_Event_Count, NULL); 

// kevent()      ,        。
// events   kqueue        

kqueueはsocket,ファイル変化,システム信号,タイマイベント,ユーザカスタムイベントを傍受することができる.
一般的にsocketのイベントを傍受するために使用され、読み取り可能かどうか、書き込み可能かどうかなど、大量のsocket IO要求を処理することができ、性能が高く、原理はオペレーティングシステムのI/O、および高性能IOモデルを参照してください.
ユーザーは、kqueueのオンまたは終了を制御するためにいくつかのイベントをカスタマイズできます.
タイマーイベント、GCDのdispatch_afterは、kqueueを直接使用したタイマイベントで、何秒間隔で何をするかを設定できます.
参考文献:kqueueドキュメントkqueue原論文kqueue例kqueueを用いてFreeBSD上で高性能アプリケーションサーバを開発する