EN JA
MLOCKALL(2)
MLOCKALL(2) FreeBSD System Calls Manual MLOCKALL(2)

名称

mlockall, munlockallプロセスのアドレス空間のロック (アンロック)

ライブラリ

Standard C Library (libc, -lc)

書式

#include < sys/mman.h>

int
mlockall( int flags);

int
munlockall( void);

解説

mlockall() システムコールは、プロセスのアドレス空間に関連付けられた物理ページを、そのアドレス空間がアンロックされるまで、またはプロセスが終了するまで、または他のプログラムイメージを exec するまでの間、メモリ内にロックします。

以下のフラグは mlockall() の振舞いに影響します:

MCL_CURRENT
プロセスのアドレス空間に現在マップされている全てのページをロックします。
MCL_FUTURE
将来プロセスのアドレス空間にマップされる全てのページを、マッピングが確立する時点でロックします。これらのマッピングがリソースの制限の超過を引き起こす場合には、将来のマッピングの失敗を引き起こすかもしれないことに、注意してください。

物理メモリは、潜在的に欠乏しているリソースであるため、プロセスはどのくらいの量をロックできるのかを制限されています。単一のプロセスは、最小のシステム全体の“決め打ちされたページ” (wired pages) の制限 vm.max_wired とプロセスごとの RLIMIT_MEMLOCK リソース制限をロックすることができます。

security.bsd.unprivileged_mlock が 0 に設定されるなら、これらの呼び出しは、スーパユーザにだけ利用可能です。 vm.old_mlock が 1 に設定されるなら、プロセスごとの RLIMIT_MEMLOCK リソース制限は、 mlockall() 呼び出しに対して適用されません。

munlockall() 呼び出しは、プロセスのアドレス空間の中の全てのロックされたメモリ領域をアンロックします。 munlockall() 呼び出し後にマップされる全ての領域は、ロックされません。

戻り値

戻り値 0 は、呼び出しが成功し、その範囲内の全てのページがロックまたはアンロックされたことを示します。戻り値-1 は、エラーが発生し、その範囲内の全てのページのロック状態が変更されないまま残されていることを示します。この場合、グローバル変数 errno がそのエラーを示すために設定されます。

エラー

mlockall() は、次の場合に失敗します:
[ EINVAL]
flags 引数が 0 であるか、または実装されていないフラグを含んでいます。
[ ENOMEM]
指定された範囲のロックが、システムまたはプロセス当たりのロック可能なメモリの制限を越えます。
[ EAGAIN]
プロセスのアドレス空間にマップされたメモリの一部または全てが、呼び出しが実行された時にロックできませんでした。
[ EPERM]
呼び出し側のプログラムが、要求された操作を行なうための適切な権限を持っていません。

規格

mlockall() と munlockall() 関数は、 IEEE Std 1003.1-2001 (“POSIX.1”) に適合すると確信しています。

歴史

mlockall() と munlockall() 関数は、 FreeBSD 5.1 ではじめて登場しました。

バグ

プロセス当たりのリソースの制限は、ロックされた仮想メモリの量について制限されます。その一方、システム全体での制限は、ロックされた物理ページの数についての制限です。そのために、同一の物理ページに対する 2 つの別個のロックされたマッピングを持つプロセスは、プロセス当たりの制限に対しては、2 ページとしてカウントし、システム制限では、ただ 1 つのページとしてカウントします。
December 25, 2012 FreeBSD