仮想メモリ わかりやすく
2回目のレッスンで、いくつものプロセスが同時に動くと話しました。そのプログラムたちには、それぞれ覚えておく場所、つまりメモリが必要です。でも本物のメモリ(RAM)は量がきっちり決まっているので、みんなが本物の場所をじかに取り合えば、すぐに足りなくなってぶつかります。そこでオペレーティングシステムは、それぞれに「にせものの大きなメモリ」を渡すのです。
みんながメモリを欲しがる
同時に動くプログラムには、それぞれ覚えておく場所が必要です。でも本物のメモリは、大きさの決まった狭い空間です。
みんなが本物の場所をじかに取ろうとすれば、すぐに場所が足りなくなり、おたがいの領域がぶつかります。
メモリをめぐって争いが起きるわけです。
プログラムを増やすほど、本物のメモリの棒がすぐにいっぱいになってあふれます。
本物のメモリだけでは、とてもまかないきれません。かといって、プログラムに「メモリをゆずって」とも言えません。それぞれがたっぷり使えなければならないからです。
そこでオペレーティングシステムは、うまいからくりを使います。
それぞれに「自分だけの大きなメモリ」を渡す
オペレーティングシステムは、プログラムごとににせもののメモリを一つずつ渡します。広くて、0番からきれいに始まり、自分一人で使っているように見えます。
Aの「0番のマス」とBの「0番のマス」は、じつは別の場所です。それぞれ自分のメモリだけを見ていて、ほかのものは見えさえしません。
この自分だけのにせもののメモリを、仮想メモリといいます。
AとBを交互に見ると、どちらも0番から始まる「自分のメモリ」を別々に持っています。
どちらも0番からきれいに使えるので、とても便利です。でも、にせものの番地は本物の場所ではありません。
プログラムが「自分の3番のマス」と言ったら、それをだれが、どうやって本物の場所に置きかえるのでしょうか。
にせものの番地を本物の場所へ移す
プログラムが「自分の3番」を使うたびに、オペレーティングシステムとハードウェアがこっそり本物の場所に置きかえます。
小さな地図が一枚、「自分の3番 → 本物の27番」のようにつないでくれます。Aの「自分の0番」は本物の5番、Bの「自分の0番」は本物の40番です。
同じにせものの番号でも本物の場所は違うので、ぶつかることはありません。
にせものの番地を押すと、地図を通って本物の場所につながります。AとBは同じ番号でも別の場所に届きます。
地図がにせものを本物に置きかえてくれるので、それぞれが安全に別々に暮らせます。
でも、みんなのにせもののメモリを合わせると、本物のメモリよりずっと大きくなることもあります。そんなにたくさんのものを、小さな本物のメモリにどうやって全部入れるのでしょうか。
本物より大きく、使わないものはディスクへ
オペレーティングシステムの秘密はこれです。いま使っていない部分は遅いディスクにいったん追い出し、その場所にいま必要な部分を載せます。
あとで追い出したものがまた必要になれば、呼び戻します。
だから本物のメモリより大きなメモリを使えるのです。
新しい部分を読み込むと、本物のメモリがいっぱいのときは、使っていなかったものがディスクへ出て、必要なものが入ってきます。
追い出したり呼び戻したりすることで、本物より大きな記憶ができるようになりました。でも、ディスクは本物のメモリよりずっと遅いのです。
毎回ディスクまで行き来していたらもどかしいので、オペレーティングシステムは最後にもう一つ気を配ります。
よく使うものは近くに置く
オペレーティングシステムは、よく使う部分を近くの本物のメモリに残しておき、たまにしか使わないものだけを遠くて遅いディスクへ送ります。
コンピュータのしくみで出会ったキャッシュとまったく同じ考えです。「よく使うものは近くに」。
だから大部分の仕事は速い本物のメモリですぐに終わり、ディスクまで行くのはたまにだけなので、遅さをほとんど感じません。
何回も取り出すほど、よく使うものは本物のメモリ(近く)に、たまに使うものはディスク(遠く)にとどまります。
まとめると、仮想メモリは、にせものの番地を本物の場所へ移し、使わないものはディスクへ送り、よく使うものは近くに置く腕前です。そのおかげで、それぞれが本物より大きなメモリを一人で使っているように感じられます。
ところが、それぞれが「自分だけの場所」しか見えず、ほかのものは見えないということが、じつは自分のものと相手のものを分けて守る壁になります。それが次の話です。