(toppers-users 3802) Re: 2つの優先度の最適な利用方法は?

Naoki Saito nsaito.nmiri @ gmail.com
2012年 1月 21日 (土) 15:51:15 JST


高橋さん

斉藤です.

返信が遅くなりまして申し訳ありません.
一部,意味をよく理解出来なかった箇所があり
その確認をさせていただきながらのお返事となります.

> 実際にSSPの省メモリ(省スタック)でタスク設計を行う場合に
> 従来のITRONの考え方での設計だけでは、不十分で新しい手順が必要になると考えています。

この点については同意します.

> どちらのタスクが実行されるかは、起動時優先度が絶対ではなく、起動の順番と、どこ
> (どのタスク)から起動されるかによって変わると思います。
> つまり、起動されるパターンが一定のタスク群の条件によらない場合、たとえば
> 割り込みハンドラからの起動の場合には、どちらのタスクが優先的に動くか不定
> ではないかと思います。 これが何か誤解があれば指摘いただければ
> 幸いですが、そのとおりなら、これを「美しくない」と思うのは同意できます。

「不定」の意味ですが,タスク起動を同じ順序で要求しても
結果が異なる可能性があるということでしょうか.
もしその可能性があるとした場合の例を一つ挙げていただけると
助かります.

> タスクの優先度の低いものの3つのタスクがあり、これは割り込みハンドラ
> からそれぞれ、フラグとFIFOとタスク起動されるタスクa,タスクb,タスクcがあるとします。

「それぞれ」とありますので,次のように理解しました.
タスクa → フラグ
タスクb → FIFO
タスクc → タスク起動
としますと,タスクaおよびタスクbはどこから起動される
のでしょうか.
割込みハンドラから起動されるという理解で良いでしょうか.

> 実行時優先度は、最低の16とし、起動時優先度はタスクa,b,cそれぞれ、5,6,7 とします。

これは実行時優先度と起動時優先度が逆と言う理解で良いでしょうか.
この例ですと実行時優先度の方が起動時優先度よりも低い優先度
ですので,コンフィギュレーション時にエラーとなります.

> 上位タスクが動いた場合は、過負荷になり、FIFOキューがかなり溜まるようなシステム
> となっていたとします。

FIFO を処理するタスクは,キューにたまっている全てのデータを
一回で処理するような作りになっているという前提で
よいでしょうか.

> こういった場合、これが期待通りに動いてくれないと思います。
> FIFOが溜まりだしたら、タスクa,b,cのうちどれかばかり動く可能性があります。

この例では b ばかりが動くと考えてよいでしょうか?
仰るような状況になりそうだというのは理解出来ました.

> だいたい、過負荷のタスクが複数あることが問題ですが、普通の設計なら
> a,b,c優先度つけて、bやcが走りきらないことをあきらめるという設計になると思います。
> つまり、プリエンプトされる関係にすることになります。
> 最も省メモリにはこのケースは使えないことになります。

仰る方針で設計するとしたら,仰る通りですね.

> それでは、SSPの省スタックにするためには同一実行時優先度が使えるケースとはどんな
> ケースがあるのかということを考えると上記のようにCPUの稼働率が高い場合には
> どれだけ動くか予測が難しく利用できないように思います。
> なので、省メモリとCPUの負荷のバランスがとる必要があると思います。
> リアルタイムシステムにおいて負荷は変動するので、安易に利用すると思わぬ
> 不具合になると思います。

タスクに待ち状態がないという時点で,
1回あたりのタスクの実行時間を意識した作り
が必要になるのはやむを得ないかなと思います.
(ほとんど割込み処理と変わりません)

もしくは,実行時間がかかるものは優先度を低くするか
(本当にそれが出来るのは1つだけになるかと思いますが),
時間制約が厳しい処理は割込み処理としていただくとか
という方法を検討していただくことになるかと思います.

仰るように,メモリと負荷(とか,時間制約とか)のバランスを
取る必要があり,安易な利用は注意が必要というご意見は
ごもっともと思います.

