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

名称

mlock, munlockメモリ中の物理的なページをロック (アンロック) する

ライブラリ

Standard C Library (libc, -lc)

書式

#include < sys/mman.h>

int
mlock( const void *addr, size_t len);

int
munlock( const void *addr, size_t len);

解説

mlock() システムコールは、 addr から始まる len バイトの仮想アドレス範囲に関連した物理的なページをメモリにロックします。 munlock() システムコールは、1 つ以上の mlock() 呼び出しによって以前にロックされたページをアンロックします。両方について、 addr 引数は、ページサイズの倍数に整列されるべきです。 len 引数が、ページサイズの倍数でないなら、そのように丸められます。全体の範囲が、割り付けられなければなりません。

mlock() システムコールの後に、指示されたページは、アンロックされるまで、非常駐のページのフォルトもアドレス変換のフォルトも引き起こしません。まだ、それらは、ソフトウェアで管理された TLB があるアーキテクチャで保護違反のフォルト、または TLB ミスのフォルトを引き起こすかもしれません。物理ページは、ページに関するすべてのロックされたマッピングが削除されるまで、メモリに残ります。複数のプロセスは、それら自体の仮想アドレスのマッピングによって同じ物理ページをロックするかもしれません。同様に、単一のプロセスは、同じページの異なる仮想マッピング、または同じアドレス範囲で入れ子にされた mlock() 呼び出しによって多重にロックされたページがあるかもしれません。アンロックは、 munlock() よって明示的に、またはアンマップされたアドレス範囲の割り付け解放する、 munmap() への呼び出しによって暗黙に、実行されます。ロックされたマッピングは、 fork(2) の後に子プロセスによって継承されません。

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

security.bsd.unprivileged_mlock が 0 に設定されるなら、これらの呼び出しは、スーパユーザにだけ利用可能です。

戻り値

Upon successful completion, the value 0 is returned; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

呼び出しが成功するなら、範囲内のすべてのページは、ロック (アンロック) されるようになります。そうでなければ、範囲内のすべてのページのロックされた状態は、変更されません。

エラー

mlock() システムコールは、次の場合に失敗します:
[ EPERM]
security.bsd.unprivileged_mlock が 0 に設定され、呼び出し側がスーパユーザではありません。
[ EINVAL]
与えられたアドレスが整列されたページでないか、または長さが負です。
[ EAGAIN]
指示された範囲をロックすることは、ロックされたメモリに対してシステムの制限を超えています。
[ ENOMEM]
指示されたアドレス範囲の一部分が割り付けられていません。ページのフォルト/マッピングのエラーがありました。指示された範囲をロックすることは、ロックされたメモリに対してプロセスごとの制限を越えています。
munlock() システムコールは、次の場合に失敗します:
[ EPERM]
security.bsd.unprivileged_mlock が 0 に設定され、呼び出し側がスーパユーザではありません。
[ EINVAL]
与えられたアドレスが整列されたページでないか、または長さが負です。
[ ENOMEM]
addr と len 引数によって指定されたアドレス範囲のいくつかまたはすべてが、プロセスのアドレス空間の有効にマップされたページに対応していません。
[ ENOMEM]
指定された範囲によってマップされたページのロックが、プロセスがロックするメモリの合計の制限を越えています。

歴史

mlock() と munlock() システムコールは、 4.4BSD ではじめて登場しました。

バグ

あまりに結合されたメモリを割り当てることは、復旧するリブートを要求する、メモリ割り付けのデッドロックになるかもしれません。

プロセスごとのリソースの制限は、ロックされた仮想記憶の量で制限され、一方、システム全体の制限は、ロックされた物理ページの数に対してです。従って、同じ物理ページの 2 つの個別のロックされたマッピングがあるプロセスは、プロセスごとの制限に対して 2 ページとしてカウントされ、そしてシステム制限で単一のページだけとしてカウントされます。

プロセスごとのリソースの制限は、現在サポートされていません。

March 18, 2013 FreeBSD