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

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

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

Re[6]: 「threadを使うか、processを使うかこれは問題だ」


(過去ログ 115 を表示中)

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

■67990 / inTopicNo.1)  「threadを使うか、processを使うかこれは問題だ」
  
□投稿者/ ハムレット (1回)-(2013/09/14(Sat) 10:59:57)

分類:[Windows 全般] 


実に悩んでいます。

一つのやや処理内容が複雑で且つ繰り返し実行予定の関数を一つのthreadより起動されるほうがいいか、
それとも一つのプロセスとして起動するほうがいいかは分かりません。
つまり、 threadを使うか、processを使うかの選択基準は分からないのです。

処理対象とするデータがない時に、
processもthreadも中でデータ有効するかどうかのポーリングチェックを行います。
(もっと有効な確認方法があれば、合わせて教えていただきたいです)

ご指導お願いできますか。

環境
Windows7/8, Visual STUDIO 2012


引用返信 編集キー/
■67992 / inTopicNo.2)  Re[1]: 「threadを使うか、processを使うかこれは問題だ」
□投稿者/ しま (26回)-(2013/09/14(Sat) 12:07:06)
No67990 (ハムレット さん) に返信
(1)
> 一つのやや処理内容が複雑で且つ繰り返し実行予定の関数を一つのthreadより起動されるほうがいいか、
> それとも一つのプロセスとして起動するほうがいいかは分かりません。
> つまり、 threadを使うか、processを使うかの選択基準は分からないのです。
>
(2)
> 処理対象とするデータがない時に、
> processもthreadも中でデータ有効するかどうかのポーリングチェックを行います。
> (もっと有効な確認方法があれば、合わせて教えていただきたいです)
>
> ご指導お願いできますか。
>

ご指導する程の者ではありませんが、私の考えを書いてみます。
質問は2つの様ですが2つ目の問い (2) の意味がわからないので初めの問いに答えます。
どちらか迷うのであれば、ややコードが簡単になるのでスレッドを使います。
プロセスを使わないとならない場合はしかたなくプロセスを選ぶでしょうが、
複雑で重い処理はプロセスに分けたところで、そのプロセスでスレッドに任せるでしょうから
結局、スレッドを使うことには変わりないと考えます。
なぜなら、プロセス間通信が必要ですが、重い処理をプロセスが受け持って単一スレッド
で動作するとしたら、どのようにプロセス間通信を実装すればいいのか(開始、中断、停止など
の操作指令を受取って処理するや、処理の経過や結果を返すなど)頭の悪い私には思いつかない
からです。
引用返信 編集キー/
■68005 / inTopicNo.3)  Re[2]: 「threadを使うか、processを使うかこれは問題だ」
□投稿者/ ハムレット (2回)-(2013/09/15(Sun) 09:17:20)
No67992 (しま さん) に返信

しま 様
早速お返答ありがとうございます。

私の説明不足で申しわけありません。
> 処理対象とするデータがない時に、
> processもthreadも中でデータ有効するかどうかのポーリングチェックを行います。
これはprocessの中で、繰り返し絶えずあるメモリの内容を確認するという意味です。

それから、
processとthreadのどっちがパフォーマンスやシステムの安定性に優れるのでしょうか。

また宜しくお願い致します。

引用返信 編集キー/
■68006 / inTopicNo.4)  Re[3]: 「threadを使うか、processを使うかこれは問題だ」
□投稿者/ Azulean (210回)-(2013/09/15(Sun) 09:35:03)
No68005 (ハムレット さん) に返信
>>processもthreadも中でデータ有効するかどうかのポーリングチェックを行います。
> これはprocessの中で、繰り返し絶えずあるメモリの内容を確認するという意味です。

あるメモリというのは誰がどのように確保したメモリでしょうか。
プロセス間では原則的にメモリ空間の内容は共有されません。(いろいろと例外はあります)
また、プロセス間の同期制御はスレッド間の同期制御に比べて難易度が上がる傾向にあります。


> それから、
> processとthreadのどっちがパフォーマンスやシステムの安定性に優れるのでしょうか。

パフォーマンス・安定性だけが評価基準なのでしょうか?
個人的にはプロセス間にしないといけない大きなメリットがなければ、開発難易度を下げる・コストを下げる観点からスレッドの路線を考えた方がよいとは思います。
パフォーマンス・安定性の観点でプロセスを分けることで優位になることは少ないのではないかとも思っています。


実際のところ、前提条件・制約事項・技量などに左右されることですので、あなたに対して正しいコメントをすることは難しいでしょう。
一般論や個人の経験からどちらかがよいという話があったとしても、あなたの取り組む課題には不適切かもしれませんので。

同じ要件を実現するためのプロトタイプを作って、両方を評価してみることも考えてみてください。
引用返信 編集キー/
■68010 / inTopicNo.5)  Re[3]: 「threadを使うか、processを使うかこれは問題だ」
□投稿者/ しま (29回)-(2013/09/15(Sun) 16:26:25)
No68005 (ハムレット さん) に返信
> ■No67992 (しま さん) に返信
>
> 私の説明不足で申しわけありません。
>>処理対象とするデータがない時に、
>>processもthreadも中でデータ有効するかどうかのポーリングチェックを行います。
> これはprocessの中で、繰り返し絶えずあるメモリの内容を確認するという意味です。
私が分からないのはポーリングチェックの意味ではなく
「処理対象のデーターがない」のに「データ有効するかどうかの云々」というところです。
処理対象がなければ、何もできないのだから、何もしないだけでしょう?
処理対象があれば、処理を行うだけですね?

