• 締切済み

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

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

  • Java
  • 回答数9
  • ありがとう数0

みんなの回答

回答No.9

>回答No.7 amanojaku1 例えばオカメの お面を作るのに6サイクルかかるとします。 1つ1つオカメの お面を作ると、いつも6サイクルかかりますが、ベルトコンベアなら最初の1個目は6サイクルかかりますが、2個目からは1サイクルづつでオカメの お面が完成します。 ただし、実際は そう単純ではなく、Stall(ストール:停止状態:実態はベルトコンベア上のオカメの お面の破棄)、Stall(ストール)以外のパイプライン・ハザード(パイプラインの停止状態:ベルトコンベアの停止状態)などがあり、理想どおりにはなりませんが。

  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.8

他の方も答えていらっしゃいますが、 CPUのスレッドとは、Hyper Threadingという名のCPUの論理コアのことを表しています。 Javaのスレッドは、java.lang.Threadクラスを用いて、 OSが管理しているスレッド機構にアクセスすることで、 同一プロセス上のメモリ空間を共有して、 プロセス間通信をせずに情報を伝達する機構です。 OSが管理しているスレッド機構では、 CPUに命令(とデータ)を投げる際、 高速に処理を行うために L1~L3のキャッシュメモリに データが残っているCPUコアに対して 命令を投げるようにします。 そのため、OS上の同一プロセス、同一スレッドの処理が 同一CPUコアで処理されることが多いです。 しかしながら、 どうしても命令を同一CPUコアに割り振ることができない場合に 別なCPUコア(とL1~L3のキャッシュメモリ)に 命令とデータを送る必要があり、 そのことを「コンテキストスイッチ」と呼び、 処理の遅くなる傾向を表す尺度の一つとなっています。

回答No.7

>回答No.6 amanojaku1 ちなみにパイプラインとは、ざっくりと言うとベルトコンベア的な感じです。

回答No.6

>回答No.5 amanojaku1 インテルCPU進化論 パイプラインで見るAtomの利点と限界 http://ascii.jp/elem/000/000/737/737249/ ↑添付画像は上記ページより引用。 添付画像はIntel Atomのパイプラインで、「Execute」が実行ユニットになります。 Intel Atomの実行ユニットは下記のようになってるようです。 ALU(整数演算ユニット)x2 JEU(ジャンプ実行ユニット)x1 Shifter(シフト演算ユニット)x1 FPU(浮動小数点演算ユニット)x2 SIMD(Single Instruction Multiple Data)x2 ※(Intel Atomでは)FPUとSIMDが同じユニットになってるぽいので、(Intel Atomでは)FPUとSIMDは排他利用かもしれません。

回答No.5

>回答No.4 amanojaku1 >例えば論理コア(Hyper-Threading(Hyper-Tasking))は1コアで2Thread(Task)を実行し、使われてない(CPUの)実行ユニットを使って例えば約5%~20%程度の(CPUの)実行ユニットの使用率を向上させます(既に使用中の(CPUの)実行ユニットは使えませんが)。 >例えば約10%前後の回路の増加で、例えば約5%~20%程度の実行ユニットの使用率が向上するなら(コスト的な意味で)メリットが有る訳です。 (CPUの)特定の実行ユニットを2系統・装備し、「自分、他者」のThread(Task)で使用中でも、もう1系統の(CPUの)実行ユニットが使えるようになっている場合もあるようです(その分、回路も増加しコストも増加する)。 Intel Atomは((CPUの)実行ユニットの有効活用と言う側面もあるが)Stall(ストール:停止状態)の解消に論理コア(Hyper-Threading(Hyper-Tasking))を採用しているらしいです。 下記は残念なIntel Atomの解説ですが、CPUの基本の基本としては理解しやすいと思います。 インテルCPU進化論 パイプラインで見るAtomの利点と限界 http://ascii.jp/elem/000/000/737/737249/ http://ascii.jp/elem/000/000/737/737249/index-2.html http://ascii.jp/elem/000/000/737/737249/index-3.html

回答No.4

