smpl は,M. H. MacDougall, "Simulating Computer Systems: Techniques and Tools,"で紹介され,解説されているイベント指向のシミュレーション言語です。 C, Fortran 等の汎用言語のライブラリ・ファンクションとして提供されています。
smpl は以下のより入手できます。
http://www.nic.funet.fi/pub/files/index/Science/simulation/simdigest/tools/smpl.tar.Z
|
1. smpl のシミュレーションモデル
2. 関数リファレンス
*. 参考文献
- 変数の型
- モデルの初期化
- 名前の処理
- イベントのスケジューリング
- schedule() イベントのスケジュール
- cause() イベントの発生
- time() 現在のシミュレーション時刻の取得
- cancel() イベントのキャンセル
- ファシリティの定義,オペレーション,問い合わせ
- デバッグとレポート
- 乱数の発生
用語
エンティティ(実体)
smpl からシステムをみるとファシリティ(設備),トークン,イベントの 3 つのエンティティが存在する.ファシリティ
静的に見たシステムは相互につながり合ったファシリティから成り立っている.ファシリティは,普通コンピュータシステムの CPU や LAN のバスのようにモデル化されるような,システムのある仕事をする資源を表している.また OS におけるソフトウェアのロックのようにハードウェア以外の資源をも表す.ファシリティ間のつながりは直接的には表現されないが,モデルにおいてファシリティ間を移動するトークンの経路によって定められる.smpl のファシリティは一つの待ち行列と n 個のサーバをもつ.ファシリティの定義は facility() を使う.
ファシリティの要求を行う関数には非割り込み型の request() と割り込み型の preempt() がある.またファシリティを開放する関数は release() である.
トークン
トークンはシステムの能動的な実体を表し,システムの動的な振舞はファシリティ間を移動するトークンの動きによってモデル化される.トークンはコンピュータシステムのモデルにおけるタスク,ネットワークモデルにおけるパケット,メモリ・バス・サブシステムにおけるメモリへのアクセスなどを表すことができる.smpl ではトークンは非ゼロのint 型整数で識別される.負の整数を用いても構わないが,トークンの識別子は配列のインデックスや switch 文の引数として用いられることを考慮して正の値とする方が良いだろう.
イベント
エンティティの状態変化を意味する.処理の終了や待ち行列への要求の到着はイベントである.イベントはその番号(int 型整数),発生時刻(real型変数)イベントに関連したトークンにより識別される.イベントのスケジュールは schedule(),発生は cause() によって処理される.プライオリティ(優先度)
ファシリティにおける要求処理の優先度.smpl では優先度は int 型の整数で表される.値が大きい程,優先度が高い.非割り込み型の要求はファシリティの待ち行列にならんだ要求のうち同じ優先度の要求の一番後ろに挿入される.
割り込み
prempt() によりファシリティへの割り込み要求を行うことができる.ファシリティのサーバが全てビジーである時,ファシリティのサーバで処理中のトークンのうちで最も優先度が低いものと,割り込み要求の優先度が比較される.
割り込み要求の優先度の方が高ければ,その要求のトークンはサーバでの処理が開始され,そのサーバで処理されていたトークンは待ち行列に入れられることになる.待ち行列で処理されていたトークンは残りの処理時間が計算されて,待ち行列中の同じ優先度の要求の一番前に挿入される.
割り込み要求の優先度が同じか低い場合,非割り込み型要求と同じように処理される.
ファシリティのサーバのどれかがフリーであれば,要求はフリーのサーバによって処理される.
smpl のエラーメッセージ
- empty element pool
- empty name space
- facility defined after queue/shcedule
- negative event time
- empty event list
- preempted token not in event list
- release of idel/unowned facility
- stream argument error
- uniform argument error: a>b
- random argument error: i>j
- erlang argument error: s>x
- hyperx argument error: s not>x
変数の型
変数の型 real は smpl.h で定義されている.実体は double である.モデルの初期化
void smpl(int m, char *s)
モデルの初期化m: mtr を起動するかどうか [Bool]
s: モデル名 (50 文字以下)シミュレーションの実行のためにシミュレーション・サブシステムを初期化する.シミュレーション時刻と現在の測定時間の始まりは 0 にセットされる.
smpl() が呼ばれるたびに乱数のシードのセット(16種類)が順次切り替わる.
void reset(void)
測定カウンターや累積算値のクリア名前の処理
char *mname(void)
モデル名へのポインタを返すchar *fname(int f)
番号 f のファシリティの名前へのポインタを返すイベントのスケジューリング
void schedule(int ev, real te, int tkn)
イベントのスケジュールev: イベント番号
te: イベント発生時刻
tkn: トークン番号void cause(int *ev, int *tkn)
イベントを返し,シミュレーション時刻を進めるev: 発生したイベントの番号が入る変数へのポインタ
tkn: 発生したイベントのトークン番号が入る変数へのポインタreal time(void)
現在のシミュレーション時刻を返すint cancel(int ev)
スケジュールされているイベントをキャンセルする.ev: イベント番号
戻り値: キャンセルされたイベントのトークン番号ファシリティの定義,オペレーション,問い合わせ
int facility(char *s, int n)
ファシリティの定義s: ファシリティの名前へのポインタ
n: サーバ数
戻り値: 定義されたファシリティの識別子int request(int f, int tkn, int pri)
ファシリティの要求(非割り込み)f: ファシリティ番号
tkn: トークン番号
pri: 優先度 (値が大きい程優先される)
戻り値: 要求が待ち行列に入れられたかどうか [1/0]すなわち,要求が即時処理されたかどうか. 戻り値が 1 の場合要求は待ち行列に入れられる.int preempt(int f, int tkn, int pri)
ファシリティの保有(割り込み)f: ファシリティ番号
tkn: トークン番号
pri: 優先度 (値が大きい程優先される)
戻り値: ファシリティがビジーかどうか [1/0]void release(int f, int tkn)
ファシリティを解放して行列の待ち要求を再開f: ファシリティ番号
tkn: トークン番号release() がサーバを開放する時,待ち行列の先頭のエントリが取り出され,そのエントリのイベントがもともとの要求のトークンとともに現在のシミュレーション時刻で再スケジュールされる.
int status(int f)
ファシリティの現在の状態を返すf: ファシリティ番号
戻り値: ファシリティの状態 [1/0]int inq(int f)
ファシリティの現在の待ち行列長を返すf: ファシリティ番号
戻り値: ファシリティの待ち行列長real U(int f)
ファシリティの利用率を返すf: ファシリティ番号
戻り値: ファシリティの利用率real B(int f)
ファシリティの平均ビジー時間を返すf: ファシリティ番号
戻り値: ファシリティの平均ビジー時間real Lq(int f)
ファシリティの平均待ち行列長を返すf: ファシリティ番号
戻り値: ファシリティの平均待ち行列長デバッグとレポート
void trace(int n)
トレースの開始/終了n: トレース制御スイッチ
0 トレースの終了
1 トレースの開始: 現在の出力装置に連続出力
2 トレースの開始: 標準出力に出力 1 画面毎に停止
3 トレースの開始: 標準出力に出力 メッセージ毎に停止
4 トレース表示の行数の更新・一時停止ユーザのトレースメッセージ表示後に呼ぶ。上記以外の値は無視される。
void pause(void)
実行の一時停止
mtr 使用時のみ有効void error(int n, char *s)
エラー・メッセージを表示/プリントして実行を終了するn: エラー番号
s: エラーメッセージ- エラーの表示形式は以下のとおり
"エラー番号のメッセージ エラーが起きた時刻 s で指定した文字列"- エラー番号で指定するメッセージは以下のとおり0 "Simulation Error at Time "- エラーメッセージは現在の出力デバイスに出力される
1 "Empty Element Pool"
2 "Empty Name Space"
3 "Facility Defined After Queue/Schedule"
4 "Negative Event Time"
5 "Empty Event List"
6 "Preempted Token Not in Event List"
7 "Release of Idle/Unowned Facility"1-7 は smpl システムによって使用される.ユーザは常に n = 0 として利用する.
void report(void)
シミュレーション・レポートの作成- newpage() と endpage() の間で reportf() を実行する
void reportf(void)
ファシリティのレポートの作成以下の情報が出力される
- モデル名
- 現在のシミュレーション時刻
- 測定インターバル長
- ファリシティ名
- 各ファシリティの統計値
- 利用率
全てのサーバの積算ビジー時間 / 測定インターバル長
- ビジー時間はサーバが開放される時に積算される
- サーバ数が複数の場合利用率は 1 を越えることがある.
- 平均ビジー時間
全てのサーバの積算ビジー時間 / サーバ開放回数
- サーバ開放回数 = release() による開放回数 + 割り込みによる開放回数
- 平均待ち行列長
ファシリティの待ち行列の平均トークン数
- サーバでサービス中のトークン数を含まない
- ファシリテイ開放回数
割り込みによるものを含む
- 割り込み回数
preempt() のコール数ではなく,実際の割り込みの回数
- 行列待ち回数
トークンを待ち行列中から取り出した数.
- ファシリティがビジーのために待ち行列に入れられた要求と割り込まれたために待ち行列に入れられた要求とを含んでいる.
int lns(int i)
レポートに空白行を挿入するi: 空白行の行数
戻り値: そのページの残りの行数void endpage(void)
1ページ(スクリーン)進める(一時停止)void newpage(void)
新しいページまたはスクリーンの行数を初期化するFILE *sendto(FILE *dest)
現在の出力デバイスをセットするdest: セットする出力ストリーム
戻り値: セットされた出力ストリーム
real ranf(void)
[0.0, 1.0) の一様分布real uniform(real a, real b)
[a, b] の一様分布int irandom(int i, int n)
[i, n] のランダムな整数real expntl(real x)
平均 x の指数分布real erlang(real x, real s)
平均 x 標準偏差 s のアーラン分布real hyperx(real x, real s)
平均 x 標準偏差 s の 2 ステージ超指数分布real normal(real x, real s)
平均 x 標準偏差 s の正規分布int stream(int n)
乱数シードの選択n: シード番号 (0 =< n =< 15)
戻り値: 設定されたシードの番号有効なシード番号は 1 - 15 である.
n = 0 を設定してもシードセットは変更されない.long seed(long Ik, int n)
乱数シードのセットIk: シード値
n: シード番号
戻り値: 選択したシードの値乱数シード n (1 <= n <= 15) にシード Ik をセットする.
Ik <= 0L の時にはシードはセットされない.
副作用として選択シードセットは n になる.