システムインタフェース

概要

SunOS 5.0 から 5.8 では、プロセスのメモリ常駐性は、プロセスの現在の状態、使用できる全物理記憶、有効なプロセス数、およびプロセッサのメモリに対する要求によって決まります。これは、タイムシェアリング環境には適合しますが、実時間プロセスについては受け入れられないことがよくあります。実時間環境では、プロセスは、メモリアクセスとディスパッチ中の潜在的な時間を減らすために、プロセスの全部または一部がメモリ内に常駐していることが保証される必要があります。

SunOS 5.0 から 5.8 の実時間では、メモリロッキングはスーパーユーザ特権付きで実行されているプロセスが、自分の仮想アドレス空間の指定された部分を物理記憶にロッキングできるようにするライブラリルーチンのセットによって提供されています。このようにしてロッキングされたページは、ロッキングを解除されるか、プロセスが終了するまでページングの対象になりません。

一度にロッキングできるページ数には、システム全体で共通の制限があります。これは調整可能なパラメタで、デフォルト値は起動時に計算されます。値は、ページフレーム数マイナス一定のパーセント (現在は 10 パーセントに設定) が基本になります。

ページのロッキング

mlock(3C) は、メモリの 1 セグメントをシステムの物理記憶にロッキングするように要求します。指定したセグメントを構成するページは、ページフォルトが発生して物理記憶に入り、各ロッキングカウント値は 1 増やされます。ロッキングのカウントが 0 より大きいページは、ページング操作から除外されます。

特定のページを異なったマッピングで複数のプロセスを使って何度もロッキングできます。2 つの異なったプロセスが同じページをロッキングすると、両方のプロセスがロッキングを解除するまで、そのページはロッキングされたままです。ただし、マッピング内でページロッキングはネストしません。同じアドレスに対して同じプロセスがロッキング関数を何度も呼び出した場合でも、ロッキングは一度のロッキング解除要求で削除されます。

ロッキングが実行されているマッピングが削除されると、そのメモリセグメントのロッキングは解除されます。ファイルを閉じるまたは切り捨てることによってページが削除された場合も、ロッキングは解除されます。

fork(2) 呼び出しが行われた後、ロッキングは子プロセスには継承されません。したがって、メモリをロッキングしているプロセスが子プロセスをフォークすると、子プロセスはページをロッキングするために、自分でメモリロッキング操作を行わなければなりません。そうしないと、プロセスをフォークした場合に通常必要となるページのコピー即時書き込みを行わなければならなくなります。

ページのロッキング解除

メモリによるページのロッキングを解除するには、プロセスは munlock(3C) 呼び出しによって、ロッキングされている仮想記憶のセグメントを解放するように要求します。こうすると、指定された物理ページのロッキングカウントが減らされます。ページのロッキングカウントが 0 まで減ると、そのページは普通にスワップされます。

全ページのロッキング

スーパーユーザプロセスは、mlockall(3C) 呼び出しによって、自身のアドレス空間内の全マッピングをロッキングするように要求できます。MCL_CURRENT フラグが設定されている場合は、既存のメモリマッピングがすべてロッキングされます。MCL_FUTURE フラグが設定されている場合は、既存のページに追加されるか、既存のマッピングを置き換えるマッピングはすべてメモリ内にロッキングされます。

スティッキロッキング

ページのロッキングカウントが 65535 (0xFFFF) に達すると、そのページは永久にロッキングされます。0xFFFF の値は実装の際に定義されているため、将来のリリースでは変更される可能性があります。このようにしてロッキングされたページは、ロッキングを解除できません。復元するにはシステムを再起動してください。