>
> それから、
> processとthreadのどっちがパフォーマンスやシステムの安定性に優れるのでしょうか。

プロセスとスレッドのどちらが安定性や効率(パフォーマンス)が優れているかという問いは
私には余り興味がありません。
それよりもどのように処理を記述するかの方が遥かに安定性や効率やに響いてくると考えます。
引用返信 編集キー/
■68018 / inTopicNo.6)  Re[4]: 「threadを使うか、processを使うかこれは問題だ」
□投稿者/ ハムレット (3回)-(2013/09/16(Mon) 09:05:27)

しま さん Azulean さん 

貴重なご意見ありがとうございます。

-----------------------------

基本はスレッドの路線を取りたいと思いますが、
あえて、両者を比較したいです。
例えば、
1.両方ともアイドル状態(sleep)から起動するにはどっちがより早いでしょうか。
2. それから、処理データがない時、あるデータポートを絶えずチェックするような処理は相当CPU時間を費やすのでしょうか。
  つまり、他の並列処理に相当な影響を与えるのでしょうか。


どうぞ 宜しくお願い致します。

引用返信 編集キー/
■68019 / inTopicNo.7)  Re[5]: 「threadを使うか、processを使うか
□投稿者/ Azulean (212回)-(2013/09/16(Mon) 09:19:51)
2013/09/16(Mon) 09:30:49 編集(投稿者)

No68018 (ハムレット さん) に返信
> 1.両方ともアイドル状態(sleep)から起動するにはどっちがより早いでしょうか。

プロセスが存在しないときからプロセスを起動するということと、スレッドが存在しないときからスレッドを起動することを比較するということでしょうか?
それなら後者の方が速いと思います。前者は必要な DLL を読み込むなど、初期化処理は長いためです。

どちらの場合でも、あらかじめプロセスを立ち上げておく、スレッドを立ち上げておくなどして、トリガがかかるまで寝かせておくことを考えたいです。
そうしておいた上で待機状態から”復帰”という視点で考えると、両者に差はないでしょう。どちらもスレッドをシグナル状態になるか、タイムアウトするかの条件で寝かしつつ、それを繰り返しているケースが多いと予想されるため。


> 2. それから、処理データがない時、あるデータポートを絶えずチェックするような処理は相当CPU時間を費やすのでしょうか。
>   つまり、他の並列処理に相当な影響を与えるのでしょうか。

その「データポートを絶えずチェックするような処理」に依存します。
それが要する CPU コストなどによって決まるので、シリアルポートだとか、ハードディスクだとか、具体的なデバイスでの話でないと答えられないと思います。
(もっとも、私が知らないデバイスであれば、私も答えられませんが…)

ヘビーな I/O 要求の場合、他の処理に影響を与えることもありますが、単にデータがある・ないぐらいではそこまでのことはないとは思います。
前者の場合、OS 全体を含めて動きが遅いということがあり得ますので、プロセスを分ける優位点とは言いがたいです。



結局、プロセスで分けてもプロセスの中のスレッドで処理することになりますので、処理内容や待機のさせ方もプロセスで分けたとしても、スレッドでの考え方と同等です。
メモリ空間などが分かれるので、その分ややこしくなるポイントがある(普通には変数を共有できないので、データ送受信の手間がある)、CPU の優先度の違いがあるといった点はあるとは思います。
引用返信 編集キー/
■68020 / inTopicNo.8)  Re[5]: 「threadを使うか、processを使うかこれは問題だ」
□投稿者/ しま (31回)-(2013/09/16(Mon) 10:04:15)
No68018 (ハムレット さん) に返信
>
> あえて、両者を比較したいです。
> 例えば、
> 1.両方ともアイドル状態(sleep)から起動するにはどっちがより早いでしょうか。

プロセス、スレッドについてどうお考えなのでしょう?
Azulean さんも書かれていますが、新規に作成するという意味ではややプロセスの方が時間がかかります。
ただ、スレッドもかなり時間がかかるのでその差に意味があるかどうかは私には分かりません。
スレッドも、プロセスも作成後は、記憶上にある場合は活動中ならOSが順番に切り替えますので
非活動から活動に変更したとしても、割り当て期間が来るまで待たされます。
ですからプロセスだから、スレッドより確実に時間がかかるということはできないと考えます。

> 2. それから、処理データがない時、あるデータポートを絶えずチェックするような処理は相当CPU時間を費やすのでしょうか。
>   つまり、他の並列処理に相当な影響を与えるのでしょうか。

データーポートが何を指すのか不明ですが、記憶(メモリー)上の特定の領域か、
二つのプロセスかスレッドで共通に読み書きできる何か(記憶領域、ファイルなど)だと仮定します。
プロセスにも、スレッドにもOSは活動期間を割り当てます。普通、処理すべきものがない場合プロセスも
スレッドも活動期間を譲ります(OSに返します)。そうしない場合、他のプロセスなどに影響するといえます。
監視するから他のプロセスなどに影響するかどうかは気にしません(監視することが必要なら監視するしかないからです)。
>
> どうぞ 宜しくお願い致します。

「どうぞ」は日本語の使い方として奇妙に感じるのは私だけ??
*どうぞは何かすすめる場合
*どうかは何かお願いする場合
だと思っていた。
引用返信 編集キー/
■68024 / inTopicNo.9)  Re[6]: 「threadを使うか、processを使うかこれは問題だ」
□投稿者/ ハムレット (4回)-(2013/09/16(Mon) 18:50:16)
良い勉強になりました。

「どうか」と「どうぞ」に関してもこれから注意致します。

合わせてお礼を申し上げます。


解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -