mlock(2) - wariua/manpages-ko GitHub Wiki

NAME

mlock, mlock2, munlock, mlockall, munlockall - ๋ฉ”๋ชจ๋ฆฌ ๊ณ ์ •ํ•˜๊ณ  ํ’€๊ธฐ

SYNOPSIS

#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);

DESCRIPTION

mlock(), mlock2(), mlockall()์€ ํ˜ธ์ถœ ํ”„๋กœ์„ธ์Šค ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์˜ ์ผ๋ถ€ ๋‚ด์ง€ ์ „์ฒด๋ฅผ ๋žจ์— ๊ณ ์ •ํ•˜์—ฌ ๊ทธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์Šค์™‘ ์˜์—ญ์œผ๋กœ ๋น ์ง€์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.

munlock()๊ณผ munlockall()์€ ๋ฐ˜๋Œ€ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ฆ‰, ํ˜ธ์ถœ ํ”„๋กœ์„ธ์Šค ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์˜ ์ผ๋ถ€ ๋‚ด์ง€ ์ „์ฒด์˜ ๊ณ ์ •์„ ํ’€์–ด์„œ ํ•ด๋‹น ์ฃผ์†Œ ๊ณต๊ฐ„ ๋ฒ”์œ„์˜ ํŽ˜์ด์ง€๊ฐ€ ๋‹ค์‹œ ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์ž ์š”๊ตฌ ์‹œ ์Šค์™‘์œผ๋กœ ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๊ณ ์ •๊ณผ ํ•ด์ œ๋Š” ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ์ด๋ค„์ง„๋‹ค.

mlock(), mlock2(), munlock()

mlock()์€ addr์—์„œ ์‹œ์ž‘ํ•ด์„œ len ๋ฐ”์ดํŠธ๋งŒํผ ์ด์–ด์ง€๋Š” ์ฃผ์†Œ ๋ฒ”์œ„์˜ ํŽ˜์ด์ง€๋“ค์„ ๊ณ ์ •ํ•œ๋‹ค. ํ˜ธ์ถœ์ด ์„ฑ๊ณต ๋ฐ˜ํ™˜ํ•  ๋•Œ ์ง€์ •ํ•œ ์ฃผ์†Œ ๋ฒ”์œ„๋ฅผ ์ผ๋ถ€๋ผ๋„ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€๋“ค์ด ๋žจ์— ์ƒ์ฃผํ•ด ์žˆ๋‹ค๊ณ  ๋ณด์žฅ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ดํ›„ ํ’€๊ธฐ ์ „๊นŒ์ง€๋Š” ๊ทธ ํŽ˜์ด์ง€๋“ค์ด ๋žจ ๋‚ด์— ์žˆ๋‹ค๊ณ  ๋ณด์žฅ๋œ๋‹ค.

mlock2()๋„ addr์—์„œ ์‹œ์ž‘ํ•ด์„œ len ๋ฐ”์ดํŠธ๋งŒํผ ์ด์–ด์ง€๋Š” ์ง€์ •ํ•œ ๋ฒ”์œ„์˜ ํŽ˜์ด์ง€๋“ค์„ ๊ณ ์ •ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ํ˜ธ์ถœ์ด ์„ฑ๊ณต ๋ฐ˜ํ™˜ํ•œ ํ›„ ๊ทธ ๋ฒ”์œ„์— ํฌํ•จ๋œ ํŽ˜์ด์ง€๋“ค์˜ ์ƒํƒœ๊ฐ€ flags ์ธ์ž ๊ฐ’์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค.

flags ์ธ์ž๋Š” 0 ๋˜๋Š” ๋‹ค์Œ ์ƒ์ˆ˜์ผ ์ˆ˜ ์žˆ๋‹ค.

MLOCK_ONFAULT
ํ˜„์žฌ ์ƒ์ฃผ ์ค‘์ธ ํŽ˜์ด์ง€๋“ค์€ ๊ณ ์ •ํ•˜๊ณ  ๋ฒ”์œ„ ์ „์ฒด์— ํ‘œ์‹œ๋ฅผ ํ•ด์„œ ๋‚˜๋จธ์ง€ ๋น„์ƒ์ฃผ ํŽ˜์ด์ง€๋“ค์ด ํŽ˜์ด์ง€ ํดํŠธ์— ์˜ํ•ด ์ฑ„์›Œ์งˆ ๋•Œ ๊ณ ์ •๋˜๋„๋ก ํ•œ๋‹ค.

