初心者

プログラムから見たメモリ

はじめに

「コンピュータの動作にはメモリが大事」ということは、プログラマに限らず、多くの人が知ってることだろう。そしてメモリはプログラムとは切ってもきれない関係にある。ここでは、初心者向けに、メモリとはなんなのか、どういう役割があるのか、簡単に説明してみようと思う。(本来、専門書等で体系的に勉強することが望ましいのはいうまでもないが、ここでは"手っ取り早く理解したい=つまみ食い”を想定している。)

2種類の記憶領域

コンピュータには大別して2種類の記憶場所がある。一つはストレージと呼ばる、データを保存しておく装置で、具体的にはハードディスクやSSDなどだ。音楽や写真、文章やエクセルなど、コンピュータのデータの保存場所といえば、直感的なのはこちらだろう。もう一つは、メモリと呼ばれる、一時記憶領域だ。一時、と名前が付いているように、ここは電源を落とすたびにリセットされる。メモリは、ストレージと違って、我々が直接操作して写真などのデータを保することはできない。では誰が何に使ってるのだろうか。

メモリはプログラムにとって作業机

メモリは、「プログラム」が「作業領域として」使うための記憶領域だ。メモリ容量はプログラムから見れば、作業机の大きさに等しい。プログラムは、いろんな計算を実行する。途中で、計算結果を出すだろう。これらは”一時的に”、どこかに保存しておく必要がある。作業台に喩えれば、走り書きしたノートを机の橋に置いといて、それをみながらまた別の計算を進めるイメージだ。
作業机にものがたくさん溜まってきて、必要な走り書きをそれ以上置けなくなったら、プログラムは計算を継続できなくなる。「メモリ不足でプログラムを起動できません」なんてエラーメッセージを昔はよくみたものだが、これはそういうことだ。(厳密に言えば、データだけでなく、プログラムのコード自身もメモリに置かれる。)

作業机をみんなで使う方法

コンピュータに動いているプログラムが1つなら、話は単純だ。8Gのメモリを積んだコンピュータで動くプログラムは8Gのメモリがつかえる。しかし実際にはコンピュータでは、複数のプログラムが動いている。ワードで文章を書きながら、たまにブラウザでネットサーフィンして、かつiTunesで音楽を聴いている、、なんてことは普通だろう。(実際にはシステムを動かすための小さなプログラムが複数動いており、総数は100を超える)では、この状況で作業机はどうなってるのだろうか。一つの作業机の上に様々なプログラムが計算結果を置いてるはずで、その場合、どうやって空いてる場所を見つけたり、他のプログラムが使ってる計算結果を上書きしてしまったり、逆に他のプログラムから読まれてしまったりしないのだろうか。

実は、1つのプログラムからは一枚のまっさらな作業机が見えている。机の大きさ(メモリ容量)は、どのプログラムからも一定の大きさだ。動いているプログラムの数で全体を分割してるのかな?と思うかもしれないが、そうではない。それだと、机を汚さなかったプログラムにも一定領域割り当てられてしまい、無駄になるし、逆に、机をたくさん使いたいプログラムは、実際には机がいっぱい空いているのに使えないという状態になる。ではどうしているかと言うと、どのプログラムからも、大きなまっさらな机が見えるようにしている。その大きさは、実際に積まれているメモリよりもはるかに大きいことが多い。他のプログラムがどれだけメモリを使っているかは、自分が使える領域には影響を及ぼさない。他人がどれだけ使おうが、自分はとても大きな机を使えるという夢のような状態なのだ。

仮想メモリ

このような状態を作り出してるのは「仮想メモリ(Virtual memory)」という仕組みだ。
日本語訳である”仮想"は誤訳だという話もあるので、Virtualの語源に沿って説明する。Virtualの意味は、バーチャルリアリティといえば直感的にわかるだろう。実際にはありもしないものをまるでそこにあるかのように体験させることだ。仮想メモリは、まさに、ありもしないメモリをまるであるかのように見せる仕組みだ。プログラムから見えているまっさらで大きくてまだ誰も使っていない作業机は、実際には存在しない。そう、まさしく夢だったのだ。

実際に存在しているのは、様々なプログラムがすでに作業結果を積みまくっている、ごちゃごちゃした机だ。この汚い机をプログラムに渡したら、プログラムは、自分が使えるところをいちいち探しながら、なんとか計算結果をねじ込んで、時には分割したりして、計算をやらざるを得ない。これでは、プログラムが本来やるべき計算に集中できない。どのプログラムも、まず空いている場所を探して、計算結果をねじ込む、という作業を作り込むことが必要になってしまう。仮想メモリという仕組みは、この面倒な仕事を代わりにやってくれる。プログラムからは一枚のまっさらな机が見えるため、好きに使ってもらって構わない。使われた分だけ、仮想メモリの仕組みの方で、空いているところに分割したりしてねじ込んでいく。全てのプログラムが仮想メモリの上で動いているので、仕組みの方で使う場所の重複はさせないようにしているし、お互いに読むこともできないよう保護機能が働いている。

実際の限界

仮想メモリでとても大きな机が見えているとはいえ、実際には本物の机の大きさに制限されている。ではその大きさを超えたらどうなるのだろうか。答えは単純で、もうそれ以上計算ができなくなる。と、言いたいところだが、仮想メモリはもう少しだけ頑張ってくれる。喩えれば、机よりは少し使い勝手が悪いけど、、、地下室にある床を机がわりに使ってもいいわよ。という感じだろうか。これで、プログラムは計算途中で終了したりせずに動き続けることはできる。しかし、あくまでも地下室の床は目の前の作業机の代わりであって、とても行き来がめんどくさいのだ。具体的にはこの地下室の床は、スワップ領域と呼ばれ、ハードディスクなどが使われる。アクセス速度がメインメモリに比べて2桁以上違うハードディスクに計算結果を置くと、プログラム自体のスピードは劇的に下がるが、計算できなくなるよりは良い場合が多い。

したがって、プログラマはシステム全体のメモリ使用量に常に注意していなければならないし、自分の書いたプログラムがどの程度メモリを使っているか、机を汚しているかを意識してプログラムを書く必要がある。スワップ領域が使われているようであれば、危険信号で、本来使えるスペースに収めるのが良いだろう。

まとめ

メモリはプログラムにとっての作業机。