Man page - munlockall(2)

Packages contains this manual

Available languages:

en fr ja ru de

Manual

MLOCK

名 前
書 式
説 明
mlock(), mlock2(), munlock()
mlockall() と munlockall()
返 り 値
エ ラ ー
バ ー ジ ョ ン
準 拠
注 意
Linux で の 注 意
制 限 と 権 限
バ グ
関 連 項 目
こ の 文 書 に つ い て

名 前

mlock, mlock2, munlock, mlockall, munlockall - メ モ リ ー の ロ ッ ク と ロ ッ ク 解 除 を 行 う

書 式

#include <sys/mman.h>

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

int mlockall(int flags );
int munlockall(void);

説 明

mlock () と mlockall () は 、 呼 び 出 し 元 プ ロ セ ス の 仮 想 ア ド レ ス 空 間 の 一 部 ま た は 全 部 を RAM 上 に ロ ッ ク し 、 メ モ リ ー が ス ワ ッ プ エ リ ア に ペ ー ジ ン グ さ れ る の を 防 ぐ 。

munlock () と munlockall () は 逆 の 操 作 で 、 そ れ ぞ れ 呼 び 出 し 元 プ ロ セ ス の 仮 想 ア ド レ ス 空 間 の 一 部 ま た は 全 部 を ロ ッ ク 解 除 す る 。 つ ま り 、 指 定 さ れ た 仮 想 ア ド レ ス 範 囲 の ペ ー ジ は カ ー ネ ル メ モ リ ー マ ネ ー ジ ャ ー か ら 要 求 さ れ れ ば ス ワ ッ プ ア ウ ト す る よ う に な る 。 メ モ リ ー の ロ ッ ク と ロ ッ ク 解 除 は ペ ー ジ 単 位 で 行 わ れ る 。

メ モ リ ー の ロ ッ ク と ロ ッ ク 解 除 は ペ ー ジ 単 位 で 行 わ れ る 。

mlock(), mlock2(), munlock()

mlock () は addr か ら 始 ま る 長 さ len バ イ ト の ア ド レ ス 範 囲 の ペ ー ジ を ロ ッ ク す る 。 呼 び 出 し が 成 功 し た 場 合 に は 、 指 定 さ れ た ア ド レ ス 範 囲 を 含 む 全 て の ペ ー ジ は RAM に 残 り 続 け る こ と が 保 証 さ れ る 。 こ れ ら の ペ ー ジ は 後 で ロ ッ ク 解 除 さ れ る ま で RAM に 残 り 続 け る こ と が 保 証 さ れ る 。

mlock2 () also locks pages in the specified range starting at addr and continuing for len bytes. However, the state of the pages contained in that range after the call returns successfully will depend on the value in the flags argument.

The flags argument can be either 0 or the following constant:
MLOCK_ONFAULT

Lock pages that are currently resident and mark the entire range so that the remaining nonresident pages are locked when they are populated by a page fault.

If flags is 0, mlock2 () behaves exactly the same as mlock ().

munlock () は 、 addr か ら 始 ま る 長 さ len バ イ ト の ア ド レ ス 範 囲 の ペ ー ジ の ロ ッ ク を 解 除 す る 。 こ の 呼 び 出 し を 行 っ た 後 は 、 カ ー ネ ル が 、 指 定 さ れ た メ モ リ ー 範 囲 を 含 む 全 て の ペ ー ジ を 外 部 の ス ワ ッ プ 空 間 に 移 動 で き る よ う に な る 。

mlockall() と munlockall()

mlockall () は 呼 び 出 し 元 プ ロ セ ス の ア ド レ ス 空 間 に マ ッ プ さ れ て い る 全 て の ペ ー ジ を ロ ッ ク す る 。 こ れ に は コ ー ド 、 デ ー タ 、 ス タ ッ ク の 各 セ グ メ ン ト 、 共 有 ラ イ ブ ラ リ 、 カ ー ネ ル の ユ ー ザ ー 空 間 デ ー タ 、 共 有 メ モ リ ー 、 メ モ リ ー マ ッ プ さ れ た フ ァ イ ル が 含 ま れ る 。 シ ス テ ム コ ー ル が 成 功 し た 場 合 に は 全 て の マ ッ プ さ れ た ペ ー ジ は RAM に 残 る こ と を 保 証 さ れ る 。 こ れ ら の ペ ー ジ は 後 で ロ ッ ク 解 除 さ れ る ま で RAM に 残 り 続 け る こ と が 保 証 さ れ る 。