flags๊ฐ€ 0์ด๋ฉด mlock2()๋Š” mlock()๊ณผ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.

munlock()์€ addr์—์„œ ์‹œ์ž‘ํ•ด์„œ len ๋ฐ”์ดํŠธ๋งŒํผ ์ด์–ด์ง€๋Š” ์ฃผ์†Œ ๋ฒ”์œ„์˜ ํŽ˜์ด์ง€๋“ค์„ ๊ณ ์ • ํ•ด์ œํ•œ๋‹ค. ์ด ํ˜ธ์ถœ ํ›„์—๋Š” ์ง€์ •ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ฒ”์œ„๋ฅผ ์ผ๋ถ€๋ผ๋„ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€๋“ค์„ ๋‹ค์‹œ ์ปค๋„์ด ์™ธ๋ถ€ ์Šค์™‘ ๊ณต๊ฐ„์œผ๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

mlockall(), munlockall()

mlockall()์€ ํ˜ธ์ถœ ํ”„๋กœ์„ธ์Šค ์ฃผ์†Œ ๊ณต๊ฐ„์˜ ๋งต ๋œ ํŽ˜์ด์ง€๋“ค์„ ๋ชจ๋‘ ๊ณ ์ •ํ•œ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ, ์Šคํƒ ์„ธ๊ทธ๋จผํŠธ์˜ ํŽ˜์ด์ง€๋“ค๋ฟ ์•„๋‹ˆ๋ผ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ์ปค๋„ ๋ฐ์ดํ„ฐ, ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ, ๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ๋„ ํฌํ•จ๋œ๋‹ค. ํ˜ธ์ถœ์ด ์„ฑ๊ณต ๋ฐ˜ํ™˜ํ•  ๋•Œ ๋งต ๋œ ํŽ˜์ด์ง€๋“ค์ด ๋ชจ๋‘ ๋žจ์— ์ƒ์ฃผํ•ด ์žˆ๋‹ค๊ณ  ๋ณด์žฅ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ดํ›„ ํ’€๊ธฐ ์ „๊นŒ์ง€๋Š” ๊ทธ ํŽ˜์ด์ง€๋“ค์ด ๋žจ ๋‚ด์— ์žˆ๋‹ค๊ณ  ๋ณด์žฅ๋œ๋‹ค.

flags ์ธ์ž๋Š” ๋‹ค์Œ ์ƒ์ˆ˜๋ฅผ 1๊ฐœ ์ด์ƒ ๋น„ํŠธ OR ํ•ด์„œ ๊ตฌ์„ฑํ•œ๋‹ค.

MCL_CURRENT
ํ”„๋กœ์„ธ์Šค ์ฃผ์†Œ ๊ณต๊ฐ„์— ํ˜„์žฌ ๋งต ๋˜์–ด ์žˆ๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€๋“ค์„ ๊ณ ์ •ํ•œ๋‹ค.
MCL_FUTURE
ํ”„๋กœ์„ธ์Šค ์ฃผ์†Œ ๊ณต๊ฐ„์— ํ–ฅํ›„ ๋งต ๋˜๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€๋“ค์„ ๊ณ ์ •ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํž™๊ณผ ์Šคํƒ์„ ํ‚ค์šฐ๋Š” ๋ฐ ํ•„์š”ํ•œ ์ƒˆ ํŽ˜์ด์ง€๋‚˜ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ๋งต ํŒŒ์ผ ๋‚ด์ง€ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด ํ•ด๋‹น๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.
MCL_ONFAULT (๋ฆฌ๋ˆ…์Šค 4.4๋ถ€ํ„ฐ)
MCL_CURRENT๋‚˜ MCL_FUTURE, ๋˜๋Š” ๋‘˜ ๋ชจ๋‘์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค. ํ˜„์žฌ(MCL_CURRENT) ๋‚ด์ง€ ํ–ฅํ›„(MCL_FUTURE) ๋งคํ•‘ ๋ชจ๋‘์— ํดํŠธ๋กœ ๋“ค์–ด์˜จ ํŽ˜์ด์ง€๋ฅผ ๊ณ ์ •ํ•˜๊ฒŒ ํ‘œ์‹œํ•œ๋‹ค. MCL_CURRENT์™€ ์‚ฌ์šฉํ•˜๋ฉด ํ˜„์žฌ ํŽ˜์ด์ง€๋“ค์„ ๋ชจ๋‘ ๊ณ ์ •ํ•˜๋˜ mlockall()์ด ๋ถ€์žฌ ํŽ˜์ด์ง€๋ฅผ ํดํŠธ๋กœ ๋“ค์ด์ง€๋Š” ์•Š๋Š”๋‹ค. MCL_FUTURE์™€ ์‚ฌ์šฉํ•˜๋ฉด ํ–ฅํ›„ ๋งคํ•‘ ๋ชจ๋‘์— ํŽ˜์ด์ง€๊ฐ€ ํดํŠธ๋กœ ๋“ค์–ด์˜ฌ ๋•Œ ๊ณ ์ •ํ•˜๊ฒŒ ํ‘œ์‹œํ•˜๋˜ ๋งคํ•‘ ์ƒ์„ฑ ์‹œ ๊ณ ์ •์œผ๋กœ ์ธํ•ด ํŽ˜์ด์ง€๋“ค์ด ์ฑ„์›Œ์ง€์ง€๋Š” ์•Š๋Š”๋‹ค. MCL_ONFAULT๋Š” MCL_CURRENT๋‚˜ MCL_FUTURE, ๋˜๋Š” ๋‘˜ ๋ชจ๋‘์™€ ํ•จ๊ป˜ ์จ์•ผ ํ•œ๋‹ค.

MCL_FUTURE๋ฅผ ์ง€์ •ํ•ด ๋‘๋ฉด ์ดํ›„ ์‹œ์Šคํ…œ ํ˜ธ์ถœ(๊ฐ€๋ น mmap(2), sbrk(2), malloc(3))๋กœ ์ธํ•ด ๊ณ ์ • ๋ฐ”์ดํŠธ ์ˆ˜๊ฐ€ ํ—ˆ์šฉ ์ตœ๋Œ€์น˜(์•„๋ž˜ ์ฐธ๊ณ )๋ฅผ ์ดˆ๊ณผํ•˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ ๊ทธ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์Šคํƒ ์„ฑ์žฅ์ด ์‹คํŒจํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ์ปค๋„์ด ์Šคํƒ ํ™•์žฅ์„ ๊ฑฐ๋ถ€ํ•˜๊ณ  ํ”„๋กœ์„ธ์Šค์—๊ฒŒ SIGSEGV ์‹œ๊ทธ๋„์„ ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค.

munlockall()์€ ํ˜ธ์ถœ ํ”„๋กœ์„ธ์Šค์˜ ์ฃผ์†Œ ๊ณต๊ฐ„์œผ๋กœ ๋งต ๋˜์–ด ์žˆ๋Š” ํŽ˜์ด์ง€๋“ค์„ ๋ชจ๋‘ ๊ณ ์ • ํ•ด์ œํ•œ๋‹ค.

RETURN VALUE

์„ฑ๊ณต ์‹œ ์ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ๋“ค์€ 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์˜ค๋ฅ˜ ์‹œ -1์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ errno๋ฅผ ์ ์ ˆํžˆ ์„ค์ •ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ์„ธ์Šค ์ฃผ์†Œ ๊ณต๊ฐ„ ๋‚ด์˜ ๊ณ ์ •์— ์–ด๋–ค ๋ณ€ํ™”๋„ ์ƒ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.

ERRORS

ENOMEM
(๋ฆฌ๋ˆ…์Šค 2.6.9 ๋ฐ ์ดํ›„) ํ˜ธ์ถœ์ž์—๊ฒŒ 0 ์•„๋‹Œ RLIMIT_MEMLOCK ์—ฐ์„ฑ ์ž์› ์ œํ•œ์ด ์žˆ๋Š”๋ฐ ํ—ˆ์šฉ ํ•œ๊ณ„๋ณด๋‹ค ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณ ์ •ํ•˜๋ ค ํ–ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค์— ํŠน๊ถŒ(CAP_IPC_LOCK)์ด ์žˆ์œผ๋ฉด ์ด ์ œ์•ฝ์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.
ENOMEM
(๋ฆฌ๋ˆ…์Šค 2.4 ๋ฐ ์ด์ „) ํ˜ธ์ถœ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋žจ ์ ˆ๋ฐ˜์„ ๋„˜๊ฒŒ ๊ณ ์ •ํ•˜๋ ค ํ–ˆ๋‹ค.
EPERM
ํ˜ธ์ถœ์ž์—๊ฒŒ ํŠน๊ถŒ์ด ์—†๋Š”๋ฐ ์š”์ฒญ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํŠน๊ถŒ(CAP_IPC_LOCK)์ด ํ•„์š”ํ•˜๋‹ค.

