04.メモリー管理

By 神居 - Posted: 2008/10/25 Last updated: 2009/10/17 - One Comment

仮想記憶

コンピュータのプログラムは命令にせよデータにせよ、必ずメモリー上に置かれていなければCPUが処理することができません。プログラムが大きくなりデータ量も増えてくればそれに応じたサイズのメモリーが必要です。ところがすべてのプログラムが同じ大きさで同じ量のデータを扱うわけではありませんから、小さなプログラムでは使われないメモリーは無駄になってしまいます。昔はメインフレームに限らずハードウェア部品としてのメモリーは非常に高価であったため大きな問題でした。そこで登場したのが仮想記憶と言う考え方の仕組みです。
仮想記憶方式では主記憶装置はハードウェア部品としての実記憶装置とDASD上の補助記憶装置によって構成される論理的な装置として扱われます。MVS上のジョブは一部の例外を除けば実記憶(リアルストレージまたはリアルメモリー)を直接アクセスすることはありません。よってMVSでは単にメモリー、記憶域と言った場合は基本的に仮想記憶(バーチャルストレージまたはバーチャルメモリー)のことを指します。

仮想記憶によって得られるメリットとして大きく以下の2つがあります。


ページングとスワッピング

CPUは実記憶装置しかアクセスできませんから、実際に命令を実行したり演算処理やデータの移動を行うためには命令と対象となるデータは必ず実メモリー上に置かれなければなりません。仮想記憶は一般に実記憶より大きなサイズを持ちます。そのため溢れた内容をどこかにしまっておく必要があります。これが補助記憶でメインフレームではDASD内に作成されているページ・データセットに入れられます。
S/370アーキテクチャーではCPUはDATと呼ばれるハードウェア機構によって仮想アドレスのまま命令やデータの場所をアクセスできるようになっています。この時仮想アドレスで示されたメモリー領域が実際の実記憶上に存在しない場合、CPUはOSに割込みを起こして通知します。MVSはこの割込みを受けて、そのアドレスが示す領域が仮想記憶域として存在するかを調べます。正しい仮想アドレスであればページ・データセットにその内容が退避されているので、DASDからそれを実記憶上に読み込みます。これがページインです。逆に当面CPUが使わない領域はページ・データセットに退避されます。これがページアウトです。

このページインとページアウトによって実記憶と補助記憶間でのメモリー領域を、CPUがその都度必要とする部分に対応させ頻繁にやり取りを行って制御しています。これがページングと呼ばれる仕組みです。MVSではやり取りされるメモリー領域を4KBずつの大きさに区切って管理します。この4KBで区切られた領域をページと呼びます。ページングではページ単位に実記憶から補助記憶に書き出され、また逆に補助記憶から実記憶に読み込まれます。

頻繁にアクセスされるページがその都度DASDから読み込まれるのでは、効率が悪いので優先度が低いジョブが使用している実記憶上のページの集まり(ワーキングセットと呼ばれます)はCPUの割込みに依らずMVSが自らまとめてページ・データセットに書き出します。このようにページ単位ではなくワーキングセット単位に行われるのがスワッピングです。スワッピングは仮想記憶そのもののメカニズムではなく、パフォーマンス制御のために行われるMVSのOSとしての機能になります。
またMVSのページング制御や割込み制御などを行うモジュールはページアウトされてしまうとOSとしての制御ができなくなってしまいます。このようなOSとしての核になる部分はページアウトされないようになっていて、ページ固定と呼ばれます。


アドレス空間

MVSでは1つのジョブは1つのアドレス空間の中で動きます。実行するジョブが2つあるとそれぞれが独立したアドレス空間を持ちます。アドレス空間はプログラムに与えられる一定の大きさを持つ連続したメモリー領域です。メモリーと言ってもあくまでも仮想です。
またMVSと言う名前はMultiple Virtual Storageの略で、複数の仮想空間を並べて制御するためにMVSと名付けられたのです。ここで言うVirtual Storageが仮想アドレス空間となります。これが複数だからMVSとなったのです。ちなみにMVSの前にはSVSと呼ばれるものもありました。Single、つまり単一の仮想空間では、複数のプログラム(ジョブ)はパーティションと呼ばれる空間内を区分けした区画内で動きます。ジョブ管理とJES2で出てきたイニシエーターは、この区画の考え方の名残でもあります。
アドレス空間はメモリー空間と言い換えて考えてもいいです。Windowsなどではそう呼ばれます。「1つのプロセスには1つの独立したメモリー空間が与えられる」なんて解説されたりします。独立しているのがポイントです。ジョブAのプログラムでもジョブBのプログラムでも8000番地は同じ8000番地ですが、お互いの領域がかぶらないのは、それぞれの空間が独立しているからです。これによって、誤りがあっても他のプログラムのメモリー領域を壊すことがありません。ソフトウェア面におけるシステムの信頼性は大きく向上しました。「行儀の悪いプログラムのおかげでみんなが迷惑する」と言うことは、メインフレームの世界ではすでに1970年代初期には解決していたわけです。

