サーバアーキテクチャ

【図解】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)の仕組み ~メリットとデメリット,悪影響や脆弱性などの問題~
CPU コアとスレッドの関係 最近の CPU は、1つの CPU ソケットに複数...

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

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) 間の切り替え時にも発生しています。

コメント

  1. きのこ より:

    わかりやすい記事ありがとうございます!

    『x86 = 64 ビット OS 用』を指すことが多くなりました。
    とありますが、
    「x86 = 32 ビット OS用」
    の誤植だと思います。

  2. nesuke より:

    きのこさん
    コメントありがとうございます。

    ご指摘の件ですが、歴史的には仰る通りなのですが、「x86=32bitも64bitも含む x86アーキテクチャ」を指すことがあり、そのことを言っています。

    いま何か例示できないかな、とサイトを探してみましたが、x86 と x64(x86_64) で区別しているサイトがほとんどですね。。Wikipedia 等では記述がありましたが。。

    「多くなった」というのは言い過ぎかもしれません。修正します。

    ご指摘ありがとうございました。

タイトルとURLをコピーしました