(toppers-users 3908) 実行時優先度の使用例について(スタック使用量削減)

Naoki Saito nsaito.nmiri @ gmail.com
2012年 2月 12日 (日) 22:05:13 JST


みなさま

斉藤です.
こんばんは.

実行時優先度の使用例について,もっと極端に単純な例を挙げてみます.
排他制御ではなく,単純にメモリ使用量を減らしたいという目的で
使用する場合です.
つまらない例かもしれませんが,ご意見頂けたらと思います.

(前提)
・システムで実行するいくつかの処理は,機能的に独立しており,
 それぞれの間で共有するリソースがないようなケース.
 例えば,それぞれの処理はそれぞれの異なるイベント(割込み等)に対応し,
 それぞれ異なる制御対象デバイスのレジスタ操作するだけ.
 というようなケースです.

・処理時間,想定する最小起動間隔,許容される位相誤差,
 処理内容の重要度合い,などなどを勘案し,処理をいくつかの
 カテゴリに分類する.
 そして,それぞれをタスクに対応付け,各タスクに起動時優先度を
 割り当てる(割り当て方は割愛します)
 (これは現行のSSPが1起動優先度1タスクのため,こうしています)

ここでは話を簡単にするため,処理が5つで
それぞれ別々のタスクに関連づけたとします.
そしてそのタスクは A,B,C,D,E という名前の5つがあり,

・起動時優先度は A=1, B=3, C=5, D=7, E=9
・スタック使用量は A=10, B=20, C=30, D=40, E=50
・処理時間は A=5ms, B=10ms, C=50ms, D=100ms, E=500ms
とします.

全てのタスクが,実行時優先度=起動時優先度とすると
想定される最大スタック使用量は A+B+C+D+E=10+20+30+40+50=150
となります.

ここでもし,応答の遅れが多少あっても許されるようなタスクが
存在した場合,(狭義の)スタック共有によりスタック使用量を抑えることが出来
ます.
例えばタスク E の実行時優先度を 7 とした場合,D と E は互いに
プリエンプトされない関係になります.

これによってタスクD の実行開始は最悪の場合,
タスクE の実行1回分だけ余分に遅れる可能性が生じます.
つまり,実行時優先度を使わなければタスクDは最悪 5+10+50=65ms
遅れるところが,A+B+C+E=5+10+50+500=565ms となります.
そのかわり,タスク全体のスタック使用量は
A+B+C+max(D,E)=10+20+30+50=110 と
なり,減少します.

この例ではタスクEより起動優先度の高いタスクDの方が
実行開始の遅れる影響を大きく受けます.
それが許せるかどうか?は検討の余地がありますが...

以上ですが,基本的に以上は妄想の域を出ませんので
現場を良くご存知の方からすると現実にはそんな例は
意味がないよとお叱りを受けるかもしれませんが...
その場合にはあまり価値の無い方法かも知れません.
そうことでしたらご教示いただけるとありがたいと思います.

以上,よろしくお願いします.