next up previous contents
Next: データベースの設計 Up: DAQシステムの設計 Previous: 基本的な構成要素

バッファの設計

データ収集系のプロセスの間でやり取りされるデータはバッファシステムに よって管理されます。データ収集系で第一義的に重要なのはデータバッファで す。フロントエンドからストレージデバイスまでの間、計算機の上ではデータ はバッファメモリーに保管されます。いくつかのプロセスがデータを参照する ためにバッファは共有メモリーに実装する必要があります。データは次から次 に送られてきますがメモリーは有限ですから必然的に資源管理が必要になりま す。バッファの設計で重要な問題は資源管理の問題です。

データバッファに書き込みを行うのは通常単一のプロセスです。CAMACなど を読み、適当なフォーマットをしてバッファに書き込むデータ収集プログラム がそれに当たりますが、場合によっては例えば同じスキームでデータを磁気テー プから読み込むこともあります。書き込みプロセスは高い優先度でバッファを 要求します。読み出しプロセスとしてはマスストレージへの書き込みプロセス やオンライン解析プログラムがあります。これらの優先度は実験により違って きます。イベントごとにデータを書き込む場合オンライン解析の優先度は下が ることもありますが、ヒストグラムしか残さない場合オンライン解析の優先度 は高くなります。

このようにシステムではバッファは優先度を持って要求されます。上の例で はまた、書き込みプロセスと読み出しプロセスでは当然要求しているものが違 います。書き込みプロセスは空のメモリーを要求し、読み出しプロセスはデー タの入ったバッファを要求します。いずれの場合も要求が満たされない場合は 満たされるまで実行が保留されるかエラーとなって制御が戻されるべきです。

これまでの考察から次のようなバッファ管理メカニズムが考えられます。何 らかのマネージャがいて、それぞれのプロセスはマネージャにバッファを要求 します。要求は実行待ちキューにいれられ、順に処理されます。与えられたバッ ファは必要が無くなればマネージャに返されます。各々のバッファは施された プロセスによって状態を変えます。空から書き込み済みに、さらに読み出し済 みに。バッファの状態を変えることの出来るプロセスは高い優先度のものです。 読み出し済みのバッファは空のバッファが無くなったときは読み出し済みバッ ファを書き込みに回すことになります。

バッファマネージャは次のような機能を持つことが要求されます。要求を受 け付け適当なバッファ(へのキーやポインター)をプロセスに渡すこと、処理済 みのバッファを受け取り状態をマークすること、バッファを待っているプロセ スに利用可能になったバッファを与えること、長時間占有されたバッファがあ ることを検出し警報を発することなど。

プロセスの間のやりとりになるわけですから当然プロセス間通信の機能を使 うことになります。しかしバッファマネージャをプロセスとして実装する必要 があるわけではありません。通信のようなオーバーヘッドの大きな機能を多用 するとシステムとしてのパフォーマンスが低下します。UNIXのシステムの機能 を見てみると次のようなものが使えると考えられます。

        共有メモリー    バッファ本体の他、管理情報の共有のため

        ロック          バッファの排他制御、実行待ちキュー

        セマフォ                ロックに比べ細かい制御が可能

共有メモリーは必須です。ロックかセマフォはいずれかが必要です。プロセス はロックもしくはセマフォの仕組みを使ってバッファが使用可能になったこと を知ることが出来ます。

ロックを使うとNFSの機構を通じてネットワークに分散したプロセス間で制 御が可能になりますが、共有メモリーはノードに閉じているので、データのネッ トワークの間の転送が必要になります。片方のノードの読み出しプロセスと別 のノードの書き込みプロセスが同期して働くことになります。

ロックやセマフォを使って実装した場合よく問題になるのはデッドロックで す。関与するいずれかのプロセスが異常終了した場合などによく発生します。 より安定なシステムを構築するためにはこういったことの発生を検知する仕組 みが必要です。それには監視役のプロセスを走らせて、異常に長い間バッファ をつかんでいるプロセスはないか、本来存在すべきプロセスがちゃんと働いて いるかなど見る必要があります。バッファの数や寸法の設計が妥当かどうかな どシステムパフォーマンスの測定も監視プロセスの重要な役割です。

(演習問題)

 共有メモリーとセマフォを使ってバッファマネージャを設計する。

共有メモリーとセマフォにバッファ管理情報を埋め込み、次のインターフェース

関数を装備する。バッファは固定長で固定数用意する。



        int buf_init( )         システムの初期化

        int buf_get( int mode )

                空か書き込み済みをmodeで識別し、該当するバッファIDを返す。

        int buf_put( int id, int mode )

                バッファを返却する。新しい状態をmodeに設定する。

        char * buf_locate( int id )     バッファIDに対応するメモリーアドレスを返す。

サポートコマンドを用意する}



        buf_init        システムの初期化をする

        buf_stat        バッファシステムの状態表示



next up previous contents
Next: データベースの設計 Up: DAQシステムの設計 Previous: 基本的な構成要素



Kinya Hibino
Sun Jan 14 21:50:32 JST 1996