【図解】CPUのコアとスレッドとプロセスの違い・関係性、同時マルチスレッディング、コンテキストスイッチについて

CPU コアとは

最近の CPU は、1つの CPU ソケットに複数のコア(実際に処理を行う部品)が付いています。

例えば Intel Xeon E5-2643V4 という CPU ではコア数は 6 です。

CPU コアとは実際に命令を行う部品のことで、SMT 登場前においてはCPUコア数=同時に実行できる命令の数』でした。

実行中のプログラムは『プロセス』と呼ばれ、プロセスは 1 つ以上の『スレッド』を持ちます。このスレッドが CPU コアに命令を与えますので、

CPU コア数 = 同時実行できるスレッド数

でした。

先程の Intel Xeon E5-2643V4 は「コアの数 6」と書いてある下に「スレッド数 12」と書かれています。これは何でしょうか?

プロセスとスレッドの違い

プロセスとは、実行中のプログラムのことです。1 つのプロセスには、1 つのメモリ空間(メモリ領域)が割り当てられます。メモリ空間はプロセスから OS に要求すれば(空きがあれば)増やしてくれます。

スレッドとは、プロセス内で命令を逐次実行する部分であり、CPU コアを利用する単位のことです。前述の通り、SMT(同時マルチスレッディング)登場以前では 1 スレッドに 1 コアが基本でした。

ですが最近の CPU は、SMT (Intel ではハイパースレッディングと呼ぶ)機能を搭載しているモデルが多くなってきており、この機能を使うと、1 つのコアに対して複数のスレッド(多くは 2 つのスレッド)を割り当てることができます。

物理的に 1 つのコアを、OS からは 2 つのコアであるように見せかけることができコアの利用率を上げることができるのです。

なので、2 スレッドの SMT に対応している CPU であれば、「スレッド数」は「コアの数」の倍になります。

ハイパースレッディングやSMTのより詳細の仕組みについては以下を参照下さい。

【図解】ハイパースレッディング(SMT)の仕組み~メリットとデメリット、悪影響や脆弱性などの問題について~
【図解】ハイパースレッディング(SMT)の仕組み~メリットとデメリット、悪影響や脆弱性などの問題について~
CPU コアとスレッドの関係 最近の CPU は、1つの CPU ソケットに複数...

シングルスレッドとマルチスレッド

1 つのプロセスで複数のスレッドを使うかどうかは、アプリケーションの作り方次第です。例えば JavaScriptプロキシソフトの SQUID シングルスレッドなので、JavaScript や SQUID の動作を早めたい!と思って CPU のコアをたくさん搭載しても、意味がありません

一方、マルチスレッドの場合は 1 つのプロセス中に複数の処理を並行して行えるので、パフォーマンスが良い傾向にあります。

なお、プロセス間でメモリ領域を侵食しないかはOSが管理してくれますが、マルチスレッドではプロセスに割り当てられた1つのメモリ領域複数のスレッドが共有するので、マルチスレッドアプリケーションがスレッド間で互いにメモリを侵食しないよう、プログラミングする人で意識する必要があります。

CPU の命令セットアーキテクチャ

現在は x86 系が主流です。

昔は 32 ビット OS があったため、32 ビット OS 用は x86、64ビットOS用は x64 もしくは x86_64 と区別していましたが、現在は 32 ビット OS はほぼなくなりましたので、わざわざ _64 と書かなくても、『x86=64ビットOS用』を指すことが多くなりました。

もう少し言うと、結構前から 32 ビット OS であっても 64 ビット OS であっても x86_64 の CPU を搭載しています。つまりアーキテクチャは分かれていますが、1 つの CPU でこの 2 つのアーキテクチャが使えるのです。

x86 系の実装として、Intel であれば「Intel 64」AMDであれば「AMD 64」という命令セットがあります。

Windows や RedHat Enterprise Linux では現在は x86 系のみをサポートしています。(サーバの OS は 64 bit 版しかないため、x86_64 アーキテクチャのみが使われます)

CPUのメーカ

汎用的なサーバでは CPU メーカは Intel か AMD のどちらかで考えてよいかと思います(異論は認めます)。正直、現場エンジニアとしてはどちらでも良い感はあります。

コンテキストスイッチとは

SMT(同時マルチスレッディング)とマルチタスクの違いを整理しておきます。

SMT は、ある瞬間で並行して実行されている命令数のことを言っており、マルチタスクは短い時間(例えば1秒)で並行して実行されているプログラムの数のことを言っています。

マルチタスクは、実際には人間には分からないほど高速に、実行するプログラムを頻繁に切り替えることで実現しています。

CPU の Context(コンテキスト)というのがプロセスに紐づいており、この Context にそのプロセスで最後に実行した状態が記憶されており、また順番が回ってきたらその Context から情報を引っ張り出し、処理を継続するのです。

この切替のことを『コンテキストスイッチ』と呼びます。コンテキストスイッチはこのプロセスの切り替えだけでなく、ユーザーモード(リング 3)とカーネルモード(リング 0)間の切り替え時にも発生しています。

フォローする