(toppers-users 3827) Re: 2つの優先度の有効な利用方法は?(長文 改造案)
Miyagawa
miyagawa @ sanritz.co.jp
2012年 1月 23日 (月) 19:16:08 JST
昔を思い出したのでちょっとだけ昔話を書きます。
今やメモリーは数GBという世界に住んでいるので
オブジェクトにたっぷりとメモリーを割り当てて
疎結合なシステム設計をするのが当たり前な状況ですが
30年前は 8bit CPUをアセンブラでプログラムしてました。
その頃はメモリーの制約が大きく、タスクモニターの
課題のひとつがスタック領域でした。
各タスク毎にスタックを割り付ければ、待ちを行う
システムコールは比較的簡単に作れます。しかし、
そうするとタスク数分のスタックが必要となる。
そこで、待ちは必ずスタックがボトムに戻った時しか
出来ないようにすれば、スタックを共有していても
待つ事が出来る。しかし、これをやるのは実際は
面倒です。昔はアセンブラでやっていましたけれどね。
まあ、タスクは待つ事が出来ないとして、一旦走りきって
終了する物とするのが簡単確実な手でした。
ちょっと大きな処理は、再度走り始める時にステータスを
見て今は何をしないといけないかを毎回判定して実行する
様な作りに成ります。
優先度設計は例えば下記のように時間制限で決めます。
優先度 H : 1秒以内に走らなければ成らないタスク
優先度 M : 1分以内に走らなければ成らないタスク
優先度 L : 10分以内に走らなければ成らないタスク
それぞれの優先度のタスクの実行時間の和をH_max,
M_max, L_maxとすると下記の条件が成り立つように
システム設計します。
話を簡単にするため割り込み処理時間は無視します。
H_maxに含まれると考えてください。
H_max < 1秒
H_max*60 + M_max < 1分
(H_max*60 + M_max)*10 < 10分
極々当たり前の話ですね。
ここで、優先度Lのタスクが走りきれないというのは
設計上許さないと言う事に成ります。
例外的にLのタスクが1本だけで、状況に応じて品質を
調整するような作りは有りです。
忙しすぎれば間引いてしまうような事です。
また、1秒のタスクが1秒以内に全目的を完了する必要は無く
完了まで定期的に呼ばれて順次実行する作りも有りです。
時間制限を満たす所で一旦終わるわけです。
昔の記憶だと、優先度の高いのが制御や計測部分、
中くらいがその加工や記録部分、低いのが印刷等の
レポート機能部分と言う様な感じが多かったかな?
例えば3本のレポート印刷するタスクがあれば
そいつらは全部まとめて10分以内に印刷できれば良い
という感じです。
根本的にオーバーロードな設計を禁止すれば
それなりに動きます。
SSPだとHグループ(実行時1、起動時2-4)、Mグループ
(実行時5、起動時6-8)、Lグループ(実行時9、起動時10-16)
見たいな感じかなぁ。
まあ、レベル数は3段階でなくても良いし。
スタックの共有が出来れば各グループの最大値の和程度に
割込み分を加えた値位に抑えられますよね。
タスク毎に持たなくて良いと言うのは大きいですし、
通常は余裕度の部分が優先度グループ分足されて多少楽になる
はずですよね。
昔の作り方からすればSSPもシステム設計しだいで
役に立つのではないかなぁ?
でもまぁ
待ちが出来ないと手続き通りの素直なプログラミングが出来ない
と言うのは間違いないので開発効率は下がりますよね。
------
このメールはsanritz.co.jpから出しますが、実は1/20で
辞めちゃいましたので、アドレス登録しなおします。
今回だけ御免なさい。