誤解があればご指摘ください.
以上,よろしくお願いします.

2012年1月19日23:16 kazuhiro takahashi <takahashi_kazuhiro @ nifty.com>:
> こんばんは、アライブビジョンソフトウエアの高橋です。
>
> 厳しい回答がされているようなのですが、「美しい」とか「でたらめ」など
> なかなか伝わりにくい表現をされているようですが、自分はこいさんさんの
> ご意見はなんとなくわかる気がします。
>
> 実際にSSPの省メモリ(省スタック)でタスク設計を行う場合に
> 従来のITRONの考え方での設計だけでは、不十分で新しい手順が必要になると考えています。
>
> 考え方が難しいのは、2つのタスクの2種類の優先度が挟まったような状態
> のときですね。 2パターンあり、含まれるケースと互い違いになるケースかと思います。
> 結局、いずれのパターンも両方の実行時優先度は両方の起動時優先度より優先度が高く
> なります。 つまり、お互いにプリエンプトされないものになります。
> どちらのタスクが実行されるかは、起動時優先度が絶対ではなく、起動の順番と、どこ
> (どのタスク)から起動されるかによって変わると思います。
> つまり、起動されるパターンが一定のタスク群の条件によらない場合、たとえば
> 割り込みハンドラからの起動の場合には、どちらのタスクが優先的に動くか不定
> ではないかと思います。 これが何か誤解があれば指摘いただければ
> 幸いですが、そのとおりなら、これを「美しくない」と思うのは同意できます。
>
> ただこういったテレコの優先度の場合は、プリエンプトされない関係にあるので
> スタックサイズをどちらかの最大値にできるので省メモリには有効になり、
> いつどれだけ動くかについては、同一優先度のものと考えたら考えやすいように
> 思いますが、ただこれには落とし穴があると思います。
>
> 例をあげてみます。
>
> タスクの優先度の低いものの3つのタスクがあり、これは割り込みハンドラ
> からそれぞれ、フラグとFIFOとタスク起動されるタスクa,タスクb,タスクcがあるとします。
> タスクa,b,cの実行時優先度を同一にします。同一にする理由は同一スタックを利用するためです。
> だいたい満遍なく実行される取りこぼししてもいい処理を行うタスクとします。
> (同一実行時優先度以外でもスタック同一化は可能ではありますが、とりあえず例はそうします。)
>
> 実行時優先度は、最低の16とし、起動時優先度はタスクa,b,cそれぞれ、5,6,7 とします。
> さらに上位のタスクが4つあるものとします。起動時優先度と実行時優先度が同じでそれぞれ1〜4の優先度
> をもちます。
>
> タスクa,b,cの負荷は、上位タスクがまったく動かなければ問題ないが、
> 上位タスクが動いた場合は、過負荷になり、FIFOキューがかなり溜まるようなシステム
> となっていたとします。
>
> こういった場合、これが期待通りに動いてくれないと思います。
> FIFOが溜まりだしたら、タスクa,b,cのうちどれかばかり動く可能性があります。
> なにかVisualBasicのDoEventsのような協調的マルチタスクまがい
> の動作になるように思います。
>
> だいたい、過負荷のタスクが複数あることが問題ですが、普通の設計なら
> a,b,c優先度つけて、bやcが走りきらないことをあきらめるという設計になると思います。
> つまり、プリエンプトされる関係にすることになります。
> 最も省メモリにはこのケースは使えないことになります。
>
>
> それでは、SSPの省スタックにするためには同一実行時優先度が使えるケースとはどんな
> ケースがあるのかということを考えると上記のようにCPUの稼働率が高い場合には
> どれだけ動くか予測が難しく利用できないように思います。
> なので、省メモリとCPUの負荷のバランスがとる必要があると思います。
> リアルタイムシステムにおいて負荷は変動するので、安易に利用すると思わぬ
> 不具合になると思います。
>
> 思い違いをしていれば、ご指摘いただければ幸いです。