flags 引 数 は 以 下 の 内 容 の 一 つ ま た は 複 数 の ビ ッ ト OR か ら 構 成 さ れ る :
MCL_CURRENT

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

MCL_FUTURE

将 来 、 プ ロ セ ス の ア ド レ ス 空 間 に マ ッ プ さ れ る 全 て の ペ ー ジ を ロ ッ ク す る 。 例 え ば 、 ヒ ー プ (heap) や ス タ ッ ク の 成 長 に よ り 新 し く 必 要 に な っ た ペ ー ジ だ け で な く 、 新 し く メ モ リ ー マ ッ プ さ れ た フ ァ イ ル や 共 有 メ モ リ ー 領 域 も ロ ッ ク さ れ る 。

MCL_ONFAULT (Linux 4.4 以 降 )

Used together with MCL_CURRENT , MCL_FUTURE , or both. Mark all current (with MCL_CURRENT ) or future (with MCL_FUTURE ) mappings to lock pages when they are faulted in. When used with MCL_CURRENT , all present pages are locked, but mlockall () will not fault in non-present pages. When used with MCL_FUTURE , all future mappings will be marked to lock pages when they are faulted in, but they will not be populated by the lock when the mapping is created. MCL_ONFAULT must be used with either MCL_CURRENT or MCL_FUTURE or both.

MCL_FUTURE が 指 定 さ れ て い る と 、 以 後 の シ ス テ ム コ ー ル (例 え ば 、 mmap (2), sbrk (2), malloc (3)) は 、 ロ ッ ク す る バ イ ト 数 が 許 可 さ れ た 最 大 値 (下 記 参 照 ) を 超 え た 場 合 に 失 敗 す る 可 能 性 が あ る 。 同 様 に 、 ス タ ッ ク の 成 長 も 失 敗 す る 可 能 性 が あ る 。 そ の 場 合 、 カ ー ネ ル は ス タ ッ ク の 拡 張 を 拒 否 し 、 SIGSEGV を プ ロ セ ス に 送 る 。

munlockall () は 、 呼 び 出 し 元 プ ロ セ ス の ア ド レ ス 空 間 に マ ッ ピ ン グ さ れ て い る 全 て の ペ ー ジ を ロ ッ ク 解 除 す る 。

返 り 値

成 功 し た 場 合 は 、 こ れ ら の シ ス テ ム コ ー ル は ゼ ロ を 返 す 。 エ ラ ー の 場 合 は -1 が 返 さ れ 、 errno が 適 切 に 設 定 さ れ 、 プ ロ セ ス の ア ド レ ス 空 間 に お け る ロ ッ ク は 変 更 さ れ な い 。

エ ラ ー

ENOMEM

(Linux 2.6.9 以 降 ) 呼 び 出 し 元 は 非 ゼ ロ の ソ フ ト 資 源 制 限 RLIMIT_MEMLOCK を 持 つ が 、 制 限 が 許 可 し て い る 以 上 の メ モ リ ー を ロ ッ ク し よ う と し た 。 こ の 制 限 は 、 プ ロ セ ス が 特 権 ( CAP_IPC_LOCK ) を 持 っ て い る 場 合 は 適 用 さ れ な い 。

ENOMEM

(Linux 2.4 以 前 ) 呼 び 出 し 元 プ ロ セ ス が RAM の 半 分 以 上 を ロ ッ ク し よ う と し た 。

EPERM

呼 び 出 し 側 が 特 権 を 持 っ て い な い が 、 要 求 さ れ た 操 作 を 実 行 す る に は 特 権 ( CAP_IPC_LOCK ) が 必 要 で あ る 。

For mlock (), mlock2 (), and munlock ():

EAGAIN

指 定 さ れ た ア ド レ ス 範 囲 の 一 部 ま た は 全 て を ロ ッ ク す る こ と が で き な か っ た 。

EINVAL

addr + len の 加 算 の 結 果 が addr よ り も 小 さ か っ た (例 え ば 、 加 算 で オ ー バ ー フ ロ ー が 発 生 し た な ど )。

EINVAL

(Linux で は こ の 意 味 で 使 わ れ な い ) addr が ペ ー ジ サ イ ズ の 倍 数 で は な い 。

ENOMEM

指 定 さ れ た ア ド レ ス 範 囲 が プ ロ セ ス の ア ド レ ス 空 間 に マ ッ プ さ れ た ペ ー ジ と 一 致 し な い 。

ENOMEM

Locking or unlocking a region would result in the total number of mappings with distinct attributes (e.g., locked versus unlocked) exceeding the allowed maximum. (For example, unlocking a range in the middle of a currently locked mapping would result in three mappings: two locked mappings at each end and an unlocked mapping in the middle.)

For mlock2 ():

EINVAL

未 知 の flags が 指 定 さ れ た 。

mlockall () 用 と し て :

EINVAL

Unknown flags were specified or MCL_ONFAULT was specified without either MCL_FUTURE or MCL_CURRENT .

munlockall () 用 と し て :

EPERM

(Linux 2.6.8 以 前 ) 呼 び 出 し 元 が 権 限 ( CAP_IPC_LOCK ) を 持 っ て い な い 。

バ ー ジ ョ ン

mlock2 () is available since Linux 4.4; glibc support was added in version 2.27.

準 拠

POSIX.1-2001, POSIX.1-2008, SVr4.

mlock2 () は Linux 固 有 で あ る 。

mlock () と munlock () が 使 用 可 能 な POSIX シ ス テ ム で は _POSIX_MEMLOCK_RANGE <unistd.h> で 定 義 さ れ て い る 。 ま た 、 ペ ー ジ あ た り の バ イ ト 数 は 、 <limits.h> で 定 義 さ れ る 定 数 PAGESIZE か ら (定 義 さ れ て い る 場 合 )、 も し く は sysconf(_SC_PAGESIZE) を 呼 び 出 す こ と で 決 定 で き る 。

mlockall () と munlockall () が 利 用 可 能 な POSIX シ ス テ ム で は 、 _POSIX_MEMLOCK <unistd.h> で 0 よ り 大 き い 値 に 定 義 さ れ て い る ( sysconf (3) も 参 照 の こ と )。

注 意

メ モ リ ー の ロ ッ ク の 用 途 と し て は 主 に 二 つ あ る : リ ア ル タ イ ム ア ル ゴ リ ズ ム と 高 い セ キ ュ リ テ ィ の 必 要 な デ ー タ 処 理 で あ る 。 リ ア ル タ イ ム の ア プ リ ケ ー シ ョ ン は 決 定 的 な タ イ ミ ン グ や ス ケ ジ ュ ー リ ン グ を 必 要 と す る が 、 ペ ー ジ ン グ は 予 期 し な い プ ロ グ ラ ム の 実 行 遅 延 を も た ら す 主 要 な 要 因 と な る 。 リ ア ル タ イ ム の ア プ リ ケ ー シ ョ ン は た い て い は sched_setscheduler (2) で リ ア ル タ イ ム ス ケ ジ ュ ー ラ に 変 更 さ れ る 。 暗 号 や セ キ ュ リ テ ィ の ソ フ ト ウ ェ ア は し ば し ば パ ス ワ ー ド や 秘 密 鍵 の デ ー タ の よ う な 重 要 な バ イ ト 列 を 扱 う 。 ペ ー ジ ン グ の 結 果 、 こ れ ら の 秘 密 が ス ワ ッ プ 用 の 固 定 媒 体 に 転 送 さ れ る か も し れ な い 。 そ し て 、 セ キ ュ リ テ ィ ソ フ ト ウ ェ ア が RAM 上 の 秘 密 を 削 除 し て 終 了 し た ず っ と 後 に な っ て も 、 こ の ス ワ ッ プ さ れ た デ ー タ に は 敵 が ア ク セ ス で き る 可 能 性 が あ る (し か し 、 ラ ッ プ ト ッ プ と い く つ か の デ ス ク ト ッ プ コ ン ピ ュ ー タ の サ ス ペ ン ド モ ー ド は シ ス テ ム の RAM の 内 容 を メ モ リ ー の ロ ッ ク に 関 わ ら ず デ ィ ス ク に 保 存 す る こ と に 注 意 )。