mlock(), mlock2(), munlock():

EAGAIN
์ง€์ •ํ•œ ์ฃผ์†Œ ๋ฒ”์œ„์˜ ์ผ๋ถ€ ๋‚ด์ง€ ์ „์ฒด๋ฅผ ๊ณ ์ •ํ•  ์ˆ˜ ์—†๋‹ค.
EINVAL
๋ง์…ˆ addr+len์˜ ๊ฒฐ๊ณผ๊ฐ€ addr๋ณด๋‹ค ์ž‘๋‹ค. (๊ฐ€๋ น ๋ง์…ˆ์—์„œ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ์ผ์–ด๋‚ฌ์„ ์ˆ˜๋„ ์žˆ๋‹ค.)
EINVAL
(๋ฆฌ๋ˆ…์Šค ์™ธ) addr์ด ํŽ˜์ด์ง€ ํฌ๊ธฐ์˜ ๋ฐฐ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค.
ENOMEM
์ง€์ •ํ•œ ์ฃผ์†Œ ๋ฒ”์œ„์˜ ์ผ๋ถ€๊ฐ€ ํ”„๋กœ์„ธ์Šค ์ฃผ์†Œ ๊ณต๊ฐ„ ๋‚ด์˜ ๋งต ๋œ ํŽ˜์ด์ง€์— ๋Œ€์‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.
ENOMEM
์˜์—ญ์„ ๊ณ ์ •ํ•˜๊ฑฐ๋‚˜ ํ’€๋ฉด ์ƒ์ดํ•œ ์†์„ฑ(๊ฐ€๋ น ๊ณ ์ •๊ณผ ๋น„๊ณ ์ •)์˜ ๋งคํ•‘ ์ด๊ฐœ์ˆ˜๊ฐ€ ํ—ˆ์šฉ ์ตœ๋Œ€์น˜๋ฅผ ์ดˆ๊ณผํ•˜๊ฒŒ ๋œ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด ํ˜„์žฌ ๊ณ ์ •๋œ ๋งคํ•‘ ์ค‘๊ฐ„์˜ ์–ด๋А ๋ฒ”์œ„๋ฅผ ํ’€๋ฉด ์–‘์ชฝ์˜ ๊ณ ์ •๋œ ๋งคํ•‘๊ณผ ๊ฐ€์šด๋ฐ์˜ ํ’€๋ฆฐ ํŽ˜์ด์ง€๋ฅผ ํ•ฉ์ณ์„œ ์„ธ ๊ฐœ ๋งคํ•‘์ด ์ƒ๊ธด๋‹ค.)

mlock2():

EINVAL
๋ชจ๋ฅด๋Š” flags๋ฅผ ์ง€์ •ํ–ˆ๋‹ค.

mlockall():

EINVAL
๋ชจ๋ฅด๋Š” flags๋ฅผ ์ง€์ •ํ–ˆ๋‹ค. ๋˜๋Š” MCL_FUTURE์™€ MCL_CURRENT ์–ด๋А ์ชฝ๋„ ์—†์ด MCL_ONFAULT๋ฅผ ์ง€์ •ํ–ˆ๋‹ค.

munlockall():

EPERM
(๋ฆฌ๋ˆ…์Šค 2.6.8 ๋ฐ ์ด์ „) ํ˜ธ์ถœ์ž์—๊ฒŒ ํŠน๊ถŒ(CAP_IPC_LOCK)์ด ์—†๋‹ค.

VERSIONS

๋ฆฌ๋ˆ…์Šค 4.4๋ถ€ํ„ฐ mlock2()๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. glibc ๋ฒ„์ „ 2.27์—์„œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

CONFORMING TO

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