アドレス空間の大きさは初期のMVSでは16MB(24ビット)、次のMVS/XAでは2GB(31ビット)となりました。何で32ビット使って4GBにしないのか?とお思いでしょうがこれにも理由があります。
先頭の1ビットはプログラムが16MBまでのメモリーをアクセスできる24ビット・プログラムなのか、それを超えてアクセスできる31ビット・プログラムなのか、を識別するための標識に使われます。そのため仮想アドレスは残りの31ビットで表現するため最大2GBとなったのです。これは古い24ビット・プログラムも、新しい31ビット・プログラムも、どちらも修正なしでそのまま動かせる互換性のためです。現在のz/OSでも同じです。MVSを始めとするメインフレームOSや、ハードウェアは、この互換性を非常に重要視してきました。故に今でも昔のプログラムが現役で動いているわけです。
現在のz/OSでは16ExaB(64ビット)となっていますが、2GBを超える領域はデータ用に使われプログラム自身は動きません。64ビットの空間をフルに利用するプログラムは、データベース系の製品など、これから少しずつ出てくるでしょうが、一般のプログラムではそこまでの広大なメモリーはあまり必要とされないと思います。またアドレス空間の数ですが最大で32767空間となっていますが、z/OSのデフォルト値では255とされています。

アドレス空間が2GBの大きさを持っていてもプログラムですべて自由に使える訳ではありません。MVSは空間をOS自身を置く領域、OSがシステムやプログラムを制御するために使う領域、複数のプログラムで共通に使える領域、ユーザー・プログラムを置く領域など、いくつかに区分けして管理します。それぞれの領域の大きさはシステムのパラメーター設定によっても変わってきます。
ユーザー・プログラムが利用できる領域が「リージョン(REGION)」です。PVTとも呼ばれます。リージョンは16MBより低い24ビット領域と、16MBより高い31ビット領域の2つに分かれ、それぞれ基本リージョン・拡張リージョンとなります。基本リージョンはユーザーのシステム設定によって幅があります(6MB?10MB)が、一般的なユーザーでは8MB程度の大きさを持ちます。拡張リージョンはGBの大きさを持つものの利用できるのは標準では32MBです。MVSとMSPでは暗黙で利用できますが、VOS3ではJCLに明示的に利用する大きさを定義する必要があります。

MVSアドレス空間構成図

MVSアドレス空間構成図



アドレスモード

MVSではプログラムはアドレスモード(またはアドレッシングモード)と呼ばれる空間をアクセスできる範囲があります。16MBまでのメモリー域にアクセスできる24ビット・アドレッシングモード、2GBまでのメモリー域にアクセスできる31ビット・アドレッシングモード、さらに16ExaBまでのメモリー域にアクセスできる64ビット・アドレッシングモードです。24ビットモードを基本モード、31ビットモードを拡張モードと呼ぶこともあります。
最初のMVSの仮想アドレス空間の大きさは16MBでした。その後MVS/XAになって、これが2GBに拡張された時に、旧24ビットプログラムの互換を保ち、新31ビットプログラムも同時に動かすためにアドレッシングモードの考え方が採用されたのです。
Windowsなどのように、32ビットを使用して4GBにしなかったのは、アドレス・ワードの先頭ビットをアドレスモードの識別に使用したためです。CPUは元々32ビット、PSWなどもアドレス部は32ビットを持っていたため、それらをそのまま生かして仮想アドレス空間を拡張しました。zアーキテクチャではPSWや命令も新たに64ビット対応に変更されたり、追加されたりしたので、MVS/XAの時のように63ビットではなく64ビットをすべて使用してアドレス表現できるようになっています。

Posted in ..基礎編 • • Top Of Page

One Response to “04.メモリー管理”

Comment from shok
Time 2013年7月11日 at 08:25

VOS3についてアドレス空間の説明の最後に『JCLで利用する大きさを明示的に指定をする必要があります』との記載がありますが、これはジョブ管理(JSS3)のパラメタ(JSS3PARM)に指定しておくことで、実行ジョブクラス単位に標準値を与えることが可能です。
ユーザーは意識してリージョンサイズを明示指定する必要はありません