>cpuのスレッドとjavaのスレッドの関係がいまいち解りません。 まず、Hyper-ThreadingとJavaのThreadは全くの別物です。 Hyper-ThreadingはJavaで言う所のThreadではなく、論理コアです(Hyper-ThreadingはHyper-Taskingとかに読み替えて下さい)。 (Windowsなどでは)物理コアと論理コア(Hyper-Threading)は区別しないようです。 物理コア:2、論理コア(Hyper-Threading):2で(Windowsなどでは)合計4コアと認識されます。 例えば1コアでは約30%程度の(CPUの)実行ユニットしか使用されなかったとします。 例えば論理コア(Hyper-Threading(Hyper-Tasking))は1コアで2Thread(Task)を実行し、使われてない(CPUの)実行ユニットを使って例えば約5%~20%程度の(CPUの)実行ユニットの使用率を向上させます(既に使用中の(CPUの)実行ユニットは使えませんが)。 例えば約10%前後の回路の増加で、例えば約5%~20%程度の実行ユニットの使用率が向上するなら(コスト的な意味で)メリットが有る訳です。 >例えば12個のスレッドを使用したプログラムを実行するとpcが勝手に8700kの12スレッドに割り振って実行してくれるのか、それとも単にcpuの1スレッドでjavaの12スレッドを同時に動かしてるように見せかけるのか、 >回答No.2 amanojaku1 ↑こちらで前述した記事ではJavaのThreadでは「物理コア、論理コア(Hyper-Threading)」を100%使い切ることは出来ないので「マルチコア・プロセッサ環境でその性能を十分に発揮できない」ので「もうこのような実装はやめたほうがよい」と説明している訳です。

回答No.3

>回答No.2 amanojaku1 関係無いですが IntelのSkylake&Kaby Lake世代のCPUにはハイパースレッディング有効でデータ欠損やプログラムエラーにつながる重大なバグがあると判明 https://gigazine.net/news/20170626-intel-skylake-kabylake-bug/ >バグ対象のSkylake・Kaby Lakeには、リリース目前のハイエンド向け新CPU「Core i9」シリーズを含む、Core-Xシリーズが含まれています。 ↑「Skylake、Kaby Lake」だけでないことに注意して下さい。 ハイパースレッディングOFF無効化推奨 エラーでデータ破損の可能性 Skylake/Kabylake http://osusumenewusedpc.seesaa.net/article/451221695.html >4月か5月にはIntelから修正されたマイクロコードが登場していた様子 ↑2017年5月頃までに販売された該当するCPUが搭載されているPCは危険と言うことに。

回答No.2

知らない間に「Thread」は非推奨になっているようです(^_^;マジか?) Java EE 7で並列処理がケタ違いに速くなる! 使いこなしのポイントは?──Java Day Tokyo 2013レポート https://blogs.oracle.com/wlc/java-ee-7-java-day-tokyo-2013 >Java EE 7では、「Concurrency Utilities for Java EE」の導入により、マルチコア・プロセッサの能力を余すことなく引き出し、並列処理を格段に速く行えるようになる。 ↑このJava EE(Enterprise Edition)はサーバー側の開発環境の話です。 >2004年にJava SE 5でConcurrency Utilitiesを導入。 ↑このJava SE(Standard Edition)はクライアント(一般の個人のPC)側の開発環境の話です。 >2011年にリリースされたJava SE 7ではFork/Joinに対応。さらに、2014年にリリース予定のJava SE 8ではラムダ式をサポートし、これまで以上に並列処理が簡単に記述できるようになるという。 >「スレッド処理に関して、いまだにJavaの登場当初からのnew Thread(r).start(); などと書いているプログラムを多く見かけるが、もうこのような実装はやめたほうがよい」とアドバイスした。 >そこで現在、スレッドを直接生成する方法に代わって推奨されているのが、Java SE 5 から導入されたConcurrency Utilitiesである。Concurrency Utilitiesは並列処理の実装を簡素化するために導入されたAPIで、これを利用することによってスレッドのライフサイクル管理が簡単になるほか、スケーラビリティやパフォーマンスが大幅に向上するのだという。 >このデモでは、シングルスレッドやマルチスレッドのプログラムが256個のうち一部のプロセッサしか利用できないのに対して、Concurrency Utilitiesを使った場合は256個のプロセッサの負荷がほぼ同時に限界まで達し、瞬時に処理を終えることが確認できた。 >「Javaはパフォーマンスが悪いという声を聞くことがあるが、それは間違い。パフォーマンスが悪いのは、いまだに古いやり方でプログラムを書いているからにすぎない。Concurrency Utilitiesでマルチコア・プロセッサの能力をフルに使い切れば、Javaは驚異的なパフォーマンスを発揮する」

takahasi5634
質問者

補足

Concurrency Utilitiesですか。知りませんでした。回答ありがとうございました。

  • t_ohta
  • ベストアンサー率38% (5078/13272)
回答No.1

CPUのスレッドもアプリケーションのスレッドも同じ意味です。 > 例えば12個のスレッドを使用したプログラムを実行するとpcが勝手に8700kの12スレッドに割り振って実行してくれるのか、それとも単にcpuの1スレッドでjavaの12スレッドを同時に動かしてるように見せかけるのか CPUの12スレッド全てがアプリケーションに使用される訳ではありませんし、アプリケーションの各スレッドが完全に独立して動ける訳では無いので、完全にばらける訳ではありませんが、同時実行可能な処理であればある程度はばらけて動作します。

takahasi5634
質問者

補足

回答ありがとうございました。

関連するQ&A

  • cpuのコア スレッド

    cpuのコアとスレッドはゲームのフレームレートに影響はでるのですか?例えばintel core i7 3820は3.6ghzで4コア8スレッドでintel core i7 3930kは3.2ghzでコア6スレッド12ですがどちらがゲームするとき快適ですか?

  • 多コア多スレッドのCPUは何が違う?

    Intel Core i5 9600Kを使用した、Windows11 64bit 自作PCを使用中。Intel 第9世代のCore i5は6コア6スレッドです。Intel第12世代のCore i5 12600Kになると、Pコア(パフォーマンスコア)6、Eコア(高効率コア)4、16スレッド、ハイパースレッティング対応です。明らかに同時稼働コア数やスレッド数が多くなっております。ゲーム以外の用途(Office使用時、ブラウザ使用時、アプリケーション使用時、Windows11の起動、その他)の、PC処理速度の向上と複数アプリ使用時の処理速度の向上は体感上分かってしまうぐらいの差なのでしょうか?教えてください。

  • CPUのコア、スレッド

    ノートPCに外部ディスプレイをつけて片方で動画、片方で作業をする場合、PCのCPUは例えばCorei3-4000Mくらいで十分ですか? Core i5-4200Mの方がいいですか? また、それ以下のCPUでも十分?(Celeron、Pentium等) なるべく安いPCがいいんですが、最近価格が上がってます。 あと、2コア4スレッドとかわかりません、教えてください。

  • Javaスレッドの割り込みについて

    Javaのスレッド割り込み制御についてご質問です。 スレッドの割り込みの際に用いるメソッドinterrupt()は、 通常、対象のスレッドがsleep()やwait()状態の最中でアクセス不能な場合に使用しますが、 対象のスレッドが、sleep()やwait()以外の状態で、正常に動作している場合に interrupt()を実行した場合、どのような動きをするのでしょうか? 特に問題などありますでしょうか? お手数ですが、どなたかご教授願います。

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

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

    • ベストアンサー
    • Java
  • i7(4コア8スレッド)とi5(2コア4スレッド)

    今度カスタマイズを買うにあたり、CPUをi5(2コア4スレッド)にしようかi7(4コア8スレッド)にしようか迷っております。 HP dv7-6000 http://h20547.www2.hp.com/is-bin/INTERSHOP.enfinity/WFS/Directplus-Customer-Site/ja_JP/-/JPY/DisplayProductInformationForConsumer-Frame?CatalogCategoryID=KR4Q8gZPxkQAAAEuztcnweGx&ProductID=pP4Q8gZP8KIAAAEuMbUnwW_t 価格差はGPUの変更込みで17000円で安くありません。 考えられる重い作業としては「動画の編集をしながら、別の動画を外付けHDDに移しながら Officeやネットをやる」といったことです。 テレビ機能はないPCなので、「+TV+録画」といった作業はしないと思われます。 ちなみにゲームをやる予定はありません。 今使っているPCのCPUはceleronMで動画編集作業中は、重くてOfficeもネットも立ち上がらない状態でとても不便でした。 私程度のPC使用でi7の選択は必要でしょうか? i5の2コア4スレッドとは2つのCPUで4つの作業まで同時にできるということですよね? (間違っていましたら訂正願います。^^;) さすがにi7の8作業同時というのはあり得ないと思うので、i5でもよいのかなと思うのですが、 如何でしょうか? 5年程度は使いたいと思っておりますので、できれば将来的なことも考えてのアドバイスを頂けるとありがたいです。 よろしくお願い致します。

  • スレッドについて

    JAVAでプログラムを書く上で、Aという処理が終了次第、Bという処理を実行したい場合どうすればいいのでしょうか? ///////////////////////////////////////////////////////////////// 例えば、 ・ファイルにデータを出力する。(例えば、バッチファイルhoge.batとして) その後、すぐに ・そのバッチファイルを実行する命令を書く(Runtime.exec(hoge.bat); ///////////////////////////////////////////////////////////////// このプログラムを実行した場合、スレッドAがファイルにデータを出力し終わる前に勝手にスレッドBが作られ、Runtime.exec(hoge.bat);が実行されてしまいます。正しくスレッドAが終了し終わった後にスレッドBが実行し始めるようにするにはどうすればいいのでしょうか?教えてください。お願いします。

    • ベストアンサー
    • Java
  • 36スレッドって何ていうの?

    ふとCPUを見てみたところ Core i9 7980XEなる物が出ていて 見ると18コア36スレッドとのこと(なんだそりゃー 2 :dual:デュアル 4 :quad:クアッド 8:octa:オクタ は聞いた事はありますが 36スレッドになると何ていうのでしょうか?

  • Javaのマルチスレッド処理(スレッド数の上限)

    Tomcatを使用したWebアプリを作成しているのですがある処理を マルチスレッドで行う予定でいます。 画面でチェックボックスが100個チェックされたら100個スレッドを作成して それぞれのスレッドが通信を行うイメージです。 ここで以下の疑問があります。 1.一度に作成できるスレッドの数はTomcatがインストールされているOSに依存するのでしょうか。 2.もし100個が上限として101個スレッドを作成した場合、どうなるのでしょうか。 3.100個が上限とした場合、この数は一定でしょうか。何か別の全く関係のない重い処理が   実行されていてCPUに負荷がかかっていたりすると上限が10個になるということはあるので   しょうか。 4.一度に作成できるスレッドが100個とした場合、Tomcatが下記4人のリクエストを同時に処理   したらエラーという認識でよいでしょうか。それとも4人それぞれが100個ずつ(計400個)   スレッドを作成できるということでしょうか。   Aさん・・・30個のチェックボックスをONにして実行   Bさん・・・30個のチェックボックスをONにして実行    Cさん・・・30個のチェックボックスをONにして実行   Dさん・・・30個のチェックボックスをONにして実行 5.また、Javaプログラムで現時点で作成可能なスレッド数を取得することは可能でしょうか。

  • Javaの実行エラーが起きます。

    Javaの実行エラーが起きます。 Exception in thread "main" java.lang.UnsatisfiedLinkError: no nativetimer in java.library.pathの解決方法 現在、大学で研究をしており、その関係でネットからひろったJavaのプログラムを動かそうとしているのですが、実行すると上記のようなエラーにより実行できずに困っています。eclipseを使っています。何か解決方法があれば、教えてください。

    • ベストアンサー
    • Java

専門家に質問してみよう