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]
- 指示されたアドレス範囲の一部分が割り付けられていません。ページのフォルト/マッピングのエラーがありました。指示された範囲をロックすることは、ロックされたメモリに対してプロセスごとの制限を越えています。
- [ EPERM]
- security.bsd.unprivileged_mlock が 0 に設定され、呼び出し側がスーパユーザではありません。
- [ EINVAL]
- 与えられたアドレスが整列されたページでないか、または長さが負です。
- [ ENOMEM]
- addr と len 引数によって指定されたアドレス範囲のいくつかまたはすべてが、プロセスのアドレス空間の有効にマップされたページに対応していません。
- [ ENOMEM]
- 指定された範囲によってマップされたページのロックが、プロセスがロックするメモリの合計の制限を越えています。
関連項目
fork(2), mincore(2), minherit(2), mlockall(2), mmap(2), munlockall(2), munmap(2), setrlimit(2), getpagesize(3)歴史
mlock() と munlock() システムコールは、 4.4BSD ではじめて登場しました。バグ
あまりに結合されたメモリを割り当てることは、復旧するリブートを要求する、メモリ割り付けのデッドロックになるかもしれません。プロセスごとのリソースの制限は、ロックされた仮想記憶の量で制限され、一方、システム全体の制限は、ロックされた物理ページの数に対してです。従って、同じ物理ページの 2 つの個別のロックされたマッピングがあるプロセスは、プロセスごとの制限に対して 2 ページとしてカウントされ、そしてシステム制限で単一のページだけとしてカウントされます。
プロセスごとのリソースの制限は、現在サポートされていません。
March 18, 2013 | FreeBSD |