コンピュータの仕組み

 2進数情報のデジタル表現デジタル回路などについて説明しましたので、これらを使ってコンピュータが如何にして動作するかについて簡単に説明します。


1 コンピュータの基本構造

 コンピュータの主な構成要素はCPU、(メイン)メモリ、ストレージ、I/O(入出力装置)、ALU、レジスタ、プログラムカウンタなどです。

 CPU(Central Processing Unit、中央演算処理装置)はパソコンの中心となり、全体の処理や計算を行うコンピュータの頭脳というべき部分です。プログラムに記述された命令を順番に解釈し、指示された処理を行います。ALU(Arithmetic Logic Unit、算術演算装置)とレジスタ(Register)、プログラムカウンタ(Program Counter)はCPUに内蔵された装置です。

 ALUはCPUに内蔵されていて、算術演算や論理演算を行う装置です。レジスタはCPUに内蔵された記憶装置で、演算結果や実行状態などを保持するために利用されます。メインメモリに比較すると容量は小さいのですが、極めて高速に動作します。CPUはメモリに格納された命令を順番に実行します。CPUはメモリに書かれた命令を実行して、また次の命令を読みだして実行するという動作を繰り返します。従って、どこまで実行したかを覚えておく必要があります。メモリのどのアドレス(番地)まで実行したか、従って次にどのアドレスから実行すべきかを記憶するのが、プログラムカウンタです。CPUが命令を実行する度にプログラムカウンタの値が書き換えられ、次に行うべき命令が格納されたアドレスが指される(ポイントされる)ことになります。

 パソコン用語にはメモリという言葉がいくつかありますが、ここでメモリと言っているのは、いわゆるメインメモリ(main memory、主記憶装置、一次記憶装置)のことです。メモリの中でもっとも代表的なものと言っていいでしょう。ストレージは二次記憶装置などと呼ばれることもあります。ハードディスクやCD(compact disc、コンパクトディスク)などが該当します。二次記憶装置はCPUと比較すると、あまりにも動作が遅すぎますので、CPUと二次記憶装置の間で直接読み書きしようとすると効率的な処理ができません。そこで、CPUと二次記憶装置の間に中間的な速度の記憶装置を挟むことが必要となります。メインメモリは半導体素子を利用して電気的に記録を行うため高速な動作が可能で、CPUから直接読み書きすることができます。メインメモリは動作速度の点ではCPUと二次記憶装置の中間にあたるため、二次記憶装置との間でもデータの読み書きが可能です。

 I/O(Input/Output、入出力)装置はコンピュータと外部の機器を接続する装置です。キーボード(文字入力)、マウス(座標入力)、マイク、各種センサーなどの入力機器、モニタ(画面表示)、プリンタなどの出力機器が接続されます。


2 コンピュータの動き

 この章では、パソコンなどの主要部分であるマイクロコンピュータの例をつかって説明します。説明の分かり易さを重視して、簡略化された例を使っています。実際のパソコンから比べるとだいぶ簡略化していますが、本質的なところは実際のパソコンとあまり変わりません。コンピュータの動きを知るための最初の一歩として理解していただければと思います。

 次に示すのは今回の説明に使用するマイクロコンピュータの図です。


 CPUにはALUとレジスタ1、レジスタ2、レジスタ3が内蔵されています。CPUとメモリ、入出力ユニットはバスで接続されています。バスにはデータバスとアドレスバス、コントロールバスがあります。データバスの信号数が16本あれば、データを16ビット単位で転送できます。この場合に一度に送信できるデータ量は216となります。アドレスバスの信号数が20本あれば指定できるアドレスは20ビットとなります。アドレスを16進数で表示すると、0x00000~0xFFFFFまでのアドレスを表現できます。1つのアドレス毎に8ビットの領域があるとすると、アドレスバスを使って指定できるメモリ領域は220バイト(1,048,576バイト=1Mバイト)となります。入出力ユニットをつないだアドレスバスは下位の16本のみで、216バイトのアドレス領域をアクセスできます。

 入出力ユニットはキーボードと、CRT(Cathode Ray Tube)とつながっています。

 コントロールバスは選択信号とREAD/WRITE信号からなります。コントロールバスを制御することで、メモリとCPUの間のデータのやり取り、入出力ユニットとCPUのデータのやり取りをすることができます。選択信号とREAD/WRITE信号の組み合わせで、CPUとデータのやり取りをするのがメモリなのか、入出力ユニットなのかを決定し、またその方向を決定します(例えば、CPUからメモリの方向なのか、それともメモリからCPUの方向なのか)。また、アドレスバスで、CPUとやり取りするデータの存在する位置(READするデータのある場所)、あるいはデータが移動すべき位置(データをWRITEする位置)を指定します。また、データバスを使えば、CPUとメモリ間、CPUと入出力ユニット間のデータのやり取りを行うことができます。

 コンピュータはメモリにあるデータをCPUに読み込んで処理します。ここでは、次のような命令がメモリに格納されているものとします。

