山内の授業のページ/資料編/システムソフトウェア?

ハードとソフトの境界 〜 メモリ

CPUから見た(物理)メモリの構造

ハードウェア的(電気的)に見たメモリは、1バイトごとにアドレス(番地)の付いたメモリ(要するに1バイトが格納できる箱)が並んでいる(1次元の配列をイメージしてもらえばよい)ものである。メモリに対して、CPUから、アドレスを指定する線(アドレスのビット数だけ線が必要)と、データを送受する線(1バイト=8ビット=8本、同じ線を、読出しの時はメモリからCPUへ、書込みの時はCPUからメモリへ、データを送る。本数は物理的にはもう少したくさん(たとえば32ビットとか64ビットとか128ビットとか)同時に転送できるようにしてあるものが普通。)、その他に制御信号として、読みか書きかの区別をする線(1ビット分=1本)がある。 実用されているメモリはもう少し複雑なことがしてあるので、線の本数も多い。

アドレス線の本数は、同じPCでメモリの量を増やしたり減らしたりすることがあるので、たとえば256メガバイトだからといって256メガバイト分(=2の28乗バイト)つまり28本ちょうどでよいわけではない。ユーザがお金を出して1ギガバイト(=2の30乗バイト)に増設したいといった時に、マザーボード(PCの配線基盤)を取り替えることなく対応するためには、30本アドレス線を引けなければならない。最大のバイト数はCPUチップ等で(ピンの本数として)決まっていて、たとえば64ギガバイト(=2の36乗バイト)だったりする。これ以上はいくらお金を出してもメモリを増やすことは出来ない。

同時に、CPUの内部論理もメモリアドレスのビット幅を制限している。OSの授業で習う仮想記憶の仕組では、アドレスをチップ内で変換するので、その変換表のビット幅は、上記のピンで決まるビット幅と同じにしてあるのが普通である。

CPUの命令から見たメモリ構造と物理的なメモリ構造の違い

細かい話になるので、興味のない人はコンピュータアーキテクチャの講義に譲る。ここで理解しておきたいのは、CPUの命令(セット)から見たメモリ構造は、上記のような「アドレスの付いたバイト列」、で(仮想記憶の話は別にして)終りである。。それ以上のものではない。

よくメモリで話題になる、キャッシュの話(高速メモリをアクセス経路の途中において、そこに「よく使う」データを記憶しておいて、次にもう一度アクセスする時には、従来のメモリに読みに行くのではなく、途中に書いてある高速メモリから読み出す)は、命令から見たメモリのモデルには一切影響ない。正確に言えば見かけ上の平均アクセス時間が短縮されるのだが、論理的には(つまり読書きされるデータそのものは)変わらない。なお、キャッシュメモリは転送の高速化のためCPUチップ内に置かれている。

JAVA仮想マシンのなどで使われるスタックメモリモデル

スタックメモリモデルは、上記のように、バイドアドレスの付いたメモリが、1次元配列のように並んでいるモデルとはまったく異なる。メモリの読書きは、現在のスタックポインタの指す位置への読書きであり、かつ、読み出せ(ポップすれ)ばスタックは1つ減らされ、書き込め(プッシュすれ)ばスタックは1つ増やされる。このスタックモデルを使っても、バイトアドレスの付いた配列のようなメモリモデルと同じことが出来るが、見掛けはかなり異なる。ハードウェアとしては、スタックモデルをそのままハードウェアとして実現したメモリは(現在は)売られていない。ソフトウェアでエミュレート(模擬)する仮想機械(バーチャルマシン)として実現される。

ハードウェアのメモリは一次元アドレス

メモリのアドレス付けは、上にも触れたようにアドレスの付いたバイトの列(1次元配列)のように見える。ここで大事なのは、一次元の配列であることである。OSの授業で習うように、複数のプロセス(擬似的に同時並行に複数のプログラムを実行させる、そのプログラムのこと)を実行させるために、メモリ上に複数のプロセスのプログラム(命令列)を置きたくなるが、複数のプログラムを置くような二次元、つまりxの方向には命令順のアドレスを、yの方向にはプログラムを区別する番号(1番のプロセス・2番のプロセスなど)を取るような二次元配列の構造にはなっていない。

なっていない理由はさまざま考えられるが、歴史的な理由が一番強いだろうと思う。二次元だと管理が面倒という理由もあるが、それは克服して出来ないことではあるまい。要するに「昔から一次元だった」のである。OSを作った人たちは、仕方が無いので、その一次元のアドレス構造を持つメモリの上で、必要ならば複数プロセスを置くような二次元の使い方を工夫した。その結果、「再配置問題」が出てきたし、結局「仮想記憶」の技術によりアドレス変換をすることにより非常に大きいアドレス空間の提供し、アドレスのいくつかの上位ビットをプロセスの区別のために使うことにして、実質的に二次元のアドレス構造を持つメモリを実現している。しつこいようだが、この努力の道筋は、現在の状況から考えて、正しいかどうかは分からない。ハードウェア的に二次元アドレス構造を持つメモリを作ることは、おそらく現在で考えれば、難しいことではないだろうから、こちらの選択肢も現在なら(あくまで現在設計するならという前提で)妥当性があるかもしれない。技術とはそういうものである。

