• ベストアンサー

スレッドの意味

マルチスレッドについて良い資料が見当たらず、教えて下さい。 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