Post

๐Ÿข 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 ` 18.png - 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
          

          20.png 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;
          }
          
          • ํ˜„์žฌ main ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๊ฐ€ func ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ณด๋‹ค ๋†’์€ ์ฃผ์†Œ์— ์œ„์น˜

            21.png

        • ์ฃผ์†Œ๊ฐ€ ์ปค์ง€๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์Šคํƒ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ์ฝ๋Š”๋‹ค? โ†’ ์Šคํƒ ์„ธ๊ทธ๋จผํŠธ์— ์ด๋ฏธ ํ‘ธ์‹œ๋œ ๋‚ด์šฉ์„ 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 : ์Šคํƒ ๋‚ด๋ถ€์˜ ๊ฐ’ ๋ณ€๊ฒฝํ•˜๊ธฐ + ๋ฐฐ์—ด์˜ ๊ฒฝ๊ณ„ ๋ฐ”๊นฅ์— ์žˆ๋Š” ๊ฐœ๋ณ„ ๋ฐ”์ดํŠธ ๋ณ€๊ฒฝํ•˜๊ธฐ
            • ๊ธฐ์กด ๋ฐฐ์—ด 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
              
      • ๐Ÿšจ ์ถ”๊ฐ€ ์ฐธ๊ณ ํ•  ์ , ์Šคํƒ์˜ ๊ฐ€์žฅ ์œ„์— ํ• ๋‹น๋œ ๋ฒ„ํผ (๋ฐ”์ดํŠธ ๋˜๋Š” ๋ฌธ์ž์—ด ๋ฐฐ์—ด์˜ ๋‹ค๋ฅธ ์ด๋ฆ„) ์— ํ• ๋‹น๋˜์ง€ ์•Š์€ ๊ฐ’์„ ์ž‘์„ฑํ•˜๋Š” ์ผ์€ ์ทจ์•ฝ์ ์œผ๋กœ ๊ฐ„์ฃผ
        • ๊ณต๊ฒฉ์ž๊ฐ€ ์ด๋ฅผ ์ด์šฉํ•ด ๋ฐฐ์—ด์„ ํ”„๋กœ๊ทธ๋žจ์— ์ฃผ์ž…ํ•ด์„œ ํ†ต์ œํ•จ! โ‡’ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ = ์ต์Šคํ”Œ๋กœ์ž‡
        • ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ ์ทจ์•ฝ์„ฑ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ”„๋กœ๊ทธ๋žจ
          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 ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์ด ์™„๋ฃŒ๋  ๋•Œ๋„ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ–๋Š”๋‹ค
          • ๋ฐ์ดํ„ฐ๋‚˜, 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 ํ•จ์ˆ˜๋Š” ๋ฐ›์€ ํฌ์ธํ„ฐ๋ฅผ ์—ญ์ฐธ์กฐํ•ด ์ฃผ์†Œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ง€์—ญ์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•จ
            • ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ง€์—ญ ๋ณ€์ˆ˜์— ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ”ํ•œ ์‹ค์ˆ˜!!!
            • ๐Ÿšจ ๊ฒฝ๊ณ : ํ•จ์ˆ˜๊ฐ€ ์ง€์—ญ ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค
          • ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด ๋ฐœ์ƒํ•˜๋Š” ์„ธ๊ทธ๋ฉ˜ํ…Œ์ด์…˜ ์˜ค๋ฅ˜
            • ์ถฉ๋Œ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Œ
            • ์ผ๋ฐ˜์ ์œผ๋กœ ์ด์ „์—๋Š” ํ• ๋‹น๋˜์—ˆ์œผ๋‚˜, ํ˜„์žฌ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์œ ํšจํ•˜์ง€ ์•Š์€ ์ ‘๊ทผ์„ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ!
  • gdb ๋กœ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ํ•˜๋ฉด ์ถฉ๋Œ์— ๊ด€ํ•œ ๋” ์ž์„ธํ•œ ๋‚ด์šฉ ๋‚˜ํƒ€๋‚จ!
    • ์ปดํŒŒ์ผ ์‹œ ๋””๋ฒ„๊ทธ ์ •๋ณด ์‚ฝ์ž…ํ•˜๋Š” -g ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ!!!
    • gdb ๋˜๋Š” valgrind ๊ฐ™์€ ๋””๋ฒ„๊ทธ ๋„๊ตฌ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ ๋””๋ฒ„๊ทธ ๊ฐ€๋Šฅ
      • ์ด๋•Œ๋„ -g ์˜ต์…˜ ์ถ”๊ฐ€ํ•ด์„œ ์†Œ์Šค ํŒŒ์ผ ์ปดํŒŒ์ผ ํ•˜๊ธฐ
    • ์ปดํŒŒ์ผ ์‹œ -g ์˜ต์…˜ ์ฃผ๊ณ  ๋””๋ฒ„๊ฑฐ ์‹คํ–‰ํ•˜๊ธฐ 19.png
      • 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 ํ•จ์ˆ˜๋กœ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

  1. ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ œํ•œ ์ ์ธ ํ™˜๊ฒฝ์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•.

    • ํŒจํ‚น๋œ ๊ตฌ์กฐ์ฒด ํŒจ๋”ฉ์„ ํฌ๊ธฐํ•˜๊ณ  ๊ตฌ์กฐ์ฒด๋ฅผ ํŒจํ‚น์‹œํ‚ต์œผ๋กœ์„œ ๋” ์ž‘์€ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์ •๋ ฌ์„ ํ๊ธฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋œ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋ณ€์ˆ˜๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋™์•ˆ ์›Œ๋“œ ๋‹จ์œ„๋กœ ์ฝ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ๋Š” ์‹œ๊ฐ„์ด ๋” ๋“ญ๋‹ˆ๋‹ค.
    • ์••์ถ• ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ด์ง„ ํŒŒ์ผ ๋ฐ์ดํ„ฐ์— ๋น„ํ•ด ์••์ถ•๋ฅ ์ด ๋†’์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์••์ถ•๊ณผ ์••์ถ•ํ•ด์ œ๋ฅผ ํ•˜๊ธฐ์œ„ํ•œ ์ž‘์—…์ด ํ•„์š”ํ•ด์ง€๊ณ , ์••์ถ• ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ 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 ์˜ต์…˜ ์ „๋‹ฌ
          • ์ถœ๋ ฅ ๊ฒฐ๊ณผ
            1. ํ–‰๋ ฌ์„ 2์ฐจ์›์œผ๋กœ ํ‘œํ˜„
            2. ๊ฐ™์€ ํ–‰๋ ฌ์„ 1์ฐจ์›์œผ๋กœ ํ‘œํ–”
          • ํ–‰๋ ฌ์€ ๋ฉ”๋ชจ๋ฆฌ์— ํ–‰-์šฐ์„  ์ˆœ์œ„๋กœ ์ €์žฅ๋˜์—ˆ์Œ
            • ํ–‰๋ ฌ์ด ํ•œ ํ–‰์”ฉ ์ €์žฅ๋œ๋‹ค๋Š” ์˜๋ฏธ
          • CPU ๊ฐ€ ์–ด๋–ค ํ–‰์—์„œ ๋ญ”๊ฐ€๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•œ๋‹ค๋ฉด, ๊ทธ ํ–‰์˜ ๋ชจ๋“  ์›์†Œ ๋˜ํ•œ ๊ฐ€์ ธ์™€์•ผ ํ•จ
            • ์—ด-์šฐ์„ ์ด ์•„๋‹ˆ๋ผ ํ–‰-์šฐ์„ ์ˆœ์œ„์—์„œ ์ด ์ฝ”๋“œ์˜ ํ•ฉ๊ณ„ ์—ฐ์‚ฐ์ด ์ž˜ ์ˆ˜ํ–‰๋จ
          • friendly_sum ํ•จ์ˆ˜
            • ํ–‰-์šฐ์„ ์œผ๋กœ ํ•ฉ๊ณ„๊ฐ€ ์ˆ˜ํ–‰๋จ
          • not friendly_sum ํ•จ์ˆ˜
            • ์—ด-์šฐ์„ ์œผ๋กœ ํ•ฉ๊ณ„๊ฐ€ ์ˆ˜ํ–‰๋จ
          • 20,000 ๊ฐœ์˜ ์—ด๊ณผ ํ–‰์˜ ํ–‰๋ ฌ ํ•ฉ๊ณ„ ์ˆ˜ํ–‰ ์‹œ๊ฐ„ ๋น„๊ตํ•˜๊ธฐ
            • ๊ฐ™์€ ๋กœ์ง๊ณผ ๊ฐ™์€ ์–‘์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„, ํ–‰๋ ฌ์˜ ์›์†Œ์— ์ ‘๊ทผํ•˜๋Š” ์ˆœ์„œ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์„ ํƒํ•˜๋ฉด ์‹œ๊ฐ„์ด ํ›จ์”ฌ ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Œ
            • time
              • ํŠน์ • ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•œ ๋ช…๋ น์–ด
                • real : ์ด ์‹คํ–‰ ์‹œ๊ฐ„ (์‹ค์ œ ์ปค๋งจ๋“œ ์‹คํ–‰ํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„)
                • user : user ์˜์—ญ์—์„œ ์‹คํ–‰๋œ ์‹œ๊ฐ„
                • sys : ์ปค๋„ ์˜์—ญ์—์„œ ์‹คํ–‰๋œ ์‹œ๊ฐ„
  • ํ• ๋‹น ๋ฐ ํ•ด์ œ ๋น„์šฉ
    • ํž™ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ์™€ ํ• ๋‹น ์ž‘์—…์€ ์‹œ๊ฐ„๊ณผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋น„ํ•˜์—ฌ ๋น„์šฉ์ด ๋” ํ•„์š”ํ•จ
    • ์ƒ๋Œ€์ ์œผ๋กœ ๋” ๋น ๋ฅด๋ฉฐ ํ• ๋‹น ์ž์ฒด์— ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋” ํ•„์š”ํ•˜์ง€ ์•Š์€ ์Šคํƒ ํ• ๋‹น๊ณผ ๋‹ฌ๋ฆฌ,
      • ํž™ ํ• ๋‹น์€ ์ถฉ๋ถ„ํ•œ ํฌ๊ธฐ์˜ ๋น„์–ด ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์„ ์ฐพ์•„์•ผ ํ•จ
    • ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ํ•ด์ œ๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋œ ๋งŽ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๅคš
      • ํ• ๋‹น๊ณผ ํ•ด์ œ ์ž‘์—… ์‚ฌ์ด์—์„œ ์–ธ์ œ๋‚˜ ํƒ€ํ˜‘ (trade off) ํ•„์ˆ˜
      • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋น ๋ฅด๊ฒŒ ํ• ๋‹นํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ๋งŽ์ด ์‚ฌ์šฉ
      • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์‹œ๊ฐ„์ด ๋” ๋“œ๋Š” ๋Š๋ฆฐ ํ• ๋‹น ๋ฐ›๊ธฐ
    • ๊ธฐ๋ณธ C ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
      • malloc
      • free
      • ptmalloc
      • tcmalloc
      • Haord
      • dlmalloc
    • โ“ ์น˜๋ช…์ ์ผ ์ˆ˜๋„ ์žˆ๋Š” ์ด ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ์ฑ…์€?
      • ํ• ๋‹น๊ณผ ํ•ด์ œ๋ฅผ ์ตœ์†Œํ™” ํ•˜๋Š” ๊ฒƒ
      • ๋Œ€์ฒด๋กœ ํž™ ๋ฉ”๋ชจ๋ฆฌ์˜ ํฐ ๋ธ”๋ก์„ ํ• ๋‹นํ•˜๋ฉฐ ๊ด€๋ฆฌํ•˜๋ ค๊ณ  ํ•จ
      • ๋งˆ์น˜ ์ปค๋‹ค๋ž€ ํž™ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก ์œ„ํ•ด ๋†“์€ ํ• ๋‹น๊ณผ ํ•ด์ œ์˜ ๋กœ์ง์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋ ˆ์ด์–ด๋ฅผ ๊ฐ–๋Š” ๊ฒƒ๊ณผ๋„ ๊ฐ™์Œ
      • ๊ทธ๋ฐ–์—๋„ + ๋ฉ”๋ชจ๋ฆฌ ํ’€ ์ด์šฉ
  • ๋ฉ”๋ชจ๋ฆฌ ํ’€
    • ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ํ•ด์ œ๋Š” ๋น„์šฉ์ด ๋“ฆ
      • ๋ฏธ๋ฆฌ ํ• ๋‹น๋˜์–ด ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ํž™ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์˜ ํ’€์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ• ๋‹น์˜ ํšŸ์ˆ˜๋ฅผ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ์•ฝ๊ฐ„ ํ–ฅ์ƒํ•จ
    • ํ’€์˜ ๊ฐ ๋ธ”๋ก
      • ์ผ๋ฐ˜์ ์œผ๋กœ ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์‹๋ณ„์ž๋Š” ํ’€ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋œ API ๋ฅผ ํ†ตํ•ด ์–ป์„ ์ˆ˜ ์žˆ์Œ
      • ํ•„์š” ์—†์–ด์ง€๋ฉด ์ด ๋ธ”๋ก์€ ๋‚˜์ค‘์— ํ•ด์ œ๋จ
      • ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ์–‘์ด ๊ณ ์ •๋œ ์ฑ„ ๋‚จ์œผ๋ฏ€๋กœ, ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ œํ•œ์ ์ธ ํ™˜๊ฒฝ์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ฒฐ์ •๋ก ์ ์ธ ํ–‰์œ„๋ฅผ ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ํƒ์›”ํ•œ ์„ ํƒ์ž„

โญ 5.4 ๋งˆ๋ฌด๋ฆฌ

์Šคํƒ๊ณผ ํž™ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ๋‹ค๋ค˜์œผ๋ฉฐ ์ด๋“ค ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹์„ ์‚ดํŽด๋ดค์Šต๋‹ˆ๋‹ค.

  • ์Šคํƒ ๋ฐ ํž™ ์„ธ๊ทธ๋จผํŠธ ๋ชจ๋‘๋ฅผ ๊ฒ€์‚ฌํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋„๊ตฌ์™€ ๊ธฐ๋ฒ•์„ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋””๋ฒ„๊ฑฐ๋ฅผ ์†Œ๊ฐœํ–ˆ์œผ๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋ฅผ ๊ณ ์น˜๋Š” ๋ฉ”์ธ ๋””๋ฒ„๊ฑฐ๋กœ dgb๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋ฅผ ์„ค๋ช…ํ–ˆ๊ณ , ์‹คํ–‰ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ˆ„์ˆ˜๋‚˜ ํ—ˆ์ƒ ํฌ์ธํ„ฐ์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์œ„ํ•ด valgrind๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์Šคํƒ ๋ณ€์ˆ˜์™€ ํž™ ๋ธ”๋ก์˜ ์ˆ˜๋ช…์„ ๋น„๊ตํ–ˆ์œผ๋ฉฐ ๊ทธ๋Ÿฌํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์˜ ์ˆ˜๋ช…์„ ํŒ๋‹จํ•˜๋Š” ๋ฒ•์„ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์Šคํƒ ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ์ž๋™์ด์ง€๋งŒ ํž™ ๋ธ”๋ก์—์„œ๋Š” ์ „์ ์œผ๋กœ ์ˆ˜๋™์ด๋ผ๋Š” ์ ์„ ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค.
  • ์Šคํƒ ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์ €์ง€๋ฅด๋Š” ํ”ํ•œ ์‹ค์ˆ˜๋ฅผ ์‚ดํŽด๋ดค์Šต๋‹ˆ๋‹ค.
  • ์ œํ•œ๋œ ํ™˜๊ฒฝ์„ ๋…ผ์˜ ํ–ˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ํ™˜๊ฒฝ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ํŠœ๋‹ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค.
  • ์„ฑ๋Šฅ์ด ๋” ๋‚˜์€ ํ™˜๊ฒฝ๊ณผ ์„ฑ๋Šฅ์„ ์–ป๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฒ•์€ ๋ฌด์—‡์ด ์žˆ๋Š”์ง€ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.
This post is licensed under CC BY 4.0 by the author.