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

Naoki Saito nsaito.nmiri @ gmail.com
2012年 2月 12日 (日) 10:44:46 JST


高橋様

おはようございます.
斉藤です.

既に賞味期限切れのスレッドかもしれませんが,
せっかくご回答頂いておりましたのにお返事もできず大変失礼致しました.
考えがうまくまとまらなかったためどうお答えすればよいのか
良くわからなったためです.
これに懲りず,もう少しだけおつきあいください.

以下,回答させていただきます.

例としては排他制御の例であれば何でも良かったのですが,
ログ機能の例はあまりうまい例ではなかったかもしれません.
(toppers-users 3888) で内山様よりご呈示頂いた例の方が
より現実的かもしれません.(内山様,ありがとうございます)

> ブロックされないタスク 実行時優先度 ログタスクの実行時優先度よりも高い
> ブロックされないタスク 起動時優先度 ログタスクをプリエンプトしないと
いけないので、ログタスクの実行時優先度より高い
>
> ブロックされるタスク  実行時優先度 ログタスクにブロックされるため、
ログタスクの実行時優先度以下
>             その中でも a)ログタスクの起動時優先度以上の場
合と b)それより低い場合。
> ブロックされるタスク  起動時優先度 上記 a)の場合にログタスク起動時
優先度以上の場合と未満の場合
>             上記b)の場合に最下位の優先度
>
> になると思いますが、

はい.

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

はい.

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

最初の文については仰る通りです.
ブロックされないタスクがどの程度動くかを明確にしていませんが,
ブロックされないタスクが動いている間はログ収集出来ません.
もしログ収集中にブロックされないようにすることを考えるのであれば
私ならディスパッチ禁止とかCPUロックとかを使っていたと思います.

2番目の文(「また、...」)は,
起動時優先度がログタスクの起動時優先度より高いか低いかによりますね.

低い場合は仰る通りと思います.

高い場合は,高々ログタスクが1回実行する時間だけです.
前提とするキューイングの実装方法を明記していませんけど
カーネルにキューイング機能を実装すればそうなると思います.

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

はい.(b) は動かなくても構わないタスクということですね.

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

はい.(b) のケースはスタック共有ではありません.
(a) のケースのうち,起動時優先度がログタスクより低いケースのタスクは
動かなくともいいタスクとして扱う,という考え方もありそうですが
それはいかがでしょうか.

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

(12/01/23 17:20), 高橋和浩@nifty wrote:
> 斎藤様
> 返信ありがとうございます。
>>
>>> 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/