C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: アプリケーションのプライオリティとスレッドのプライオリティ


(過去ログ 101 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■60383 / inTopicNo.1)  アプリケーションのプライオリティとスレッドのプライオリティ
  
□投稿者/ キーサン (1回)-(2011/06/30(Thu) 18:27:55)

分類:[Windows 全般] 

C#2008である制御系アプリを製作しています。リアルタイム性を出したかったので、
Process.PriorityClass プロパティ を使用して、プライオリティをリアルタイムで
動かしています。

そのアプリで、外部I/Oをポーリングで監視するスレッドがありまして、
そのポーリング間隔をなるべく短くしたいと考えました。
外部から処理を開始するトリガをなるべく速く受信したいのです。
しかし、ポーリング間隔を短くすることで、そのアプリ内の処理が遅くなるのは
避けたいと考えています。
ポーリングは、処理の開始の受信と処理結果を返すだけなので、
アプリ内で処理している時は別に止まっていても構いません。

そこで、外部I/Oの監視のスレッドだけプライオリティを下げて、
他の優先度の高い処理をしている時は、外部I/Oの監視用スレッドは
お休みをしていただくようにしようと、スレッドのPriorityプロパティに
Normalを設定してみました。
でも、それが効いているんだか効いていないんだかよくわからない状況です。

アプリのプライオリティを上げておいて、その中の1つのスレッドだけプライオリティを
下げるなんてことはできるのでしょうか。
御存知の方、アドバイスをお願いします。
引用返信 編集キー/
■60384 / inTopicNo.2)  Re[1]: アプリケーションのプライオリティとスレッドのプライオリティ
□投稿者/ オショウ (589回)-(2011/06/30(Thu) 19:26:32)
> アプリのプライオリティを上げておいて、その中の1つのスレッドだけプライオリティを
> 下げるなんてことはできるのでしょうか。
> 御存知の方、アドバイスをお願いします。

  私もFAプログラマーとして20年以上やってきてますが・・・
  この手の場合、環境に依存する部分と、拡張I/Oのボードがどこのメーカーか
  またドライバーの質(性能)が大きく影響します。

  特に最近のCPUの場合は、プライオリティーの変更を行っても性能差が出る程
  変化は無いように思います。

  それよりも同一PC上で重い処理(CPU負荷を食う)をするアプリが動作すれ
  ば、その差も出ることでしょう。

※ ポーリングさせるよりも、割り込み処理できるものをお使いになった方が、イベ
  ントドリブンでCPU負荷も食わず、余計なスレッドを作る必要もないので、そ
  の方が適していると思われますが・・・
  ただ、C++ CLI使って、割り込み処理ルーチン作ることになる可能性が高いので
  敷居は高いでしょう。

以上。参考まで
引用返信 編集キー/
■60394 / inTopicNo.3)  Re[2]: アプリケーションのプライオリティとスレッドのプライオリティ
□投稿者/ キーサン (2回)-(2011/07/01(Fri) 10:24:43)
オショウさんアドバイスありがとうございます。

プライオリティをリアルタイムにした理由については、
BTOで買ってきたパソコンで、常駐ソフトを全く切らないでやっていまして
処理時間のバラツキがすごかったんです。
通常100msec以内で終わるものが、時々結果が返ってくるまで1秒以上かかったり。
そこで、プライオリティをリアルタイムにしたら、そのバラツキが随分抑えられました。
今は常駐ソフトも切って、どれだけバラツキが抑えられるかを試しているところです。
ただし、処理時間に関しては確かにオショウさんが指摘しているように、
リアルタイムにしても短くなった感じはありませんでした。

割込み処理ですか・・・。
本当に敷居が高いですね・・・。
パソコンって難しいですね。

