1. 概要

このチュートリアルでは、最初にオペレーティングシステムのメモリ管理を担当するページング手法について説明します。 次に、断片化の問題とその2つのバリエーションを紹介します。最後に、断片化の2つのバリエーションのコアの違いについて説明します。

最後に、ページングで内部フラグメンテーションのみが発生する理由を説明します。

2. ページングの概要

ページングにより、プロセスを不連続スペースのメモリに格納できます。この手法を実装するために、プロセスをページに分割します。 ページは固定サイズのブロックです。 同様に、物理メモリもフレームに分割します。

プロセスを実行するとき、CPUは各ページの論理アドレス物理アドレスに変換します。 次に、セグメント化ページング手法を使用して、CPUから提供されたアドレスをページ番号とページオフセットに分割します。

仮想アドレスが大きい場合、ページはページング時に実際のメモリで大きなスペースを占有します。 複雑なプログラムは大きく、多くのメモリを消費する傾向があります。 したがって、ページングを使用してメインメモリを管理することは、OSにとって難しい作業です。

ページングは外部の断片化の問題を解決しますが、内部の断片化は依然としてページングの主な欠陥の1つです。ページングに外部の断片化がない理由を理解するには、両方の断片化を詳細に知る必要があります。

2.1. 物理アドレスコンピューティング

論理アドレスをリールアドレスに変換するには、ページ番号を知る必要があります。 論理アドレスに関連付けられているページ番号は、ページテーブルにあります。 各ページの住所もそこに保存されます。 ここで、物理アドレスを取得するために、対応する実際のページアドレスを抽出し、それらをオフセットに追加します:

2.2. 例

プロセスをA、B、Cの3つのページに分割するとします。 プロセスに対応する各ページには、ページ番号(A、5)、(B、6)、(C、7)が関連付けられています。 ここで、ページテーブルでページを見つけるために、CPUはページに関連付けられたページ番号を使用します。 セグメントテーブルには、各ページのページ番号とフレーム番号が格納されます。

CPUは、セグメントテーブルから各ページのフレーム番号を抽出して、物理メモリ内でそれらを見つけます。 オフセットは、フレームのサイズを見つけるのに役立ちます。これは、すでに決定されています。

3. 断片化とそのバリエーション

断片化は、メモリを小さなサイズのブロックに分割するときに発生します。さらに、断片化は本質的に連続していません。 したがって、それらをプロセスに割り当てることはできません。 その結果、プロセスがキューで保留中でメモリを待機している間、メモリには複数の未使用のブロックがあります。 フラグメンテーションは内部または外部のいずれかになります。

内部フラグメンテーションは、物理メモリを連続したマウントサイズのブロックに分割し、要求されたメモリよりも大きくなる可能性のあるプロセスにメモリを割り当てるときに発生します。 したがって、未使用の割り当て済みスペースは残り、他のプロセスで使用することはできません。 最適なブロック検索は、内部フラグメンテーションのソリューションです。

外部フラグメンテーションは、未使用のメモリスペースの合計がすべての割り当て要求に応答するのに十分な場合に発生します。ここでは、メモリは連続していません。 したがって、メモリには空のブロックが散在しており、他のプログラムに割り当てるには不十分です。 Compaction は、外部フラグメンテーションのソリューションです。

4. 内部フラグメンテーションと外部フラグメンテーションの違い

これら2つのタイプの断片化の主な違いについて話しましょう。

5. ページングが内部フラグメンテーションを引き起こすのはなぜですか?

ページングがプログラムを固定サイズのページに分割することはすでに知っています。 ただし、ある時点で、プログラムがページ全体を正確に必要としない場合があります。 したがって、メモリの空きパーティションを残して、未使用のスペースが割り当てられたメモリにつながる可能性があります。 これはまさに、メモリ内で内部フラグメンテーションが発生する方法です。

例を見てみましょう。 それぞれ2KBの同じサイズの2つのブロックに分割されたプログラムを使用しています。 したがって、メモリに4KBの非連続スペースを割り当てます。 しかし、プログラムに必要なのが3KBだけの場合、割り当てられた未使用の1KBスペースがメモリに残り、内部フラグメンテーションが発生します:

ここでは、それぞれ2KBの2つのブロックがあります。 ただし、プログラムは最初のブロックから1.7KB、2番目のブロックから1.3KBを使用しました。 したがって、両方のブロックに2つの割り当てられているが未使用の小さなメモリチャンクが残っています。 これらのメモリチャンクを使用して他のプログラムを割り当てることはできません。したがって、ページングの動作方法により、内部の断片化に対して非常に脆弱になります。

6. ページングで外部フラグメンテーションが発生する可能性はありますか?

プログラムを固定サイズのページに分割する場合、物理メモリも同じサイズのフレームに分割します。 この手法の特徴は、プログラムに割り当てられるスペースが連続していないことです。 したがって、他のプロセスが非連続ブロックを割り当てない場合、他のプログラムで使用できます。ページングにより、非連続メモリブロックを使用できます。

例を見てみましょう。 まず、プログラムを2つの連続しない固定サイズのブロックに分割します。 次に、他のプログラムは、割り当てられていない残りのブロックを使用できます。

ここで、プログラムAは、2つの隣接しない固定サイズのブロックからスペースを割り当てます。 ただし、ブロックにはスペースが残っています。 メモリが連続していないため、プログラムBはブロックから残りのスペースを取得できます。したがって、ページングでの外部フラグメンテーションの可能性は大幅に低くなります。

次に、外部と内部の断片化の例を1つにマージして、明確なアイデアを得ることができます。

7. 結論

このチュートリアルでは、断片化とそのバリエーション、つまり内部および外部の断片化について説明しました。 また、ページングが内部フラグメンテーションに対してより脆弱である理由についても説明しました。