MLOCKALL(2)

名前
mlockall - 呼び出したプロセスのページングを禁止する

書式
#include <sys/mman.h>

int mlockall(int flags);

説明
mlockall 呼び出したプロセスのアドレス空間にマップされている全てのページの ページング(paging)を禁止する。これにはコード、データ、スタックの 各セグメント、共有ライブラリ、カーネルのユーザー空間データ、 共有メモリ、メモリ・マップされたファイルを含んでいる。 mlockall システム・コールが成功した場合には全てのマップされたページは RAM に 残り続けることを保証される、そして munlock や munlockall によってページがアンロックされたり、プロセスが終了したり、 exec によって他のプログラムを開始したりするまでは RAM に残ることが 保証される。 fork を行なった場合に子プロセスはページのロックを継承しない。 メモリのロックには主に二つの使い道がある。リアル・タイム(real-time) アルゴリズムと高いセキュリティのデータ処理である。リアル・タイムの アプリケーションは決定的なタイミングやスケジューリングを要求し、 ページングは予期しないプログラムの実行遅れをもたらす重要な要因である。 リアル・タイムのアプリケーションはたいていは sched_setscheduler でリアル・タイム・スケジュラーに変更される。 暗号やセキュリティのソフトウェアはしばしばパスワードや秘密鍵のデータの のような重要なバイトをあつかう。ページングの結果、これらの秘密が スワップ用の固定媒体に転送されるかもしれない。そしてそれはセキュリティ ・ソフトウェアが RAM 上の秘密を削除して終了したずっと後にでも敵によって アクセスが可能になるかもしれない。セキュリティ・アプリケーションでは メモリのほんの小さな部分のみがロックされなければならない。そのために mlock が使用できる。 flags パラメーターは以下の内容の論理的 OR からなる:

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

MCL_FUTURE
    将来、プロセスのアドレス空間にマップされる全てのページをロックする。 これは例えば、成長するヒープ(heap)やスタックの他に 新しいメモリ・マップされたファイルや共有メモリ領域などに必要となる。

MCL_FUTURE が指定されており、ロックされたページの数がロックすることができるページ数の 上限を超えた場合には、新しくページをマップするシステム・コールは ENOMEM となって失敗する。 成長するスタックによって新しいページがマップされる場合は、カーネルは スタックの拡張を拒否し、 SIGSEGV を送る。 リアル・タイム・プロセスは関数呼び出しでページ・フォールトが発生しない ように時間が致命的な部分に入る前に十分なロックされたスタックを確保して おく必要がある。これは十分に大きな自動変数を確保する関数を呼び出し、 これらのスタック用のページがメモリに確保されるようにこの大きな配列に 書き込みを行なうことによって達成できる。この方法によって十分なページが スタックにマップされ、RAM にロックされる。ダミーの書き込みは致命的な 部分で書き込み時コピー(copy-on-write)によるページ・フォールトさえ 起きないことを保証する。 メモリのロック(lock)は累積しない。例えば複数回 mlock や mlockall を呼び出してロックされたページも一回の munlockall によってアンロック(unlock)される。 複数の場所や複数のプロセスにマップされているページは、少なくとも一つの場所、 一つのプロセスでロックされている限りは RAM に残り続ける。 mlockall と munlockall が使用可能である POSIX システムでは _POSIX_MEMLOCK が <unistd.h> に定義されている。

返り値
成功した場合は、 mlockall はゼロを返す。エラーの場合は、-1 が返され、 errno が適切に設定される。

エラー

ENOMEM
    許される上限を超える数のページをロックしようとした。

EPERM
    呼び出したプロセスが適切な特権を所有していない。 スーパー・ユーザーのプロセスのみがページをロックすることができる。

EINVAL
    未知のフラグが指定された。

準拠
POSIX.1b, SVR4. SVr4 には他に EAGAIN エラーについての記述がある。

関連項目
munlockall(2), mlock(2), munlock(2).