引用返信 編集キー/
■60395 / inTopicNo.4)  Re[3]: アプリケーションのプライオリティとスレッドのプライオリティ
□投稿者/ オショウ (590回)-(2011/07/01(Fri) 12:30:44)
> 本当に敷居が高いですね・・・。
> パソコンって難しいですね。

  どれだけの方法が用意されているか。
  どれだけの手法(技術)を知っているか。
  で、選択肢が増え、対応策も豊富に出てくる。

  なので、FAの場合、サイクリックに一定間隔での動作を
  求められた場合、PC内のタイマー割り込みや、もっと短
  時間の動作を要求された場合は、タイマーボードや、A/D
  D/Aボード、I/Oボードにタイマーが東夷されているものを
  使って割り込みかけて、その中で処理させます。

  Sleep関数でも一番安定してSleepしてくれるのは、100msec
  です。が、確実に100msecで再開してくれるわけではありま
  せん。最低100msec止まってくれる。と言うだけです。

  FA以外でも計測(データロギング)によるフィードバッ
  ク処理で何かを調整するような機能を求められた場合、時
  間が非常に重要な意味を持ちます。
  その場合、割り込み処理で時間間隔を一定にできないと、
  調整(キャリブレーション)ができません。

  まぁ〜Windowsパソコンで行うな!なんていわれますが、
  私はWindowsPCで、延々その手のFA装置制御やってますが
  不具合を出したことはありません。

  要は、確実に行える1個の方法をマスターしておけば、怖
  いものはそうそうにありません。
  頑張って下さい!

以上。

引用返信 編集キー/
■60396 / inTopicNo.5)  Re[3]: アプリケーションのプライオリティとスレッドのプライオリティ
□投稿者/ 甕星 (1回)-(2011/07/01(Fri) 13:28:41)
No60394 (キーサン さん) に返信
> プライオリティをリアルタイムにした理由については、
> BTOで買ってきたパソコンで、常駐ソフトを全く切らないでやっていまして
> 処理時間のバラツキがすごかったんです。

そういう時はGPUのハードウェアアクセラレーションを切ると良いよ。

引用返信 編集キー/
■60404 / inTopicNo.6)  Re[4]: アプリケーションのプライオリティとスレッドのプライオリティ
□投稿者/ なちゃ (494回)-(2011/07/01(Fri) 19:40:42)
アプリの処理スレッドの優先度は何にしてますか?
ポーリングスレッドの優先度を落としたいなら、ポーリング側を下げるか、処理側を上げる必要がありますよ。
Normalだと何も変えないのと同じでは?

プロセスの優先度設定とスレッドの優先度設定は独立して存在してます。
それらの設定の組み合わせで、本当の優先度が決定されます。

ただ、リアルタイム設定のプロセスでポーリングとか、ちょっとゾッとしないです。
まあ今時のマルチコアでは大分状況は違いますが。

引用返信 編集キー/
■60409 / inTopicNo.7)  Re[5]: アプリケーションのプライオリティとスレッドのプライオリティ
□投稿者/ ちゃっぴ (77回)-(2011/07/03(Sun) 11:45:39)
ちゃっぴ さんの Web サイト
最近は multi-core processor が一般的なので、processor affinity mask を使って利用する core を固定させることもできますね。

SetProcessAffinityMask Function
http://msdn.microsoft.com/en-us/library/ms686223(VS.85).aspx

SetThreadAffinityMask Function
http://msdn.microsoft.com/en-us/library/ms686247(VS.85).aspx

上記を使って、監視 thread を特定の core に割り振ってそれ以外の processes, threads を別の core を利用するように固定化してやる。

思いつきだけで検証もしていないため、効果があるかはわかりませんけど。
引用返信 編集キー/
■60444 / inTopicNo.8)  Re[4]: アプリケーションのプライオリティとスレッドのプライオリティ
□投稿者/ キーサン (3回)-(2011/07/04(Mon) 09:28:24)
オショウさん、ありがとうございます。

>   まぁ〜Windowsパソコンで行うな!なんていわれますが、
>   私はWindowsPCで、延々その手のFA装置制御やってますが
>   不具合を出したことはありません。
>
>   要は、確実に行える1個の方法をマスターしておけば、怖
>   いものはそうそうにありません。
>   頑張って下さい!

心強いお言葉ありがとうございます。
一つ一つ勉強して頑張っていきます。
今、FAとは切り離して信頼性確認試験をしているのですが、
モニタの電源をON/OFFすると、ハードディスクがガリガリ動き出して
処理時間がかかることも判明。
モニタの電源が入っているか落ちているかなんて、Windows側で
監視もしていないと思っていたので、びっくりしてしまいました。
今更ながら、Windows7の本を読もうと思って発注した次第です・・・。
がんばります!