リ ア ル タ イ ム プ ロ セ ス が mlockall () を 使 っ て ペ ー ジ フ ォ ー ル ト に よ る 遅 延 を 防 ご う と す る 場 合 、 関 数 呼 び 出 し に よ っ て ペ ー ジ フ ォ ー ル ト が 発 生 し な い よ う に 、 時 間 制 限 の 厳 し い 部 分 (time-critical section) に 入 る 前 に 十 分 な 量 の ロ ッ ク さ れ た ス タ ッ ク を 確 保 し て お く 必 要 が あ る 。 こ れ を 実 現 す る に は 、 十 分 な 大 き さ の 自 動 変 数 (の 配 列 ) を 確 保 し 、 こ れ ら の ス タ ッ ク 用 の ペ ー ジ が メ モ リ ー 上 に 確 保 さ れ る よ う に こ の 配 列 に 書 き 込 み を 行 う 関 数 を 用 意 し 、 こ れ を 呼 び 出 せ ば よ い 。 こ う す る こ と で 、 十 分 な 量 の ペ ー ジ が ス タ ッ ク に マ ッ ピ ン グ さ れ 、 RAM に ロ ッ ク さ れ る 。 ダ ミ ー の 書 き 込 み を 行 う こ と に よ っ て 、 時 間 制 限 の 厳 し い 部 分 (critical section) 内 で は 書 き 込 み 時 コ ピ ー に よ る ペ ー ジ フ ォ ー ル ト さ え も 発 生 し な い こ と が 保 証 さ れ る 。

Memory locks are not inherited by a child created via fork (2) and are automatically removed (unlocked) during an execve (2) or when the process terminates. The mlockall () MCL_FUTURE and MCL_FUTURE | MCL_ONFAULT settings are not inherited by a child created via fork (2) and are cleared during an execve (2).

Note that fork (2) will prepare the address space for a copy-on-write operation. The consequence is that any write access that follows will cause a page fault that in turn may cause high latencies for a real-time process. Therefore, it is crucial not to invoke fork (2) after an mlockall () or mlock () operation—not even from a thread which runs at a low priority within a process which also has a thread running at elevated priority.

あ る ア ド レ ス 範 囲 に 対 す る メ モ リ ー ロ ッ ク は 、 そ の ア ド レ ス 範 囲 が munmap (2) に よ っ て ア ン マ ッ プ さ れ た 場 合 は 削 除 さ れ る 。

メ モ リ ー の ロ ッ ク は 累 積 し な い 。 す な わ ち 複 数 回 mlock (), mlock2 (), mlockall () を 呼 び 出 し て ロ ッ ク さ れ た ペ ー ジ で も 、 対 応 す る 範 囲 に 対 し て munlock () を 1 回 呼 び 出 し た り munlockall () を 呼 び 出 し た り す る だ け で ロ ッ ク 解 除 さ れ る 。 複 数 の 場 所 や 複 数 の プ ロ セ ス に マ ッ プ さ れ て い る ペ ー ジ は 、 少 な く と も 一 つ の 場 所 、 一 つ の プ ロ セ ス で ロ ッ ク さ れ て い る 限 り は RAM に 残 り 続 け る 。

If a call to mlockall () which uses the MCL_FUTURE flag is followed by another call that does not specify this flag, the changes made by the MCL_FUTURE call will be lost.

