(toppers-users 3823) R2つの優先度の有効な利用方法は? 1.2 ログタスクの例

高橋和浩@nifty takahashi_kazuhiro @ nifty.com
2012年 1月 23日 (月) 17:20:03 JST


斎藤様
返信ありがとうございます。
> 
> > 1.2.
> >> 私の理解では実行時優先度の目的はあくまでも
> >> 省メモリと排他制御であり,その目的に対しては
> >> 依然として有効な手段だと思っています.
> > だから、その有効な手段が使える一例をあげてみてくださいと言っているのです。
> > 自分では思いつきません。後述の(2.2つの優先度が有効な事例)であげてい
> ますが
> > 結論的には意味のないケースです。
> 
> 排他制御の一例としては,
> ログ出力機能をタスクとして実現する場合を考えていました.
> 複数タスクがログ出力を行い,ログ出力タスクが一定周期で
> それを回収・出力する.
> 
> 優先度が低いとログタスクが始まらなくなる可能性があります.
> 割込みハンドラでもよいですが,同期手段はCPUロックか
> 割込み禁止となります.
> タスクの場合,ディスパッチ禁止で排他制御してもよいです.
> ただし全てのタスクが影響を受けます.
> 
> という時に,実行時優先度を使えば
> ある特定範囲以下の優先度のみにブロック範囲をおさえ込む
> ことが出来ます.
> もちろん単純にライブラリ関数として,タスク実行時に処理してしまう,
> という方法も考えられます(sample1 はこちらですね)ので,
> 絶対に実行時優先度でなければならない話ではないです.
> 

少しはお考えになったことは伺えますが、問題点が1点とさらにこれではやはり効果が
伺えないということを言っておきます。

まず問題点ですが、ログタスクよりも実行時優先度の低いタスクがあるというと、
ログタスクによってその低いタスクに影響のある設計かと思います。
そういう設計が無いわけではありませんが、

確認ですが

ブロックされないタスク 実行時優先度 ログタスクの実行時優先度よりも高い
ブロックされないタスク 起動時優先度 ログタスクをプリエンプトしないといけないので、ログタスクの実行時優先度より高い

ブロックされるタスク  実行時優先度 ログタスクにブロックされるため、ログタスクの実行時優先度以下
            その中でも a)ログタスクの起動時優先度以上の場合と b)それより低い場合。
ブロックされるタスク  起動時優先度 上記 a)の場合にログタスク起動時優先度以上の場合と未満の場合
            上記b)の場合に最下位の優先度

になると思いますが、

a)の場合は、スタック共有になり、ログタスクとブロックされるタスクがプリエンプトされない関係になります。
b)の場合は、ブロックされるタスクが、ログタスクによってプリエンプトされます。

a)の場合は、ブロックされないタスクが動いていればログが収集されません。また、ログが収集している間はブロックされるタスクは
どれだけ動けるかわかりません。 これが使えるのでしょうか?使えないと思います。

b)の場合は、ログ収集に時間がかかれば、ブロックされタスクは動かなくてもかまわないというものになります。
こういうケースはないとはいえません。動かなくともいいタスクというものを使う場合になります。
これが使えるような事例は少なからずあるとは思いますが稀ですね。

つまり、a)は現実にありえない設計なので、b)がかろうじて有りです。ただし、前述したとおり、b)は効果がありません。
スタック共有の場合ではないからです。 それとも ログタスクを2つ用意してそれでスタック共有するというお話でも
無いとは思います。だとしてもログタスクを2つにする意味もありません。

要するに優先度が低くて足りるタスクは複数必要が無いのでやはり、効果がうかがえるケースは無いと思っています。
---
アライブビジョンソフトウエア株式会社
高橋和浩
673-0005兵庫県明石市小久保2-2-7幹線ビル4F
Email:takahashi_kazuhiro @ nifty.com
http://homepage3.nifty.com/ALVS/