引用返信 編集キー/
■60445 / inTopicNo.9)  Re[4]: アプリケーションのプライオリティとスレッドのプライオリティ
□投稿者/ キーサン (4回)-(2011/07/04(Mon) 09:29:55)
甕星さん、アドバイスありがとうございます。

> そういう時はGPUのハードウェアアクセラレーションを切ると良いよ。

なるほどです。
ハードウェアアクセラレーションについて調べてみますね。
皆さん、やっぱりこういうのに経験が御有りなんですね。
ありがとうございます。
引用返信 編集キー/
■60446 / inTopicNo.10)  Re[5]: アプリケーションのプライオリティとスレッドのプライオリティ
□投稿者/ キーサン (5回)-(2011/07/04(Mon) 09:36:37)
なちゃさん、アドバイスありがとうございます。

プロセスのプライオリティをリアルタイムにしています。
ポーリングに関しては、自分も気持ち悪いところが合ってスレッドの
Sleepを10msecにしています。
これなら、処理に問題無いだろうと・・・。
ところが、この10msecを短くできないかなと思ったのです。
せめて、Sleepを1msecぐらいにしたいなと。
それで、ポーリングのスレッドだけプライオリティを下げれないかなって思いました。

> プロセスの優先度設定とスレッドの優先度設定は独立して存在してます。
> それらの設定の組み合わせで、本当の優先度が決定されます。

おお!
そうなんですね!ちょっと安心しました。
きびしそうなところまで実験したくなりました(^^)

> ただ、リアルタイム設定のプロセスでポーリングとか、ちょっとゾッとしないです。
> まあ今時のマルチコアでは大分状況は違いますが。

そうですよね・・・。
一応、今は4コアのCPUを使う事にしています。

またよろしくお願いします。
引用返信 編集キー/
■60447 / inTopicNo.11)  Re[6]: アプリケーションのプライオリティとスレッドのプライオリティ
□投稿者/ キーサン (6回)-(2011/07/04(Mon) 09:39:50)
ちゃっぴさん、アドバイスありがとうございます。

なるほど、そういう方法もあるのですか。
確かに、タスクマネージャーのパフォーマンスタブのCPU使用率のグラフを見ると
8個あるうちの左側ばっかり使われる傾向があるように見えます。
ポーリングだけ右側(?)のコアで使われるようにしたらいいのかも。

ちょっとやってみます。ありがとうございます。
引用返信 編集キー/
■60486 / inTopicNo.12)  Re[5]: アプリケーションのプライオリティとスレッドのプライオリティ
□投稿者/ キーサン (8回)-(2011/07/05(Tue) 15:54:31)
アドバイスをいただきました事を一つ一つやってみました。
もともと作っていたプログラムの、ポーリングのSleep()を10msec待つ設定と、
ポーリングのSleep()を1msecにして、いろいろ設定を変えてみたということを行い、
ポーリングとは違うスレッドで200msecぐらいかかる処理を繰り返し行い、
その処理にかかった時間を記録してみました。
これを3回ずつ計測しました。


まず、単純にポーリングのSleep()を10msecと1msecで比較しました。
処理時間のバラツキはほぼ同一で、Sleep()が1msecのほうが2〜3msec
処理時間がかかった感じでした。


次に、最初の質問でしたプロセスとスレッドのプライオリティを別々に設定したときの
状況は、下記のページで説明されていました。
http://msdn.microsoft.com/en-us/library/ms685100%28v=VS.85%29.aspx
プロセスをリアルタイムにして、スレッドをLowestにしてもNormalのプロセスのHighestよりも
プライオリティは高いんですね。
ということで、プロセスをリアルタイム、ポーリングのスレッドをLowestにしてやってみましたら
平均時間ではSleep()を10msecにした場合よりも1msecにした場合のほうが速い回もありました。
ところが、計測した時間のバラツキが大きくなってしまいました。


それから、ポーリングのコアをあまり使っていないコア(コア7)に固定するのもやってみました。
これも平均時間ではSleep()を10msecにした場合よりも、1msecにした場合のほうが速い回も
ありましたが、スレッドのプライオリティをいじった時と同じでバラツキが大きくなって
しまいました。

結局のところ、バラツキを少なくして安定した処理時間をというと
プロセスのプライオリティをリアルタイムにして、Sleep()を10msecから1msecにするのが
一番いい感じでした。

今回のことで非常に勉強になりました。
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -