プロセスの仮想空間
分類 | 内容 |
ローカルメモリ操作 | プロセス毎にもつヒープ領域の操作 |
共有メモリ操作 | すべてのプロセス |
get_lmb() を使用する場合、取得したいローカルメモリのサイズをバ イト単位で指定します。get_lmb() は、取得サイズをページサイズに 切上げてから仮想メモリを取得します。
仮想メモリ(ページ) を取得するとき、ページの属性として NULL ページを指 定します。ユーザプロセスが該当ページをアクセスしたとき、メモリ管理マネー ジャは物理メモリ(ページ)を割り当てます。そのときページ内容は 0 でクリ アします。
get_lmb() によって、取得した仮想メモリ領域はユーザプロセスが終 了した時点で解放されます。もし、仮想メモリ領域をアクセスしているプロセ スがひとつだけの場合には、仮想メモリ領域にマッピングしていた物理メモリ ページも解放します。
ローカルメモリ操作用のシステムコールは、次のものがあります
関数名 | 内容 |
get_lmb | ローカルメモリを取得する |
rsz_lmb | 取得したローカルメモリのサイズを変更する |
rel_lmb | ローカルメモリを解放する |
lmb_siz | ローカルメモリのサイズを測定する |
lmb_sts | ローカルメモリに関する情報を取得する |
関数名 | 内容 |
cre_mpl | メモリプールの獲得 |
del_mpl | メモリプールの削除 |
get_smb | 共有メモリのブロックを取得する |
rel_smb | 共有メモリのブロックを解放する |
rea_smb | 共有メモリのブロックの内容を読み取る |
wri_smb | 共有メモリのブロックに書き込む |
smb_adr | 共有メモリブロックのアドレスの取得 |
smb_key | 共有メモリブロックのアクセスキーを取得する |
get_sma | 共有メモリブロックの属性情報を取得する |
set_sma | 共有メモリブロックの属性情報を設定する |
get_smi | 共有メモリブロックのユーザ情報のとりだし |
set_smi | 共有メモリブロックのユーザ情報の設定 |
smb_sts | 共有メモリブロック情報の取得 |
mpl_sts | 共有メモリプール状態の取得 |
共有メモリは、共有メモリブロックを取得することによって、使用できます。
共有メモリブロックはメモリプール中にあるメモリ領域のうち指定したサイズ の領域のことを言います。このメモリブロックへのアクセスはブロックを取得 したプロセス以外にも、アクセスキーを取得したプロセスならばアクセスする ことができます。
アクセスキーが、ないプロセスの場合には共有メモリブロックへのアクセスは できません。アクセスキーは、smb_key() システムコールによって 取得することができます。
関数名 | 内容 |
map_mem | 実メモリのマップ |
ump_mem | 実メモリのアンマップ |
add_swap | スワップデバイス/ファイルの追加 |
del_swap | スワップデバイス/ファイルの登録取り消し |
通常のメモリを使用する場合には、これらのシステムコールを使う必要はあり ません。これらのシステムコールは次の目的のために使用できます。
なお、仮想空間はプロセスごとに分離している固有空間とすべてのプロセスで 共通にアクセス可能な共有空間の2つがあります。{\tt map_mem()} は、両方 の種類の仮想空間に物理メモリを割り付けることができます。
固有空間に物理メモリをマッピングした場合、マッピングしたプロセスがいな くなると自動的にマップを解除します。
共有空間にマッピングした場合、共有空間が破棄されるまでマッピングは解除 しません。共有空間にアクセスしたプロセスがいなくなってもマッピングは保 持したままです。
add_swap は、スワップデバイスを追加します。
メモリ管理マネージャは、いくつかのモジュールに分かれています。
それぞれのモジュールは、次の処理を行います。
要求受け付けモジュール | メモリ管理マネージャへの要求メッセージの受信処理を行います。 受信したメッセージの要求の種類ごとに処理モジュールを呼び出します。 そして最後に処理した結果を要求メッセージを送信元へ送ります。 処理要求メッセージには、ページフォールトへの対応処理も含まれます。 |
ページアウト可能ページ選択モジュール | ページアウト可能な仮想ページを選択します。 このモジュールは、ハードウェアの情報を見るためカーネルモードで動 作します。 |
ページアウトモジュール | ページアウト可能ページ選択モジュールが選択したページを二次記憶装 置に記録し、物理メモリを解放します。 |
他の周辺核と違っているのは、メモリ管理マネージャはカーネルモードで動作 しているモジュールがあるということです。
メモリ管理マネージャは、各プロセスのもっている仮想メモリ領域の各ページ の情報を管理しています。
各ページの管理情報は、図 のようになっています。
仮想ページの管理情報
仮想ページの管理情報は、仮想メモリページがページアウト時の場合と実メモ リにマッピングしている場合とで異なった情報を管理しています。
ページアウト中の仮想メモリページは、属性情報の他にスワップデバイスまた はファイルを示すインデックスとスワップデバイス中の位置の2つの情報を保 持しています。
仮想メモリページが物理メモリをマッピングしている場合、物理メモリのペー ジ番号によって物理メモリの位置を保持します。 この情報はページアウト時の処理で使用します。
ページの属性 | 内容 |
ページアウト中ページ | スワップエリアにページアウトしている状態。 ページフォールトが発生したときには、スワッ プからページの内容をもってきます |
NULL ページ | 物理ページは割り当てていない。ページフォールト したときは、NULL クリアするページ |
未変更ページ | 物理メモリにマップしている。内容を変更していな いページ。物理ページを再使用する場合に中身を保存 する必要はありません |
変更済ページ | 物理メモリにマップしている。内容を変更したペー ジ。物理ページを再使用する場合には、ページアウ トして内容を保存する必要があります |
ページイン中 | ページインの途中であることを示します。ページイ ン処理が終るまで、このページをアクセスしようと したプロセスは、SUSPEND されます |
ページ属性 | 処理 |
ページアウト中ページ | ページアウト後、物理メモリを解放せずにも との内容をそのまま使用する |
NULL ページ | 物理メモリをマップし、ページの内容を NULL クリ アする |
未変更ページ | ページフォールトは発生しない |
変更済ページ | ページフォールトは発生しない |
ページイン中 | ページイン処理が終わるまで SUSPEND |
そのため、ページフォールトの発生および対応をメモリマネージャに通知する ための仕組みが必要になります。
ページフォールトの発生から、メモリマネージャがページフォールトを処理す るまでのフローは、次のようになります。
for (すべてのタスクの最初から最後まで) { for (タスクのマップテーブルの最初から最後まで) { アクセスビットをクリア。 } } for (すべてのタスクの最初から最後まで) { for (タスクのマップテーブルの最初から最後まで) { アクセスビットをチェック。 もし、アクセスビットが立っていなかった(クリアしてから今まで 誰もアクセスしていない)場合には、ページアウト可能ページとして ユーザモードで動いているモジュールに情報を送信。 } }
ページアウト処理は、全実メモリサイズのうち空きページの割合によってペー ジアウトする頻度を調節します。
ページアウトの頻度は、図のようになります。 定数 PAGE_MAX_FREE で示す数値より多く空いている実メモリがある 場合、ページアウト処理は行いません。空いている実メモリが PAGE_MAX_FREE よりも少くなった場合、PAGE_MIN_FREE よりも 多い場合には、ユーザプロセスを実行したままページアウト処理を行います。 さらに、PAGE_MIN_FREE よりも空いている実メモリが少なくなった場合、 メモリ管理マネージャは、緊急処理モードに入ります。ページアウトモジュー ルのもっているタスクのプライオリティを上げ、ユーザプロセスのもつタスク を停止させます。そして、実メモリをマッピングしている仮想ページのうち、 未変更ページをすべてパージします。もし、これでも PAGE_MIN_FREE より空きメモリが増えなかった場合、変更済ページをページアウトします。
ページアウト仮想ページの選択モジュールが選んだページアウト可能な仮想ペー ジは、ユーザレベルで動作しているモジュールが行います。
このモジュールは、ページアウト可能なページの内容を中心核のシステムコー ル (vrea_reg())を使って読み取ります。このシステムコールは、指定 したタスクの任意のページの内容を読み取ることができます。
次に、読み込んだページの内容を二次記憶装置に書き込みます。 そのとき、単に二次記憶装置に書き込んだだけではページインの時に困ってし まうので、メモリマネージャのもつ仮想ページテーブルにどこにページアウト したかを記録します。
このテーブルは、ページインのときにどこから読み取ればいいかを決定するた めに参照します。
ページアウトは、スワップ領域が HD のパーティションとして独立している場 合には、デバイスマネージャを、BTRON 上の独立したファイルがスワップ用と して使われている場合には、ファイルマネージャを介して出力します。