• ベストアンサー

スレッドの意味

マルチスレッドについて良い資料が見当たらず、教えて下さい。 OSにおけるマルチスレッドと言うと、同一プロセス内でメモリ空間を 共有して独立に動く一連の手続き、と捉えています。(シングルCPU シングルコアだとOSで時分割によって作られた仮想的な並列計算) Javaのようなマルチスレッドのプログラミング言語では「一つの プログラムから作られた二つの一連の手続き」と言うイメージが あります。※裏側の動作ではOSに依頼してJavaのプロセス内で OSのスレッドを生成して処理を渡しているだけ?と思っています。 CPUコアの内部で説明される「マルチスレッド」と言うのは、 どのようなレベルのスレッド(何が並列処理?何処まで並列?) なのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

コア数の虚偽申告については, 今だと Core i7 がわかりやすいでしょうか. こいつは 4個のコアを持っているのですが, (例えば) Windows のタスクマネージャーからパフォーマンスを見ると「CPU 使用率」には 8個のグラフが現れます. これは, とりもなおさず「本当は 4個のコアを持っているが Windows にはあたかも 8個持っているかのように見せかけている」ことを意味します. で, メモリアクセスの話なんですが.... すみません, そこまで詳しくないです. ただ, 現実のプロセッサでは #3 に書いたような単純な話にはなっていません. なにせキャッシュを持ってますから, メインメモリのような遠くに行かなくてもいいことも多いです. まあ, 「もう 1つのスレッド」のために命令キャッシュに入れておいてもいいようか気はしますが.

tondemosan
質問者

お礼

そうですよね。レジスタレベル、1次キャッシュレベルで次の命令をフェッチしておかないと、一々メモリに取りに行くと間に合わない気がします。 私も詳しく無いのですが、コアチップ内のハードウェアレベルでそうした「次の命令を読み込んでおいてくれ」と言う処理と、次の命令を保管するレジスタ的なものがあって、OS側がアセンブラで呼び出すと考えるのが自然かも知れませんね。 度々、分かり易い説明を頂き有難う御座いました。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

そこのレベルだと, 「プロセスなんてものは存在しない」と思ってもらってかまいません. つまり, システムには複数のスレッドがあり, OS が各スレッドをプロセッサ (コア) に割り当てます. で, もともとは 1つのプロセッサ (コア) に対して 1つのスレッドを割り当てていたわけですが, 命令実行の都合上これでは「コアがひまになる」ことがあります. 例えば, 現在のプロセッサではメモリへのアクセスに長い時間を必要とします. 従って, メモリアクセス命令を実行すると, 原理的には「メモリアクセスが終了するまで次の命令を実行できない」ということになります. これは無駄なので, 「このようにひまになったら別のスレッドを実行する」というのは自然な考え方でしょう. つまり「1つのコアに複数のスレッドを割り当て, あるスレッドの実行が中断したときには別のスレッドを実行する」ということを考えます. こうすると「同時に複数のスレッドを実行する」ように見えるので SMT (Simultaneous Multi-Threading) といいます. Intel は Hyperthreading と言ってますが, やってることはこれ. 内部的には, CPU が OS に対し「(実コア数の) 2倍のコアがあるよ~」と申告しています (つまり, 4個のコアを持つプロセッサなら「8個のコアがある」と申告する: 2倍である必要はないのですが, 効率の関係で 2倍というのが普通). 従って OS は各実コアに 2つのスレッドを割り当て, それぞれのコアでは割り当てられた 2つのスレッドを上のように実行します. もう 1回いうと, このレベルでは「全てがスレッド」と思ってかまいません. 「プロセス」というのは「たまたまある種の情報を共有する (複数の) スレッド」でしかありません. #2 で言われているのは「パイプライニング (パイプライン処理)」というやつですね. 通常その各工程は「ステージ」というはずです.

tondemosan
質問者

お礼

CPU側から自分のコア数を虚偽申告するんですね(笑)わかりやすい説明ありがとうございます。CPUの遊び時間を減らすために外部アクセスの際に命令を切り替えると言う事ですね。 その際に気になることですが、通常のプログラムはメモリに命令が蓄えられている訳ですから、メモリアクセスを検知して他の命令処理を続ける場合結局再度メモリにアクセスしてキャッシュに読み込み必要があり、時間がかかるように思えます。 切り替えの際の「メモリへのアクセスが起こったらスレッドを切り替える」 と言う処理は何処に書かれているのでしょうか。直接的にレジスタレベルで幾つかの命令をストアする領域があるのでしょうか?

  • jeee
  • ベストアンサー率52% (119/227)
回答No.2

