Manpages

名 前

mlock − メ モ リ ー の ロ ッ ク と ロ ッ ク 解 除 を 行 う

書 式

#include <sys/mman.h>

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

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

説 明

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

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

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

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

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

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

MCL_FUTURE 将 来 、 プ ロ セ ス の ア ド レ ス 空 間 に マ ッ プ さ れ る 全 て の ペ ー ジ を ロ ッ ク す る 。 例 え ば 、 ヒ ー プ

(heap) や ス タ ッ ク の 成 長 に よ り 新 し く 必 要 に な っ た ペ ー ジ だ け で な く 、 新 し く メ モ リ ー マ ッ プ さ れ た フ ァ イ ル や 共 有 メ モ リ ー 領 域 も ロ ッ ク さ れ る 。

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) が 必 要 で あ る 。

mlock() と munlock() 用 と し て :

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

EINVAL

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

EINVAL

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

ENOMEM

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

mlockall() 用 と し て :

EINVAL 未 知 の

flags が 指 定 さ れ た 。

munlockall() 用 と し て :

EPERM

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

準 拠

POSIX.1−2001, SVr4.

可 用 性

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) 内 で は 書 き 込 み 時 コ ピ ー に よ る ペ ー ジ フ ォ ー ル ト さ え も 発 生 し な い こ と が 保 証 さ れ る 。 メ モ リ ー ロ ッ ク は fork(2) で 作 成 さ れ た 子 プ ロ セ ス に は 継 承 さ れ ず 、 execve(2) が 呼 ば れ た り 、 プ ロ セ ス が 終 了 し た 場 合 は 自 動 的 に 削 除 さ れ る (ロ ッ ク 解 除 さ れ る )。 mlockall() の MCL_FUTURE 設 定 は fork(2) で 作 成 さ れ た 子 プ ロ セ ス に は 継 承 さ れ ず 、 execve(2) の 中 で ク リ ア さ れ る 。 あ る ア ド レ ス 範 囲 に 対 す る メ モ リ ー ロ ッ ク は 、 そ の ア ド レ ス 範 囲 が munmap(2) に よ っ て ア ン マ ッ プ さ れ た 場 合 は 削 除 さ れ る 。 メ モ リ ー の ロ ッ ク は 累 積 し な い 。 す な わ ち 複 数 回 mlock() や mlockall() を 呼 び 出 し て ロ ッ ク さ れ た ペ ー ジ で も 、 対 応 す る 範 囲 に 対 し て munlock() を 1 回 呼 び 出 し た り munlockall() を 呼 び 出 し た り す る だ け で ロ ッ ク 解 除 さ れ る 。 複 数 の 場 所 や 複 数 の プ ロ セ ス に マ ッ プ さ れ て い る ペ ー ジ は 、 少 な く と も 一 つ の 場 所 、 一 つ の プ ロ セ ス で ロ ッ ク さ れ て い る 限 り は RAM に 残 り 続 け る 。

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

Linux 固 有 の /proc/PID/status フ ァ イ ル の VmLck フ ィ ー ル ド に は 、 mlock(), mlockall() お よ び mmap(2) MAP_LOCKED を 使 っ て 、 ID が PID の プ ロ セ ス が ロ ッ ク し て い る メ モ リ ー 量 (キ ロ バ イ ト 単 位 ) が 表 示 さ れ る 。 制 限 と 権 限
Linux 2.6.8 以 前 で は 、 メ モ リ ー を ロ ッ ク す る た め に は 特 権 (CAP_IPC_LOCK) が 必 要 で 、 ソ フ ト 資 源 制 限 RLIMIT_MEMLOCK は プ ロ セ ス が ど れ だ け の メ モ リ ー を ロ ッ ク で き る か の 制 限 を 定 義 す る 。

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

バ グ

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)) は 失 敗 す る 。

関 連 項 目

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

こ の 文 書 に つ い て

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