NeiNeigh's blog

覚書のようなブログ.PC・アプリケーション・プログラミング・オーディオ・アニメ

libeventとは

日本語で書いてある記事があんまりなく,どんなソフトウェアなのかよくわからなかったので調べる.

libeventとは

英語版のwikipediaのページを和訳してみた.wikipediaを毛嫌いする人が多いが(信頼性がないだのどーのこーの),いうてそれなりに正しいこと書いてあるし,その分野の表面上の知識を得るだけなら十分.だと思う.
http://en.wikipedia.org/wiki/Libevent

libevent

libeventとはソフトウェアライブラリで,非同期イベント通知機能を持っている.libeventのAPIはコールバック関数を実行する機構を持っていて,ファイルディスクリプタで,またはタイムアウト後で特定のイベントが発生するときに実行される.libeventは,シグナルや一定のタイムアウトをトリガーとしてコールバックを実行することもサポートしている.

libeventは、イベント駆動型のネットワークサーバに見られるイベントループを置き換えることを意図している。アプリケーションはevent_dispatch()を呼ぶだけでよく,イベントのaddやremoveをイベントループを変えること無く動的に行える.

現在のところ,libeventは/dev/poll, kqueue(2), select(2), poll(2), epoll(4), Solarisのevent portsをサポートしている.リアルタイムシグナルも実験的にサポートしている.むき出しイベントAPIは,サポートしているどのプラットフォームに対しても均一である.結果として,libeventはポータブルなアプリケーション開発を可能にし,OS上の最もスケーラブルなエベント通知機構を提供する.

シグナルのコールバックを利用することで,libeventによって,安全なシグナルハンドラを書くことが簡単になり,そのシグナルハンドラはシグナルのコンテキストで実行されるユーザが供給するシグナルハンドリングではない.(ちょっとここの訳は良くわかんない)

libeventはNiels Provosによって作成され,BSDライセンスのもとでリリースされた.

有名なアプリケーション

libeventを利用している有名なアプリケーション

代替手段

libevでは,libeventのアーキテクチャにより発生する固有の問題を解決しようという試みがなされている.

そして,ちょっと意味が不安だった語句を調査.

- コールバック関数
プログラム中で,呼び出し先の関数の実行中に実行されるように,あらかじめ指定しておく関数.
http://e-words.jp/w/E382B3E383BCE383ABE38390E38383E382AFE996A2E695B0.html

- シグナル
シグナルは、プロセス間で連絡を取り合うための仕組みです。実行中のプロセスの処理をいったん止めて、別のプロセスを処理したい場合などに用いられます。シグナルは、Linuxカーネルに実装されています。
http://itpro.nikkeibp.co.jp/article/Keyword/20070308/264009/

- イベント駆動型
ユーザや他のプログラムが実行した操作(イベント)に対応して処理を行う、プログラムの実行形式。
http://e-words.jp/w/E382A4E38399E383B3E38388E38389E383AAE38396E383B3.html

- イベントループ
多分こんなイメージ.イベントがtrueになるまでずっとループしていて,イベントがきたらコールバック処理を実行.それがおわったらまたイベント待ちループ突入.

while(1){
  if(event()){
    exec();
  }
}

まとめ

これらからlibeventについてまとめると…
libeventは,何らかのイベントがファイルディスクリプタ上で起きたとき,またはタイムアウト発生時にコールバック関数を実行してくれる機構を持っていて,様々なプラットフォームをサポートしている移植性の高いライブラリである.

っていうことだと思う.有名なアプリケーションでいくつか例が挙げられていたが,その中のmemcachedはソケット通信でオープンしたファイルディスクリプタを監視して,接続があった場合にコールバック処理が行なわれるようにして,複数のクライアントに対応する機能を提供しているものと思われる.他のアプリケーションではどのように利用されているのか分からないが,最近話題になったTorにも使われてたとは….