そこのレベルだと, 「プロセスなんてものは存在しない」と思ってもらってかまいません. つまり, システムには複数のスレッドがあり, OS が各スレッドをプロセッサ (コア) に割り当てます.
で, もともとは 1つのプロセッサ (コア) に対して 1つのスレッドを割り当てていたわけですが, 命令実行の都合上これでは「コアがひまになる」ことがあります. 例えば, 現在のプロセッサではメモリへのアクセスに長い時間を必要とします. 従って, メモリアクセス命令を実行すると, 原理的には「メモリアクセスが終了するまで次の命令を実行できない」ということになります.
これは無駄なので, 「このようにひまになったら別のスレッドを実行する」というのは自然な考え方でしょう. つまり「1つのコアに複数のスレッドを割り当て, あるスレッドの実行が中断したときには別のスレッドを実行する」ということを考えます. こうすると「同時に複数のスレッドを実行する」ように見えるので SMT (Simultaneous Multi-Threading) といいます. Intel は Hyperthreading と言ってますが, やってることはこれ.
内部的には, CPU が OS に対し「(実コア数の) 2倍のコアがあるよ~」と申告しています (つまり, 4個のコアを持つプロセッサなら「8個のコアがある」と申告する: 2倍である必要はないのですが, 効率の関係で 2倍というのが普通). 従って OS は各実コアに 2つのスレッドを割り当て, それぞれのコアでは割り当てられた 2つのスレッドを上のように実行します.
もう 1回いうと, このレベルでは「全てがスレッド」と思ってかまいません. 「プロセス」というのは「たまたまある種の情報を共有する (複数の) スレッド」でしかありません.
#2 で言われているのは「パイプライニング (パイプライン処理)」というやつですね. 通常その各工程は「ステージ」というはずです.
お礼
そうですよね。レジスタレベル、1次キャッシュレベルで次の命令をフェッチしておかないと、一々メモリに取りに行くと間に合わない気がします。 私も詳しく無いのですが、コアチップ内のハードウェアレベルでそうした「次の命令を読み込んでおいてくれ」と言う処理と、次の命令を保管するレジスタ的なものがあって、OS側がアセンブラで呼び出すと考えるのが自然かも知れませんね。 度々、分かり易い説明を頂き有難う御座いました。