mlock2()๋Š” ๋ฆฌ๋ˆ…์Šค ์ „์šฉ์ด๋‹ค.

AVAILABILITY

mlock() ๋ฐ munlock()์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ POSIX ์‹œ์Šคํ…œ์—๋Š” <unistd.h>์— _POSIX_MEMLOCK_RANGE๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉฐ, <limits.h>์˜ ์ƒ์ˆ˜ PAGESIZE๋‚˜ (์ •์˜๋ผ ์žˆ์ง€ ์•Š์œผ๋ฉด) sysconf(_SC_PAGESIZE) ํ˜ธ์ถœ๋กœ ํŽ˜์ด์ง€์˜ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

mlockall() ๋ฐ munlockall()์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ POSIX ์‹œ์Šคํ…œ์—์„œ๋Š” <unistd.h>์— _POSIX_MEMLOCK์ด 0๋ณด๋‹ค ํฐ ๊ฐ’์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ๋‹ค. (sysconf(3)๋„ ์ฐธ๊ณ .)

NOTES

๋ฉ”๋ชจ๋ฆฌ ๊ณ ์ •์˜ ์ฃผ๋œ ์šฉ์ฒ˜๊ฐ€ ๋‘ ๊ณณ ์žˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์•Œ๊ณ ๋ฆฌ๋“ฌ๊ณผ ๊ณ ์ˆ˜์ค€ ๋ณด์•ˆ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์ด๋‹ค. ์‹ค์‹œ๊ฐ„ ์‘์šฉ์—์„œ๋Š” ์‹œ๊ฐ„์ด ์˜ˆ์ธก ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์Šค์ผ€์ค„๋ง์—์„œ๋„ ๊ทธ๋ ‡์ง€๋งŒ ํŽ˜์ด์ง•์€ ์˜ˆ์ƒํ•  ์ˆ˜ ์—†๋Š” ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ง€์—ฐ์˜ ์ฃผ์š” ์›์ธ์ด๋‹ค. ์—ฌ๊ธฐ ๋”ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ์‹ค์‹œ๊ฐ„ ์‘์šฉ์—์„œ๋Š” sched_setscheduler(2)๋กœ ์‹ค์‹œ๊ฐ„ ์Šค์ผ€์ค„๋Ÿฌ๋กœ ์ „ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค. ์•”ํ˜ธ ๋ณด์•ˆ ์†Œํ”„ํŠธ์›จ์–ด์—์„œ๋Š” ์ข…์ข… ์•”ํ˜ธ๋‚˜ ๋น„๋ฐ€ํ‚ค ๊ฐ™์€ ์•„์ฃผ ์ค‘์š”ํ•œ ๋ฐ”์ดํŠธ๋“ค์„ ์ž๋ฃŒ ๊ตฌ์กฐ๋กœ ๋‹ค๋ฃฌ๋‹ค. ํŽ˜์ด์ง• ๊ฒฐ๊ณผ๋กœ ๊ทธ ๋น„๋ฐ€๊ฐ’์ด ์˜์†์ ์ธ ์Šค์™‘ ์ €์žฅ ๋งค์ฒด๋กœ ์˜ฎ๊ฒจ์งˆ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๊ณ , ๋ณด์•ˆ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๋žจ์—์„œ ๊ทธ ๋น„๋ฐ€๊ฐ’์„ ์‚ญ์ œํ•˜๊ณ  ์ข…๋ฃŒํ•œ ํ›„ ์˜ค๋žซ๋™์•ˆ ๊ณต๊ฒฉ์ž๊ฐ€ ๊ทธ ๊ฐ’์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•  ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค. (ํ•˜์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ๊ณ ์ •๊ณผ ์ƒ๊ด€์—†์ด ๋žฉํ†ฑ ๋ฐ ์ผ๋ถ€ ๋ฐ์Šคํฌํ†ฑ์˜ ์ ˆ์ „ ๋ชจ๋“œ๊ฐ€ ์‹œ์Šคํ…œ ๋žจ์˜ ์‚ฌ๋ณธ์„ ๋””์Šคํฌ์— ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค๋Š” ์ ์„ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.)