メモリの歴史 〜 雑学に興味のある人へ

初期のメモリの実現技術は、苦闘の歴史であったと言えるだろう。現在だって、少しでも高速で大きいメモリを安価に実現するために、技術者は毎日苦心している。

そもそも、次のようなことが言える。現在のコンピュータを単なる計算装置(電卓)と区別しているものは、蓄積プログラム方式(ストアドプログラム方式、プログラム=計算手順をメモリ中に保持し、違う計算をするためにはそのプログラムを入替える)である。電卓では計算手順は人間がどのキーを押すかで制御している。だから、そのプログラムをメモリに保持するためには、データを入れるだけではなくプログラムを入れるためのメモリが必要になる。(ここでは同じメモリ内にデータとプログラムを入れるか、別のメモリを用意するか、それは議論しない。歴史的には両方の方式が考えられたが、結局同じメモリを使う方式が生き残っている。)だから、大きなメモリが必要になる。

歴史的には、最初の電子式計算機は配線式プログラム(手順を配線として実現)していた。そのときにもデータを入れておく(特に計算途中結果を保持するための)メモリは必要で、ハードの授業で出てくるフリップフロップによるメモリだけでなく、たとえば水銀の柱の中を超音波が伝播する遅延を使ったメモリ、などというものが使われたりしたこともある。このフリップフロップも、この当時は半導体が使えないため、真空管を6本使って1ビットを実現するというものである。せいぜい100ビットぐらいしか作れない、という感覚は分かるだろうか。

脱線話だが、いろいろな記憶素子の工夫を競っていた頃、日本でも東大がTACという計算機を作るプロジェクトを持っていた。この記憶素子は、旧式テレビに使われているブラウン管と同じような仕組で記憶するものである。ブラウン管は真空管で、背面にある電子銃から電子を発射し、画面の裏側に塗られた蛍光体に当てて光らせる。電子銃から発射される電子ビームを、外部から曲げて(偏向という)光る位置を変える。曲げる方法として、通常のテレビは外側にコイルを巻いて電磁石を作りその磁場によって曲げる。物によっては(レーダーに使われるものなど)磁場の代わりに電場を加えて曲げる。メモリに使われたのは電場によるブラウン管(オシロスコープに使われるもの)で、画面に蛍光体を塗って光らせる代わりに、絶縁物を置いてそこへ電荷を貯める。読み出すときはその電荷を読む、というものであった。この仕組を散々苦労して作ったらしいが、なかなか安定して動作せず、結局その後使われる技術にはならなかった。

これではあまりに大変なので、磁気テープや磁気ドラム(磁気テープのテープの代わりにドラム=円筒の外側に磁性分を塗ってそれをヘッドによって磁化する)などをメモリとして使ったりした。これが1950年代ぐらいだろうか?

その後、磁性体のコア(マグネティックコア、ドーナツ状の磁性体に導線を通し、その電流の向きによって右回りもしくは左回りに磁化させて情報を記憶し、それを読出す技術)が発明されて、数百キロビットのメモリが比較的安価に作れるようになった。この時点で初めて本格的に大きなプログラムがメモリ上に載せられるようになったといえるだろう。それではあっても、容量はかなり小さい(物理的な大きさや発熱から制約される)ので、それを補助する形で磁気テープ、磁気ドラム、磁気ディスク等が使われていた。

このあたりの苦労があって、厳しいメモリ量の制限の中で大きなプログラムを動かしたいという話が出てきて、OSの授業で触れる「オーバーレイ」技法が出てきたり、そのあとの「仮想記憶」技術が出てきたりしているのである。現在のような半導体メモリが安価に、大きな制約無く使える時代では、これらの技術はばかばかしく見えるかもしれないが、当時は大きな意味があったのである。

ところで、上に述べたような磁気メモリ、たとえば磁気コアにしても、磁気テープ・磁気ディスクにしても、電源を消してもデータは消えない。これは音楽テープやビデオテープを見れば分かるだろう。それに対して、半導体メモリは電源を消すと内容が消えてしまう。半導体メモリが磁気コアを置き換え始めた頃は、これがどうしても「不満」だった。パソコンの電源を切って、翌日電源を入れると、切った直後の状態からそのまま使い続けられるのが当たり前だったのに、半導体にした途端にOSを最初から起動しなければならなくなった。これは不思議だったし、嫌だった記憶がある。

半導体メモリの技術にも、いろいろとある。読出しのみ(ROM=Read Only Memory)か読書きできる(RAM=Random Access Memory)か、電源を消してもデータが保持されるか消えてしまうか、高速で(トランジスタ数が多くてスペースを食って)高価か、少し低速でも小さくて安価か、など、用途に応じて使い分ける必要がある。また、時代が変わると技術が進化して、集積度や速度・価格が大きく変わるので、使い分けの仕方も変わる。ここでは個々の技術は説明しない。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-03-07 (水) 14:56:59 (5595d)