CPUのマルチスレッドとは、次のように考えています。 プログラムにおける命令を実行する際に、CPU内では複数の工程で処理されます。 この工程を、工程1、工程2、工程3の順で処理するとした場合、 ある命令を工程2の処理しているときは、工程1が空いているので次の命令の処理をすることができます。 また、ある命令を工程3の処理に移った場合には、工程2では次の命令の処理を、工程1では次の次の命令を処理することができます。 この場合、CPUでは同時に複数の命令を実行してるように見え、それぞれの工程をスレッドと呼んでいるものと思います。 参考のされたURLでは、コア内に命令制御装置と演算装置がありますが、命令が命令制御装置、演算装置と順に処理されるとすると、 ある命令が演算装置で処理しているときに、 命令制御装置では次の命令の処理をしていることだと思いますが。

tondemosan
質問者

お礼

ありがとうございます。 CPUの空き時間の使い方については幾つか知っているのですが、 (基本情報技術者試験でも学びますがパイプライン処理もそうですね) これらはCPUのマルチスレッドと呼ばれるのでしょうか?少しイメージが 合わないのですが・・・。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

使われている場面が分からないのですが, CPU コアの話であれば「スレッド」は「処理の流れ」という意味しかない, つまり「複数のスレッドがあっても, それらには何も関係がない」ことが普通だと思います.

tondemosan
質問者

補足

ご回答有難う御座います。 http://primeserver.fujitsu.com/sparcenterprise/technology/performance/processor/ 上記の記述に見られる CPUコア内部でのスレッド処理の話です。 この辺の話は一般的にOSレベルでやる物かと思っていたのですが、 CPUをハードウェアレベルで自動制御する等、通常のOSによる マルチスレッド(単にプロセス内で処理の流れが二つ以上ある)と 異なる意味合いでの表記なのか?と思いまして。

