メモリ管理とは?
一次元の物理アドレス空間を持つメインメモリ上には、OSの自身だけでなく、複数のアプリケーションプログラムやデータも共存することになる。
↓
どの領域が使用済みor未使用かを管理し、確実に書き込み&読み出しをおこなうことが要求される。(メモリ管理、メモリ保護)
アドレス空間
通常、プログラムは実行可能形式のデータとして補助記憶装置に格納されていて、実行時に物理メモリに読み出す。
多くのOSでは、物理メモリ上の任意の位置にプログラムを配置することができる。
- 物理アドレス:物理メモリ上のアドレス
- 物理アドレス空間:物理アドレスの集合
- 論理アドレス:各プロセスに独立に与えられた、論理的なアドレス
- 論理アドレス空間論理アドレスの集合
上の2つのアドレスの変換は、アドレス変換と呼ばれ、**メモリ管理ユニット(MMU)**と呼ばれるハードウェアを用いて行われる。
スワッピング
スワップアウト
メモリ容量が不足した場合に、時間刻みを使い切ったプロセスを**スワップファイル(スワップ領域)**に書き出して停止し、専有していたメモリ空間を開放する。
スワップアウト
スワップファイル(スワップ領域)から再度メモリに書き戻す。
スワップを繰り返すと、メモリ名にたくさんの利用できない小さな空き領域が生じてしまう。(フラグメンテーション)
解消するには、メモリコンパクションという、小さな細切れの空き領域を大きな空き領域にする処理を行えば良いが
処理コストが大きいので、現実的には困難な場合が多い。
空きメモリ管理
固定区画方式
メモリを固定長の区画に分割してメモリを割り当てる。
各区画へ1つのプロセスを割り当てる単一区画方式と、複数の固定長の区画に分ける多重区画方式がある。
↓
同時に実行可能なプロセスの多重度は、いくつの区画に分割しているかによる区画の数に依存するので、原罪ではあまり利用されていない
可変区画方式
メモリのどの部分が利用可能で、どの部分が使用済みかを記録した表を用いて管理する方法。これが現在のOSでは一般的。
この方式では、大きさの異なる様々な空き領域が生じるので、適切に割り当てることが必要になる。
ファーストフィット
最初に見つかった領域に入れる。
ベストフィット
1番ギリギリで格納できる領域に入れる。
ワーストフィット
ベストフィットの逆
ビットマップによる管理
各ブロックの使用状況をビットマップ(ビットベクトル)で管理する。
連結リストを用いた管理
- 空きもしくはプロセス所有
- その領域の先頭アドレス
- 領域サイズおよび次エントリのアドレス
などをが合わさった構造体を連結させたリストを使って管理する。
仮想記憶
物理メモリ容量より大きなプログラムを動かす場合は、工夫が必要。
↓
メインメモリを抽象化し、巨大で一様な記憶領域である仮想アドレス空間として、物理アドレスから独立させた形で論理アドレス空間を提供する。
オーバーレイ
補助記憶装置上のプログラムを、いくつかの断片に分け、必要に応じてその断片をスワップイン・アウトする。
この手法は、プログラマがどのタイミングでどの部分をスワップするか指定する必要があった、、、
ページング
仮想アドレス空間を、**ページ(page)**と呼ばれる固定長ブロックに分割。
一方、物理アドレス空間を、**ページフレーム(page frame)**と呼ばれる固定長ブロックに分割。
この2つのサイズは同じにするのが一般的。(Linuxは4096バイト)
↓
ページテーブルという対応表を使って、ページとページフレームをマッピングすることで、ペーz単位でメモリを割り当てることができる。(ページイン・ページアウト)
ページングの高速化
ページテーブルをCPUのレジスタにおくことができれば、メモリにアクセスすることなくマッピングを行えるが、ページテーブルのサイズが大きい場合は、ページテーブルの実装にレジスタを使うのは適していない。
↓
そこで、TLB(transration look-aside buffer)または連想メモリと呼ばれる、小型かつ高速な、キャッシュ用の専用ハードウェアを利用することが一般的。
大容量仮想記憶でのページテーブル
逆ページテーブル法と呼ばれる、物理アドレス空間のページフレームごとにエントリを作成する方法がある。