mallopt(3) - wariua/manpages-ko GitHub Wiki
mallopt - ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋งค๊ฐ๋ณ์ ์ค์ ํ๊ธฐ
#include <malloc.h>
int mallopt(int param, int value);
mallopt()
ํจ์๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํจ์๋ค(malloc(3) ์ฐธ๊ณ )์ ๋์์ ์ ์ดํ๋ ๋งค๊ฐ๋ณ์๋ค์ ์กฐ์ ํ๋ค. param
์ธ์๋ ๋ณ๊ฒฝํ ๋งค๊ฐ๋ณ์๋ฅผ ๋ํ๋ด๊ณ value
๋ ๊ทธ ๋งค๊ฐ๋ณ์์ ์ ๊ฐ์ ๋ํ๋ธ๋ค.
param
์ ๋ค์ ๊ฐ์ ์ง์ ํ ์ ์๋ค.
M_ARENA_MAX
-
๊ฐ์ด 0์ด ์๋๋ฉด ์ด ๋งค๊ฐ๋ณ์๋ ๋ง๋ค ์ ์๋ ์๋ ๋ ์ต๋ ๊ฐ์์ ๋ํ ๊ฒฝ์ฑ ์ ํ์ ๊ท์ ํ๋ค. ์๋ ๋(arena)๋ malloc(3) (๋ฐ ์ ์ฌ) ํธ์ถ์ด ํ ๋น ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ํ์ ๋ํ๋ธ๋ค. ์๋ ๋๋ ์ค๋ ๋์ ๋ํด ์์ ํ๊ณ ๊ทธ๋์ ๋์์ ๋ฉ๋ชจ๋ฆฌ ์์ฒญ์ด ์ฌ๋ฌ ๊ฐ ์์ ์ ์๋ค. ์ค๋ ๋ ์์ ์๋ ๋ ์ ๊ฐ์๋ ์์ถฉ ๊ด๊ณ๊ฐ ์๋ค. ์๋ ๋๊ฐ ๋ง์์๋ก ์ค๋ ๋ ๊ฐ ๊ฒฝ์์ด ์ค์ด๋ค์ง๋ง ๋์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฌ๋ผ๊ฐ๋ค.
์ด ๋งค๊ฐ๋ณ์์ ๊ธฐ๋ณธ๊ฐ์ 0์ธ๋ฐ,
M_ARENA_TEST
์ค์ ์ ๋ฐ๋ผ ์๋ ๋ ๊ฐ์ ์ ํ์ ์ ํ๋ค๋ ๋ป์ด๋ค.์ด ๋งค๊ฐ๋ณ์๋ glibc 2.10๋ถํฐ
--enable-experimental-malloc
์ ํตํด์, ๊ทธ๋ฆฌ๊ณ glibc 2.15๋ถํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. ์ด๋ค ํ ๋น์ ๋ฒ์ ๋ค(๊ฐ๋ น CentOS 5, RHEL 5)์์๋ ์์ฑ ์๋ ๋ ์์ ์ ํ์ด ์์๋ค.์ดํ์ glibc ๋ฒ์ ์ ์ฌ์ฉํ๊ณ ์์ ๋ ์ด๋ค ๊ฒฝ์ฐ์ ์์ฉ์์ ์๋ ๋ ์ ๊ทผ ์ ๋์ ๊ฒฝ์์ ๋ณด์ผ ์ ์๋ค. ๊ทธ๋ฐ ๊ฒฝ์ฐ์ ์ค๋ ๋ ์์ ๋ง๊ฒ
M_ARENA_MAX
๋ฅผ ๋์ด๋ ๊ฒ์ด ์ ์ตํ ์ ์๋ค. ์ด๋ ๋์ ๋ฐฉ์ ๋ฉด์์ tcmalloc๊ณผ jemalloc์ด ์ทจํ๋ ์ ๋ต(์ค๋ ๋๋ณ ํ ๋น ํ)๊ณผ ๋น์ทํ๋ค. M_ARENA_TEST
-
์ด ๋งค๊ฐ๋ณ์๋ ์์คํ ์ค์ ์ ํ์ธํด์ ์์ฑ ์๋ ๋ ์์ ๋ํ ๊ฒฝ์ฑ ์ ํ์ ์์๋ผ ์์ ์ ์์ฑ ์๋ ๋ ์ ๋จ์๋ก ์ง์ ํ๋ค. (์๋ ๋์ ์ ์๋
M_ARENA_MAX
๋ฅผ ๋ณด๋ผ.)์๋ ๋ ๊ฒฝ์ฑ ์ ํ ๊ณ์ฐ ๋ฐฉ์์ ๊ตฌํ๋ณ๋ก ๊ท์ ํ๋๋ฐ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฉ CPU ์์ ๋ฐฐ์๋ก ๊ณ์ฐํ๋ค. ๊ฒฝ์ฑ ์ ํ์ ํ๋ฒ ๊ณ์ฐํ๊ณ ๋๋ฉด ๊ทธ ๊ฒฐ๊ณผ๊ฐ ์ต์ข ๊ฐ์ด ๋์ด ์๋ ๋์ ์ด๊ฐ์๋ฅผ ์ ํํ๋ค.
M_ARENA_TEST
๋งค๊ฐ๋ณ์์ ๊ธฐ๋ณธ๊ฐ์sizeof(long)
์ด 4์ธ ์์คํ ์์๋ 2์ด๋ค. ๊ทธ ์ธ ๊ฒฝ์ฐ์์๋ ๊ธฐ๋ณธ๊ฐ์ด 8์ด๋ค.์ด ๋งค๊ฐ๋ณ์๋ glibc 2.10๋ถํฐ
--enable-experimental-malloc
์ ํตํด์, ๊ทธ๋ฆฌ๊ณ glibc 2.15๋ถํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.M_ARENA_MAX
๊ฐ 0 ์๋ ๊ฐ์ ๊ฐ์ง ๋๋M_ARENA_TEST
์ ๊ฐ์ ์ฌ์ฉํ์ง ์๋๋ค. M_CHECK_ACTION
-
์ด ๋งค๊ฐ๋ณ์ ์ค์ ์ ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ค๋ฅ๋ค(๊ฐ๋ น ๊ฐ์ ํฌ์ธํฐ ๋ ๋ฒ ํด์ ํ๊ธฐ)์ ํ์งํ์ ๋ glibc๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง๋ฅผ ์ ์ดํ๋ค. ์ด ๋งค๊ฐ๋ณ์์ ํ ๋นํ ๊ฐ์ ํ์ 3๊ฐ (0๋ฒ, 1๋ฒ, 2๋ฒ) ๋นํธ๊ฐ ๋ค์๊ณผ ๊ฐ์ด glibc ๋์์ ๊ฒฐ์ ํ๋ค.
- 0๋ฒ ๋นํธ
- ์ด ๋นํธ๊ฐ ์ค์ ๋์ด ์์ผ๋ฉด ์ค๋ฅ ์์ธ ๋ด์ฉ์ ๋ด์ ํ ์ค์ง๋ฆฌ ๋ฉ์์ง๋ฅผ
stderr
๋ก ์ฐ๋๋ค. ๋ฉ์์ง๋ "*** glibc detected ***"๋ก ์์ํ๋ฉฐ, ๋ค์์ผ๋ก ํ๋ก๊ทธ๋จ ์ด๋ฆ๊ณผ ์ค๋ฅ๋ฅผ ํ์งํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํจ์ ์ด๋ฆ, ์งง์ ์ค๋ฅ ์ค๋ช , ๊ทธ๋ฆฌ๊ณ ์ค๋ฅ๋ฅผ ํ์งํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ์จ๋ค. - 1๋ฒ ๋นํธ
- ์ด ๋นํธ๊ฐ ์ค์ ๋์ด ์์ผ๋ฉด 0๋ฒ ๋นํธ์์ ์์ ํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ฐ์ ํ์ ํ๋ก๊ทธ๋จ์ด abort(3)๋ฅผ ํธ์ถํด์ ์ข
๋ฃํ๋ค. ๊ทธ๋ฆฌ๊ณ glibc ๋ฒ์ 2.4๋ถํฐ๋ 0๋ฒ ๋นํธ๊ฐ ํจ๊ป ์ค์ ๋ผ ์์ผ๋ฉด ์ค๋ฅ ๋ฉ์์ง ์ถ๋ ฅ๊ณผ ์คํ ์ค๋จ ์ฌ์ด์์ ํ๋ก๊ทธ๋จ์ด backtrace(3) ๋ฐฉ์์ผ๋ก ์คํ ํธ๋ ์ด์ค๋ฅผ ์ฐ๊ณ
/proc/[pid]/maps
๋ฐฉ์(proc(5) ์ฐธ๊ณ )์ผ๋ก ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ ๋งคํ์ ์ฐ๋๋ค. - 2๋ฒ ๋นํธ (glibc 2.4๋ถํฐ)
- 0๋ฒ ๋นํธ๊ฐ ํจ๊ป ์ค์ ๋ผ ์์ ๋๋ง ์ด ๋นํธ๊ฐ ํจ๊ณผ๊ฐ ์๋ค. ์ด ๋นํธ๊ฐ ์ค์ ๋์ด ์์ผ๋ฉด ์ค๋ฅ๋ฅผ ์ค๋ช ํ๋ ํ ์ค ๋ฉ์์ง๊ฐ ๊ฐ๋จํด์ ธ์ ์ค๋ฅ๋ฅผ ํ์งํ ํจ์ ์ด๋ฆ๊ณผ ์งง์ ์ค๋ฅ ์ค๋ช ๋ง ๋ด๋๋ค.
value
์ ๋๋จธ์ง ๋นํธ๋ค์ ๋ฌด์ํ๋ค.์ ๋ด์ฉ์ ์ข ํฉํ๋ฉด
M_CHECK_ACTION
์์ ๋ค์ ์ซ์ ๊ฐ๋ค์ด ์๋ฏธ๊ฐ ์๋ค.- 0
- ์ค๋ฅ ์กฐ๊ฑด์ ๋ฌด์ํ๋ค. (๊ท์ ๋์ง ์์ ๊ฒฐ๊ณผ๋ก) ์คํ์ ๊ณ์ํ๋ค.
- 1
- ์์ธํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ฐ๊ณ ์คํ์ ๊ณ์ํ๋ค.
- 2
- ํ๋ก๊ทธ๋จ ์คํ์ ์ค๋จํ๋ค.
- 3
- ์์ธํ ์ค๋ฅ ๋ฉ์์ง์ ์คํ ํธ๋ ์ด์ค, ๋ฉ๋ชจ๋ฆฌ ๋งคํ์ ์ฐ๊ณ ํ๋ก๊ทธ๋จ ์คํ์ ์ค๋จํ๋ค.
- 5
- ๊ฐ๋จํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ฐ๊ณ ์คํ์ ๊ณ์ํ๋ค.
- 7
- ๊ฐ๋จํ ์ค๋ฅ ๋ฉ์์ง์ ์คํ ํธ๋ ์ด์ค, ๋ฉ๋ชจ๋ฆฌ ๋งคํ์ ์ฐ๊ณ ํ๋ก๊ทธ๋จ ์คํ์ ์ค๋จํ๋ค.
glibc 2.3.4๋ถํฐ๋
M_CHECK_ACTION
๋งค๊ฐ๋ณ์์ ๊ธฐ๋ณธ๊ฐ์ด 3์ด๋ค. glibc ๋ฒ์ 2.3.3 ๋ฐ ์ด์ ์์๋ ๊ธฐ๋ณธ๊ฐ์ด 1์ด๋ค.M_CHECK_ACTION
์ 0 ์๋ ๊ฐ์ ์ฐ๋ ๊ฒ ์ ์ฉํ ์ ์๋ ๊ฑด ์ ๊ทธ๋ฌ๋ฉด ํฌ๋์๊ฐ ํจ์ฌ ๋์ค์ ๋ฐ์ํด์ ๋ฌธ์ ์ ์ง์ง ์์ธ์ ์ก์๋ด๊ธฐ๊ฐ ์์ฃผ ์ด๋ ค์ธ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค. M_MMAP_MAX
-
์ด ๋งค๊ฐ๋ณ์๋ mmap(2)์ผ๋ก ๋์์ ๋์ํ ์ ์๋ ํ ๋น ์์ฒญ ์ต๋ ๊ฐ์๋ฅผ ๋ํ๋ธ๋ค. ์ด ๋งค๊ฐ๋ณ์๊ฐ ์กด์ฌํ๋ ์ด์ ๋ ์ผ๋ถ ์์คํ ์์ mmap(2)์ ์ฐ๋ ๋ด๋ถ ํ ์ด๋ธ ์๊ฐ ํ์ ๋ผ ์์ด์ ์ฌ๋ฌ ๊ฐ๋ฅผ ์ฌ์ฉํ ๋ ์ฑ๋ฅ์ด ๋จ์ด์ง ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ธฐ๋ณธ๊ฐ์ 65,536์ด๋ค. ํน๋ณํ ์๋ฏธ๊ฐ ์๋ ๊ฐ์ ์๋๊ณ ์์ ์ฅ์น ์ญํ ์ผ ๋ฟ์ด๋ค. ์ด ๋งค๊ฐ๋ณ์๋ฅผ 0์ผ๋ก ์ค์ ํ๋ฉด ํฐ ํ ๋น ์์ฒญ์ mmap(2)์ผ๋ก ์ฒ๋ฆฌํ๋ ๋์์ด ๊บผ์ง๋ค.
M_MMAP_THRESHOLD
-
M_MMAP_THRESHOLD
๊ฐ ๋ํ๋ด๋ (๋ฐ์ดํธ ๋จ์) ์ ํ ์ด์์ด๊ณ ์ ํด ๋ชฉ๋ก์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ์์ฒญ์ ๋ํด ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํจ์๋ค์ sbrk(2)๋ก ํ๋ก๊ทธ๋จ ๋จ์ ์ ์ ์ฌ๋ฆฌ๋ ๋์ mmap(2)์ ์ฌ์ฉํ๋ค.mmap(2)์ ์ด์ฉํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐฉ์์๋ ํ ๋น ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ธ์ ๋ ๋ ๋ฆฝ์ ์ผ๋ก ์์คํ ์ผ๋ก ํด์ ํ ์ ์๋ค๋ ํฐ ์ฅ์ ์ด ์๋ค. (๊ทธ์ ๋ฐํด ํ์ ์๋จ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ ๋๋ง ์ค์ผ ์ ์๋ค.) ํํธ์ผ๋ก mmap(2) ์ฌ์ฉ์๋ ๋จ์ ๋ ์๋๋ฐ, ํ ๋น ํด์ ํ ๊ณต๊ฐ์ ํฅํ ํ ๋น์์ ์ฌ์ฌ์ฉํ๋๋ก ์ ํด ๋ชฉ๋ก์ ๋์ง ์์ผ๋ฉฐ, mmap(2) ํ ๋น์ด ํ์ด์ง์ ์ ๋ ฌ๋ผ ์์ด์ผ ํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ญ๋น๋ ์ ์์ผ๋ฉฐ, mmap(2)์ ํตํด ํ ๋นํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ 0์ผ๋ก ์ฑ์ฐ๋ ๋น์ผ ์์ ์ ์ปค๋์ด ์ํํด์ผ ํ๋ค. ์ด๋ฐ ์ธ์๋ค ์ฌ์ด์์ ๊ท ํ์ ์ก์ ๊ฒฐ๊ณผ๊ฐ
M_MMAP_THRESHOLD
๋งค๊ฐ๋ณ์ ๊ธฐ๋ณธ ์ค์ ์ธ 128*1024์ด๋ค.์ด ๋งค๊ฐ๋ณ์์ ํํ์ 0์ด๋ค. ์ํ์
DEFAULT_MMAP_THRESHOLD_MAX
์ธ๋ฐ, 32๋นํธ ์์คํ ์์๋ 512*1024์ด๊ณ 64๋นํธ ์์คํ ์์๋4*1024*1024*sizeof(long)
์ด๋ค.์ฐธ๊ณ : ์์ฆ glibc์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ ์ธ mmap ๋ฌธํฑ๊ฐ์ ์ฌ์ฉํ๋ค. ๋ฌธํฑ๊ฐ์ด ์ฒ์์๋ 128*1024์ด์ง๋ง ํ์ฌ ๋ฌธํฑ๋ณด๋ค ํฌ๊ณ
DEFAULT_MMAP_THRESHOLD_MAX
์ดํ์ธ ๋ธ๋ก์ ํด์ ํ ๋ ๋ฌธํฑ๊ฐ์ ํด์ ๋ธ๋ก ํฌ๊ธฐ์ ๊ฐ๊น๊ฒ ์กฐ์ ํ๋ค. ๋์ ์ธ mmap ๋ฌธํฑ๊ฐ์ ์ฌ์ฉํ๊ณ ์์ ๋๋ ํ ์ค์ด๊ธฐ ๋ฌธํฑ๊ฐ ์ญ์๋ ๋์ mmap ๋ฌธํฑ๊ฐ์ ๋ ๋ฐฐ๊ฐ ๋๋๋ก ๋์ ์ผ๋ก ์กฐ์ ํ๋ค.M_TRIM_THRESHOLD
,M_TOP_PAD
,M_MMAP_THRESHOLD
,M_MMAP_MAX
๋งค๊ฐ๋ณ์ ์ค ํ๋๋ผ๋ ์ค์ ํ๋ฉด mmap ๋ฌธํฑ๊ฐ ์๋ ์กฐ์ ์ด ๊บผ์ง๋ค. -
M_MXFAST
(glibc 2.3๋ถํฐ) -
"ํจ์คํธ๋น(fastbin)"์ ์ด์ฉํด ์ฒ๋ฆฌํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์ฒญ์ ์ํ์ ์ค์ ํ๋ค. (์ด ๋งค๊ฐ๋ณ์์ ๋จ์๋ ๋ฐ์ดํธ์ด๋ค.) ํจ์คํธ๋น์ ํด์ ๋ ๊ฐ์ ํฌ๊ธฐ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก๋ค์ ์ธ์ ๋ธ๋ก๊ณผ ๋ณํฉํ์ง ์๊ณ ์ ์งํด ๋๋ ์ ์ฅ ์์ญ์ด๋ค. ์ดํ์ ๊ฐ์ ํฌ๊ธฐ ๋ธ๋ก์ ๋ค์ ํ ๋นํ๋ฉด ํจ์คํธ๋น์ ์ด์ฉํด ์์ฃผ ๋นจ๋ฆฌ ์ฒ๋ฆฌํ ์ ์๋ค. ๋ค๋ง ๋ฉ๋ชจ๋ฆฌ ๋จํธํ์ ํ๋ก๊ทธ๋จ์ ์ ๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฆ๊ฐํ ์ ์๋ค.
์ด ๋งค๊ฐ๋ณ์์ ๊ธฐ๋ณธ๊ฐ์
64*sizeof(size_t)/4
(32๋นํธ ์ํคํ ์ฒ์์๋ 64)์ด๋ค. ์ด ๋งค๊ฐ๋ณ์์ ๋ฒ์๋ 0์์80*sizeof(size_t)/4
๊น์ง์ด๋ค.M_MXFAST
๋ฅผ 0์ผ๋ก ์ค์ ํ๋ฉด ํจ์คํธ๋น ์ฌ์ฉ์ ๋๋ค. -
M_PERTURB
(glibc 2.4๋ถํฐ) -
์ด ๋งค๊ฐ๋ณ์๋ฅผ 0 ์๋ ๊ฐ์ผ๋ก ์ค์ ํ๋ฉด (calloc(3)์ ํตํ ํ ๋น์ ์ ์ธํ๊ณ ) ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํธ๋ค์
value
์ ์ตํ์ ๋ฐ์ดํธ ๊ฐ์ ๋ณด์๋ก ์ด๊ธฐํ ํ๋ฉฐ, ํ ๋น ๋ฉ๋ชจ๋ฆฌ๋ฅผ free(3)๋ฅผ ์ด์ฉํด ํด์ ํ ๋ ํด์ ๋ ๋ฐ์ดํธ๋ค์value
์ ์ตํ์ ๋ฐ์ดํธ๋ก ์ค์ ํ๋ค. ํ๋ก๊ทธ๋จ์์ ํ ๋น ๋ฉ๋ชจ๋ฆฌ๊ฐ 0์ผ๋ก ์ด๊ธฐํ ๋์ด ์๋ค๊ณ ์๋ชป ์์ ํ๊ฑฐ๋ ์ด๋ฏธ ํด์ ๋ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ ์ฌ์ฌ์ฉํ๋ ์ค๋ฅ๋ฅผ ํ์งํ๋ ๋ฐ ๋์์ด ๋ ์ ์๋ค.์ด ๋งค๊ฐ๋ณ์์ ๊ธฐ๋ณธ๊ฐ์ 0์ด๋ค.
M_TOP_PAD
-
์ด ๋งค๊ฐ๋ณ์๋ sbrk(2)๋ฅผ ํธ์ถํด ํ๋ก๊ทธ๋จ ๋จ์ ์ ์ ๋ณ๊ฒฝํ ๋ ์ ์ฉํ ํจ๋ฉ์ ์์ ๊ท์ ํ๋ค. (์ด ๋งค๊ฐ๋ณ์์ ๋จ์๋ ๋ฐ์ดํธ์ด๋ค.) ๋ค์ ๊ฒฝ์ฐ์ ์ด ๋งค๊ฐ๋ณ์๊ฐ ํจ๊ณผ๊ฐ ์๋ค.
-
ํ๋ก๊ทธ๋จ ๋จ์ ์ ์ด ์ฌ๋ผ๊ฐ ๋ sbrk(2) ์์ฒญ์
M_TOP_PAD
๋ฐ์ดํธ๋ฅผ ์ถ๊ฐํ๋ค. -
free(3) ํธ์ถ์ ๊ฒฐ๊ณผ๋ก ํ์ ์ค์ผ ๋ (
M_TRIM_THRESHOLD
์ค๋ช ์ฐธ๊ณ ) ํ ์๋จ์ ์ด๋งํผ์ ์ ํด ๊ณต๊ฐ์ ๋จ๊ฒจ๋๋ค.
์ด๋ ๊ฒฝ์ฐ์ด๋ ํจ๋ฉ ์์ ํญ์ ์์คํ ํ์ด์ง ๊ฒฝ๊ณ๋ก ์ฌ๋ฆผ ํ๋ค.
M_TOP_PAD
๋ณ๊ฒฝ์ (๋งค๊ฐ๋ณ์๋ฅผ ๋ฎ๊ฒ ์ค์ ํ์ ๋) ์์คํ ํธ์ถ ํ์๊ฐ ๋์ด๋๋ ๊ฒ๊ณผ (๋งค๊ฐ๋ณ์๋ฅผ ๋๊ฒ ์ค์ ํ์ ๋) ํ ์๋จ์ ์ ์ฐ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ญ๋นํ๋ ๊ฒ ์ฌ์ด์ ํํ์ด๋ค.์ด ๋งค๊ฐ๋ณ์์ ๊ธฐ๋ณธ๊ฐ์ 128*1024์ด๋ค.
-
M_TRIM_THRESHOLD
-
ํ ์๋จ์ ์ฐ์๋ ์ ํด ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ถฉ๋ถํ ์ปค์ง๋ฉด free(3)์์ sbrk(2)๋ฅผ ์ฌ์ฉํด ๊ทธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์คํ ์ผ๋ก ๋๋๋ ค์ค๋ค. (์๋นํ ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ ํ์๋ ์ค๋ซ๋์ ์คํ๋๋ ํ๋ก๊ทธ๋จ์์ ์ด ๋์์ด ์ ์ฉํ ์ ์๋ค.)
M_TRIM_THRESHOLD
๋งค๊ฐ๋ณ์๋ sbrk(2)๋ฅผ ์ด์ฉํด ํ์ ์ค์ด๊ฒ ๋๋ ค๋ฉด ์ ํด ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ด ๋๋ฌํด์ผ ํ๋ ์ต์ ํฌ๊ธฐ(๋ฐ์ดํธ ๋จ์)๋ฅผ ์ง์ ํ๋ค.์ด ๋งค๊ฐ๋ณ์์ ๊ธฐ๋ณธ๊ฐ์ 128*1024์ด๋ค.
M_TRIM_THRESHOLD
๋ฅผ -1๋ก ์ค์ ํ๋ฉด ์ค์ด๊ธฐ๋ฅผ ์์ ํ ๋๋ค.M_TRIM_THRESHOLD
๋ณ๊ฒฝ์ (๋งค๊ฐ๋ณ์๋ฅผ ๋ฎ๊ฒ ์ค์ ํ์ ๋) ์์คํ ํธ์ถ ํ์๊ฐ ๋์ด๋๋ ๊ฒ๊ณผ (๋งค๊ฐ๋ณ์๋ฅผ ๋๊ฒ ์ค์ ํ์ ๋) ํ ์๋จ์ ์ ์ฐ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ญ๋นํ๋ ๊ฒ ์ฌ์ด์ ํํ์ด๋ค. MALLOC_ARENA_MAX
-
mallopt()
M_ARENA_MAX
์ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ดํ๋ค. MALLOC_ARENA_TEST
-
mallopt()
M_ARENA_TEST
์ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ดํ๋ค. MALLOC_CHECK_
-
์ด ํ๊ฒฝ ๋ณ์๋
mallopt()
M_CHECK_ACTION
๊ณผ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ดํ๋ค. ์ด ๋ณ์๊ฐ 0 ์๋ ๊ฐ์ผ๋ก ์ค์ ๋ผ ์์ผ๋ฉด ํน์ํ๊ฒ ๊ตฌํ๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํจ์๋ค์ ์ด๋ค. (malloc_hook(3) ๊ธฐ๋ฅ์ ์ด์ฉํด ๊ทธ๋ ๊ฒ ํ๋ค.) ๊ทธ ๊ตฌํ์์ ์ถ๊ฐ์ ์ธ ์ค๋ฅ ๊ฒ์ฌ๋ฅผ ์ํํ๋ฉฐ ํ์ค ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํจ์๋ค๋ณด๋ค ๋๋ฆฌ๋ค. (๊ทธ ๊ตฌํ์ด ๊ฐ๋ฅํ ๋ชจ๋ ์ค๋ฅ๋ฅผ ํ์งํ์ง๋ ์๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋์๋ ์ฌ์ ํ ๋ฐ์ํ ์ ์๋ค.)์ด ํ๊ฒฝ ๋ณ์์ ํ ๋นํ๋ ๊ฐ์ ํ ์๋ฆฌ ์ซ์์ฌ์ผ ํ๋ฉฐ, ๊ทธ ์๋ฏธ๋
M_CHECK_ACTION
์์ ์ค๋ช ํ๋ ๋๋ก์ด๋ค. ๊ทธ ์ฒซ ๋ฒ์งธ ์ซ์ ์ดํ์ ๋ฌธ์๋ค์ ๋ฌด์๋๋ค.๋ณด์์ ์ด์ ๋๋ฌธ์ set-user-ID ๋ฐ set-group-ID ํ๋ก๊ทธ๋จ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก
MALLOC_CHECK_
์ ํจ๊ณผ๊ฐ ๊บผ์ง๋ค. ํ์ง๋ง/etc/suid-debug
๋ผ๋ ํ์ผ์ด ์กด์ฌํ๋ฉด (ํ์ผ์ ๋ด์ฉ๋ฌผ์ ์๊ด์์) set-user-ID ๋ฐ set-group-ID ํ๋ก๊ทธ๋จ์๋MALLOC_CHECK_
๊ฐ ํจ๊ณผ๊ฐ ์๋ค. MALLOC_MMAP_MAX_
-
mallopt()
M_MMAP_MAX
์ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ดํ๋ค. MALLOC_MMAP_THRESHOLD_
-
mallopt()
M_MMAP_THRESHOLD
์ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ดํ๋ค. MALLOC_PERTURB_
-
mallopt()
M_PERTURB
์ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ดํ๋ค. MALLOC_TRIM_THRESHOLD_
-
mallopt()
M_TRIM_THRESHOLD
์ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ดํ๋ค. MALLOC_TOP_PAD_
-
mallopt()
M_TOP_PAD
์ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ดํ๋ค.
์ฌ๋ฌ ํ๊ฒฝ ๋ณ์๋ค์ ์ ์ํ์ฌ mallopt()
๋ก ์ ์ดํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ค์ ๋ณ๊ฒฝํ ์ ์๋ค. ํ๊ฒฝ ๋ณ์ ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ ์์ค ์ฝ๋๋ฅผ ๋ฐ๊ฟ ํ์๊ฐ ์๋ค๋ ์ฅ์ ์ด ์๋ค. ํจ๊ณผ๊ฐ ์์ผ๋ ค๋ฉด ์ฒซ ๋ฒ์งธ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํจ์ ํธ์ถ ์ ์ ์ด ๋ณ์๋ค์ด ์ ์๋ผ ์์ด์ผ ํ๋ค. (๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ mallopt()
๋ฅผ ํตํด ์กฐ์ ํ๋ ๊ฒฝ์ฐ์๋ mallopt()
์ค์ ์ด ์ฐ์ ์๋๋ค.) ๋ณด์์ ์ด์ ๋๋ฌธ์ set-user-ID ๋ฐ set-group-ID ํ๋ก๊ทธ๋จ์์๋ ์ด ๋ณ์๋ค์ด ๋ฌด์๋๋ค.
๊ทธ ํ๊ฒฝ ๋ณ์๋ค์ ๋ค์๊ณผ ๊ฐ๋ค. (์ผ๋ถ ํ๊ฒฝ ๋ณ์ ์ด๋ฆ ๋์ ๋ฐ์ค์ด ๋ถ์ด ์๋ค๋ ๊ฒ์ ์ ์ํ๋ผ.)
์ฑ๊ณต ์ mallopt()
๋ 1์ ๋ฐํํ๋ค. ์ค๋ฅ ์ 0์ ๋ฐํํ๋ค.
์ค๋ฅ ์ errno
๋ฅผ ์ค์ ํ์ง ์๋๋ค.
์ด ํจ์๋ POSIX๋ C ํ์ค์ ๋ช
์ธ๋์ด ์์ง ์๋ค. ์ฌ๋ฌ ์์คํ
V ํ์ ์์คํ
์ ๋น์ทํ ํจ์๊ฐ ์กด์ฌํ์ง๋ง param
๊ฐ์ ๋ฒ์๊ฐ ์์คํ
์ ๋ฐ๋ผ ๋ค๋ฅด๋ค. SVID์์ M_MXFAST
, M_NLBLKS
, M_GRAIN
, M_KEEP
์ต์
์ ์ ์ํ์ง๋ง ์ด ์ค ์ฒซ ๋ฒ์งธ๋ง glibc์ ๊ตฌํ๋์ด ์๋ค.
param
์ ์ ํจํ์ง ์์ ๊ฐ์ ์ง์ ํด๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
glibc ๊ตฌํ ๋ด์ ๊ณ์ฐ ์ค๋ฅ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ํธ์ถ ์
mallopt(M_MXFAST, n)
n
๊น์ง ํฌ๊ธฐ์ ๋ชจ๋ ํ ๋น์ ํจ์คํธ๋น์ ์ฌ์ฉํ๊ฒ ๋์ง ์๋๋ค. ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํ๋ ค๋ฉด n
์ ๋ค์ ๋ฒ (2k+1)*sizeof(size_t)
๋ก ์ฌ๋ฆผ ํด์ผ ํ๋ค (k
๋ ์ ์).
mallopt()
๋ฅผ ์ฌ์ฉํด M_PERTURB
๋ฅผ ์ค์ ํ๋ฉด ๊ธฐ๋ํ๋ ๋๋ก ํ ๋น ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํธ๋ค์ด value
์ ๋ฐ์ดํธ์ ๋ณด์๋ก ์ด๊ธฐํ ๋๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ ๋ ๊ทธ ์์ญ์ ๋ฐ์ดํธ๋ค์ด value
์ ์ง์ ํ ๋ฐ์ดํธ๋ก ์ด๊ธฐํ ๋๋ค. ๊ทธ๋ฐ๋ฐ ๊ตฌํ์ sizeof(size_t)
์ฐจ์ด์ ์ค๋ฅ๊ฐ ์๋ค. free(p)
ํธ์ถ๋ก ํด์ ํ๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ ํํ ์ด๊ธฐํ ํ์ง ์๊ณ p+sizeof(size_t)
์์ ์์ํ๋ ๋ธ๋ก์ ์ด๊ธฐํ ํ๋ค.
์๋ ํ๋ก๊ทธ๋จ์ M_CHECK_ACTION
์ฌ์ฉ ๋ฐฉ์์ ๋ณด์ฌ ์ค๋ค. ํ๋ก๊ทธ๋จ์ (์ ์) ๋ช
๋ นํ ์ธ์๋ฅผ ์ฃผ๋ฉด ๊ทธ ์ธ์๋ก M_CHECK_ACTION
๋งค๊ฐ๋ณ์๋ฅผ ์ค์ ํ๋ค. ๊ทธ๋ฌ๊ณ ์ ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํ ๋นํด์ ์ด๋ฅผ ๋ ๋ฒ ํด์ ํ๋ค (์ค๋ฅ).
๋ค์ ์
ธ ์ธ์
์ glibc ํ์์ M_CHECK_ACTION
๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ด ํ๋ก๊ทธ๋จ์ ์คํํ ๋ ์ด๋ป๊ฒ ๋๋์ง ๋ณด์ฌ ์ค๋ค.
$ ./a.out
main(): returned from first free() call
*** glibc detected *** ./a.out: double free or corruption (top): 0x09d30008 ***
======= Backtrace: =========
/lib/libc.so.6(+0x6c501)[0x523501]
/lib/libc.so.6(+0x6dd70)[0x524d70]
/lib/libc.so.6(cfree+0x6d)[0x527e5d]
./a.out[0x80485db]
/lib/libc.so.6(__libc_start_main+0xe7)[0x4cdce7]
./a.out[0x8048471]
======= Memory map: ========
001e4000-001fe000 r-xp 00000000 08:06 1083555 /lib/libgcc_s.so.1
001fe000-001ff000 r--p 00019000 08:06 1083555 /lib/libgcc_s.so.1
[์ผ๋ถ ํ ์๋ต]
b7814000-b7817000 rw-p 00000000 00:00 0
bff53000-bff74000 rw-p 00000000 00:00 0 [stack]
Aborted (core dumped)
๋ค์ ์คํ ์๋ M_CHECK_ACTION
์ ๋ค๋ฅธ ๊ฐ์ ์ฌ์ฉํ ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ ์ค๋ค.
$ ./a.out 1 # ์ค๋ฅ ์ง๋จ ๋ฐ ์คํ ๊ณ์
main(): returned from first free() call
*** glibc detected *** ./a.out: double free or corruption (top): 0x09cbe008 ***
main(): returned from second free() call
$ ./a.out 2 # ์ค๋ฅ ๋ฉ์์ง ์์ด ์คํ ์ค๋จ
main(): returned from first free() call
Aborted (core dumped)
$ ./a.out 0 # ์ค๋ฅ ๋ฌด์ํ๊ณ ์คํ ๊ณ์
main(): returned from first free() call
main(): returned from second free() call
๋ค์ ์คํ ์๋ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ MALLOC_CHECK_
ํ๊ฒฝ ๋ณ์๋ฅผ ์ด์ฉํด ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ ์ค๋ค.
$ MALLOC_CHECK_=1 ./a.out
main(): returned from first free() call
*** glibc detected *** ./a.out: free(): invalid pointer: 0x092c2008 ***
main(): returned from second free() call
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{
char *p;
if (argc > 1) {
if (mallopt(M_CHECK_ACTION, atoi(argv[1])) != 1) {
fprintf(stderr, "mallopt() failed");
exit(EXIT_FAILURE);
}
}
p = malloc(1000);
if (p == NULL) {
fprintf(stderr, "malloc() failed");
exit(EXIT_FAILURE);
}
free(p);
printf("main(): returned from first free() call\n");
free(p);
printf("main(): returned from second free() call\n");
exit(EXIT_SUCCESS);
}
mmap(2), sbrk(2), mallinfo(3), malloc(3), malloc_hook(3), malloc_info(3), malloc_stats(3), malloc_trim(3), mcheck(3), mtrace(3), posix_memalign(3)
2019-03-06