感想: イベントVs.スレッドをhigh-conccurencyサーバを対象に
して真面目に考え直してみた論文。
Events - Threads
event handlers - monitors
events accepted by a handler - functions exported by a module
SendMessage / AwaitReply - procedure call, or fork/join
SendReply - return from procedure
waiting for messages - waiting on condition variables
適切な実装であれば、両者の性能は同等である。
従って、対象アプリケーションによって適切なパラダイムを選ぶべき。
スレッドモデルではタスクを線形に書くため、より効率の良い並列
フローの利用を妨げるという批判。しかし、既存システムを調べると
イベントシステムでも主に使われているフローは call/return,
parallel calls, pipelines の3種類だけ。→ スレッドでもOK!
また、複雑な制御フローは複雑性を産み、新たなエラーや競合状態
を引き起こすからどっちにしても望ましくないと思われる。
multicast や publish/subscribe アプリケーションで見られる
dynamic fan-in / fan-out だけはスレッドでは実現が難しい。
しかしこのフローは high concurrency サーバではほとんど見られない。
堅牢なシステムを作るには、処理後に何らかのack処理が必要である。
これは結局イベントモデルでも何らかの形で "return" 処理が必要
となることを示している。
スレッドシステムではスタック上に各スレッドの実行状態を積んで
いけるが、この手法には小さいスタックを使うとスタックオーバフロー
の危険があり、大きいスタックを使うと無駄にメモリを浪費するという
トレードオフがある。
→ 新しい dynamic stack growth 機構を提案
イベントモデルは状態管理を block point であまり保持しないよう
なプログラムになりやすいという利点があり、block 時に保持される
スタック上のデータが比較的少なくすむ。
→ コンパイラサポートによる解決を提案
ここまではスレッドとイベントの同等性を示したが、3. ではスレッドの方が
より優れているということを示す。
スレッドモデルだと、cause/effect 関係などが理解しやすいし、スタックが
全てのタスク実行状態をカプセル化してくれるのでわかりやすい。
既存のイベントシステムにおいてすら複雑なところや性能が問題ない
ところではスレッドを使いがち。
コンパイラとランタイムのちょっとした変更で、スレッドシステムが
安全性、性能、コード生産性ともに達成できることを示す。
スタックサイズを固定ではなく実行時に調整できるように変更し、
スタックにおけるトレードオフを解消。
This html is automatically converted
by Txt2Html 0.9b
Fri Jun 27 16:54:02 2003