ページング
[Wikipedia|▼Menu]

ページング方式 (Paging) とは、コンピュータオペレーティングシステムにおいて記憶装置をページと呼ばれる小さな単位に分割して割り当てを行うアルゴリズム群である。仮想記憶のベースとなる設計の一つ。

物理メモリ空間および論理メモリ空間を、基本的に一定サイズのページと呼ばれる単位に分割して管理を行う。論理メモリから物理メモリ空間への対応づけはページテーブルと呼ばれる構造体で実現され、この構造体はオペレーティングシステム (OS) によって管理される。物理メモリ空間に対応づけられていない論理メモリを参照した時にはページフォルトという例外によってOS側の例外処理ルーチンに制御が移行し、OS側の管理によって適宜対応したページを二次記憶等から読み込み、テーブルを更新してその参照した命令の実行に戻る。

これを実現するハードウエアであるメモリ管理ユニット (MMU) の中にはトランスレーション・ルックアサイド・バッファ (Translation Lookaside Buffer:TLB) と呼ばれる一種のキャッシュがあり、ユニット内部ではこの対応表に基づいてメモリアドレスの対応づけを行っている。このテーブルから参照出来なかったときをTLBミスと呼ぶ。このときの処理はMMUの設計によって異なり、MMU内にはTLBのみを持ちTLBミスが即例外を起こし、OSがページテーブルを引いてTLBに追加することによってTLBミスを解決するアーキテクチャや、ページテーブル自体のフォーマットがOSが使えるビットを含めた形でMMUによって定義されていて、TLBミス時にMMU自身が与えられた物理アドレスにあるページテーブルを参照するアーキテクチャもある。
利点

他の動的メモリアロケーションに比較して、ページング方式ではプログラムに割り当てるメモリが連続である必要がなく、大きなフラグメンテーション(外部断片化)がほとんど発生しないため、メモリを無駄にしない[1]

プログラムは、ある時点でそのコードとデータを全て使用するわけではない(参照の局所性)。そのため、必要に応じてページをディスクに書き込んだり、ページの内容をディスクから読み込んだりすることで仮想記憶のコンセプトを実装できる。この点もページング方式が他のメモリアロケーション手法よりも優れている点である。
欠点

ページング方式の主な問題点は、それを実装するコードが相対的に複雑になる点であり、特に仮想記憶を実現しようとすると複雑化する。他にはMMUが必要になるという問題もあり、古くて小さいマイクロプロセッサでページングを実装するのは困難である(例えば、x86シリーズでは、i386以上でないとページングをサポートしたMMUがない)。また、ページ単位以下の小さなメモリを要求されてもページ単位でしか割り当てられないというフラグメンテーション(内部断片化)問題もある。
動作原理ページング方式のアドレス変換の概念図

ページング方式では、実際のメモリアクセスはページテーブルを使用してメモリ管理ユニットがハードウェアレベルで制御する。前述の通り、物理メモリはページと呼ばれる小さなブロックに分割される。各ページにはページ番号が付与される。OSは未使用のページのリストを保持するか、メモリ使用要求があったときに毎回メモリを調べる(最近のOSでは前者の実装が一般的)。いずれにしても、プログラムがメモリを要求したとき、OSがそのプログラムに何ページかのメモリを割り当て、それをプログラム(プロセス)毎に割り当て中のページを管理するリストに入れておく(訳注:ページそのものはプログラムが使用するので、それをリストに入れるわけではなく、物理ページを管理するデータ構造を別途作成してリストに入れる)。具体例を以下に示す。

以下のような順番でページの割り当てが行われたときのページアロケーションリストをテーブルに示す。
プログラムAが3ページのメモリを要求

プログラムCが2ページのメモリを要求

プログラムDが2ページのメモリを要求

プログラムCが終了し、2ページが解放される

プログラムBが3ページのメモリを要求し、先にCが解放した2ページを割り当て、さらに残りの1ページを割り当てる

ページ番号ページ割り当て先物理メモリアドレス
0プログラム A.01000:0000
1プログラム A.11000:1000
2プログラム A.21000:2000
3プログラム B.01000:3000
4プログラム B.11000:4000
5プログラム D.01000:5000
6プログラム D.11000:6000
7プログラム B.21000:7000

結果として、各プログラムのページテーブルには、以下のようなマッピングが格納される(「プログラムのページ番号 → OSのページ番号」)。

プログラムA: 0 → 0、1 → 1、2 → 2

プログラムB: 0 → 3、1 → 4、2 → 7

プログラムD: 0 → 5、1 → 6

ここで、プログラムが自身に割り当てられたメモリにアクセスしようとしたときに何が起きるかを示す。プログラムA が "LOAD memory at 20FE"(20FE番地からロード)という命令を実行したとする。

20FE(16進数)を2進数表記すると(16ビットシステムでは) 0010000011111110 となる。ページサイズは4Kバイトとする。従って、20FE番地のメモリ参照要求を受けると MMU は以下のようにこのアドレスを見る。0010000011111110 = 20FE|__||__________。。 。。 v v ページ内相対メモリアドレス (00FE)ページ番号 (2)

ページサイズが4096バイトなので、MMUはアドレスの先頭(最上位桁ビット群)4ビットをページ番号、残りの12ビットをページ内相対メモリアドレスとして扱う。ページサイズが2048バイトなら、MMUは先頭5ビットをページ番号、残り11ビットをページ内相対メモリアドレスとして扱うだろう。つまり、ページサイズが小さければページ数が多くなる。

従って、このメモリアクセス要求がなされると、MMUはそのプログラムのページテーブルを参照してマッピングされているOSのページ番号を得る。この例の場合、プログラムAの2番目のページはOSの2番目のページにマップされている。次いで、OSページ番号に対応する物理マッピングを得る。2番目のOSページは物理メモリアドレス 1000:2000 に対応しており、プログラムが参照しようとしているアドレスのページ内相対アドレスは 00FE なので、MMU は物理アドレス 1000:20FE の位置のメモリにアクセスする。

以上はあくまでも概略である。最近のコンピュータ・アーキテクチャでは様々な手段でページングを高速化している。


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:53 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef