オペレーティングシステムにおいて、メモリ管理とは、コンピュータの主記憶装置を管理する機能である。[ 1 ]: 105-208
メモリ管理機能は、各メモリ位置の割り当て済みか空きかの状態を追跡します。競合するプロセス間でメモリをどのように割り当てるかを決定し、どのプロセスがメモリを取得するか、いつ取得するか、そしてどれだけのメモリが許可されるかを決定します。メモリが割り当てられる際には、どのメモリ位置が割り当てられるかを決定します。メモリが解放または未割り当てになった際には、その状態を追跡し、更新します。
これは、アプリケーションメモリ管理とは異なります。アプリケーションメモリ管理とは、プロセスがオペレーティングシステムによって割り当てられたメモリをどのように管理するかということです。
単一割り当ては、最も単純なメモリ管理手法です。通常、オペレーティングシステム用に予約されたごく一部を除き、コンピュータのメモリ全体が単一のアプリケーションに割り当てられます。MS -DOSは、この方法でメモリを割り当てるシステムの一例です。単一アプリケーションを実行する組み込みシステムも、この手法を使用する場合があります。
単一の連続メモリ割り当てを使用するシステムでも、メモリの内容をスワップしてユーザーを切り替えることでマルチタスク処理を実行できる。MUSICオペレーティングシステムの初期バージョンはこの手法を採用していた。
パーティション割り当てでは、主記憶を複数のメモリパーティション(通常は連続したメモリ領域)に分割します。各パーティションには、特定のジョブまたはタスクに必要なすべての情報が含まれる場合があります。メモリ管理は、ジョブの開始時にパーティションをジョブに割り当て、ジョブの終了時にパーティションを解放することによって行われます。
パーティション割り当てでは、ジョブ同士やオペレーティングシステムとの干渉を防ぐために、通常は何らかのハードウェアサポートが必要となります。IBM System/360はロックアンドキー方式を採用しています。UNIVAC 1108、PDP-6、PDP-10、およびGE-600シリーズは、ベースレジスタとバウンドレジスタを使用して、アクセス可能なメモリ範囲を示します。
パーティションは、静的パーティション(初期プログラムロード(IPL)時またはブート時にコンピュータオペレータによって定義される)と動的パーティション(特定のジョブ用に自動的に作成される)のいずれかになります。IBM System/360オペレーティング・システムの固定タスク数によるマルチプログラミング(MFT)は静的パーティショニングの例であり、可変タスク数によるマルチプログラミング(MVT)は動的パーティショニングの例です。MVTとその後継システムでは、他のシステムで動的パーティションと静的パーティションを区別するためにリージョンという用語を使用します。[ 2 ]
UNIVAC 1108、PDP-6、PDP-10、GE-600 シリーズのように、パーティションはベースレジスタとともに再配置可能です。再配置可能なパーティションは圧縮して、より大きな連続した物理メモリのチャンクを提供できます。圧縮は、メモリの「使用中」領域を移動して、プロセスの終了によって生じた「穴」または未使用のメモリ領域をなくし、より大きな連続した空き領域を作成します。[ 3 ]
システムによっては、パーティションを二次記憶装置にスワップアウトして追加のメモリを解放できるものもあります。IBM のタイム シェアリング オプション(TSO)の初期バージョンでは、タイム シェアリングパーティションへのユーザーの切り替えが行われていました。[ 4 ] [ a ]
ページ割り当て方式では、コンピュータの主記憶装置をページフレームと呼ばれる固定サイズの単位に分割し、プログラムの仮想アドレス空間を同じサイズのページに分割します。ハードウェアのメモリ管理ユニットがページをフレームにマッピングします。物理メモリはページ単位で割り当てられますが、アドレス空間は連続しているように見えます。
通常、ページング方式のメモリ管理では、各ジョブはそれぞれ独自のアドレス空間で実行されます。しかし、IBM iのように大きなアドレス空間内で全てのプロセスを実行する単一アドレス空間オペレーティングシステムや、IBM OS/VS1およびOS/VS2 (SVS)のように、16MiB の仮想アドレス空間内で全てのジョブを実行するシステムも存在します。
ページングメモリは、システムが必要に応じて主記憶装置と補助記憶装置の間でページを移動できる場合に、デマンドページングが可能となる。
セグメントメモリは、ユーザープログラムに「線形かつ連続したアドレス空間」を提供しない唯一のメモリ管理手法です。[ 1 ]: 165セグメントは、通常、コード手順やデータ配列などの論理的な情報のグループに対応するメモリ領域です。セグメントには、通常、メモリ内のセグメントの物理アドレス、そのサイズ、アクセス保護ビットやステータス(スワップイン、スワップアウトなど)などのデータを含むセグメントテーブルの形でハードウェアサポートが必要です。
セグメンテーションは、メモリ参照が特定のセグメントに対して相対的であり、ハードウェアがそのセグメント用に定義されていないメモリへのアプリケーションによる参照を許可しないため、他の方式よりも優れたアクセス保護を実現します。
セグメンテーションは、ページングの有無にかかわらず実装可能です。ページングをサポートしない場合、セグメントは必要に応じてメモリにスワップイン/スワップアウトされる物理単位となります。ページングをサポートする場合、通常はページがスワップの単位となり、セグメンテーションはセキュリティレベルをさらに向上させるだけです。
セグメント化されたシステムにおけるアドレスは通常、セグメントIDと、セグメントのベースアドレスからのオフセット(オフセットはゼロと定義されている)で構成されます。
Intel IA-32 (x86) アーキテクチャでは、プロセスはそれぞれ最大 4GiB のセグメントを最大 16,383 個持つことができます。IA-32 セグメントは、コンピュータの線形アドレス空間、つまりページング ハードウェアによって提供される仮想アドレス空間の細分化です。[ 5 ]
Multicsオペレーティングシステムは、セグメントメモリを実装したシステムとしておそらく最もよく知られています。Multicsセグメントは、コンピュータの物理メモリを最大256ページに分割したもので、各ページは1K 36ビットワードのサイズであり、結果として最大セグメントサイズは1MiB(Multicsで使用される9ビットバイトの場合)になります。1つのプロセスは最大4046セグメントを持つことができます。[ 6 ]
ロールアウト/ローリン (RO/RI) は、コンピュータのオペレーティングシステムのメモリ管理技術で、実行中のプログラムの共有されていないコードとデータ全体を補助メモリ(ディスクまたはドラム)にスワップアウトして、メイン ストレージを別のタスク用に解放します。プログラムは「要求終了時、または...長いイベントを待っているとき」にロールアウトされることがあります。[ 7 ]ロールアウト/ローリンは、タイム シェアリングシステムでよく使用されていました。 [ 8 ]タイム シェアリング システムでは、スワップを実行する時間に比べて、ユーザーの「思考時間」が比較的長かったためです。
仮想ストレージ(ページングやセグメンテーション)とは異なり、ロールアウト/ロールインは特別なメモリ管理ハードウェアを必要としません。ただし、メモリマップやベースレジスタ、境界レジスタなどの再配置ハードウェアがシステムに搭載されていない限り、プログラムは元のメモリ位置にロールバックする必要があります。ロールアウト/ロールインは、仮想メモリによってほぼ完全に置き換えられています。
ロールアウト/ロールインは、可変タスク数(MVT)によるOS/360マルチプログラミングのオプション機能でした。
ロールアウト/ロールインにより、特定のジョブを当初指定された領域を超えて一時的に動的に拡張できます。ジョブがより多くのスペースを必要とする場合、ロールアウト/ロールインはジョブが使用できる未割り当てのストレージを取得しようとします。そのような未割り当てのストレージがない場合、別のジョブがロールアウトされます(つまり、補助ストレージに転送されます)。これにより、その領域が最初のジョブで使用できるようになります。最初のジョブによって解放されると、この追加のストレージは、(1)それがソースであった場合は未割り当てのストレージとして、または(2)メインストレージに転送されるジョブ(ロールインされる)を受け入れるために、再び使用できるようになります。[ 9 ]
OS/360では、ロールアウト/ロールインはバッチジョブでのみ使用され、ロールインは領域を借用するジョブステップが終了するまで発生しません。