mlockall()์„ ์ด์šฉํ•ด ํŽ˜์ด์ง€ ํดํŠธ ์ง€์—ฐ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋Š” ์‹ค์‹œ๊ฐ„ ํ”„๋กœ์„ธ์Šค์—์„œ๋Š” ์‹œ๊ฐ„์ด ์ค‘์š”ํ•œ ์˜์—ญ์— ์ง„์ž…ํ•˜๊ธฐ ์ „์— ์Šคํƒ ํŽ˜์ด์ง€๋ฅผ ์ถฉ๋ถ„ํ•˜๊ฒŒ ๊ณ ์ •ํ•ด์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ์ธํ•ด ํŽ˜์ด์ง€ ํดํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค. ์ถฉ๋ถ„ํžˆ ํฐ ์ž๋™ ๋ณ€์ˆ˜(๋ฐฐ์—ด)๋ฅผ ํ• ๋‹นํ•ด์„œ ๊ทธ ๋ฐฐ์—ด์ด ์ฐจ์ง€ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์“ฐ๊ธฐ๋ฅผ ํ•˜์—ฌ ์Šคํƒ ํŽ˜์ด์ง€๋“ค์„ ๊ฑด๋“œ๋ฆฌ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์Šคํƒ์— ์ถฉ๋ถ„ํžˆ ๋งŽ์€ ํŽ˜์ด์ง€๊ฐ€ ๋งต ๋˜์–ด์„œ ๋žจ์— ๊ณ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์“ฐ๊ธฐ๋ฅผ ํ•˜๋Š” ๊ฒƒ์€ ์ž„๊ณ„ ๊ตฌ์—ญ์—์„œ copy-on-write ํŽ˜์ด์ง€ ํดํŠธ์กฐ์ฐจ ์ผ์–ด๋‚˜์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.

fork(2)๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋˜๋Š” ์ž์‹์ด ๋ฉ”๋ชจ๋ฆฌ ๊ณ ์ •์„ ๋ฌผ๋ ค๋ฐ›์ง€ ์•Š์œผ๋ฉฐ, execve(2) ๊ณผ์ • ๋ฐ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ์‹œ์— ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋œ๋‹ค (๊ณ ์ •์ด ํ’€๋ฆฐ๋‹ค). fork(2)๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋˜๋Š” ์ž์‹์ด mlockall()์˜ MCL_FUTURE ๋ฐ MCL_FUTURE | MCL_ONFAULT ์„ค์ •์„ ๋ฌผ๋ ค๋ฐ›์ง€ ์•Š์œผ๋ฉฐ, execve(2) ๊ณผ์ •์—์„œ ํ•ด์ œ๋œ๋‹ค.

์ฐธ๊ณ ๋กœ fork(2)์—์„œ๋Š” ์ฃผ์†Œ ๊ณต๊ฐ„์„ copy-on-write๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ์ด์–ด์ง€๋Š” ์“ฐ๊ธฐ ์ ‘๊ทผ์ด ํŽ˜์ด์ง€ ํดํŠธ๋ฅผ ์œ ๋ฐœํ•˜๊ฒŒ ๋˜๊ณ , ์ด๋กœ ์ธํ•ด ์‹ค์‹œ๊ฐ„ ํ”„๋กœ์„ธ์Šค์— ๋†’์€ ์ง€์—ฐ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ mlockall()์ด๋‚˜ mlock() ๋™์ž‘ ํ›„์— fork(2)๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ๊ฒŒ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค. ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋กœ ๋„๋Š” ์Šค๋ ˆ๋“œ์™€ ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„๋กœ ๋„๋Š” ์Šค๋ ˆ๋“œ์—์„œ ์“ฐ๊ธฐ๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค.

munmap(2)์„ ํ†ตํ•ด ์ฃผ์†Œ ๋ฒ”์œ„์˜ ๋งต์„ ํ•ด์ œํ•˜๋ฉด ์ฃผ์†Œ ๋ฒ”์œ„์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณ ์ •์ด ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋œ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๊ณ ์ •์€ ์ค‘์ฒฉ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, mlock(), mlock2(), mlockall() ํ˜ธ์ถœ๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ณ ์ •๋œ ํŽ˜์ด์ง€๊ฐ€ ํ•ด๋‹น ๋ฒ”์œ„์— ๋Œ€ํ•œ munlock() ๋‚ด์ง€ munlockall() ํ˜ธ์ถœ ํ•œ ๋ฒˆ์œผ๋กœ ํ•ด์ œ๋œ๋‹ค. ์—ฌ๋Ÿฌ ์œ„์น˜์— ๋งต ๋˜์–ด ์žˆ๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค์— ๋งต ๋˜์–ด ์žˆ๋Š” ํŽ˜์ด์ง€๋Š” ์ ์–ด๋„ ํ•œ ์œ„์น˜ ๋‚ด์ง€ ํ•œ ํ”„๋กœ์„ธ์Šค์— ๊ณ ์ •๋˜์–ด ์žˆ๋Š” ๋™์•ˆ์€ ๋žจ์— ๊ณ ์ •๋˜์–ด ์žˆ๋Š”๋‹ค.

