mlock(2) FreeBSD 一般コマンドマニュアル

mlock

前のページ 上に戻る 次のページ

mlock




書式

     #include <sys/types.h>
     #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 ミ
     スフォルトを起こす可能性はあります。ページに関するすべてのロックされた
     マッピングが削除されるまで物理ページはメモリに留まります。複数のプロセス
     が、それぞれの仮想アドレスマッピングから同じ物理ページをロックする可能性
     があります。同様に、1 つのプロセスが同じページに対する異なる複数の仮想
     マッピングによって、または同じアドレス範囲へのネストした mlock() 呼び出し
     によって、ページを多重にロックする可能性があります。アンロックは、
     munlock() によって明示的に、または munmap() によって暗黙的に行われます。
     munmap() はマップされていないアドレス範囲の割り当てを解除します。ロックさ
     れたマッピングは fork(2) による子プロセスには継承されません。

     物理メモリは潜在的に乏しいリソースなので、プロセスはどのくらいロックでき
     るかの制限を受けます。 1 つのプロセスは、システム全体に共通の ``固定され
     たぺージ'' 限界、またはプロセスごとの RLIMIT_MEMLOCK リソース限界のいずれ
     か小さい方の値まで mlock() できます。

     これらの呼び出しが利用できるのはスーパユーザだけです。


戻り値

     成功して終了したときには値 0 を返します。そうでない場合、値 -1 が返され、
     グローバル変数 errno が設定されてエラーを示します。

     呼び出しが成功すると、範囲内のすべてのページがロック (アンロック) されま
     す。失敗した場合は、範囲内のすべてのページのロック状態は変更されません。


エラー

     mlock() は次の場合に処理を失敗します。

     [EPERM]            呼び出し側がスーパユーザではありません。

     [EINVAL]           指定されたアドレスがページ境界に整列されていないか、ま

     [ENOMEM]           指示されたアドレス範囲の一部が割り当てられていません。
                        指示されたアドレス範囲の一部がロックされていません。


関連項目

     fork(2), mincore(2), minherit(2), mmap(2), munmap(2), setrlimit(2),
     getpagesize(3)


バグ

     Sun の実装と異なり、同じアドレス範囲に関する複数の mlock() 呼び出しに対し
     て、実際にページをアンロックするために対応する数の munlock() 呼び出しが必
     要です。つまり mlock() のネストです。これは実装上の結果であって仕様ではな
     いと考える必要があります。

     プロセスごとのリソースの限界はロックされた仮想メモリの量への制限で、シス
     テム全体に共通の制限はロックされた物理ページの数についてのものです。この
     ように、2 つの別々のマッピングから同じ物理ページをロックするとプロセスご
     との制限に対しては 2 ページとしてカウントされ、システム制限では 1 ページ
     だけとしてカウントされます。

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


歴史

     mlock() 関数と munlock() 関数は 4.4BSD ではじめて登場しました。

FreeBSD 4.4                      June 2, 1993                      FreeBSD 4.4

ABELNET VPSサービス