(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で
辞めちゃいましたので、アドレス登録しなおします。
今回だけ御免なさい。