๐ข chap5. ์คํ๊ณผ ํ
โญ 5.1 ์คํ
- ํ๋ก์ธ์ค๋ ํ ์ธ๊ทธ๋จผํธ ์์ด ๊ณ์ ์๋ ๊ฐ๋ฅ, but ์คํ ์ธ๊ทธ๋จผํธ๊ฐ ์๋ค๋ฉด ๋ถ๊ฐ๋ฅ
์คํ
- ํ๋ก์ธ์ค์ ์๋ช ์์ ์ฃผ์ ๋ถ๋ถ์ ํด๋น โ ํจ์ ํธ์ถ์ ๋ํ ๋ฉ์ปค๋์ฆ ๋๋ฌธ! (์คํ ์ธ๊ทธ๋จผํธ ์ด์ฉํด์ผ ํจ์ ํธ์ถ ๊ฐ๋ฅ)
- ์คํ์ ๋ด์ฉ ๊ฑด๋๋ฆฌ๋ฉด ํ๋ก์ธ์ค์ ์คํ ๋ฐฉํด ๋ฐ ์ค๋จ ๋ฐ์
- ์คํ ์ธ๊ทธ๋จผํธ์์ ์ด๋ค์ง๋ ํ ๋น์ ๋น ๋ฅด๋ฉฐ, ์ด๋ค ํน๋ณํ ํจ์ ํธ์ถ๋ ํ์ํ์ง ์์
- ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ฐ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ๊ฐ๋ฅ!
๐จ ํ์ง๋ง ์คํ์ ๋จ์ฉํ ์ ์์ผ๋ฏ๋ก ์ฃผ์
- ์คํ์ ์์ฃผ ํฌ์ง ์์ผ๋ฏ๋ก ํฐ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ์ ์์
์คํ์ ๋ด์ฉ์ ์๋ชป ์ฌ์ฉํ๋ฉด ์คํ์ด ์ค์ง๋๊ณ ์ถฉ๋์ด ๋ฐ์
๋ฒํผ ์ค๋ฒํ๋ก ์ํฉ : ์คํ์ ๋ด์ฉ์ ๋ฎ์ด ์ฐ๋ strcpy ํจ์
1 2 3 4 5 6 7 8
#include <string.h> int main(int argc, char ** argv) { char str[10]; strcpy(str, "akafjaskfjasfjaskfj132131431fasf"); return 0; }
- ํ๋ก๊ทธ๋จ ์ถฉ๋ ๋ฐ์ !!
- strcpy๊ฐ ์คํ์ ๋ด์ฉ์ ๋ฎ์ด ์ด๋ค โ ์คํ ์ค๋งค์ฑ (smashing)
- ๋ฐฐ์ด str ์๋ 10๊ฐ์ ๋ฌธ์์ด!
- strcpy ๋ ๋ฐฐ์ด str์ 10๊ฐ ๋๋ ๋ฌธ์๋ฅผ ๋ฎ์ด ์ฐ๊ณ ์์!! โ ์ด์ ์ ํธ์ํ ๋ณ์์ ์คํ ํ๋ ์์ ๋ฎ์ด ์ด๋ค โ main ์์ ์๋ชป๋ ๋ช ๋ น์ผ๋ก ๊ฑด๋๋
- ํ๋ก๊ทธ๋จ ์ถฉ๋ ๋ฐ์ !!
5.1.1 ์คํ ๊ฒ์ฌํ๊ธฐ
- ์คํ ์ธ๊ทธ๋จผํธ
- ์์ ์ ํ๋ก์ธ์ค๋ง์ด ์ฝ๊ณ ์์ ํ ๊ถํ์ ๊ฐ๋ ์ ์ฉ ๋ฉ๋ชจ๋ฆฌ
๋๋ฒ๊ฑฐ
- ๋๋ฒ๊ทธ ํ๋ ค๋ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ๋ถ์ฌ์ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ
๋๋ฒ๊ฑฐ๊ฐ ํ๋ก์ธ์ค๋ฅผ ๋๋ฒ๊น ํ๋ฉด์ ํ๋ ์์ ์ค์๋ ๋ค์ํ ๋ฉ๋ชจ๋ฆฌ ์ธ๊ทธ๋จผํธ๋ฅผ ๊ด์ฐฐํจ
- ํ๋ก์ธ์ค๋ฅผ ๋๋ฒ๊น ํ ๋๋ง ์ ์ฉ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ฝ๊ณ ์์ ๊ฐ๋ฅ
- ํ๋ก๊ทธ๋จ ๋ช ๋ น์ด์ ์คํ ์์๋ฅผ ์ ์ดํจ
์คํ์ ๊ฐ์ฅ ์์ ํ ๋น๋ ๋ฐฐ์ด์ ์ ์ธํ ํ ๋ฐฐ์ด์ ์์์ ๋ฌธ์์ด ๋ง๋ถ์ด๊ธฐ
1 2 3 4 5 6 7 8 9 10 11 12 13
// File name: ExtremeC_examples_chapter5_1.c // Description: Example 5.1 #include <stdio.h> int main(int argc, char** argv) { char arr[4]; arr[0] = 'A'; arr[1] = 'B'; arr[2] = 'C'; arr[3] = 'D'; return 0; }
- ํ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ malloc ํจ์๋ฅผ ์ฌ์ฉํ์ง ์์
- ๋ฐฐ์ด arr์ ํ์ํ ๋ฉ๋ชจ๋ฆฌ๋ ์คํ์ ํ ๋น
- ๐จ ์คํ ๋ฉ๋ชจ๋ฆฌ๋ ๋ณ์์ ๋ฐฐ์ด์ด ํ ๋น๋๋ ๊ธฐ๋ณธ ์ฅ์!
- ์คํ์ ์ต์๋จ์ ํ ๋น๋จ
๋๋ฒ๊น ํ๋ ค๋ฉดโฆ
- ๋๋ฒ๊น ์ฉ๋์ ์ด์ง ํ์ผ์ด ๋ฐ๋์ ๋น๋ ๋์ด์ผ ํจ
์ปดํ์ผ๋ฌ๋ก ๋๋ฒ๊ทธ ์ฌ๋ฒ์ ํฌํจํ๋ ์ด์ง ํ์ผ์ด ํ์ํ๋ค๊ณ ์ ๋ฌํด์ผ ํจ
- ๋๋ฒ๊ทธ ์ฌ๋ฒ : ์คํ๋๋ ์ฝ๋ ๋๋ ์ถฉ๋์ ์ผ๊ธฐํ๋ ์ฝ๋ ์ฐพ์๋
๋๋ฒ๊ทธ ์ฌ๋ฒ์ ํฌํจํ๋ ์คํ ๊ฐ๋ฅํ ๋ชฉ์ ํ์ผ์ ๋ง๋ค์ด๋ณด์!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
```bash gcc -g ExtremeC_examples_chapter5_1.c -o ex5_1_dbg.out ``` - -g : ์ต์ข ์คํ ๊ฐ๋ฅํ ๋ชฉ์ ํ์ผ์ ๋๋ฒ๊น ์ ๋ณด๊ฐ ์ฝ์ ๋๋ค - ์ปดํ์ผ ํ ๋ ์์ค์ ๋๋ฒ๊ทธ ์ต์ ์ด ์๋์ง์ ๋ฐ๋ผ ์ด์ง ํ์ผ์ ํฌ๊ธฐ๋ ๋ค๋ฅด๋ค - -g ์ต์ ์ด ์์ ๋ vs -g ์ต์ ์ด ์์ ๋ ```bash gcc ExtremeC_examples_chapter5_1.c -o ex5_1_dbg.out gcc -g ExtremeC_examples_chapter5_1.c -o ex5_1_dbg.out ``` ```bash ls -al ex5_1_dbg.out ls -al ex5_1.out ``` - -g ์ต์ ์๋ ex5_1.out (์ด์ง ํ์ผ)ํฌ๊ธฐ๊ฐ ๋ ์์ - **gdb** ๋ฅผ ํตํด ๋๋ฒ๊ทธ๋ฅผ ์์ํด๋ณด์ ```bash gdb ex5_1_dbg.out ``` - ์ฐ๋ฆฌ๋ ๋ฐฉ๊ธ! gdb ๋ช ๋ น์ด๋ ๋ฆฌ๋ ์ค ๋จธ์ ์์ ์คํํจ - gdb ๋ ๋๋ฒ๊น ๋ช ๋ น์ด๋ฅผ ์ ๋ฌํ๋ **์ปค๋งจ๋ ๋ผ์ธ ์ธํฐํ์ด์ค** ๊ฐ์ง - ๐จ So, ๋๋ฒ๊ฑฐ์ ์ ๋ ฅ๊ฐ์ผ๋ก ์ง์ ๋ ์คํ ๊ฐ๋ฅํ ๋ชฉ์ ํ์ผ์ ์คํํ๋ ค๋ฉด ๋ช ๋ น์ด (**r** ์๋๋ฉด **run**) ์ ๋ ฅํด์ผํจ!!!!! ```bash (gdb) run ``` ![17.png](/assets/img/gani0325/17.png){: width="150" } - run ๋ช ๋ น์ด๋ฅผ ์ ๋ฌํ๋ ์ ธ ๋ฐ์ค์ gdb๋ ํ๋ก์ธ์ค๋ฅผ ์์ํ๊ณ , ํ๋ก์ธ์ค์ ์ถ๊ฐ๋ ๋ค, ํ๋ก์ธ์ค๊ฐ ๋ช ๋ น์ด๋ฅผ ์คํํ๊ณ ์ข ๋ฃํจ - gdb๋ ํ๋ก๊ทธ๋จ์ ๋ฐฉํดํ์ง ์์ - **์ค๋จ์ (breakpoint)** ๋ฅผ ์ค์ ํ์ง ์์๊ธฐ ๋๋ฌธ - ์ค๋จ์ : gdb๊ฐ ํ๋ก๊ทธ๋จ์ ์คํ์ ๋ฉ์ถ๊ณ ๋์ค์ ๋ช ๋ น์ด๋ฅผ ๊ธฐ๋ค๋ฆฌ๋๋ก ํ๋ ํ์ (์ํ๋ ๋๋ก ์ผ๋ง๋ ์ธ ์ ์์) - main ํจ์์ b ์๋๋ฉด break ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด ์ค๋จ์ ์ ์ค์ ํ์ - ์ค๋จ์ ์ค์ ํ๋ฉด gdb๋ ํ๋ก๊ทธ๋จ์ด main ํจ์์ ์ง์ ํ ๋ ์คํ์ ์ค๋จ์ํจ๋ค `bash
(gdb) break main ` - ex5_1.c (main ์ด ๋ช ๋ฒ์งธ ์ค์ธ์ง ํ์ธ)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
// File name: ExtremeC_examples_chapter5_1.c // Description: Example 5.1 #include <stdio.h> int main(int argc, char** argv) { char arr[4]; arr[0] = 'A'; arr[1] = 'B'; arr[2] = 'C'; arr[3] = 'D'; return 0; } ``` - **break๋ก** main ํจ์ ์ (6๋ฒ ํ)์ ์ง์ ์ ์ค์งํจ - ๋ค์ ********\*\*********run********\*\********* ํ๋๊น main ํจ์ (6๋ฒ ํ) ์ง์ > **r or run** : gdb ์คํ > > **break main** : main ํจ์์์ ์ค๋จ์ ์ค์ > > **n or next** : ์ฝ๋์ ๋ค์ ํ ์คํ > > **print arr** : ๋ฐฐ์ด ๋ด์ฉ์ด ๋ฌธ์์ด๋ก ๋ํ๋จ
- ๋๋ฒ๊ฑฐ๋ ๋ค์ ๋ช ๋ น์ด๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉฐ, ํ๋ก๊ทธ๋จ์ ํ๋ํ๋ ํ์คํ์ค ์คํํจ
๋ฉ๋ชจ๋ฆฌ ๋ด๋ถ์ ๋ณ์์ ๋ณ์๊ฐ ๊ฐ๋ ๊ฐ์ ์ดํด๋ณด๊ณ ๊ฒ์ฌํ ์ ์์
- ์คํ, ํ ์ธ๊ทธ๋จผํธ ๊ฒ์ฌํ ๋ ์ฌ์ฉํจ
๋ฐฐ์ด์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ํ๋ฆฐํธ ํด๋ณด๊ธฐ
ex5_1.c (arr ํ์ธ)
1 2 3 4 5 6 7 8 9 10 11 12 13
// File name: ExtremeC_examples_chapter5_1.c // Description: Example 5.1 #include <stdio.h> int main(int argc, char** argv) { char arr[4]; arr[0] = 'A'; arr[1] = 'B'; arr[2] = 'C'; arr[3] = 'D'; return 0; }
1 2
(gdb) x/4b arr (gdb) x/8b arr
x/4b ๋ 10์ง์, x/4bx ๋ 16์ง์
- x/4b : arr ์ด ๊ฐ๋ฆฌํค๋ ์ง์ญ์์ 4๋ฐ์ดํธ๋ฅผ ๋ํ๋ธ๋ค
- arr ์ ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ
- x/8b : arr ์ด ๊ฐ๋ฆฌํค๋ ์ง์ญ์์ 8๋ฐ์ดํธ๋ฅผ ๋ํ๋ธ๋ค
- A, B, C, D ๊ฐ์ ๋ฐฐ์ด arr ์ ์ ์ฅ๋๋ค
- ๋ฐฐ์ด์๋ ์ค์ ๋ฌธ์์ด์ด ์๋๋ผ ์์คํค๊ฐ์ด ์ ์ฅ๋๋ค
- A ์ ์์คํค ๊ฐ์ 10์ง๋ฒ์ผ๋ก 65, 16์ง์๋ก 0x41
- B ์ ์์คํค ๊ฐ์ 10์ง๋ฒ์ผ๋ก 66, 16์ง์๋ก 0x42
- โ ๋๋จธ์ง 4๋ฐ์ดํธ๋ ๋ฌด์?
- ์คํ์ ์ํ ๊ฒ์ผ๋ก, main ํจ์๋ฅผ ํธ์ถํ๋ ๋์ ์คํ ๋งจ ์์ ๋์ธ ์ต๊ทผ์ ์คํ ํ๋ ์์ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ค
- ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์ง์ญ์ ์์ ์ฃผ์๋ถํฐ ์์ํด์ ์ฃผ์๊ฐ์ด ๋ ์ปค์ง๋ค
- ๐จ But, ์คํ ์ธ๊ทธ๋จผํธ๋ ํฐ ์ฃผ์๋ถํฐ ์ฑ์์ง๊ณ ์ฃผ์๊ฐ์ด ์์์ง๋ค
๐จ But, ์คํ ์ธ๊ทธ๋จผํธ๋ ํฐ ์ฃผ์๋ถํฐ ์ฑ์์ง๊ณ ์ฃผ์๊ฐ์ด ์์์ง๋ค
์ดํด๊ฐ ์๊ฐ์ ์๋ฃ ์ฐพ์๋ด
1 2 3 4 5 6 7 8 9 10 11 12
// File name: ExtremeC_examples_chapter2_5_main.c // Description: This file contains the 'main' function and a definition for another function 'add'. void add(int a, int b) { int c; c = a + b; } int main(void) { add(5, 6); return 0; }
- ์ฃผ์๊ฐ ์ปค์ง๋ ๋ฐฉํฅ์ผ๋ก ์คํ ์ธ๊ทธ๋จผํธ๋ฅผ ์ฝ๋๋ค? โ ์คํ ์ธ๊ทธ๋จผํธ์ ์ด๋ฏธ ํธ์๋ ๋ด์ฉ์ just ์ฝ๋ ๊ฒ..
- ๋ํ ๋ฐ์ดํธ ๋ณ๊ฒฝ์ ์คํ์ ๋ณ๊ฒฝํ๋๊ฒ, ์ข์ ๋ฐฉ์ ์๋!
- โ ์ ๋ฐฐ์ด arr ์ ํฌ๊ธฐ๋ณด๋ค ๋ ํฐ ๊ฐ์ด ๋ณด์ด๋๊ฑด๊ฐ?
- gdb๋ ์ฐ๋ฆฌ๊ฐ ์์ฒญํ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํธ ์๋ฅผ ๊ฒ์ฌ
- ๋ช
๋ น์ด x๋ ๋ฐฐ์ด์ ๊ฒฝ๊ณ๋ฅผ ์ ๊ฒฝ์ฐ์ง ์์!!!!
- ๋ฒ์๋ฅผ ์ถ๋ ฅํ๋ ค๋ฉด ์ค์ง ์์ ์ฃผ์์ ๋ฐ์ดํธ ์๋ง ํ์ํจ
- set ๋ช
๋ น์ด๋ก ๋ฐฐ์ด์ ๊ฐ๋ณ ๋ฐ์ดํธ ๋ณ๊ฒฝํ๊ธฐ (์คํ ๋ด๋ถ์ ๊ฐ ๋ณ๊ฒฝ)
- set : ์คํ ๋ด๋ถ์ ๊ฐ ๋ณ๊ฒฝํ๊ธฐ + ๋ฐฐ์ด์ ๊ฒฝ๊ณ ๋ฐ๊นฅ์ ์๋ ๊ฐ๋ณ ๋ฐ์ดํธ ๋ณ๊ฒฝํ๊ธฐ
- ๊ธฐ์กด ๋ฉ๋ชจ๋ฆฌ ์ ์ ์์ ํจ
- ๋ฉ๋ชจ๋ฆฌ ์
์ ๋ฐฐ์ด arr์ ์๋ ๊ฐ๋ณ ๋ฐ์ดํธ ์ฐธ์กฐํจ
1 2 3 4
(gdb) x/4bx arr (gdb) set arr[1] = 'F' (gdb) x/4bx arr (gdb) print arr
- set : ์คํ ๋ด๋ถ์ ๊ฐ ๋ณ๊ฒฝํ๊ธฐ + ๋ฐฐ์ด์ ๊ฒฝ๊ณ ๋ฐ๊นฅ์ ์๋ ๊ฐ๋ณ ๋ฐ์ดํธ ๋ณ๊ฒฝํ๊ธฐ
- set ๋ช
๋ น์ด๋ก ๋ฐฐ์ด์ ๊ฒฝ๊ณ ๋ฐ๊นฅ์ ์๋ ๊ฐ๋ณ ๋ฐ์ดํธ ๋ณ๊ฒฝํ๊ธฐ
- set : ์คํ ๋ด๋ถ์ ๊ฐ ๋ณ๊ฒฝํ๊ธฐ + ๋ฐฐ์ด์ ๊ฒฝ๊ณ ๋ฐ๊นฅ์ ์๋ ๊ฐ๋ณ ๋ฐ์ดํธ ๋ณ๊ฒฝํ๊ธฐ
- ๊ธฐ์กด ๋ฐฐ์ด arr ๋ณด๋ค ํจ์ฌ ๋ ํฐ ์ฃผ์์ ์์นํ ๋ฐ์ดํธ ์์ ํ๊ธฐ
- ์คํ์ ์ด๋ฏธ ํธ์๋ ๋ด์ฉ์ ๋ณ๊ฒฝํ๊ธฐ
- ๐จ ์คํ ๋ฉ๋ชจ๋ฆฌ๋ ๋ค๋ฅธ ์ธ๊ทธ๋จผํธ์ ์ ๋ฐ๋๋ก ์ฑ์์ง๋ค๋ ๊ฒ ์ ์
1 2 3
(gdb) x/20bx arr (gdb) set *(0x7fffffffdc71) = 0xff (gdb) x/20bx arr
- ๋ฐฐ์ด์ ๊ฒฝ๊ณ ๋ฐ๊นฅ์ ์๋ 0x7fffffffdc71 ์ฃผ์์ 0xff ๊ฐ์ ์ผ๋ค
- main ํจ์์ ์ง์ ํ๊ธฐ ์ ์ ํธ์๋ ์คํ ํ๋ ์ ์์ ์กด์ฌํ๋ ๋ฐ์ดํธ
- โ ์คํ์ ๊ณ์ ํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
- ์คํ์ ์ค์ ๋ฐ์ดํธ๋ฅผ ์์ ํ๋ค๋ฉด ์ถฉ๋ ๋ฐ์
- ์คํ์ ์ค์ ๋ฐ์ดํธ ๋ณ๊ฒฝํ๋ฉด ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋จ
- ์คํ์ ๋ด์ฉ์ ๋ฎ์ด ์ด๋ค โ ์คํ ์ค๋งค์ฑ (smashing)
- ํ ๋นํ์ง ์์ ์ฃผ์์ ์คํ ๋ด์ฉ์ ์์ ํ๋ค๋ฉด ์ถฉ๋!
- ๐จ So, ๋ณ์๋ ๋ฐฐ์ด์ ์ ์๋ ๊ฒฝ๊ณ ๋ฐ๊นฅ์ ์ด๋ ํ ๊ฐ๋ ์ฐ์ง ์์์ผ ํ๋ฉฐ! ์คํ ๋ณ์๋ฅผ ์์ฑํ ๋ ๋งค์ฐ ์ฃผ์ ํ์
์คํ ๋ฉ๋ชจ๋ฆฌ์์ ์ฃผ์๋ ์ ์ ์์์ง๊ธฐ ๋๋ฌธ์ด๋ค- ๊ทธ๋์ ์ด๋ฏธ ์์ฑ๋ ๋ฐ์ดํธ์ ๋ฎ์ด์ฐ๊ธฐ ์ฌ์~
- ์คํ์ ์ค์ ๋ฐ์ดํธ ๋ณ๊ฒฝํ๋ฉด ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋จ
- ์ด๋ค ๋ฉ์ปค๋์ฆ์ ๋ฐ๋ผ ์์ ์ด ๊ฐ์ง๋์ด ํ๋ก๊ทธ๋จ์ ์คํ ์ค๋จ
- ๋ช ๋ น์ด (c or continue) ๋ gdb ์์ ํ๋ก์ธ์ค๋ฅผ ๊ณ์ ์คํํจ
- ์คํ์ ์ค์ ๋ฐ์ดํธ๋ฅผ ์์ ํ๋ค๋ฉด ์ถฉ๋ ๋ฐ์
- ๋๋ฒ๊ทธ ๋ง์น๊ณ gdb ์์ ๋๊ฐ ๋ ๋ช
๋ น์ด
- g ๋๋ quit
1
(gdb) q
- g ๋๋ quit
- set : ์คํ ๋ด๋ถ์ ๊ฐ ๋ณ๊ฒฝํ๊ธฐ + ๋ฐฐ์ด์ ๊ฒฝ๊ณ ๋ฐ๊นฅ์ ์๋ ๊ฐ๋ณ ๋ฐ์ดํธ ๋ณ๊ฒฝํ๊ธฐ
- ๐จ ์ถ๊ฐ ์ฐธ๊ณ ํ ์ , ์คํ์ ๊ฐ์ฅ ์์ ํ ๋น๋ ๋ฒํผ (๋ฐ์ดํธ ๋๋ ๋ฌธ์์ด ๋ฐฐ์ด์ ๋ค๋ฅธ ์ด๋ฆ) ์ ํ ๋น๋์ง ์์ ๊ฐ์ ์์ฑํ๋ ์ผ์ ์ทจ์ฝ์ ์ผ๋ก ๊ฐ์ฃผ
- ๊ณต๊ฒฉ์๊ฐ ์ด๋ฅผ ์ด์ฉํด ๋ฐฐ์ด์ ํ๋ก๊ทธ๋จ์ ์ฃผ์ ํด์ ํต์ ํจ! โ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ = ์ต์คํ๋ก์
- ๋ฒํผ ์ค๋ฒํ๋ก ์ทจ์ฝ์ฑ์ ๋ํ๋ด๋ ํ๋ก๊ทธ๋จ
1 2 3 4 5
int main(int argc, char** argv) { char str[10]; strcpy(str, argv[1])' printf("Hello %s! \n", str); }
- argv[1] ์ ๋ ฅ๊ฐ์ ๋ด์ฉ๊ณผ ํฌ๊ธฐ๋ฅผ ๊ฒ์ฌํ์ง ์๊ณ ๋ฐฐ์ด str ์ ๊ณง๋ฐ๋ก ๋ณต์ ํจ
- ์ด ๊ฐ์ ์คํ์ ๋งจ ์์ ํ ๋น๋จ
- ํ์น ์์ง๋ง, ์ต์คํ๋ก์ ์ผ๊ธฐํจ
5.1.2 ์คํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ์ ์ฃผ์์
- ์ค์ฝํ (scope)
- ๊ฐ ์คํ ๋ณ์๋ ๊ณ ์ ์ ์ค์ฝํ๋ฅผ ๊ฐ๊ณ , ์ค์ฝํ๋ ๋ณ์์ ์๋ช ์ ๊ฒฐ์ ํจ
- ์คํ ๋ณ์๊ฐ ํ ์ค์ฝํ ๋ด์์ ์๋ช ์ ์์ํด์ ํด๋น ์ค์ฝํ๋ฅผ ๋ ๋๋ฉด ์ฃฝ๋ ๊ฒ! โ ์ค์ฝํ๋ ์คํ ๋ณ์์ ์๋ช ์ ๊ฒฐ์ ํจ
- ์คํ ๋ณ์๋ ๋ฉ๋ชจ๋ฆฌ์์ ์๋์ผ๋ก ํ ๋นํ๊ณ ํด์ ํ ์ ์์ง๋ง ์ค์ง ์คํ ๋ณ์์๋ง ํด๋น!!!!
- ์คํ ๋ณ์ ์ ์ธํ ๋๋ง๋ค ์คํ ์ธ๊ทธ๋จผํธ์ ๊ฐ์ฅ ์๋ถ๋ถ์ ํ ๋น๋จ
- ํ ๋น์ ์๋์ผ๋ก ์ด๋ค์ง๋ฉฐ ์ด๋ ๋ณ์ ์๋ช ์ ์์์ผ๋ก ๊ธฐ๋ก๋จ
- ์ดํ ๋ ๋ง์ ๋ณ์์ ์คํ ํ๋ ์์ด ์คํ์ ๋งจ ์์ ๋์
- ๋ณ์๊ฐ ์คํ์ ์กด์ฌํ๊ณ , ๋ค๋ฅธ ๋ณ์๊ฐ ๊ทธ ์์ ๋์ด๋ ํ ๊ทธ ๋ณ์๋ ๊ณ์ ์ด์์์
๐จ But, ๋ณ์๋ ์คํ์์ ํ ์์ pop ๋จ
- ๋ฏธ๋์ ์ธ์ ๊ฐ,, ํ๋ก๊ทธ๋จ์ ์ข ๋ฃ๋ ๊ฒ์ด๊ณ ์คํ์ ๊ทธ ์๊ฐ ๋น์์ ธ์ผ ํจ
- ํด์ ๋๋ ํ์์์ ์๋์ผ๋ก ์ด๋ค์ง๊ณ , ์ด๋ ๋ณ์ ์๋ช ์ ๋์ผ๋ก ํ์ โ ๊ฐ๋ฐ์๊ฐ ์ ์ดํ์ง ์๋ ์คํ ๋ณ์์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ์๋์ผ๋ก ์ด๋ค์ง๋ค
์คํ์ ๋งจ ์์ ๋ณ์ ํ๋ ์ ์ธํ๊ธฐ
1 2 3 4 5
int main(int argc, char ** argv) { int a; ... return 0; }
- ๋ณ์๋ main ํจ์๊ฐ ๋ฐํ๋๊ธฐ ์ ๊น์ง ์คํ์ ๋จ์ ์์
- ๋ณ์๋ ์ค์ฝํ (main ํจ์) ๊ฐ ์ ํจํ ๋๊น์ง ์กด์ฌํจ
- main ํจ์๋ ๋ชจ๋ ํ๋ก๊ทธ๋จ์ด ์คํํ๋ ๋ณ์์ด๋ฏ๋ก, ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋ด๋ด ์ ์ธ๋๋ ์ ์ญ ๋ณ์์ ๊ฑฐ์ ๊ฐ์
- ๋ณ์๋ ์ค์ฝํ (main ํจ์) ๊ฐ ์ ํจํ ๋๊น์ง ์กด์ฌํจ
๐จ ํ์ง๋ง ์ ์ญ๋ณ์๋ ์๋ ^^
- ๋ณ์๋ ์คํ์์ ํ์์ ๋๋ ๋๊ฐ ์์
- ์คํ ์ธ๊ทธ๋จผํธ์ ํ ๋น๋จ
- ์ ์ญ ๋ณ์๋ main ํจ์๊ฐ ์ข
๋ฃ๋๊ณ ํ๋ก๊ทธ๋จ์ด ์๋ฃ๋ ๋๋ ๋ฉ๋ชจ๋ฆฌ ๊ฐ๋๋ค
- ๋ฐ์ดํฐ๋, BSS ์ธ๊ทธ๋จผํธ์ ํ ๋น๋จ
์คํ์ ๊ฐ์ฅ ์๋ถ๋ถ์์ ๋ณ์๋ฅผ ์ ์ธํ๊ธฐ
1 2 3 4 5 6 7 8 9 10 11 12 13
// File name: ExtremeC_examples_chapter5_2.c // Description: Example 5.2 int* get_integer() { int var = 10; return &var; } int main(int argc, char** argv) { int* ptr = get_integer(); *ptr = 5; return 0; }
- get_integer ํจ์๋ ์ง์ญ๋ณ์ var ์ ์ฃผ์๋ฅผ ๋ฐํํ์ง๋ง get_integer ํจ์์ ์ค์ฝํ์์ ์ ์ธ๋ ๊ฒ
- get_integer ํจ์๋ ์ง์ญ ๋ณ์์ ์ฃผ์๋ฅผ ๋ฐํํจ
- main ํจ์๋ ๋ฐ์ ํฌ์ธํฐ๋ฅผ ์ญ์ฐธ์กฐํด ์ฃผ์๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฉ๋ชจ๋ฆฌ ์ง์ญ์ ์ ๊ทผํ๋ ค๊ณ ํจ
- ํจ์ ๋ด์์ ์ง์ญ ๋ณ์์ ์ฃผ์๋ฅผ ๋ฐํํ๋ ํํ ์ค์!!!
- ๐จ ๊ฒฝ๊ณ : ํจ์๊ฐ ์ง์ญ ๋ณ์์ ์ฃผ์๋ฅผ ๋ฐํํฉ๋๋ค
- ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด ๋ฐ์ํ๋ ์ธ๊ทธ๋ฉํ
์ด์
์ค๋ฅ
- ์ถฉ๋์ด๋ผ๊ณ ํ ์ ์์
- ์ผ๋ฐ์ ์ผ๋ก ์ด์ ์๋ ํ ๋น๋์์ผ๋, ํ์ฌ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ ํจํ์ง ์์ ์ ๊ทผ์ ํ๊ธฐ ๋๋ฌธ!
- get_integer ํจ์๋ ์ง์ญ๋ณ์ var ์ ์ฃผ์๋ฅผ ๋ฐํํ์ง๋ง get_integer ํจ์์ ์ค์ฝํ์์ ์ ์ธ๋ ๊ฒ
- ๋ณ์๋ ์คํ์์ ํ์์ ๋๋ ๋๊ฐ ์์
- ๋ณ์๋ main ํจ์๊ฐ ๋ฐํ๋๊ธฐ ์ ๊น์ง ์คํ์ ๋จ์ ์์
- gdb ๋ก ํ๋ก๊ทธ๋จ ์คํํ๋ฉด ์ถฉ๋์ ๊ดํ ๋ ์์ธํ ๋ด์ฉ ๋ํ๋จ!
- ์ปดํ์ผ ์ ๋๋ฒ๊ทธ ์ ๋ณด ์ฝ์ ํ๋ -g ์ต์ ์ ์ฌ์ฉํด์ผ ํจ!!!
- gdb ๋๋ valgrind ๊ฐ์ ๋๋ฒ๊ทธ ๋๊ตฌ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋จ ๋๋ฒ๊ทธ ๊ฐ๋ฅ
- ์ด๋๋ -g ์ต์ ์ถ๊ฐํด์ ์์ค ํ์ผ ์ปดํ์ผ ํ๊ธฐ
- ์ปดํ์ผ ์ -g ์ต์
์ฃผ๊ณ ๋๋ฒ๊ฑฐ ์คํํ๊ธฐ
- main ํจ์ ๋ด 11 ๋ฒ ํ์ ์ถฉ๋ ์์ธ์ด ์์
- ํ๋ก๊ทธ๋จ์ด ๋ฐํ๋ ํฌ์ธํฐ๋ฅผ ์ญ์ฐธ์กฐํด์ ๋ฐํ๋ ์ฃผ์๋ฅผ ์์ฑํ๋ ค๋ ๊ณณ
- ๋ณ์ var ์ get_integer ํจ์์ ์ง์ญ ๋ณ์๋ก, ๋ ์ด์ ์กด์ฌํ์ง ์์
- ๋ฐํ๋ ํฌ์ธํฐ๋ ํ์ ํฌ์ธํฐ
- ํ์ฌ ์ค์ฝํ์ ์๋ ๋ณ์์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ๋ค๋ฅธ ํจ์๋ก ์ ๋ฌํ๋ ๊ฒ์ด ์ผ๋ฐ์ .. - ํ์ฌ ์ค์ฝํ๊ฐ ์ ํจํ ์ด์, ๋ณ์๋ ํ์ฌ์ ์ค์ฝํ์ ์๊ธฐ ๋๋ฌธ! - ๊ทธ๋ฐ๋ฐ ๋์์ ๋ค๋ฅธ ์์
์ด ํ์ฌ ์ค์ฝํ ๋ด์ ์๋ ๋ณ์์ ์ฃผ์๋ฅผ ๋ํ๋ด๋ ํฌ์ธํฐ๋ฅผ ๋ฐ์์ ์ฌ์ฉํ๋ ค๊ณ ํ ๋๋ ์ ๋ฌ๋์ง ์์ (๋์ ํ๋ก๊ทธ๋จ์์๋ ์ข์ ๋ฐฉ์์ด XXX) - ํ์ฌ ์ค์ฝํ๋ ์ด๋ฏธ ์ฌ๋ผ์ก์ผ๋๊น!!
1 2 3 4 5 6 7 8 9
๐ก ์คํ ์ธ๊ทธ๋จผํธ - ์คํ ๋ฉ๋ชจ๋ฆฌ๋ **ํฌ๊ธฐ๊ฐ ์ ํ์ ** (ํฐ ๊ฐ์ฒด ์ ์ฅํ๊ธฐ์ ์ข์ ์ฅ์ X) - ์คํ ์ธ๊ทธ๋จผํธ์ **์ฃผ์๋ ์์์ง๋ค** (์คํ ๋ฉ๋ชจ๋ฆฌ๋ ์ค๋ฆ์ฐจ์์ผ๋ก ์ฝ์ผ๋ฉด, ์ด๋ฏธ ํธ์๋ ๋ฐ์ดํธ๋ฅผ ์ฝ๋ ๊ฒ์) - ์คํ์ **์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ด๋ฆฌ**๋จ (ํ ๋น ๋ฐ ํด์ ๋ชจ๋) - **๋ชจ๋ ์คํ ๋ณ์๋ ์ค์ฝํ**๋ฅผ ๊ฐ์ง๋ฉฐ ์ค์ฝํ๋ ๋ณ์์ ์๋ช ์ ๊ฒฐ์ ํจ - **ํฌ์ธํฐ๋ ๊ณ์ ์ค์ฝํ ๋ด์ ์กด์ฌํ๋ ์คํ ๋ณ์๋ง**์ ๊ฐ๋ฆฌ์ผ์ผ ํจ - ์คํ ๋ณ์์ **๋ฉ๋ชจ๋ฆฌ ํด์ ๋ ์๋**์ผ๋ก ์ํ๋จ - ์ค์ฝํ๊ฐ ์ข ๋ฃ๋์ด ๋์ด์ ๊ฐ๋ฐ์๊ฐ ํต์ ํ ์ ์์ ๋ ์๋์ผ๋ก ํด์ - **ํ์ฌ ์ค์ฝํ์ ์กด์ฌํ๋ ๋ณ์์ ๋ํ ํฌ์ธํฐ๋ ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ์ ๋ฌ** ๋ ์ ์์ - ๋จ, ํธ์ถ๋ ํจ์์ ์๋ ์ฝ๋๊ฐ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ ๋ ํ์ฌ ์ค์ฝํ๊ฐ ์ฌ์ ํ ๊ทธ์ฅ์์ ์๋ค๊ณ ํ์ธํ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฅ! (๋์์ฑ ๋ก์ง ์์ ๋ ์๋จ)
โญ 4.2 ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ ์์๋ณด๊ธฐ
โ๏ธ ํ์ ์ ์ฌ์ฉํ๋๊ฐ?
- ์คํ์ ์ปดํ์ผ์ ํฌ๊ธฐ๊ฐ ๊ฒฐ์ ๋ ๊น? ๋ฐํ์์ ํฌ๊ธฐ๊ฐ ๊ฒฐ์ ๋ ๊น? ์ปดํ์ผ์ ํฌ๊ธฐ๊ฐ ๊ฒฐ์ ๋๋ค๊ณ ์๊ธฐํ๋ ์ฌ๋์ ์ฃผ์ฅ: int arr[a] ๊ฐ ์ปดํ์ผ ์ค๋ฅ์ด๋ฏ๋ก ์ปดํ์ผ์ ํฌ๊ธฐ๊ฐ ๊ฒฐ์ ๋๋ค. ๋ฐํ์์ ํฌ๊ธฐ๊ฐ ๊ฒฐ์ ๋๋ค๋ ์ฌ๋์ ์ฃผ์ฅ: ์คํ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐํ์์ ๋ฐ์ํ๋ฏ๋ก ๋ฐํ์์ ํฌ๊ธฐ๊ฐ ๊ฒฐ์ ๋๋ค.
- ํ์ ์๋์ผ๋ก ํ ๋น๋๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ๊ฐ์ง ์์ต๋๋ค. ๊ฐ๋ฐ์๊ฐ malloc ๋๋ ๊ทธ์ ์ ์ฌํ ํจ์๋ฅผ ์ฌ์ฉํด์ ํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํ๋์ฉ ์ป์ด์ผ ํฉ๋๋ค. ์๋ ํ ๋น์ด ๋์ง ์์ต๋๋ค. ๋์ ์คํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ด ์ฝ์ ์ ๋ณด์ํด ์ค๋๋ค.
- ํ์ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๊ฐ ํฝ๋๋ค. ํ ํฌ๊ธฐ๊ฐ ์ปค์ง์๋ก ํ ๋น์๋ ์ด์์ฒด์ ์์ ํ ํ์ด์ง๋ฅผ ๋ ๋ง์ด ์์ฒญํด์ผ ํฉ๋๋ค. ํ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ด ํ์ด์ง๋ฅผ ๋ฐ๋ผ ๋ ์ ํ ๋ฉ๋๋ค. ์คํ ์ธ๊ทธ๋จผํธ์ ๋ฌ๋ฆฌ, ํ ๋ฉ๋ชจ๋ฆฌ์์ ํ ๋น๋๋ ์ฃผ์๊ฐ์ ์ ์ฐจ ๋ ์ปค์ง๋๋ค.
- ํ ๋ฉ๋ชจ๋ฆฌ ๋ด์์ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๊ณผ ํด์ ๋ ๊ฐ๋ฐ์๊ฐ ๊ด๋ฆฌํฉ๋๋ค. ๊ฐ๋ฐ์๊ฐ ํ ๋น๊ณผ ํด์ ๋ฅผ ๋งก์ต๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์๋ C์ C++์ ์๋์ผ๋ก ๋น์์ผ ํฉ๋๋ค. ์ด์ ์คํจํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํฉ๋๋ค.
- ์คํ์ ๋ณ์์๋ ๋ฌ๋ฆฌ ํ์ ํ ๋น๋ ๋ณ์๋ ์ค์ฝํ๋ฅผ ์ ํ ๊ฐ์ง ์์ต๋๋ค.
- ๋ณ์๋ฅผ ์ธ์ ํด์ ํด์ผ ํ ์ง๋ ๋ชจ๋ฅด๋ฉฐ, ํจ์จ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ค๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ค์ฝํ์ ์์ ์๋ฅผ ์ํ ์๋ก์ด ์ ์๋ฅผ ์๊ฐํด์ผ ํฉ๋๋ค.
- ํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ฃผ์๋ฅผ ์ง์ ํ๋ ค๋ฉด ํฌ์ธํฐ๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ ๋ณ์์ ๊ฐ์ ๊ฐ๋ ์ ์กด์ฌํ์ง ์๊ณ ํ ์ง์ญ์ ํฌ์ธํฐ๋ฅผ ํตํด ์ฃผ์๊ฐ ์ง์ ๋ฉ๋๋ค.
- ํ ์ธ๊ทธ๋จผํธ๋ ์์ ์ ํ๋ก์ธ์ค์ ์ ์ฉ์ด๋ฏ๋ก ๊ฒ์ฌํ๋ ค๋ฉด ๋๋ฒ๊ฑฐ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
5.2.1 ํ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๊ณผ ํด์
โ๏ธ ํ ๋ฉ๋ชจ๋ฆฌ
์๋์ผ๋ก ์ป๊ณ ๋น์์ผ ํฉ๋๋ค.
๊ฐ๋ฐ์๊ฐ ์ผ๋ จ์ ํจ์๋ API๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ ๋ป์ ๋๋ค.
stdlib.h ์ ์ ์๋ฉ๋๋ค. malloc, calloc, realloc์ ๋๋ค. ํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํด์ ํ๋๋ฐ ์ฌ์ฉ๋๋ ์ ์ผํ ํจ์๋ free์ ๋๋ค.
1
2
gcc ExtremeC_examples_chapter5_3.c -o ex5_3.out
./ex5_3.out
calloc์ ์ฒญ์ ๋ฐ ํ ๋น malloc์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ๋๋ค.
realloc ํจ์๋ ์ด์ ์ ๋ธ๋ก์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ์ด๋ฏธ ํ ๋น๋ ๋ธ๋ก์ ์๋ก์ด ๋ธ๋ก์ผ๋ก ํ์ฅํฉ๋๋ค.
๋จํธํ
(๋จํธํ๋, ํ ์์ญ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋จ์์์ผ๋ ๋ธ๋ก์ ํ ๋นํ๊ธฐ ์ด๋ ค์ด ์ํฉ, ์ฆ ๊ณต๊ฐ์ด ํํธํ๋๋ ํ์)
๋จํธํ ๋๋ฌธ์ ํ์ฌ ํ ๋น๋ ๋ธ๋ก์ ํ์ฅํ ์ ์์ ๋๋ ๋ค๋ฅธ ์ถฉ๋ถํ ํฐ ๋ธ๋ก์ ์ฐพ์ ๋ค ์ด์ ๋ธ๋ก์์ ์ ๋ธ๋ก์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๋์ ๊ฐ์ง ๋๊ตฌ valgrind
๋๋ฒ๊ทธ -g์ต์ ๊ณผ valgrind๋๊ตฌ
1 2
gcc -g ExtremeC_examples_chapter5_4.c -o ex5_4.out valgrind ./ex5_4.out
free(ptr) ์ฝ๋ ์์ ์ดํ valgrind๋ก ๋ฉ๋ชจ๋ฆฌ ๋์ ํ์ธ
๋ฉ๋ชจ๋ฆฌ ๋์๋ ์ค๊ณ๊น ์ฌ๋ฐ๋ฅด์ง ์์์ ๋์๋ฅผ ์ผ๊ธฐํ๋ ๊ฒฝ์ฐ ๊ธฐ์ ๋ถ์ฑ๋ก ๊ฐ์ฃผ๋๋ฉฐ, ๋ฌด์จ์ผ์ด ๋ฐ์ํ ์ง ์์ง ๋ชปํ๋ ๊ฒฝ์ฐ์๋ ๋ํ ์ํ์์ธ์ด๋ผ๊ณ ๋ด ๋๋ค.
valgrind์ธ์๋ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ํ๋กํ์ผ๋ฌ๋ก MemProf๋ ์์ต๋๋ค.
5.2.2 ํ ๋ฉ๋ชจ๋ฆฌ ์์น
์คํ ๋ฉ๋ชจ๋ฆฌ์ ๋ช๋ช ๋ฐฉ์์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
ํ ๋ฉ๋ชจ๋ฆฌ๋ ๋ฉ๋ชจ๋ฆฌ๊ด๋ฆฌ์ ๊ดํ ์์ฒด ๊ฐ์ด๋ ๋ผ์ธ์ด ์์ต๋๋ค.
์คํ์ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ค์ฝํ๋ฅผ ๊ฐ์ต๋๋ค. ๋ฐ๋ผ์ ์ด ์ค์ฝํ์ ๋ฐ๋ผ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์๋ช ์ ์ ์ํ๊ธฐ๋ ์ฌ์ด ์ผ์ ๋๋ค.
ํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์๋ฌด ์ค์ฝํ๋ ๊ฐ์ง ์์ต๋๋ค. ์๋ฐ ๊ฐ์ ํ๋ ์ธ์ด๋ ์ธ๋๋ณ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ฌ์ฉํฉ๋๋ค. ํ์ ์๋ช ์ ํ๋ก๊ทธ๋จ ์์ฒด์์ ์ ์๋๊ฑฐ๋ ์ฌ์ฉ๋ C๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก๋ ์ ์๋ ์ ์์ต๋๋ค. ๊ฐ๋ฐ์๋ง์ด ํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์๋ช ์ ๊ฒฐ์ ํ ์ ์๋ ์ ์ผํ ์กด์ฌ์ ๋๋ค. ํ์ ์๋ช ์ ๊ฐ๋ฐ์๊ฐ ์ ํ๋ฏ๋ก ์ํธ ์ ์ถฉ์, ํธ๋ ์ด๋ ์คํ๊ฐ ๋ฉ๋๋ค.
์ด์ค ํด์
๋ธ๋ก์ ์์ ํ์ง ์๋๋ค๋ฉด ์ด๋ ๊ฒ๋ ํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํด์ ํด์๋ ์ ๋ฉ๋๋ค. ์ด์ค ํด์ (๋๋ธ ํ๋ฆฌ)๊ฐ ๋ฉ๋ชจ๋ฆฌ ์์ ๋ฌธ์ ์ ํด๋นํฉ๋๋ค.
- C์ธ์ด์ฉ ๊ฐ๋น์ง ์ปฌ๋ ํฐ Boehm-Demers-Weiser Conservative Garbage Collector์ ๋๋ค.
RAII๊ฐ์ฒด
RAII๋ ๋ฆฌ์์ค ํ๋์ ์ด๊ธฐํ. ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํ ๋น๋ ํ๊ณผ ๊ฐ์ ๋ฆฌ์์ค์ ์๋ช ์ ์ด๋ค ๊ฐ์ฒด์ ์๋ช ๊ณผ ์ฐ๊ฒฐํ ์ ์๋ค๋ ๋ป์ ๋๋ค. ์ด๋ค ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์ํฉ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ๋ฆฌ์์ค๋ฅผ ์ด๊ธฐํํ๊ณ , ํ๊ดดํ๋ฉด ๋ฆฌ์์ค๊ฐ ํด์ ๋๋ค๋ ๋ป์ ๋๋ค.
C์์๋ ์ด ๊ธฐ์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ฐ์ฒด๊ฐ ํ๊ดด๋์๋ค๋ ์ ๋ณด๋ฅผ ์ ๋ฌ๋ฐ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ์ง๋ง C++์์๋ ์๋ฉธ์๋ฅผ ์ด์ฉํด ์ด ๊ธฐ์ ์ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
- ํ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ด๋๋ผ์ธ
- ํ ๋ฉ๋ชจ๋ฆฌํ ๋น์๋ ์น๋ฌ์ผ ํ ๋๋ฆ์ ๋น์ฉ์ด ์์ต๋๋ค. ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํจ์๊ฐ ๊ฐ์ ๋น์ฉ์ ์น๋ฅด๋ ๊ฒ์ ์๋์ง๋ง malloc์ ๋์ฒด๋ก ๊ทธ ๋น์ฉ์ด ๊ฐ์ฅ ๋ ๋๋ ํจ์์ ๋๋ค.
- ํ ๊ณต๊ฐ์ ํ ๋น๋ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ๋ ์ด์ ํ์ํ์ง ์์ ๋๋ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํ๊ธฐ ์ง์ ์ ๋ฐ๋์ ํด์ ๋์ด์ผ ํฉ๋๋ค.
- ๊ฐ๊ฐ์ ํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ ๋ต์ ๊ณ ์ํด์ผ ํฉ๋๋ค.
- ์ ํํ ์ ๋ต๊ณผ ์ ๋ต์ ๊ดํ ๊ฐ์ ์ ๋ธ๋ก์ ์ ๊ทผํ ๋๋ง๋ค ์ฝ๋์ ๊ธฐ๋ก๋์ด์ผ ํฉ๋๋ค.
- C++ ๊ฐ์ ํน์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์๋ RAII๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด ํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก๊ณผ ๊ฐ์ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
ํ ๋ฉ๋ชจ๋ฆฌ๋ ํฐ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ธฐ์๋ ์ถฉ๋ถํ๊ณ ์ด๋ค ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ์๋ ์ถฉ๋ถํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ก๋ค๊ณ ๊ฐ์ ํ์ต๋๋ค.
๋ค์ ์ ์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ์ ์ ํ์ ๋ ๊ฒ์ด๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๊ฑฐ๋ ๋ฉ๋ชจ๋ฆฌ ์ ์ฅ์๋ฅผ ์ถ๊ฐํ๋๋ฐ ๋๋ ๋น์ฉ(๋ฉ๋ชจ๋ฆฌ, ์๊ฐ, ์ฑ๋ฅ ๋ฑ) ์ด ํฐ ํ๊ฒฝ์ ๊ดํด ๋ค๋ฃจ๊ฒ ์ต๋๋ค. ์ด๋ด ๋๋ ๊ฐ์ฅ ํจ์จ์ ์ธ ๋ฐฉ์์ผ๋ก ๊ฐ์ฉ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์จ์ผ ํฉ๋๋ค.
โญ 5.3 ์ ํ๋ ํ๊ฒฝ์์์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
โ๏ธ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ํ์ ์ธ ํ๊ฒฝ์์
๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ํ์ ์ธ ์ด์ : ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ๋ํ ํ๋ ๋ฆฌ๋ฐ, ์ ์ฉ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ ํ๋์จ์ด, ๋ ํฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ํ์ง ์๋ ์ด์์ฒด์
๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ํ๋ก์ ํธ์์ ์ค์ํ ๋น๊ธฐ๋ฅ ์๊ตฌ ์ฌํญ์ ํ๋์ด๋ค.
๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ์ ํ๊ฒฝ์์ ๊ทน๋ณตํ๋ ๊ธฐ์ ๊ณผ ์คํ ํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ์ ํฅ์ํ๊ธฐ ์ํ ํ๊ฒฝ์ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
5.3.1 ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ํ๋ ํ๊ฒฝ
์๊ฐ ๋ณต์ก๋๊ฐ ๋์๋ฐ ๋ฎ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๊ณผ ํํํด์ผ ํ๋ ๊ด๊ณ.
์๊ฐ ๋ณต์ก๋์ ๋ฉ๋ชจ๋ฆฌ ๋ณต์ก๋๋ Big-O ํจ์๋ก ๋ํ๋ ๋๋ค.
๋ฉ๋ชจ๋ฆฌ๊ฐ ์ถฉ๋ถํ์ง๋ง ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ํ ์ ์ธ ํ๊ฒฝ์ ์๋ค๊ณ ์๊ฐํ๊ณ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ.
- ํจํน๋ ๊ตฌ์กฐ์ฒด ํจ๋ฉ์ ํฌ๊ธฐํ๊ณ ๊ตฌ์กฐ์ฒด๋ฅผ ํจํน์ํต์ผ๋ก์ ๋ ์์ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์์ ๊ฐ์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ ์ ๋ ฌ์ ํ๊ธฐํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ์ฌ์ฉํ์ง๋ง ๋ณ์๋ฅผ ๋ก๋ํ๋ ๋์ ์๋ ๋จ์๋ก ์ฝ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฝ๋ ์๊ฐ์ด ๋ ๋ญ๋๋ค.
- ์์ถ ํ ์คํธ ๋ฐ์ดํฐ๊ฐ ์ด์ง ํ์ผ ๋ฐ์ดํฐ์ ๋นํด ์์ถ๋ฅ ์ด ๋์ต๋๋ค. ํ์ง๋ง ์์ถ๊ณผ ์์ถํด์ ๋ฅผ ํ๊ธฐ์ํ ์์ ์ด ํ์ํด์ง๊ณ , ์์ถ ์๊ณ ๋ฆฌ์ฆ์ CPU๋ฐ์ด๋ ์ด์ ๊ณ์ฐ ์ง์ฝ์ ์ด๋ฏ๋ก, ํ๋ก๊ทธ๋จ ์ฑ๋ฅ์ ๋จ์ด์ง๋๋ค.
- ์ธ๋ถ ๋ฐ์ดํฐ ์ ์ฅ์ ๋คํธ์ํฌ ์๋น์ค, ํด๋ผ์ฐ๋ ์ธํ๋ผ, ๋๋ ๋จ์ํ ํ๋๋์คํฌ ๋๋ผ์ด๋ธ์ ํํ๋ก ์ธ๋ถ ๋ฐ์ดํฐ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ฉ์ธ ์ ์ฅ์๊ฐ ์๋ ์บ์ ๋ฉ๋ชจ๋ฆฌ์ ์ญํ ์ ํ๋ค๊ณ ๊ฐ์ ํ๊ณ ์ธ์ ๋ ๋ฐ์ดํฐ์ ์ผ๋ถ๋ ํ์ด์ง๋ง ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. PostgreSQL์ด๋ ์ค๋ผํด ๊ฐ์ ๋ชจ๋ ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์๋น์ค๊ฐ ์ด ๊ธฐ์ ์ ์ฌ์ฉํฉ๋๋ค.
5.3.2 ์ฑ๋ฅ์ด ๋ ๋์ ํ๊ฒฝ
์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ๋๋ค.
์บ์๋ฅผ ์ ์ ํ ์ฌ์ฉํ๋ค.
- ์บ์ฑ ์บ์ฑ์ด๋ ๋ ๋ฐ์ดํฐ ์ ์ฅ์๊ฐ ์๋ก ์ฝ๊ธฐ/์ฐ๊ธฐ ์๋๊ฐ ๋ค๋ฅผ ๋ ์ปดํจํฐ ์์คํ ์ ๋ง์ ๋ถ๋ถ์์ ์ฌ์ฉ๋๋ ๋ชจ๋ ๋น์ทํ ๊ธฐ๋ฒ์ ๊ฐ๋ฆฌํค๋ ์ผ๋ฐ์ ์ธ ์ฉ์ด์ ๋๋ค. ์๋ฅผ ๋ค์ด CPU๊ฐ ์ฐ์ฐํ๊ธฐ์ํด ๋ฉ๋ชจ๋ฆฌ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผํ๋๋ฐ(fetch) ์ด ์์ ์ ๋ ์ง์คํฐ๋ณด๋ค ํจ์ฌ ๋ ๋๋ฆฝ๋๋ค. ์ด๋ ์บ์ฑ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํฉ๋๋ค. ํธ๋ ์ด๋์คํํ ์์๋์ : ๋ง์ ํญ๋ชฉ์ ํฌํจํ๋ ๋๋ฆฐ ์ ์ฅ์ vs ๋ ๋น ๋ฅด์ง๋ง ์ ํ ๋ ์์ ํญ๋ชฉ๋ง ๊ฐ์ง ์ ์๋ ์ ์ฅ์ ๋ ๋น ๋ฅด์ง๋ง ๋ ์์ ์ ์ฅ์๋ ์บ์๋ผ๊ณ ํ ์ ์์ต๋๋ค. ๋ง์ ํญ๋ชฉ์ ๋ถ๋ฅธ๋ค๋ฉด ์บ์์ ์ฅ์๊ฐ ์๋ ๋ ๋ง์ ํญ๋ชฉ์ ๋๋ฆฐ ์ ์ฅ์๋ฅผ ๊ฐ์ ธ์์ผํ ๋๋ ์์ ๊ฒ๋๋ค.
์บ์ ์นํ์ ์ฝ๋
- CPU ๊ฐ ๋ช
๋ น์ด๋ฅผ ์คํํ ๋๋ ์ฐ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๊ฐ์ ธ์ด
- ๋ฐ์ดํฐ๋ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์ ํน์ ์ฃผ์์ ์ ์ฅ๋๋ฉฐ ์ด ์ฃผ์๋ ๋ช ๋ น์ด์ ์ํด ๊ฒฐ์ ๋จ
- ์ฐ์ฐํ๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ CPU ๋ ์ง์คํฐ๋ก ์ ์ก๋์ด์ผ ํจ
- ๋ณดํต CPU ๋ ๊ฐ์ ธ์์ผ (fetch) ํ๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๋ธ๋ก์ ๊ฐ์ ธ์ ์บ์์ ๋ฃ์
- ์ด๋ค ๊ฐ์์ ์ด์ ์ ์ฃผ์์ ๋ํ ๊ทผ์ ์ฑ์ด ํ์ํ๋ค๋ฉด, ์ด ๊ฐ์ ์บ์ ๋ด์ ์กด์ฌํด์ผ๋ง ํ๊ณ , CPU๋ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ ๋์ ์บ์๋ฅผ ์ฌ์ฉํ ์ ์์
- ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ๋ก๋ถํฐ ๊ฐ์ ์ฝ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋น ๋ฆ โ ์บ์ ์ ์ค (cache hit)
- CPU ์บ์์์ ์ฃผ์๋ฅผ ์ฐพ์ ์ ์๋ค๋ฉด ์บ์ ์คํจ (cache miss)
- CPU ๋ ๋์ ์ฃผ์๋ฅผ ์ฝ๊ณ ์ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํด์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ฉฐ, ์ด ๋ฐฉ์์ ์๋นํ ๋๋ฆฌ๋ค
- ์บ์ ์ ์ค๋ฅ ์ด ๋์ผ๋ฉด ์คํ์ด ๋ ๋น ๋ฆ
โ CPU๋ ์ ์ด์ ์ฃผ์ (๊ทผ์ ์ฑ) ๊ฐ์ ธ์์ผ ํ ๊น? โ ์ง์ญ์ฑ์ ์๋ฆฌ
- ์ปดํจํฐ ์์คํ ์์๋ ๋ณดํต ๊ฐ์ ์ด์์ ์์นํ ๋ฐ์ดํฐ๊ฐ ๋ ์์ฃผ ์ ๊ทผ๋๋ค๊ณ ๊ด์ฐฐ๋จ
- CPU ๋ ์ด ์๋ฆฌ์ ๋ฐ๋ผ ์ง์ญ ์ฐธ์กฐ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ ๋ง์ด ๊ฐ์ ธ์ด
- So, CPU ๊ฐ ์๊ณ ๋ฆฌ์ฆ์ ๋ ๋นจ๋ฆฌ ์คํํ ์ ์์ โ ์บ์ ์นํ์ ์๊ณ ๋ฆฌ์ฆ
์บ์ ์นํ์ ์ฝ๋ vs ๋น ์บ์ ์นํ์ ์ฝ๋ ์ฑ๋ฅ ๋ํ๋ด๊ธฐ
โฌ๏ธ ํ๋ ฌ์ ๋ชจ๋ ์์์ ํฉ์ ๊ณ์ฐํ๊ณ ์ถ๋ ฅ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
// File name: ExtremeC_examples_chapter5_6.c // Description: Example 5.6 #include <stdio.h> // For printf function #include <stdlib.h> // For heap memory functions #include <string.h> // For strcmp function void fill(int* matrix, int rows, int columns) { int counter = 1; for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { *(matrix + i * columns + j) = counter; } counter++; } } void print_matrix(int* matrix, int rows, int columns) { int counter = 1; printf("Matrix:\n"); for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { printf("%d ", *(matrix + i * columns + j)); } printf("\n"); } } void print_flat(int* matrix, int rows, int columns) { printf("Flat matrix: "); for (int i = 0; i < (rows * columns); i++) { printf("%d ", *(matrix + i)); } printf("\n"); } int friendly_sum(int* matrix, int rows, int columns) { int sum = 0; for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { sum += *(matrix + i * columns + j); } } return sum; } int not_friendly_sum(int* matrix, int rows, int columns) { int sum = 0; for (int j = 0; j < columns; j++) { for (int i = 0; i < rows; i++) { sum += *(matrix + i * columns + j); } } return sum; } int main(int argc, char** argv) { if (argc < 4) { printf("Usage: %s [print|friendly-sum|not-friendly-sum] ", argv[0]); printf("[number-of-rows] [number-of-columns]\n"); exit(1); } char* operation = argv[1]; int rows = atol(argv[2]); int columns = atol(argv[3]); int* matrix = (int*)malloc(rows * columns * sizeof(int)); fill(matrix, rows, columns); if (strcmp(operation, "print") == 0) { print_matrix(matrix, rows, columns); print_flat(matrix, rows, columns); } else if (strcmp(operation, "friendly-sum") == 0) { int sum = friendly_sum(matrix, rows, columns); printf("Friendly sum: %d\n", sum); } else if (strcmp(operation, "not-friendly-sum") == 0) { int sum = not_friendly_sum(matrix, rows, columns); printf("Not friendly sum: %d\n", sum); } else { printf("FATAL: Not supported operation!\n"); exit(1); } free(matrix); return 0; }
- ์ฌ์ฉ์๋ ํ๋ก๊ทธ๋จ์ ์ต์
์ ์ ๋ฌํด ํ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅ
- fill ํจ์์ ์ฐ์ธ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ด๊ธฐํ๋ 2ํ 3์ด ํ๋ ฌ ์ถ๋ ฅํด๋ณด์
- ํ์ํ ํ๊ณผ ์ด ์ซ์์ print ์ต์ ์ ๋ ฅํด์ผ ํจ
./ex5_6.out print 2 3
์ ํตํด print ์ต์ ์ ๋ฌ
- fill ํจ์์ ์ฐ์ธ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ด๊ธฐํ๋ 2ํ 3์ด ํ๋ ฌ ์ถ๋ ฅํด๋ณด์
- ์ถ๋ ฅ ๊ฒฐ๊ณผ
- ํ๋ ฌ์ 2์ฐจ์์ผ๋ก ํํ
- ๊ฐ์ ํ๋ ฌ์ 1์ฐจ์์ผ๋ก ํํ
- ํ๋ ฌ์ ๋ฉ๋ชจ๋ฆฌ์ ํ-์ฐ์ ์์๋ก ์ ์ฅ๋์์
- ํ๋ ฌ์ด ํ ํ์ฉ ์ ์ฅ๋๋ค๋ ์๋ฏธ
- CPU ๊ฐ ์ด๋ค ํ์์ ๋ญ๊ฐ๋ฅผ ๊ฐ์ ธ์ค๋ ค๊ณ ํ๋ค๋ฉด, ๊ทธ ํ์ ๋ชจ๋ ์์ ๋ํ ๊ฐ์ ธ์์ผ ํจ
- ์ด-์ฐ์ ์ด ์๋๋ผ ํ-์ฐ์ ์์์์ ์ด ์ฝ๋์ ํฉ๊ณ ์ฐ์ฐ์ด ์ ์ํ๋จ
- friendly_sum ํจ์
- ํ-์ฐ์ ์ผ๋ก ํฉ๊ณ๊ฐ ์ํ๋จ
- not friendly_sum ํจ์
- ์ด-์ฐ์ ์ผ๋ก ํฉ๊ณ๊ฐ ์ํ๋จ
- 20,000 ๊ฐ์ ์ด๊ณผ ํ์ ํ๋ ฌ ํฉ๊ณ ์ํ ์๊ฐ ๋น๊ตํ๊ธฐ
- ๊ฐ์ ๋ก์ง๊ณผ ๊ฐ์ ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋๋ผ๋, ํ๋ ฌ์ ์์์ ์ ๊ทผํ๋ ์์๋ฅผ ๋ค๋ฅด๊ฒ ์ ํํ๋ฉด ์๊ฐ์ด ํจ์ฌ ์ค๋ ๊ฑธ๋ฆด ์ ์์
- time
- ํน์ ํ๋ก๊ทธ๋จ์ ์คํ ์๊ฐ์ ์ธก์ ํ๊ธฐ ์ํ ๋ช
๋ น์ด
- real : ์ด ์คํ ์๊ฐ (์ค์ ์ปค๋งจ๋ ์คํํ๋๋ฐ ๊ฑธ๋ฆฐ ์๊ฐ)
- user : user ์์ญ์์ ์คํ๋ ์๊ฐ
- sys : ์ปค๋ ์์ญ์์ ์คํ๋ ์๊ฐ
- ํน์ ํ๋ก๊ทธ๋จ์ ์คํ ์๊ฐ์ ์ธก์ ํ๊ธฐ ์ํ ๋ช
๋ น์ด
- ์ฌ์ฉ์๋ ํ๋ก๊ทธ๋จ์ ์ต์
์ ์ ๋ฌํด ํ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅ
- CPU ๊ฐ ๋ช
๋ น์ด๋ฅผ ์คํํ ๋๋ ์ฐ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๊ฐ์ ธ์ด
- ํ ๋น ๋ฐ ํด์ ๋น์ฉ
- ํ ๋ฉ๋ชจ๋ฆฌ ํด์ ์ ํ ๋น ์์ ์ ์๊ฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํ์ฌ ๋น์ฉ์ด ๋ ํ์ํจ
- ์๋์ ์ผ๋ก ๋ ๋น ๋ฅด๋ฉฐ ํ ๋น ์์ฒด์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ ํ์ํ์ง ์์ ์คํ ํ ๋น๊ณผ ๋ฌ๋ฆฌ,
- ํ ํ ๋น์ ์ถฉ๋ถํ ํฌ๊ธฐ์ ๋น์ด ์๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ฐพ์์ผ ํจ
- ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ํด์ ๋ฅผ ์ํด ์ค๊ณ๋ ๋ง์ ์๊ณ ๋ฆฌ์ฆ ๅค
- ํ ๋น๊ณผ ํด์ ์์ ์ฌ์ด์์ ์ธ์ ๋ ํํ (trade off) ํ์
- ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋น ๋ฅด๊ฒ ํ ๋นํ๊ณ ์ถ๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ๋ง์ด ์ฌ์ฉ
- ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ์๊ฐ์ด ๋ ๋๋ ๋๋ฆฐ ํ ๋น ๋ฐ๊ธฐ
- ๊ธฐ๋ณธ C ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- malloc
- free
- ptmalloc
- tcmalloc
- Haord
- dlmalloc
- โ ์น๋ช
์ ์ผ ์๋ ์๋ ์ด ๋ฌธ์ ์ ํด๊ฒฐ์ฑ
์?
- ํ ๋น๊ณผ ํด์ ๋ฅผ ์ต์ํ ํ๋ ๊ฒ
- ๋์ฒด๋ก ํ ๋ฉ๋ชจ๋ฆฌ์ ํฐ ๋ธ๋ก์ ํ ๋นํ๋ฉฐ ๊ด๋ฆฌํ๋ ค๊ณ ํจ
- ๋ง์น ์ปค๋ค๋ ํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก ์ํด ๋์ ํ ๋น๊ณผ ํด์ ์ ๋ก์ง์ ๋ํ ์ถ๊ฐ ๋ ์ด์ด๋ฅผ ๊ฐ๋ ๊ฒ๊ณผ๋ ๊ฐ์
- ๊ทธ๋ฐ์๋ + ๋ฉ๋ชจ๋ฆฌ ํ ์ด์ฉ
- ๋ฉ๋ชจ๋ฆฌ ํ
- ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ํด์ ๋ ๋น์ฉ์ด ๋ฆ
- ๋ฏธ๋ฆฌ ํ ๋น๋์ด ๊ณ ์ ๋ ํฌ๊ธฐ์ ํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ํ ๋น์ ํ์๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ์ฝ๊ฐ ํฅ์ํจ
- ํ์ ๊ฐ ๋ธ๋ก
- ์ผ๋ฐ์ ์ผ๋ก ์๋ณ์๋ฅผ ๊ฐ์ง๋ฉฐ, ์๋ณ์๋ ํ ๊ด๋ฆฌ๋ฅผ ์ํด ์ค๊ณ๋ API ๋ฅผ ํตํด ์ป์ ์ ์์
- ํ์ ์์ด์ง๋ฉด ์ด ๋ธ๋ก์ ๋์ค์ ํด์ ๋จ
- ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ์์ด ๊ณ ์ ๋ ์ฑ ๋จ์ผ๋ฏ๋ก, ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ํ์ ์ธ ํ๊ฒฝ์์ ์๊ณ ๋ฆฌ์ฆ์ด ๊ฒฐ์ ๋ก ์ ์ธ ํ์๋ฅผ ํ๋ ค๊ณ ํ ๋ ํ์ํ ์ ํ์
- ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ํด์ ๋ ๋น์ฉ์ด ๋ฆ
โญ 5.4 ๋ง๋ฌด๋ฆฌ
์คํ๊ณผ ํ ์ธ๊ทธ๋จผํธ๋ฅผ ๋ค๋ค์ผ๋ฉฐ ์ด๋ค ์ธ๊ทธ๋จผํธ๊ฐ ์ฌ์ฉ๋๋ ๋ฐฉ์์ ์ดํด๋ดค์ต๋๋ค.
- ์คํ ๋ฐ ํ ์ธ๊ทธ๋จผํธ ๋ชจ๋๋ฅผ ๊ฒ์ฌํ ๋ ์ฌ์ฉ๋๋ ๋๊ตฌ์ ๊ธฐ๋ฒ์ ์ค๋ช ํ์ต๋๋ค.
- ๋๋ฒ๊ฑฐ๋ฅผ ์๊ฐํ์ผ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ์ ๊ด๋ จ๋ ๋ฌธ์ ๋ฅผ ๊ณ ์น๋ ๋ฉ์ธ ๋๋ฒ๊ฑฐ๋ก dgb๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ํ๋กํ์ผ๋ฌ๋ฅผ ์ค๋ช ํ๊ณ , ์คํํ ๋ ๋ฐ์ํ๋ ๋์๋ ํ์ ํฌ์ธํฐ์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๊ธฐ ์ํด valgrind๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
- ์คํ ๋ณ์์ ํ ๋ธ๋ก์ ์๋ช ์ ๋น๊ตํ์ผ๋ฉฐ ๊ทธ๋ฌํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์๋ช ์ ํ๋จํ๋ ๋ฒ์ ์ค๋ช ํ์ต๋๋ค.
- ์คํ ๋ณ์์ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ์๋์ด์ง๋ง ํ ๋ธ๋ก์์๋ ์ ์ ์ผ๋ก ์๋์ด๋ผ๋ ์ ์ ์์๋ดค์ต๋๋ค.
- ์คํ ๋ณ์๋ฅผ ๋ค๋ฃฐ ๋ ์ ์ง๋ฅด๋ ํํ ์ค์๋ฅผ ์ดํด๋ดค์ต๋๋ค.
- ์ ํ๋ ํ๊ฒฝ์ ๋ ผ์ ํ์ผ๋ฉฐ ์ด๋ฌํ ํ๊ฒฝ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ํ๋ํ ์ ์๋์ง ์์๋ดค์ต๋๋ค.
- ์ฑ๋ฅ์ด ๋ ๋์ ํ๊ฒฝ๊ณผ ์ฑ๋ฅ์ ์ป๊ณ ์ ํ ๋ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฒ์ ๋ฌด์์ด ์๋์ง ์ค๋ช ํ์ต๋๋ค.