Mackey's Lab

博士を取るまでの備忘録

epoll におけるレベルトリガーとエッジトリガー

epoll を利用したプログラミングをやっていて「レベルトリガー」と「エッジトリガー」という聞き慣れない単語を目にした。

これらの言葉はどうやら電子工学や制御工学などでよく利用される言葉のようである。調べるとマイコン制御などの記事が多く出てくる。IT 用語辞典 e-Words によると・・・

エッジトリガ
割り込み通知などにおいて、信号がある状態から別の状態へ変化した時点でトリガが引かれる方式。

レベルトリガ(レベルセンス)
信号レベルが変化した瞬間ではなく「信号レベルがある基準より上か下か」という信号の状態に注目してトリガのオン・オフを決める方式。

なるほど・・・なんとなく分かった。
つまりこれらの概念を epoll に適用すると・・・

エッジトリガ
epoll が管理しているディスクリプタのうちどれかが読み書き可能になった「瞬間」に epoll_wait() 関数が帰ってくる。

レベルトリガ
epoll が管理しているディスクリプタから読み書きできる(通常は読みか?)「状態」にあるディスクリプタが存在すれば epoll_wait() 関数が帰ってくる。

言葉で書くとややこしいので実際の実装に落とし込んで考えてみる。

エッジトリガでの epoll_wait 時に管理ディスクリプタが読み書き可能になると、epoll_wait() 関数が帰ってき、読み書き可能になったディスクリプタを取得することができる。この時、読み書き可能になったディスクリプタに対して何もせずに再び epoll_wait() を呼び出すと次のイベント(読み書き可能になるディスクリプタが現れる)まで epoll_wait() は帰ってこない。

一方レベルトリガでの epoll_wait は、ディスクリプタの「状態」によって epoll_wait() が帰るため、上記の様に epoll_wait で上がってきたディスクリプタに対して何もせずに再び epoll_wait をすると、すでに先ほどのディスクリプタは読み書きできる「状態」にあるのですぐに epoll_wait が帰ってくる。

このエッジトリガとレベルトリガの性質を利用して次回は複数スレッドから epoll_wait を呼び出すスレッドプール型のプログラムについて言及する。