Operating-system-os-memory-management
オペレーティングシステム-メモリ管理
メモリ管理は、プライマリメモリを処理または管理し、実行中にメインメモリとディスク間でプロセスをやり取りするオペレーティングシステムの機能です。 メモリ管理は、プロセスに割り当てられているか、空きであるかにかかわらず、すべてのメモリ位置を追跡します。 プロセスに割り当てられるメモリの量をチェックします。 どのプロセスがいつメモリを取得するかを決定します。 一部のメモリが解放または未割り当てになるたびに追跡し、それに応じてステータスを更新します。
このチュートリアルでは、メモリ管理に関連する基本的な概念を学びます。
プロセスのアドレス空間
プロセスアドレス空間は、プロセスがそのコードで参照する論理アドレスのセットです。 たとえば、32ビットアドレッシングが使用されている場合、アドレスの範囲は0〜0x7fffffffです。つまり、2 ^ 31の可能な数であり、合計理論サイズは2ギガバイトです。
オペレーティングシステムは、プログラムへのメモリ割り当て時に論理アドレスを物理アドレスにマッピングします。 メモリが割り当てられる前と後にプログラムで使用されるアドレスの3種類があります-
S.N. | Memory Addresses & Description |
---|---|
1 |
Symbolic addresses ソースコードで使用されるアドレス。 変数名、定数、および命令ラベルは、シンボリックアドレス空間の基本要素です。 |
2 |
Relative addresses コンパイル時に、コンパイラはシンボリックアドレスを相対アドレスに変換します。 |
3 |
Physical addresses ローダーは、プログラムがメインメモリにロードされるときにこれらのアドレスを生成します。 |
仮想アドレスと物理アドレスは、コンパイル時とロード時のアドレスバインドスキームで同じです。 仮想アドレスと物理アドレスは、実行時のアドレスバインドスキームが異なります。
プログラムによって生成されるすべての論理アドレスのセットは、*論理アドレス空間*と呼ばれます。 これらの論理アドレスに対応するすべての物理アドレスのセットは、*物理アドレス空間*と呼ばれます。
仮想アドレスから物理アドレスへのランタイムマッピングは、ハードウェアデバイスであるメモリ管理ユニット(MMU)によって行われます。 MMUは次のメカニズムを使用して、仮想アドレスを物理アドレスに変換します。
- ベースレジスタの値は、ユーザープロセスによって生成されたすべてのアドレスに追加され、メモリに送信されるときにオフセットとして扱われます。 たとえば、ベースレジスタ値が10000の場合、ユーザーによるアドレスロケーション100の使用の試みは、ロケーション10100に動的に再割り当てされます。
- ユーザープログラムは仮想アドレスを扱います。実際の物理アドレスを見ることはありません。
静的ローディングと動的ローディング
静的ローディングまたは動的ローディングの選択は、コンピュータープログラムの開発時に行われます。 プログラムを静的にロードする必要がある場合、コンパイル時に、外部プログラムまたはモジュールの依存関係を残さずに、完全なプログラムがコンパイルおよびリンクされます。 リンカは、オブジェクトプログラムと他の必要なオブジェクトモジュールを組み合わせて、論理アドレスを含む絶対プログラムを作成します。
動的にロードされたプログラムを作成している場合、コンパイラーはプログラムをコンパイルし、動的に組み込みたいすべてのモジュールについて、参照のみが提供され、実行時に残りの作業が行われます。
ロード時に、 static loading を使用すると、実行を開始するために絶対プログラム(およびデータ)がメモリにロードされます。
- 動的ロード*を使用している場合、ライブラリの動的ルーチンは再配置可能な形式でディスクに保存され、プログラムで必要な場合にのみメモリにロードされます。
静的リンクと動的リンク
上で説明したように、静的リンクを使用すると、リンカーは、プログラムに必要な他のすべてのモジュールを単一の実行可能プログラムに結合して、実行時依存を回避します。
動的リンクを使用する場合、実際のモジュールまたはライブラリをプログラムにリンクする必要はなく、コンパイルおよびリンク時に動的モジュールへの参照が提供されます。 Windowsのダイナミックリンクライブラリ(DLL)とUnixの共有オブジェクトは、ダイナミックライブラリの良い例です。
スワッピング
スワップとは、プロセスを一時的にメインメモリからスワップ(または移動)してセカンダリストレージ(ディスク)に入れ、そのメモリを他のプロセスで使用できるようにするメカニズムです。 しばらくすると、システムはプロセスをセカンダリストレージからメインメモリにスワップバックします。
通常、パフォーマンスはスワッププロセスの影響を受けますが、複数の大きなプロセスを並行して実行するのに役立ちます。そのため、*スワップはメモリ圧縮の手法*としても知られています。
スワッププロセスにかかる合計時間には、プロセス全体をセカンダリディスクに移動してからプロセスをメモリにコピーするのにかかる時間と、プロセスがメインメモリを取り戻すのにかかる時間が含まれます。
ユーザープロセスのサイズは2048KBであり、スワッピングが行われる標準のハードディスクでは、データ転送レートが1秒あたり約1 MBであると仮定します。 メモリへの、またはメモリからの1000Kプロセスの実際の転送には、
2048KB/1024KB per second
= 2 seconds
= 2000 milliseconds
入退室時間を考慮すると、完全な4000ミリ秒に加えて、プロセスがメインメモリを取り戻すために競合する他のオーバーヘッドがかかります。
メモリ割り当て
メインメモリには通常2つのパーティションがあります-
- Low Memory -オペレーティングシステムはこのメモリにあります。
- ハイメモリ-ユーザープロセスはハイメモリに保持されます。
オペレーティングシステムは、次のメモリ割り当てメカニズムを使用します。
S.N. | Memory Allocation & Description |
---|---|
1 |
Single-partition allocation このタイプの割り当てでは、再配置レジスタスキームを使用して、ユーザープロセスを相互に保護し、オペレーティングシステムのコードとデータを変更しません。 再配置レジスタには最小の物理アドレスの値が含まれ、制限レジスタには論理アドレスの範囲が含まれます。 各論理アドレスは、制限レジスタよりも小さくなければなりません。 |
2 |
Multiple-partition allocation このタイプの割り当てでは、メインメモリはいくつかの固定サイズのパーティションに分割され、各パーティションにはプロセスを1つだけ含める必要があります。 パーティションが空いている場合、プロセスは入力キューから選択され、空いているパーティションにロードされます。 プロセスが終了すると、パーティションは別のプロセスで使用可能になります。 |
フラグメンテーション
プロセスがロードされてメモリから削除されると、空きメモリ領域は小さな断片に分割されます。 プロセスがメモリブロックに割り当てられず、サイズが小さく、メモリブロックが未使用のままである場合があります。 この問題はフラグメンテーションとして知られています。
フラグメンテーションは2種類あります-
S.N. | Fragmentation & Description |
---|---|
1 |
External fragmentation 合計メモリ領域は、要求を満たすか、その中にプロセスを常駐させるのに十分ですが、連続していないため、使用できません。 |
2 |
Internal fragmentation プロセスに割り当てられたメモリブロックが大きくなっています。 別のプロセスで使用できないため、メモリの一部は未使用のままになります。 |
次の図は、断片化がメモリの浪費を引き起こし、圧縮技術を使用して断片化されたメモリからより多くの空きメモリを作成する方法を示しています-
外部の断片化は、圧縮またはメモリ内容のシャッフルにより、すべての空きメモリを1つの大きなブロックにまとめることで削減できます。 圧縮を実行可能にするために、再配置は動的でなければなりません。
プロセスに対して十分な大きさの最小のパーティションを効果的に割り当てることにより、内部の断片化を減らすことができます。
ページング
コンピュータは、システムに物理的にインストールされている量よりも多くのメモリをアドレス指定できます。 この余分なメモリは実際には仮想メモリと呼ばれ、コンピュータのRAMをエミュレートするために設定されたハードのセクションです。 ページング技術は、仮想メモリの実装において重要な役割を果たします。
ページングは、プロセスのアドレス空間を*ページ*と呼ばれる同じサイズのブロックに分割するメモリ管理手法です(サイズは512バイトから8192バイトの間の2の累乗です)。 プロセスのサイズはページ数で測定されます。
同様に、メインメモリは(フレーム)と呼ばれる(物理)メモリの小さな固定サイズブロックに分割され、フレームのサイズはページのサイズと同じに保たれ、メインメモリの最適な利用と外部の断片化が回避されます。
アドレス変換
ページアドレスは*論理アドレス*と呼ばれ、*ページ番号*と*オフセット*で表されます。
Logical Address = Page number + page offset
フレームアドレスは*物理アドレス*と呼ばれ、*フレーム番号*と*オフセット*で表されます。
Physical Address = Frame number + page offset
- ページマップテーブル*と呼ばれるデータ構造は、プロセスのページと物理メモリ内のフレームとの関係を追跡するために使用されます。
システムがフレームをページに割り当てると、この論理アドレスが物理アドレスに変換され、プログラムの実行全体で使用されるページテーブルへのエントリが作成されます。
プロセスを実行する場合、対応するページが利用可能なメモリフレームにロードされます。 8Kbのプログラムを持っているが、特定の時点でメモリが5Kbしか収容できないと仮定すると、ページングの概念が明らかになります。 コンピューターのRAMが不足すると、オペレーティングシステム(OS)はアイドルまたは不要なメモリページをセカンダリメモリに移動して、RAMを他のプロセスに解放し、プログラムが必要とするときにそれらを戻します。
このプロセスは、OSがメインメモリからアイドルページを削除し、それらをセカンダリメモリに書き込み、プログラムが必要とするときにそれらを戻すプログラムの実行中も継続します。
ページングの長所と短所
ここにページングの利点と欠点のリストがあります-
- ページングは外部の断片化を減らしますが、それでも内部の断片化の影響を受けます。
- ページングは実装が簡単で、効率的なメモリ管理手法として想定されています。
- ページとフレームのサイズが等しいため、スワップは非常に簡単になります。
- ページテーブルには追加のメモリ領域が必要であるため、RAMが少ないシステムには適していません。
セグメンテーション
セグメンテーションは、各ジョブを異なるサイズの複数のセグメントに分割するメモリ管理手法です。各セグメントには、関連する機能を実行する部分が含まれています。 各セグメントは、実際にはプログラムの異なる論理アドレス空間です。
プロセスを実行する場合、対応するセグメンテーションは非連続メモリにロードされますが、すべてのセグメントは使用可能なメモリの連続ブロックにロードされます。
セグメンテーションメモリ管理はページングと非常によく似ていますが、ここではセグメントは可変長で、ページングページのように固定サイズです。
プログラムセグメントには、プログラムのメイン機能、ユーティリティ機能、データ構造などが含まれます。 オペレーティングシステムは、すべてのプロセスの*セグメントマップテーブル*と、セグメント番号、サイズ、およびメインメモリ内の対応するメモリ位置とともに、空きメモリブロックのリストを保持しています。 テーブルには、セグメントごとに、セグメントの開始アドレスとセグメントの長さが格納されます。 メモリ位置への参照には、セグメントとオフセットを識別する値が含まれます。