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のより詳細の仕組みについては以下を参照下さい。
シングルスレッドとマルチスレッド
1 つのプロセスで複数のスレッドを使うかどうかは、アプリケーションの作り方次第です。
例えばプロキシソフトの SQUID はシングルスレッドなので、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) 間の切り替え時にも発生しています。
コメント
わかりやすい記事ありがとうございます!
『x86 = 64 ビット OS 用』を指すことが多くなりました。
とありますが、
「x86 = 32 ビット OS用」
の誤植だと思います。
きのこさん
コメントありがとうございます。
ご指摘の件ですが、歴史的には仰る通りなのですが、「x86=32bitも64bitも含む x86アーキテクチャ」を指すことがあり、そのことを言っています。
いま何か例示できないかな、とサイトを探してみましたが、x86 と x64(x86_64) で区別しているサイトがほとんどですね。。Wikipedia 等では記述がありましたが。。
「多くなった」というのは言い過ぎかもしれません。修正します。
ご指摘ありがとうございました。