CPUとプロセス

Javaの機能の1つであるスレッド機能の説明をする前に、OSにおけるプロセス、スレッドについて理解します。
Javaのスレッドの文法を記述して並列処理を作成することは、難しくありません。
しかしながら、Javaのプログラムやスレッド、取り扱うインスタンスがJVM上実際のCPUやメモリで
どのような動きをするのか基本的な事を理解する必要があります。

javaコマンドから起動されるシングルスレットのプログラムは、ソースが100個あっても、
バグが発生した場合には、IPOモデルに基づき、入力情報、処理、出力情報を実行順にクラスをたどればとても簡単に
バグの対応ができます。

マルチスレッド(複数のスレッドの並列処理)では、互いのスレッドが同じインスタンス、データに干渉する場合があり、 それぞれのスレッドがどのタイミングでインスタンスに対する干渉をするかが掴みにくいため、
OSの基礎知識とJavaのスレッド及びJVMの動き、Javaスレッドプログラムの内容を把握する必要があります。
Java経験5年生でスレッドに対して、適切な操作と説明をできたら立派な方でしょう。

スレッドを意識するプログラムは、Web3階層アーキテクチャによるWebアプリケーションを作るエンジニアです。
例えば、TV通販サイトで爆速で売れる商品が紹介されて、オペレーターが電話で受付処理を行い、
注文処理を行います。これが、1件や2件しか売れない商品ならエンジニアも、安心して監視できます。
実際には、秒速で数百件から数千件のオーダーが発生します。

そのため、プレゼンテーション層、サービス層、データ層において、それぞれスレッドセーフであることが要求されます。

まずは、OSにおけるプロセス、スレッドについて理解していくことから始めましょう。

CPUとコア数

cpu

CPUは、PCにおいて全体の処理や演算処理を行う、まさに「頭脳」に該当します。
CPUは、「コア」という実際の処理を行うCPUの中心機能です。

2006年以前のCPUは、1CPU1コアでした。性能を上げるには周波数をできるだけ上げるようにしていました。
この動作周波数(単位:GHz)を上げる方法は、CPUに熱がこもり高性能な冷却装置も必要としました。
そこで、各CPUメーカーが開発したのがマルチコア(1つのCPUに2又は4のコア数)です。

OSでは、Excel,ブラウザ,エクスプローラなどのアプリケーション1つを、
OSのプログラムの実行単位である「プロセス」を割り当てます。
ブラウザを3つ起動すれば、3つのプロセスがOS上に管理されます。

CPUのコアでは、プロセス内の処理を更に細かくした「スレッド」単位で処理を受け付けます。
そのため、1つのアプリケーション(プロセス)は、最低1つ以上のスレッドを持ちます。
「スレッド」とはコアが処理する一番小さな処理単位と理解しておけば良いでしょう。

cpu

先の図は、1CPU2コア2スレッドのイメージ図です。上記図は、1CPU2コア4スレッドのイメージ図です。

インテル®ハイパースレッディング・テクノロジー

インテル株式会社がYoutubeで公開しているハイパースレッディング・テクノロジーについての説明動画です。
CPU、コア、スレッドの説明がとても分かり易く説明されています。

CPUの確認(WindowsOS)

CPUの確認(WindowsOS)

画面右下[Windowsメニュー]-[システム]クリック
[システム]情報欄の[プロセッサ:]項目で自PCのCPUのメーカと型式が分かります。

上記例では、私の5年前ぐらいに購入したノートPCのCPUです。
Interl®Core™i7-4510の製品情報から、
コアの数が2つ、スレッド数が4つとなっています。
実際には、このようなCPU情報の確認は、PCを購入する前に確認します。

プロセスとスレッドの確認(WindowsOS)

リソースモニター(WindowsOS)

画面右下[Windowsメニュー]-[コントロールパネル]クリック-画面右上[表示方法:小さいアイコン]-[管理ツール]クリック
[管理ツール]-[リソースモニター]クリックでリソースモニターが表示されます。

リソースモニターでは、「状態」に関わらずOSが管理しているプロセスとそのスレッド数とCPUの割り当て、
各コア及びスレッドの状態を画面右グラフで表示します。

Javaのスレッド

本サイトの各種サンプルでは、javacコマンド、jarコマンド、javaコマンドで対象のサンプルを実行してきました。
ディレクトリ操作を実行した際に、
私のIntel®Corei-4510Uでは、OSに対して19回のスレッド(CPUに対する処理要求)を処理していました。

プログラムは順次実行で実行され、1つのスレッドが19回の処理要求は順次に処理されていきます。
プログラムに記載された順番で順次実行されるスレッドをシングルスレッドと呼びます。

対して2つ以上のスレッドが順次ではなくCPUの複数のコアに対してそれぞれのスレッドをコア振り分けて処理要求を実行することを並列処理と呼びます。
並列処理は、マルチスレッドとも呼ばれます。Javaプログラムでは、マルチスレッドプログラムができるAPIを提供しています。
次頁以降にJavaのスレッドの作成方法や実行方法などについて説明していきます。