MLOCKALL(2)

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

ライブラリ
libc

書式
<sys/mman.h> int mlockall(int flags) int munlockall(void)

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

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

MCL_CURRENT
    プロセスのアドレス空間に現在マップされている全てのページをロックします。

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

物理メモリは潜在的に欠乏しているリソースであるため、プロセスは どのくらいの量をロックできるのかを制限されています。 1 つのプロセスは最低でもシステム全体に渡る “wired pages” リミットをロック可能で、プロセス当たりの RLIMIT_MEMLOCK リソース制限をロック可能です。

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

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

エラー
mlockall() は以下の場合に失敗します:

[EINVAL]
    flags 引数が 0 であるか、または実装されていないフラグを含んでいます。

[ENOMEM]
    指定された範囲のロックが、システムまたはプロセス当たりのロック可能な メモリの制限を越えます。

[EAGAIN]
    プロセスのアドレス空間にマップされたメモリの一部または全てが、 呼び出しが実行された時にロックできませんでした。

[EPERM]
    呼び出し側のプログラムが、要求された操作を行なうための適切な 権限を持っていません。

関連項目
mincore(2), mlock(2), mmap(2), munmap(2), setrlimit(2)

規格
mlockall() および munlockall() 関数は p1003.1-2001 に適合していると思われます。

歴史
mlockall() および munlockall() 関数は FreeBSD 5.1 ではじめて登場しました。 FreeBSD 5.1.

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