わかりやすく メモリ保護 とは
9回目のレッスンの仮想メモリで、プログラムごとに自分だけのメモリを持ち、ほかのメモリは見えさえしないことを見ました。でもじつは、みんなのデータは一つの本物のメモリに混ざっています。では、何が自分のものと相手のものをおたがいに触れさせないのでしょうか。驚いたことに、ふさぐ壁のようなものはありません。
一つのメモリに何人もが混ざって暮らす
にせものの見え方では、それぞれ別々に使っているようですが、本物のメモリの中では、みんな一緒に混ざっています。AのかけらとBのかけらが隣り合って置かれています。
もしAがすぐ隣のBの場所に触れられたら、Aのたった一つのミスがBを壊し、秘密までのぞけてしまいます。
一つの空間にこうして混ざっていると、不安に見えます。でも実際には、AはBに決して触れられません。
二人のあいだを、何か頑丈な仕切りがふさいでいるのでしょうか。いいえ。秘密は、9回目で見たあの地図にあります。
壁ではなく、道がないだけ
9回目の地図を思い出してください。Aの地図はAの本物の場所だけを指していて、Bの場所へつながる道は、その地図にまったくありません。
だからAには、「Bの番地」と口にする方法さえありません。
二人をふさぐ壁があるのではなく、行く道がないのです。
Aを選ぶと、Aの地図はAの場所にだけつながっていて、Bへ向かう矢印はありません。
地図に道がないので、行きようがありません。でも、もしあるプログラムがうっかり、あるいはわざと、地図の外の番地を呼んだらどうなるでしょうか。
そのときは、また別の安全装置が働きます。
線を越えようとすると捕まる
プログラムが自分の地図にない番地を呼ぶと、置きかえる本物の場所がないので、変換が失敗します。
その瞬間、ハードウェアがすぐに気づいてオペレーティングシステムに知らせます。オペレーティングシステムは「自分のものではない場所に触れた」として、そのプログラムだけをぴたりと止めます。
悪いアクセスは、最後まで届きません。
Aの番地とBの番地を順に試すと、自分のものは通過(緑)、ほかのものは捕まって停止(赤)します。
自分のものはちゃんと通り、ほかのものはその場で捕まりました。境界を越えようとする試みは、決して通りません。
おかげで、とても心強い結果がついてきます。一つのプログラムが壊れても、それがほかに広がらないということです。
一つが壊れても、ほかは平気
プログラムはそれぞれ自分の区画に閉じこめられているので、壊れたプログラムが散らかせるのは自分の場所だけです。ほかのプログラムのメモリにも、オペレーティングシステムにも手を出せません。
オペレーティングシステムは壊れたその一つだけを静かに片づけ、ほかのプログラムは何事もなかったように動き続けます。
プログラムを一つ壊すと、その一つだけが止まり、ほかは動き続けます。
保護がなかったら、壊れた一つがすべてを道づれにしていたでしょう。分けておいたおかげで、事故が一つの区画にとどまったのです。
安定も安全も、ここから一緒に生まれます。その土台にあるのは「壁」ではなく「別々の地図」です。
分けることが、そのまま保護
まとめると、メモリ保護は別に建てた壁ではありません。プロセスごとに地図を別々に渡すので、おたがいへ行く道がなく、線を越えようとすれば捕まって、その一つだけが止まります。
だから混ざって暮らしてもぶつからず、一つが壊れても広がりません。分けておくことそのものが、保護なのです。
保護を切りかえると違いがわかります。オンなら事故は一つの区画に閉じこめられ、オフならすべてに広がります。
ここまで、オペレーティングシステムは内側でCPUとメモリを取りしきってきました。交代で使わせ(時分割 · スケジューリング)、別々に守ってきたのです(仮想メモリ · 保護)。
でもコンピュータは、外とも話をしなければなりません。キーボード、画面、ディスク、初めて見る新しい装置まで。
オペレーティングシステムは、そのたくさんの装置をどうやって見分けるのでしょうか。それが次の話です。