The mlock2 () MLOCK_ONFAULT flag and the mlockall () MCL_ONFAULT flag allow efficient memory locking for applications that deal with large mappings where only a (small) portion of pages in the mapping are touched. In such cases, locking all of the pages in a mapping would incur a significant penalty for memory locking.

Linux で の 注 意

Linux で は 、 mlock (), mlock2 (), munlock () は 自 動 的 に addr を 端 数 切 り 捨 て に よ り 一 番 近 い ペ ー ジ 境 界 へ と 丸 め る 。 し か し POSIX.1 仕 様 の mlock () と munlock () は addr が ペ ー ジ 境 界 に 合 っ て い る こ と を 要 求 す る 実 装 も 許 し て い る 。 そ の た め 移 植 性 を 意 図 し た ア プ リ ケ ー シ ョ ン で は き ち ん と 境 界 に 合 わ せ た 方 が 良 い 。

Linux 固 有 の /proc/[pid]/status フ ァ イ ル の VmLck フ ィ ー ル ド に は 、 mlock (), mlock2 (), mlockall () お よ び mmap (2) MAP_LOCKED を 使 っ て 、 ID が PID の プ ロ セ ス が ロ ッ ク し て い る メ モ リ ー 量 (キ ロ バ イ ト 単 位 ) が 表 示 さ れ る 。

制 限 と 権 限

Linux 2.6.8 以 前 で は 、 メ モ リ ー を ロ ッ ク す る た め に は 特 権 ( CAP_IPC_LOCK ) が 必 要 で 、 ソ フ ト 資 源 制 限 RLIMIT_MEMLOCK は プ ロ セ ス が ど れ だ け の メ モ リ ー を ロ ッ ク で き る か の 制 限 を 定 義 す る 。

Linux 2.6.9 以 降 で は 、 特 権 を 持 つ プ ロ セ ス が ロ ッ ク で き る メ モ リ ー 量 は 無 制 限 と な り 、 代 わ り に ソ フ ト 資 源 制 限 RLIMIT_MEMLOCK は 特 権 を 持 た な い プ ロ セ ス が ロ ッ ク で き る メ モ リ ー 量 の 制 限 を 定 義 す る 。

バ グ

In Linux 4.8 and earlier, a bug in the kernel’s accounting of locked memory for unprivileged processes (i.e., without CAP_IPC_LOCK ) meant that if the region specified by addr and len overlapped an existing lock, then the already locked bytes in the overlapping region were counted twice when checking against the limit. Such double accounting could incorrectly calculate a "total locked memory" value for the process that exceeded the RLIMIT_MEMLOCK limit, with the result that mlock () and mlock2 () would fail on requests that should have succeeded. This bug was fixed in Linux 4.9.

2.4.17 ま で の 2.4 シ リ ー ズ の Linux カ ー ネ ル に は 、 mlockall () MCL_FUTURE フ ラ グ が fork (2) で 継 承 さ れ る と 言 う バ グ が あ る 。 こ れ は カ ー ネ ル 2.4.18 で 修 正 さ れ た 。

カ ー ネ ル 2.6.9 以 降 で は 、 特 権 を 持 っ た プ ロ セ ス が mlockall(MCL_FUTURE) を 呼 び 出 し た 後 で 、 特 権 を な く し た 場 合 (例 え ば 、 実 効 UID を 0 以 外 の 値 に 変 更 す る な ど に よ り 、 CAP_IPC_LOCK ケ ー パ ビ リ テ ィ を 失 っ た 場 合 )、 リ ソ ー ス 上 限 RLIMIT_MEMLOCK に 達 す る と 、 そ れ 以 降 の メ モ リ ー 割 り 当 て (例 え ば mmap (2), brk (2)) は 失 敗 す る 。

関 連 項 目

mincore (2), mmap (2), setrlimit (2), shmctl (2), sysconf (3), proc (5), capabilities (7)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man-pages プ ロ ジ ェ ク ト の リ リ ー ス 5.10 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は https://www.kernel.org/doc/man-pages/ に 書 か れ て い る 。