名 前
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 の 半 分 以 上 を ロ ッ ク し よ う と し た 。 呼 び 出 し 側 が 特 権 を 持 っ て い な い が 、 要 求 さ れ た 操 作 を 実 行 す る に は 特 権 (CAP_IPC_LOCK) が 必 要 で あ る 。 mlock() と munlock() 用 と し て :
start+len の 加 算 の 結 果 が start よ り も 小 さ か っ た (例 え ば 、 加 算 で オ ー バ ー フ ロ ー が 発 生 し た な ど )。
指 定 さ れ た ア ド レ ス 範 囲 が プ ロ セ ス の ア ド レ ス 空 間 に マ ッ プ さ れ た ペ ー ジ と 一 致 し な い 。
munlockall() 用 と し て :
準 拠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 固
有 の /proc/PID/status フ ァ
イ ル の VmLck フ ィ
ー ル ド に は 、
mlock(), mlockall() お よ び
mmap(2) MAP_LOCKED を 使 っ
て 、 ID が PID の プ
ロ セ ス が ロ ッ
ク し て い る メ
モ リ ー 量 (キ ロ
バ イ ト 単 位 ) が
表 示 さ れ る 。
制 限 と 権 限 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/ に 書 か れ て い る 。 |