命令番号 命令内容
1 データ1を入出力ユニットよりレジスタ1に入力
2 データ1をレジスタ1からレジスタ2に転送
3 データ2を入出力ユニットよりレジスタ1に入力
4  レジスタ1の内容をレジスタ2の内容を足し算し、結果をレジスタ1に格納
5 レジスタ1の内容を入出力ユニットに出力


 キーボードから入力されたデータはいったん入出力ユニットに読み込まれ、入出力ユニットからCPUに転送されます。キーボードから入出力ユニットへの読み込みはハードウエアで行われ、入出力ユニットからCPUへの転送はソフトウエア(プログラム)によって行われます。

 プログラムからみた場合、入出力ユニットはレジスタを持っています。ここでは、2つの8ビットレジスタを持っているものとします。この2つは、ステータスレジスタとデータレジスタと呼ばれ、入出力番地(入出力ユニットのアドレス)を割り当てられます。このアドレスはハードウエアの設計段階で決定されます。今、ステータスレジスタのアドレスを0x00EC(あるいは16進表示は末尾に"H"を付けて、00ECHと表現できます)とし、データレジスタのアドレスを00EAHとします。入出力ユニットにあるデータ1をレジスタ1(R1)に入力するというのが命令1です。命令はコンピュータ(CPU)に対する命令ですので、当然2進数で表現します。この2進数で書かれた命令をマシン語といいます。しかし、これでは人間には扱いにくいので、人間に分かり易いように簡略化した英単語や、記号の組み合わせに変換します。この人間に分かり易い形に置き換えたものをニーモニック(略記記号、mnemonic)といいます。命令1をニーモニックで表すと、「IN R1, 00EAH」と表現できます。このような命令がアドレス1から順に格納されます。アドレスは1バイトの容量しかありませんので、アドレス1に全部が収まり切りません。そこでこの命令が収まりきるだけの連続したアドレスが使われ、その先頭アドレスを示すことで、命令1を呼び出すことができます。ここでは、先頭アドレスをアドレス1と呼ぶことにします。

