mallopt(3) - wariua/manpages-ko GitHub Wiki

NAME

mallopt - ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ค์ •ํ•˜๊ธฐ

SYNOPSIS

#include <malloc.h>

int mallopt(int param, int value);

DESCRIPTION

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 ๋ณ€๊ฒฝ์€ (๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋‚ฎ๊ฒŒ ์„ค์ •ํ–ˆ์„ ๋•Œ) ์‹œ์Šคํ…œ ํ˜ธ์ถœ ํšŸ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ๊ณผ (๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋†’๊ฒŒ ์„ค์ •ํ–ˆ์„ ๋•Œ) ํž™ ์ƒ๋‹จ์˜ ์•ˆ ์“ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‚ญ๋น„ํ•˜๋Š” ๊ฒƒ ์‚ฌ์ด์˜ ํƒ€ํ˜‘์ด๋‹ค.

ํ™˜๊ฒฝ ๋ณ€์ˆ˜

์—ฌ๋Ÿฌ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋“ค์„ ์ •์˜ํ•˜์—ฌ mallopt()๋กœ ์ œ์–ดํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์‚ฌ์šฉ์€ ํ”„๋กœ๊ทธ๋žจ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ€ ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ํšจ๊ณผ๊ฐ€ ์žˆ์œผ๋ ค๋ฉด ์ฒซ ๋ฒˆ์งธ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ „์— ์ด ๋ณ€์ˆ˜๋“ค์ด ์ •์˜๋ผ ์žˆ์–ด์•ผ ํ•œ๋‹ค. (๊ฐ™์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ mallopt()๋ฅผ ํ†ตํ•ด ์กฐ์ •ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” mallopt() ์„ค์ •์ด ์šฐ์„ ์‹œ๋œ๋‹ค.) ๋ณด์•ˆ์  ์ด์œ  ๋•Œ๋ฌธ์— set-user-ID ๋ฐ set-group-ID ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ์ด ๋ณ€์ˆ˜๋“ค์ด ๋ฌด์‹œ๋œ๋‹ค.

๊ทธ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. (์ผ๋ถ€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ด๋ฆ„ ๋์— ๋ฐ‘์ค„์ด ๋ถ™์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์— ์œ ์˜ํ•˜๋ผ.)

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์™€ ๊ฐ™์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œ์–ดํ•œ๋‹ค.

RETURN VALUE

์„ฑ๊ณต ์‹œ mallopt()๋Š” 1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์˜ค๋ฅ˜ ์‹œ 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

ERRORS

์˜ค๋ฅ˜ ์‹œ errno๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค.

CONFORMING TO

์ด ํ•จ์ˆ˜๋Š” POSIX๋‚˜ C ํ‘œ์ค€์— ๋ช…์„ธ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค. ์—ฌ๋Ÿฌ ์‹œ์Šคํ…œ V ํŒŒ์ƒ ์‹œ์Šคํ…œ์— ๋น„์Šทํ•œ ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ param ๊ฐ’์˜ ๋ฒ”์œ„๊ฐ€ ์‹œ์Šคํ…œ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. SVID์—์„œ M_MXFAST, M_NLBLKS, M_GRAIN, M_KEEP ์˜ต์…˜์„ ์ •์˜ํ–ˆ์ง€๋งŒ ์ด ์ค‘ ์ฒซ ๋ฒˆ์งธ๋งŒ glibc์— ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.

BUGS

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)์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๋ธ”๋ก์„ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.

EXAMPLE

์•„๋ž˜ ํ”„๋กœ๊ทธ๋žจ์€ 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);
}

SEE ALSO

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

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