MCL_FUTURE๋ฅผ ์“ฐ๋Š” mlockall() ํ˜ธ์ถœ ํ›„์— ๊ทธ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์€ ํ˜ธ์ถœ์ด ๋‹ค์‹œ ์žˆ์œผ๋ฉด MCL_FUTURE ํ˜ธ์ถœ์— ์˜ํ•ด ์ด๋ค„์กŒ๋˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋“ค์ด ์‚ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค.

mlock2()์˜ MLOCK_ONFAULT ํ”Œ๋ž˜๊ทธ์™€ mlockall()์˜ MCL_ONFAULT ํ”Œ๋ž˜๊ทธ๋ฅผ ์ด์šฉํ•˜๋ฉด ํฐ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘ ์ค‘ (์ž‘์€) ์ผ๋ถ€๋งŒ ๊ฑด๋“œ๋ฆฌ๋Š” ์‘์šฉ์—์„œ ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณ ์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์— ๋งคํ•‘ ๋‚ด ํŽ˜์ด์ง€ ๋ชจ๋‘๋ฅผ ๊ณ ์ •ํ•˜๋Š” ๊ฒƒ์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณ ์ •์— ์ƒ๋‹นํ•œ ๋ถ€๋‹ด์„ ์œ ๋ฐœํ•  ๊ฒƒ์ด๋‹ค.

๋ฆฌ๋ˆ…์Šค ์ฐธ๊ณ  ์‚ฌํ•ญ

๋ฆฌ๋ˆ…์Šค์—์„œ mlock(), mlock2(), munlock()์€ addr์„ ์ž๋™์œผ๋กœ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํŽ˜์ด์ง€ ๊ฒฝ๊ณ„๋กœ ๋‚ด๋ฆผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ mlock() ๋ฐ munlock()์˜ POSIX.1 ๋ช…์„ธ์—์„œ๋Š” addr์ด ํŽ˜์ด์ง€์— ์ •๋ ฌ๋˜์–ด ์žˆ๊ธฐ๋ฅผ ๊ตฌํ˜„์—์„œ ์š”๊ตฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด์‹ ๊ฐ€๋Šฅํ•œ ์‘์šฉ์—์„œ๋Š” ์ •๋ ฌ๋˜์–ด ์žˆ๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค.

๋ฆฌ๋ˆ…์Šค ํ•œ์ •์ธ /proc/[pid]/status ํŒŒ์ผ์˜ VmLck ํ•„๋“œ๋Š” ID๊ฐ€ PID์ธ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ์ค‘ ๋ช‡ ํ‚ฌ๋กœ๋ฐ”์ดํŠธ๊ฐ€ mlock(), mlock2(), mlockall(), ๊ทธ๋ฆฌ๊ณ  mmap(2) MAP_LOCKED์— ์˜ํ•ด ๊ณ ์ •๋˜์–ด ์žˆ๋Š”์ง€ ๋ณด์—ฌ ์ค€๋‹ค.

์ œํ•œ ๋ฐ ๊ถŒํ•œ

๋ฆฌ๋ˆ…์Šค 2.6.8 ๋ฐ ์ด์ „์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณ ์ •ํ•˜๋ ค๋ฉด ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ํŠน๊ถŒ(CAP_IPC_LOCK)์ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ๊ทธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณ ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์–‘์˜ ํ•œ๊ณ„๋ฅผ RLIMIT_MEMLOCK ์—ฐ์„ฑ ์ž์› ์ œํ•œ์ด ๊ทœ์ •ํ•œ๋‹ค.