※ニーモニックという表記法を使って書いたプログラムを機械語に変換するソフトウエアをアセンブラーといいます。従って、ニーモニックで書かれたコードは、アセンブラーコードと呼ぶこともあります。あるいはアセンブラーという言語の1つ1つの命令をニーモニックあるいはアセンブラーコードというと言ってもいいでしょう。

 それでは、入出力ユニットを介してキーボードからデータを入力し、CPUで足し算を行い、計算結果を表示装置であるCRTに出力する手順について考えてみましょう。データはメモリに保管してある場合もありますが、ここでは簡単のために、データをキーボードから入力する方法について説明します。キーボードから順次[5」と「7」を入力し、計算結果の「12」をCRTに表示するまでの手順です。

 CPUのレジスタ3がプログラムカウンタの役割を果すと考えてください。レジスタ3が次に実行するメモリのアドレスを示しています。今、命令1が格納されているアドレス1を指しているものとします。

 このアドレス1を指定するにはアドレスバスを使います。レジスタ3の指示により、アドレスバスに、アドレス1の情報を流します。しかし、これではアドレス1に書き込みをするのか、読み出すのかが分かりません。これを制御するのがコントロールバスです。コントロールバスの選択信号と、READ/WRITE信号の組み合わせを使って、データの読み出し/書き込みを制御します。選択信号は、CPUとの相手がメモリか、入出力ユニットかの選択です。

 次に選択信号とREAD/WRITE信号の組み合わせで、データの転送をどのように制御するかを示します。

選択信号 READ/WRITE データ転送の方向
0 0 メモリからCPUへ
0 1 CPUからメモリへ
1 0 入出力ユニットからCPUへ
1 1 CPUから入出力ユニットへ


 命令1をCPUの命令レジスタに読み込む場合のコントロールバスの信号の組み合わせは、(選択信号、READ/WRITE信号)=(0、0)となります。

 コントロールバスの信号の組み合わせを、(選択信号=0、READ/WRITE=0)とし、アドレスバスでアドレス1を指定すると、メモリの命令1をCPUに読み込むことができます。データバス経由でCPUに読み込まれた命令1は、命令レジスタに格納されます(図では命令レジスタは省略されています)。


 CPUの命令レジスタに、命令1が格納されましたので、CPUはこの命令を実行します。命令1は「IN R1, 00EAH」(入出力ユニットのデータレジスタの値をCPUのレジスタ1(R1)に読む込むことです。キーボードから、足し算の最初のデータが打ち込まれると、このデータが入出力ユニットのレジスタ00EAHに保存されます。選択信号=1、READ/WRITE信号=0、アドレスバス=00EAHとして、データをCPUに転送し、これをレジスタ1に格納します。


 レジスタ3の指すアドレスはアドレス2になっていますので、(選択信号=0、READ/WRITE信号=0)として、アドレスバスにアドレス2を送信します。命令は、先ほど読み込んだデータをレジスタ2に移動する(コピーする)というものです。この命令はニーモニックを使うと、「MOV 移動先レジスタ、移動元レジスタ」となりますので、「MOV R2、R1」となります。これは、入出力ユニットから読み込まれるのは、常にレジスタ1なので、このレジスタ1のデータをどこかに退避しないと、データが上書きされてしまうという意味です。


 次に、レジスタ3はメモリアドレスの3を指しています。選択信号=0、READ/WRITE信号=0として、アドレスバスからアドレス3を指定して、命令3をCPUに読み出します。命令3は「データ2を入出力ユニットよりレジスタ1に入力」ですので、ニーモニックは、「IN R1, 00EAH」となります。先ほどと同様に、キーボードからデータが入力されると、入出力ユニットの00EAHレジスタに保存されますので、これをCPUに読み込みます。この時、選択信号=1、READ/WRITE信号=0として、アドレスバスには00EAHが指定されます。


 これでCPUのレジスタ1に「7」が、レジスタ2に「5」が保存されています。

 レジスタ3はメモリのアドレス4を指していますので、コントロールバスを、選択信号=0、READ/WRITE信号=0、アドレスバスをアドレス4に指定して、アドレス4から命令4「レジスタ2の内容をレジスタ1の内容に足し算し、結果をレジスタ1に格納」を命令レジスタに保存して、これを実行します。ニーモニックは「ADD R2」(加算はR1のデータと、パラメータとして指定したレジスタのデータを足して、R1に保存します)となります。加算はALUで行い、結果はレジスタ1に保管されます。


 次にレジスタ3はメモリのアドレス5を指しますので、アドレスバスでアドレス5を指定し、選択信号=0、READ/WRITE=0で、アドレス5から命令5をCPUの命令レジスタに読み込みます。命令5は「レジスタ1の内容を入出力ユニットに出力」となっています。ニーモニックは「OUT 00EAH、R1」となります。命令に従って、レジスタ1の内容を入出力ユニットに出力します。選択信号=1、READ/WRITE信号=1、アドレスバスには00EAHを指定します。これで、計算結果が入出力ユニットのデータレジスタ00EAHに書き込まれ、CRTに表示されます。


 今までの説明は分かり易さを重視して、簡略化したモデルで説明しました。実際のパソコンでは、入出力ユニット(I/O)とつながっている装置には、キーボード、ディスプレイ以外にハードディスク(HD)、コンパクトディスク(CD)、プリンターなどがあります。


3 レジスタの種類

 ここまでは分かり易さを重視してメモリやレジスタなどを簡略化して説明してきました。説明が余りにも実際とかけ離れていると勘違いする人もいるかもしれませんので、もう少し実際的な話をしておきます。

 CPUのレジスタの代表的なものとしては、次のようなものがあります。

●プログラムカウンタ(プログラムレジスタ)
 これについては既に説明していますが、このレジスタは次に実行される(フェッチされる)命令が格納されたメモリのアドレスが入っています。

●ベース(基底)レジスタ
 ベースとなる値を保持しているレジスタです。通常はベース値としてプログラムの先頭アドレスを設定しておきます。

●インデックス(指標)レジスタ
 アクセスしたいメモリ番地が、ベース値(ベースレジスタに格納された値)から相対的にどれだけ離れているかを格納します。配列データなどを扱う場合は、現在扱っているデータが先頭アドレス(ベースアドレス)から何番目かを記憶することで、簡単にデータにアクセスすることができます。

●汎用レジスタ
 特定の機能に限定せず、多目的に使用されるレジスタです。アキュムレータとして演算に用いられるだけでなく、インデックスレジスタやベースレジスタとして用いられることもあります。

●命令レジスタ
 メモリからフェッチされた命令を格納します。

●アキュムレータ
 演算結果を一時的に格納するレジスタです。

●フラグレジスタ
 演算結果の値である正、0、負などを格納します。


3.1 x86のレジスタ

 パソコンのCPUに関しては、Intel社の8086系のものと、モトローラ社のMC6800系のものが代表的です。WindowsOSでは主としてIntel社の8086系のCPUが、LinuxなどのUNIX系のOSでは主としてモトローラ社のMC6800系のCPUが使われています。

 Intel社のCPUは8086、80286、80386、80486と進化してきましたので、一般的に「x86系CPU」と呼ばれています。ただし、64ビットCPUはx86-64と呼ばれますので、一般的にx64とも呼ばれます。

 レジスタはCPUが8ビット、16ビット、32ビット、64ビットのいずれかによって、それぞれ異なります。

 例えばx86の汎用レジスタはEAX/AX/AL/AH、ECX/CX/CL/CH、EDX/DX/DL/DH、EBX/BX/BL/BH、ESP/SP、EBP/BP、ESI/SI、EDI/DIの8個です。

 EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDIの「E」はEnhancedの意味で、80386(32ビットアクセス)以降で利用されます。

 EAX/AX/AL/AHはアキュムレータレジスタで、算術演算の結果が格納されます。AXは16ビットアクセス用、AL、AHは8ビットアクセス用で、ALはAXのLSB側の8ビット、AHはAXのMSB側の8ビットを意味しています。

 EAX/AX/AL/AHはアキュムレータレジスタ、ECX/CX/CL/CHはカウントレジスタ、EDX/DX/DL/DHはデータレジスタ、EBX/BX/BL/BHはベースレジスタと呼ばれます。それぞれ呼び名の通りの使われ方をすることが多いのですが、汎用レジスタですので、何に利用しても構いません。

 ESP/SPはスタックポインタです。スタックを格納するアドレスのオフセットを指し示します。

 EBP/BPはベースポインタです。ベースポインタはスタック領域の底を示します。


※スタックとは、コンピュータで用いられる基本的なデータ構造のうちの一つで、データを後入れ先出し(LIFO、Last In First Out;FILO、First In Last Out)の構造で保持するものです。スタックにローカル変数などを積み込むことをpush、スタック領域からLIFOの原則に従って、ローカル変数などを取り出すことをpopといいます。
※スタック領域は、ローカル変数などの一時的な格納場所として使われます。C言語の場合は、関数の集まりで構成されています。最初に呼ばれる関数はmain()です。main()の中でfuncA()という関数が呼ばれ、funcA()の中で、funcB()という関数が呼ばれるとすると、関数main()の中で、関数funcA()が呼ばれたときに、main()で使用しているローカル変数等がスタック領域に退避され、funcA()に制御が移ります。funcA()の中で、funcB()が呼ばれたときには、funcA()のローカル変数などがスタック領域に退避され、制御がfuncB()に制御が移ります。そして、funcB()の仕事が終了したら、スタック領域から、LIFOの原則に従って、funcA()が呼び出され、funcA()の仕事が終わったらmain()がスタック領域から呼び出されます。


 ESI/SIはソースインデックスを表します。EDI/DIはディスティネーションソースインデックスを表します。ESI/SIとEDI/DIはセットで使います。EDIは書き込み先のアドレス、ESIは読み込み元のアドレスです。EDIは連続して移動する書き込みの際の目的アドレスを格納するために使用します。ESIは連続して移動する読み込みの際の目的アドレスとして使用します。

 これらの汎用レジスタ以外にも、セグメントレジスタ、フラグレジスタなどがあります。




4 アドレス指定方式

 アドレス指定方式とは、コンピュータのCPUが命令を実行する際に、対象となるデータのメインメモリ上での位置を指定する方法です。

 CPU命令は、命令部とアドレス部から構成されますが、アドレス部は命令の対象となるデータが存在するメモリの存在場所を示しています。アドレス部のアドレスが直接メモリアドレスを指し示している場合もありますが、CPU内部のレジスタ値と、メインメモリ上のアドレスを関連付けることで、データのアドレスを指定することもあります(アドレス修飾)。この場合、データが存在する実際のメモリアドレスを有効アドレスあるいは実効番地(アドレス)といいます。アドレス指定方式とは、この有効アドレスを指し示す方式のことです。


■直接アドレス指定
 アドレス部に入っている値がそのまま有効アドレスになる方式です。アドレス部のビット数で最大アドレスが決まってしまい、メモリの容量が制限を受けます。例えば、アドレス部のビット数が26ビットの場合64MBまでに限定されます。また、プログラムをメモリに読み込んだ時の先頭番地が変わってしまうと、データの番地も変わってしまうために、現実には使いにくい方式です。



■間接アドレス指定
 命令のアドレス部のデータが指し示すメモリアドレスにはデータではなくて、アドレスが入っていて、そのアドレスが実際のデータの入っているアドレスを指しているという方式です。命令のアドレス部よりも、大きな容量をとれるメインメモリでアドレスを指定できるので、直接アドレス方式に比較して大量のメモリに対応できますが、メモリを2回以上アクセスするために、実行速度が遅くなるという欠点があります。



■修飾アドレス方式
 特定のアドレスの値と組み合わせて有効アドレスを求める方式を「修飾アドレス方式」あるいは「アドレス修飾」といいます。アドレス修飾の方式には、次のような方式があります。

・ベースアドレス方式


 ベースアドレス方式はベースレジスタの値とアドレス部の値を加算したものが有効アドレスを指定するという方式です。メモリ上に読み込まれた(ロードされた)プログラムの先頭アドレスをベースアドレスで設定しておき、アドレス部には相対アドレス(プログラムの先頭のアドレスを0番地としたときの、オフセットアドレス)を入れておきます。命令の実行時にはベースレジスタに格納された値と、命令のアドレス部の値を加えて、それを有効アドレスとして処理を行います。

 この方式を使うと、命令のアドレス部を修正することなしに、プログラムをロードすることができます。これを再配置可能といいます。

・相対アドレス方式


 相対アドレス方式は、ベースアドレス方式と論理的には全く同じですが、ベースレジスタを持たないCPUではベースアドレス方式を採用することができません。そこで、ベースレジスタを持たず、また汎用レジスタもあまり多く持たないコンピュータで再配置可能なプログラムを作成する場合に、相対アドレス方式が利用されます。

・インデックスレジスタ方式


 命令のアドレス部の値と、インデックスレジスタの値を加えて有効アドレスとする方式です。インデックスレジスタとしては一般的に汎用レジスタが利用されます。汎用レジスタは複数あり、それぞれレジスタ番号が付けられています。そのため、命令レジスタは命令部とアドレス部以外にインデックス部からなり、インデックス部で汎用レジスタを指しています。この方式は、配列や構造体(レコード)など、メモリ上で連続しているデータに同一処理を繰り返す場合に利用しやすい方式です。

※構造体はいくつかの異なる型のデータをまとめて一つのデータ型として扱うことができるものです。例えば、学生の成績を扱う構造体では、int(整数)型の学生番号、char型配列の氏名と、double型の点数などをまとめて扱うことができます。これを理解するには、プログラミングの知識が必要ですので、ここではこれ以上の説明は止めておきます。


 アドレスを指定する方式以外には、命令のアドレス部に直接データを入れてしまう即値アドレス方式という方式があります。

■即値アドレス方式
 即値アドレス方式は、アドレス部にアドレスではなく、データの値そのものが入っている方式です。メモリを参照しないために演算は高速に行えますが、大きなサイズのデータを扱えないという問題があります。

※ここまでCPUの動作について簡略的に説明しました。もう少し詳しい説明は、また後で試みたいと思います。


5 プログラムが使う記憶領域

 CPUが利用する記憶領域として、ここまでレジスタ、メインメモリの話をしてきました。実際にはこれ以外にキャッシュメモリや、ハードディスクなどがあります。

 動作速度はレジスタ>メインメモリ>ハードディスクですが、容量は逆で、ハードディスク>メインメモリ>レジスタの順となります。キャッシュメモリについては、後で説明します。

 CPUとメインメモリは速度差があり過ぎて、直接データのやり取りをすると、CPUが待たされる時間が長くなります。いくらCPUを高性能にしたところで、メインメモリの動作が遅いので宝の持ち腐れになってしまいます。そこで、レジスタを利用します。レジスタはCPU内の記憶装置ですので、ALUと同じ速度で動きます。レジスタ内の装置同士は、お互い待たされることなく、直接データのやり取りをすることができます。しかし、レジスタは容量が極めて小さいという欠点があります。そこで、より容量の大きなメインメモリから、CPUが必要とするデータをその都度レジスタに移動し、処理し終わったデータはメインメモリに戻すという操作を繰り返します。

 CPUは、レジスタとメインメモリの間でデータのやり取りをしながら、データの処理を行います。レジスタの容量は、極々小さなものですので、CPUがその時処理するのに必要なものしか、そこに置いておくことはできません。そうでないものは、メインメモリに置いておきます。画像データを扱うプログラムなどでは大きな容量を必要とします。そこで、大きなメインメモリが必要となります。大きな容量のデータを扱うときには、大きな容量のメインメモリが有利です。最近のメインメモリでは10GBなどのものも珍しくはありません。しかし、これほどのメモリでも、必要なデータを全部メインメモリに置いておくわけにはいきません。

※1枚の画像を縦1080、横1920の画素に分割すると、画素が1080×1920=2,073,600となります。1つの画素を赤、緑、青の3原色で表し、1つの色を256段階(28=256)で表すと、1つの画素だけで256×256×256=16,777,216段階の色が必要となります。1段階を表すデータの量は24ビットです。従って、1画面で必要なビット数は、2,073,600×24ですので、49,766,400ビットです。
※レジスタの容量を増やせば、CPUの設計が複雑になり、その分高価になりますので、レジスタの容量はそうたやすくは増やせません。また、メインメモリの容量も大きくなれば、当然高価になります。

 メインメモリの容量を大きくすれば大きくするほど高価になりますので、いくらでもメインメモリを大きくすればいいというわけにもいきません。そこで、メインメモリに入りきらない分はハードディスクに保存するということになります。ハードディスクの容量当たりの価格は、メインメモリに比較するとずっと安くなります。最近では1TB、10TBのハーディスクを備えたパソコンも珍しくなくなっています。

※メインメモリの容量が大きければ、必要なデータをハードディスクから、メインメモリに移動するという処理が少なくなりますので、動作が速くなります。

 プログラムやデータは全部ハードディスクに保存し、必要な部分を必要な時にメインメモリに移動し、更にその一瞬一瞬に必要なデータをCPUのレジスタに移動させるということで処理を行います。

 CPU、メインメモリ、ハードディスクなどのコンピュータの構成要素は年々性能が向上していますが、性能向上のペースはそれぞれの要素ごとに同じではありません。例えば、近年はCPUの速度が急上昇していますが、メインメモリの速度はそれほどでもありません。その結果、CPUがどんどんデータを処理し、新しいデータを要求しているのに、レジスタに必要なデータがないということが起こりえます。これは、必要とするデータをレジスタに供給できないメインメモリの能力に問題があります。

 対処方法としてはCPUの設計を変更して、レジスタをもっと増すということが考えられますが、CPUの設計が複雑になってしまいます。そこで、考えられたのがキャッシュ(cache)という考え方です。キャッシュは「隠し場所」というような意味です。一旦使ったデータは再度使う確率が高いので、別のところに退避します。メインメモリに戻してしまうと、その他のデータと同じ扱いになってしまいますが、再利用の確率が高いのなら別に分けておいた方がいいという考え方です。よく使うデータを退避する場所ですので、メインメモリよりも高速で動作する装置なら、処理全体の速度が向上します。

 よく使うデータはメインメモリではなく、キャッシュにある確率が高いので、CPUは再度データを呼び戻そうとする場合は、とりあえずキャッシュにないか探し、なければメインメモリから探します。

 キャッシュはメインメモリに比較して高価ですので、容量が大きくありません。そこで、キャッシュに退避したデータでも、必要度が低いと判断されればキャッシュから削除され(タイムスタンプを参照して、一番長い期間再呼び出しされていないデータが削除され)、代わりにもっと必要性が高いと判断されたデータがキャッシュに保存されるということになります。





参考文献
80x86 プログラミングの要点  W.B.スルヤント オーム社
プログラミングのきほん     河村進   翔泳社

更新履歴

2016/12/30            作成








































































































































































 ページの先頭