関連するQ&A

  • 最近のcpuのコア数、スレッド数について

    osは時分割でcpuを割り当てることでマルチプロセスを 実現しているんだと思います。windowsではマルチプロ セスではなくマルチスレッド?どちらもできる?よく わからないですが、そこでいうスレッドと、最近のcpu の○コア○スレッドという際のスレッドは全然別の話です よね?アプリのスレッドがたった数個しか実行できない なんてあり得ないですし。

  • プロセスとスレッドの違いについて(Cプログラミングの観点から)

    プロセスとスレッドの違いがしっくりきません。 <プロセス> (1)プログラムの実行単位。Windows や Linux などの汎用 OS 上のアプリケーションは一般にプロセスとして動作している。プロセスは1つ以上のスレッドと、ファイル、ヒープメモリなどのリソースで構成される (2)起動や切り替えのオーバーヘッドが大きい <スレッド> (1)同一プロセス内の複数スレッドを同一メモリ空間上で実行でき、メモリ消費量などが軽減できる。 (2)マルチスレッド処理のプログラミングにおいては、同じデータを複数のスレッドが同時に書き換えることによる不整合に注意し、排他制御を行う必要がある。 等はwiki等調べて理解しています。 何が疑問なのかと申し上げますと、具体的にプログラミングする際に (1)マルチプロセスとマルチスレッド方式では、ソースにどのような違いが出てくるか (2)マルチプロセスとマルチスレッド方式では実行時間がどれだけ変化するか がわからないのです。お仕事で並列処理等について担当されている方などおられましたら、お手数ですがご教授ください。 なお、わかりやすい書籍、webサイト等ありましたらそれも併せて教えていただけると助かります。よろしくお願いします。ちなみに、環境はWindowsXP,VisualC++ExpressEdition2005を使っていますので、UNIXよりはWindowsかつCで動くプログラム例で教えていただけると大変助かります。しかし、当方Javaも多少であれば組めますのでJavaでも構いません。 何卒、よろしくお願い致します。

  • スレッドとは?

    CPU、デュアルコアなどで 話の出る「スレッド」とはどういった意味なのでしょうか?。 Javaなどプログラミングでも「マルチスレッド」という用語がありますが これとはまた意味が違うのか気になっています。

  • Javaのスレッドとcpuのスレッド

    javaのスレッドは各スレッドを少しずつ実行してあたかも同時に実行しているように見せかけているだけだと本で読んだことがあります。現在のcpuはi7 8700kだと6コア12スレッドになりますが、この場合どのような動きになるのでしょうか。 例えば12個のスレッドを使用したプログラムを実行するとpcが勝手に8700kの12スレッドに割り振って実行してくれるのか、それとも単にcpuの1スレッドでjavaの12スレッドを同時に動かしてるように見せかけるのか、cpuのスレッドとjavaのスレッドの関係がいまいち解りません。

  • 「UIスレッド」「マルチスレッド」の違い

    Androidで、「UIスレッド」「マルチスレッド」の違い、を教えてください。 ■下記理解で合ってるでしょうか? Androidは、「シングルスレッド」の「UIスレッド」モデルなので、それを「マルチスレッド」で動かそうとすると、「ワーカースレッド」で処理する必要がある ・「マルチスレッド」=「マルチタスク」? ・「UIスレッド」とは、メインスレッドが「GUI (グラフィカルユーザーインターフェイス) 処理」を行うものを指す? ・つまり、「Android」=「UIスレッド」? ・「UIスレッド」って何の用語? Androidに特化した用語? それともJAVAの用語? あるいはそれ以外?

    • ベストアンサー
    • Java
  • 「スレッド」の概念について質問

    スレッドとは、「1つのプログラムにおいての1つの処理(メソッド)」のことで、これはシングルスレッドともよぶ。 マルチスレッドは、複数の処理を「同時に実行する」こと。但し、実際にはcpuは1つなので、擬似的に複数処理をしているようにみせかけている。 例えば、マルチスレッドは、ブラウザに例えれば、画像をダウンロードしながら、画面をスクロールしたりというように、複数の処理を同時に実行している。そして、この処理の1つ1つがスレッド。 こういうことでしょうか?

    • ベストアンサー
    • Java
  • マルチスレッドとマルチプロセスの違い

    マルチスレッドとマルチプロセスの違い は例えて言うなら1つのプロセスをデュアルコアで処理するのがマルチスレッドで 2つのプロセスをシングルコアで処理するのがマルチプロセスってことでいいですか?

  • スレッドの必要性、OSとの関係について教えて下さ

     javaの初心者です、スレッドについて質問致します、宜しくお願いします。  スレッドは、ある物体が動くようなプログラムを作った場合に、CPUを独占しないように Sleepを設定しCPUを解放、他の動作に振り向けるとか、また、ある説明では、貯金の出 し入れを順序よく計算させるために必要と書かれていました。  しかし、CPUを独占させないというのは、JAVAプログラム側でわざわざコントロールしてや る必要があるのでしょうか。というかそのような基本システムでJAVAというプログラムが最初 から作られているということでしょうか。  もともとJAVAで作成したプログラムが動作していなくても、OS側で常時動作している他の複 数のプログラムをマルチスレッドとか、割込み対応でコントロールしているのではないのでしょ うか。  それとも、JAVA(とか他のCとか)で作成したプログラムが動作した場合には、この考えは 適用されないということでしょうか。  OSとの関係(役割分担?)みたいなものがよく理解出来ません。  常時CPUを独占しない一時的に計算をするとか、イメージを表示する静的プログラム(?) でも、スレッドは走っていると思うのですが、ある物体が動くようなプログラムの場合には、プ ログラム自体を走らせるスレッドと、ある物体を常時動かすスレッドと2本走っているというこ とでしょうか。  また、javaの場合には、このようなプログラムを組んだ場合には、必ずスレッドを組み込ん でやる必要があるとか、エラーとか、例外が発生するということはあるのでしょうか。

    • ベストアンサー
    • Java
  • tomcat psコマンドでスレッドのプロセスが見れません。。

    はじめまして。 JDK1.4.2-13 + tomcat5.0.28 + RHEL3でWEBアプリ環境を 構築しています。 Linux上ではJavaの1スレッドが1プロセスとして 実行されていると思いますが、この1スレッドをpsコマンドが 見た時になぜか表示されません。tomcat本体のjavaプロセスは 確認できるのですがスレッドに当たるプロセスが見えません。 topコマンドでは処理させた時にjavaというプロセスが 処理に応じて上位に表示されるのですが、この時に、 ps -ef | grep java でJavaプロセスを確認しようとしてもどうしても 見ることができません。。 linux上でtopコマンドとpsコマンドでは表示されるプロセス に違いがあるのでしょうか? WEBで調べてみてもみなさんpsコマンドでtomcatのJavaスレッド プロセスが確認できているようなので質問させて頂きました。 宜しくお願いします。

    • ベストアンサー
    • Java
  • ベンチマークスコアが同じなら体感速度も同じですか

    2008年代の2コア2スレッドCPUと、2014年代の2コア2スレッドCPUでシングルスレッドとマルチスレッド両方のベンチマーク数値がほぼ同じである時、体感速度も同じですか。 M/Bはもちろん別、メモリーはDDR2とDDR3で同一にできません。が、GPUやHDDは同じでOSも同じとき、CPUの速度に依存する処理を行うとき体感速度はどうなるのでしょうか。