なんでもかんでもイベント処理で扱う
»
まだ年明け早々で外出の予定などがあまり入っていないので、ここぞとばかりに、製品の改良でプログラミングと検証を試行錯誤しています。
私が手がけるものは、基本的にネットワーク関連製品ばかりなので、外観や使い勝手というよりも、とにかく性能と安定性が勝負というものが多いのですが、今燃えているのは、昨年からやっている「多スレッドで実現していたプロキシ処理を多重化で実現」です。
TCP/IPの扱いはepollを使ったイベント型の多重処理でかなりまとまったのですが、タイムアウト処理など、裏で動かす処理をどうするかと、処理にわざとウェイトを入れる処理をどうするかなどを試行錯誤していました。
タイムアウト処理は、別スレッドで定期的に順番にチェックしながら、という感じだったのですが、それだとどうしてもデータアクセスに排他が必要になるのと、順番にチェックするというループ処理がイマイチです。そこで、timerfdを使って、定期的な処理もイベントとして扱うようにしたところ、かなりソースがシンプルになり、排他も減らせました。
わざとウェイトを入れる処理もtimerfdを使いました。こちらもシンプルなソースにできました。
意外と困ったのが、通常ファイルの扱いです。これも読み出しレディのイベントで、と思ったら、ディスクシステムによってはイベント登録ができないので、しかたなくeventfdを使って実現しました。
これらのイベントを、場面ごとにModifyで切り替えてepollで全てをまとめて扱うという感じになり、実に満足な状態になってきました。もちろん、処理がシンプルになるので性能も上がります。
寝不足で、何を書いているかよくわかりませんが、まあ、単なる自己満足ということで・・・。
SpecialPR