๋ฆฌ๋ˆ…์Šค 2.6.9๋ถ€ํ„ฐ๋Š” ํŠน๊ถŒ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณ ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์–‘์— ์ œํ•œ์„ ๋‘์ง€ ์•Š์œผ๋ฉฐ RLIMIT_MEMLOCK ์—ฐ์„ฑ ์ž์› ์ œํ•œ์€ ๋Œ€์‹  ๋น„ํŠน๊ถŒ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณ ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์–‘์˜ ํ•œ๊ณ„๋ฅผ ๊ทœ์ •ํ•œ๋‹ค.

BUGS

๋ฆฌ๋ˆ…์Šค 4.8 ๋ฐ ์ด์ „์—์„œ ๋น„ํŠน๊ถŒ (์ฆ‰ CAP_IPC_LOCK ์—†๋Š”) ํ”„๋กœ์„ธ์Šค์˜ ๊ณ ์ • ๋ฉ”๋ชจ๋ฆฌ ์–‘ ๊ณ„์‚ฐ์— ๋ฒ„๊ทธ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ addr๊ณผ len์œผ๋กœ ์ง€์ •ํ•œ ๋ฒ”์œ„๊ฐ€ ๊ธฐ์กด ๊ณ ์ •๊ณผ ๊ฒน์น˜๋Š” ๊ฒฝ์šฐ์— ๊ฒน์น˜๋Š” ์˜์—ญ์˜ ์ด๋ฏธ ๊ณ ์ •๋œ ๋ฐ”์ดํŠธ๋“ค์ด ์ œํ•œ ๊ฒ€์‚ฌ ๋•Œ ๋‘ ๋ฒˆ ๊ณ„์‚ฐ๋˜์—ˆ๋‹ค. ๊ทธ ์ด์ค‘ ๊ณ„์‚ฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์„ธ์Šค์˜ "๊ณ ์ • ๋ฉ”๋ชจ๋ฆฌ ์ด๋Ÿ‰" ๊ฐ’์„ RLIMIT_MEMLOCK ์ œํ•œ์„ ๋„˜๋„๋ก ์ž˜๋ชป ๊ณ„์‚ฐํ•˜์—ฌ ์„ฑ๊ณตํ–ˆ์–ด์•ผ ํ•  mlock() ๋ฐ mlock2() ์š”์ฒญ์ด ์‹คํŒจํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋‚ณ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋ฆฌ๋ˆ…์Šค 4.9์—์„œ ๋ฒ„๊ทธ๊ฐ€ ๊ณ ์ณ์กŒ๋‹ค.

2.4.17๊นŒ์ง€์˜ 2.4 ์‹œ๋ฆฌ์ฆˆ ๋ฆฌ๋ˆ…์Šค ์ปค๋„์—์„œ ๋ฒ„๊ทธ ๋•Œ๋ฌธ์— fork(2)๋ฅผ ๊ฑฐ์น  ๋•Œ mlockall() MCL_FUTURE ํ”Œ๋ž˜๊ทธ๋ฅผ ๋ฌผ๋ ค๋ฐ›์•˜๋‹ค. ์ปค๋„ 2.4.18์—์„œ ์ˆ˜์ •๋˜์—ˆ๋‹ค.

์ปค๋„ 2.6.9๋ถ€ํ„ฐ๋Š” ํŠน๊ถŒ ํ”„๋กœ์„ธ์Šค๊ฐ€ mlockall(MCL_FUTURE)์„ ํ˜ธ์ถœํ•˜๊ณ  ์ดํ›„ ํŠน๊ถŒ์„ ๋ฒ„๋ฆฌ๋Š” (๊ฐ€๋ น ์‹คํšจ UID๋ฅผ 0 ์•„๋‹Œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด์„œ CAP_IPC_LOCK ์—ญ๋Šฅ์„ ์žƒ๋Š”) ๊ฒฝ์šฐ์— RLIMIT_MEMLOCK ์ž์› ์ œํ•œ์— ๋„๋‹ฌํ•ด ์žˆ์œผ๋ฉด ์ด์–ด์ง€๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น(๊ฐ€๋ น mmap(2), brk(2))์ด ์‹คํŒจํ•˜๊ฒŒ ๋œ๋‹ค.

SEE ALSO

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


2018-02-02

โš ๏ธ **GitHub.com Fallback** โš ๏ธ