次のページ 前のページ 目次へ

8. コンピュータはどうやって複数のプロセスをお互いに干渉し合わないようにしているの?

カーネルのスケジューラは、複数のプロセスを時間で分割しています。 また、オペレーティング・システムは時間と同様に空間でもプロセスを分割します。 このため、各プロセスはお互いの作業メモリに入ることができません。 たとえ全てのプログラムを一緒に動かしたとしても、あるプログラムのバグが他の プログラムに害を与えることはありません。 オペレーティング・システムが行うこの問題に対する対処方法のことを、 メモリ管理 と呼びます。

あなたの管理下にある各プロセスには、実行すべきコードを格納したり 変数を保持して結果を書き込むためのコアメモリの領域がそれぞれ必要 になります。この領域のセットは、読み込みのみの コードセ グメント (プロセスの命令を保持している)と、書き込み 可能なデータセグメント (プロセス内のすべて の変数領域を保持している)から構成されます。データセグメントは各 プロセス間で全くユニークですが、2 つのプロセスが同一のコードを実 行する場合、効率的に管理するために、Unix は自動的に単一のコード セグメントを共有するようにそれらを調整します。

効率が大切なのは、コアメモリが高価だからです。マシン上で動作して いるすべてのプログラム全体を保持することができない場合も時にはあります。 X サーバのような巨大なプログラムを使っている時などは特にそうです。 この問題を解決するために、Unix では 仮想 メモリ という手法を使います。この手法では、プロセスの ためのすべてのコードとデータをコアに持とうとはしません。そのかわ り比較的小さな ワーキングセット を保持します。 プロセスの中のそれ以外の情報は、ハードディスク上の特殊な スワップスペース 領域に残されます。

プロセスが動作すると、 Unix はどれくらいのワーキングセットが変更 されるかを予測し、プロセス空間のうち必要最小限の部分をコアの中に 持ちます。これを効果的に行うことは複雑でかつ手の込んだことなので、 ここでそのすべてを説明することはしません -- しかしこの手法は、 コードおよびデータの参照においては、新しいものは古いものの近くのどこかを参 照することが多く、またそれは連続して起こる傾向があるという事実に基づいてい ます。

注意: 過去においては、2 つ前の段落の「時には」の部分は「ほとんど常に」で した。コアのサイズは基本的にプログラムのサイズに比較して小さいた め、スワッピングが頻繁に起こりました。メモリは今日ではもはやそんなに 高価な物ではなく、ローエンドのマシンでも十分なメモリを積んでいま す。コアに 64MB 以上ものメモリを積んでいる最近のシングルユーザ・ マシンでは、X に加えて一般的なジョブを組み合わせて走らせても全く スワッピングは起こりません。

この幸せな状況においてもなお、メモリ・マネージャ と呼ば れるオペレーティング・システムの一部分は、未だに重要な役目を果た しています。メモリ・マネージャは、あるプログラムが変更できるのは自分自身の データセグメントのみであることを保証しなければなりません。 つまり、プログラム中のコードが間違って、もしくは悪意を持ってデータを別の 内容に書き換えることが起こらないようにしなければなりません。メモリ ・マネージャ はこれを行うために、データおよびコード・セグメン トのテーブルを保持しています。プロセスがより多くのメモリを要求し たり(通常はプログラムの終了時に)メモリを解放したりするたびに、 このテーブルは更新されます。

このテーブルは、MMUまたはメモリ管理ユニット と呼ばれる、下で動いているハードウェアの特別な部分にコマンドを渡すために使 われます。最近のプロセッサ・チップは MMU を内蔵しています。MMU はメモリ領域 を周りから保護するという役目がありますので、領域を超えた参照は拒否され、特 殊な割り込みが発生するようになっています。

もし今までに "Segmentation fault", "core dumped" といった Unix メッセージを見たことがあれば、まさにこれが起こったということです。 動作中のプログラムがそのセグメント外のメモリをアクセスしようとし た場合、致命的な割り込みが発生します。これはプログラム中にバグが あることを示しています。この際にはプログラマが原因を追究できるように、 コアダンプ という診断情報が出力されます。

メモリのアクセスを分離する以外にも、プロセスをお互いから保護する状況があり ます。また、ファイルのアクセスも制限して、バグっぽいプログラムや悪意のある プログラムがシステムの重要な部分を壊せないようにしたいと思うでしょう。これ が、Unix に ファイルのパーミッションがある理由 です。これについては後述します。


次のページ 前のページ 目次へ