前回までは、プロセス管理について見ていきました。
今回からは、メモリ管理についてまとめていきます。
計算機システム概論 第19回「メモリー管理:メモリー管理アーキテクチャ」 - YouTube
本記事は↑の講義の学習用のまとめです
主記憶装置と物理アドレス
まずは、主記憶装置と物理アドレスについて整理していきましょう。
物理アドレスについては、以下のようにシンプルに表現できます。
物理メモリー : PM[a1, .., an] a1, . . . , an : メモリーアドレス Load(PM, ai, r) : レジスタ r へのメモリーからの読み込み Store(PM, ai, r) : レジスタ r のメモリーへの書き出し
メモリー : PM[a1, .., an]とa1, . . . , an : メモリーアドレス
物理メモリ(physical memory)は、一次元配列です。 メモリにアクセスする時には、アドレス(a1)を指定してあげればよいです。
日常生活でも、モノに名前なり識別子をつけてますよね。アドレスも同じです。
メモリを管理するために、それぞれにアドレスをつけているだけです。 日常でやっていることと同じなので難しいこっちゃないです。
Load(PM, ai, r) Store(PM, ai, r)
Load命令とStore命令も、ざっと整理します。
CPUで演算処理をするためは、メモリからデータを読み込んであげないといけませんよね。 で、演算処理が終わったデータをまたメモリに格納する必要もあります。
ということで、CPU内のレジスタとデータのやりとりをするためにLoad命令とStore命令が存在しています。
Load(PM, ai, r)
命令としてはシンプルで、aiとメモリのアドレスを指定して、r(レジスタ)に格納するという命令になってます。
物理メモリ(physical memory)について
講義では、物理メモリ(physical memory)について
という2点を述べています。
まず、一点目。 なるほど、プロセスにとっては、メモリさえ確保できればよいわけで、実際の物理アドレスの番地が意味を持たないってことですね。
次に2点目。
物理アドレスの配置の仕方は、コンピュータのアーキテクチャによって違うわけです。 よって、メモリ管理は、ハードへの依存するのではなく、仮想化することでメモリ管理を実現するよという話ですね。
では、続いては論理アドレスについて確認していきましょう。
論理メモリ
論理メモリは、以下のように表現できます仮想的なアドレス空間を [1, . . . , n] もつメモリー
論理メモリー : LM[1, .., m] アドレス変換機構 : ϕ ∈ {1, .., m} → {a1, . . . , an} Load(LM, i, r) : レジスタ r へのメモリー LM[i] からの読み込み Store(LM, i, r) : レジスタ r のメモリー LM[i] への書き出し
アドレス変換機構以外は、物理メモリと同じですね。
アドレス変換機構ですが、文字通り、論理アドレスを物理アドレスに変換することです。 これは、ハードウェア上で実装されており、MMU(memory manegement unit)、メモリ管理ユニットの一部ですね。
主記憶割り当て
ここからは一旦講義から離れて参考書籍を読みつつ、理解を深めていこうと思います。
プロセスが主記憶を要求するタイミング
プロセスが主記憶を要求するタイミングは、2つあります。
- 静的な領域要求
- 動的な領域要求
です。
静的な領域要求は、プロセスの実行開始時のタイミングで、 動的な領域要求は、プロセスの実行中に必要になったメモリを確保するタイミングで行われます。
まずは、静的な領域要求から整理していきます。
静的な領域要求とメモリフラグメンテーション
静的な領域要求に対して、どのような方式でメモリ割り当てれば効率よくメモリを管理できるか?という点から整理していきます。
これには2つあり、
- 固定区画方式
- 可変区画方式
があります。
固定区画方式は、固定区画という名の通り、同じ大きさのメモリをプロセスに割り当てるという方法です。可変区画方式は、可変なので同じ大きさではなく、必要な分だけプロセスに割り当てるという方法です。
固定区画方式では、メモリ管理のコストが少なくて済む分、固定値なので確実に空き領域ができてしまうので効率の良いメモリ管理を行うことはできません。
一方で、可変区画方式は、必要な分だけ割り当てるので空き領域が少なくなりそうです。が、メモリ管理をしているうちに可変が故に、メモリの空き領域の大きさがバラバラになってしまいます。
大小の大きさの歯抜けメモリが点在してしまうので、今度はプロセスが要求する分のメモリ領域を探すコストがかかります。
メモリフラグメンテーション
さらには、メモリフラグメンテーション(メモリの断片化)という現象も起こります。 これは、可変のメモリを割り当て&消滅を繰り返した結果、使えない小さな空き領域が大量に残ってしますことです。
日常生活で例えると、、
これも日常生活に置き換えてみてもわかりやすいっすね。
例えば、自分が土地を管理しているとして、、
区画を区切って売り出せば、区画交渉などのコストはかからないですが、購入者にとっては自分の欲しい分だけの土地ではないかもしれないので、不要な面積が出てきてしまい、買ったけど使わない土地が出てきます。
一方で、区画を区切らずに売れば、購入者が必要な分だけ買えますね。しかし、売買を繰り返してしていくと、誰も買わないような小さな土地が点在してしまう。
そんなイメージで理解しました。
ページテーブル方式
では、講義に戻ります。
講義では、仮想メモリと物理メモリのバインディングの方式としてページテーブル方式を解説しています。他にもセグメンテーション方式というやつがあるようですが、ページテーブル方式が決定版だそうです。
ページテーブル方式の原理
まずは、概観から掴んでいきます。
ページテーブル方式は
- 仮想メモリはページに、物理メモリはページフレームにブロック分割する
- ページテーブルでページとページフレームを管理する
- アドレス変換によって、ページとページフレームを紐づける
という方式でメモリ管理をします。
仮想メモリはページに、物理メモリはページフレームにブロック分割する
ページテーブル方式では、仮想メモリ、物理メモリともに同じサイズの固定長のブロックに分割します。その分割したブロックに対して、仮想メモリではページ番号、物理メモリではページフレーム番号をつけます。
で、この点について押さえておきたいポイントは2つあります。
1つ目は、「仮想アドレス空間で連続していても、対応するページフレームは連続している必要はない」という点です。
ナイスアイディアっすね。
これによって、先ほどのメモリフラグメンテーションを気にする必要がなくなります。
2つ目は、「ページはページフレームのみにマッピングされるのではなく、2次記憶上にもマッピングされる」という点です。
この方式によって、物理メモリの容量を超えてメモリ管理をできるようになるということです。
ページテーブルでページとページフレームを管理する
参考書籍をみながら、ページテーブルとページフレームの関係の図を作って見ました。
ページテーブルが何をしているのか、詳しく見ていきましょう。
Vフラグ(Virtual memory flag)
Vフラグは、仮想アドレス上にあるページが物理メモリ上にあるのか、2次記憶上にあるのかを示します。
0の場合は、物理メモリ上にあり、1の場合は、2次記憶上にあります。
もし、2次記憶上にある場合には、どうするか?ですが、2次記憶装置からロードする必要がありますよね。
その際に発生させる割り込みをページフォールト割り込みと呼び、また2次記憶装置からメモリにロードすることをスワップインと呼びます。
Cフラグ(change flag)
Cフラグの前に、ページ置き換え方式について理解していきます。
Vフラグのところで、ページフォールト割り込み、スワップインについて触れましたが、ここの処理をより詳しく確認します。
Vフラグが1の場合に、2次記憶装置からスワップインするわけですが、物理メモリがもし一杯の場合は、どれかを追い出す必要があります。
ページを置き換え、つまりページ置き換え方式です。
で、追い出す時に、追い出されるページが変更の履歴があるかどうかの情報を保持しているのが、Cフラグです。
なぜ、変更されたかどうか?が重要かというと、2次記憶上には常にページのコピーが存在するからです。
つまり、変更されていない場合には、わざわざページを転送する必要がないので、Cフラグで変更履歴の情報を保持しているわけですね。
すばらしいな、良き。
まとめ
今回は、メモリー管理アーキテクチャ:ページテーブル方式について を整理していきました。
参考書籍を読みながら進めたのですが、積読していた本たちの内容が理解できるようになってきていて、感動でぎょざいます。
書籍を読むと、ページテーブルにまつわるアルゴリズムやら色々あるようでしたが、一旦は概要と原理だけを理解すればOkと判断したので、またの機会にします。
僕から以上。あったかくして寝ろよー。