๐Ÿ“š Computer Science/CS

[์ปดํ“จํ„ฐ ๋ฐ‘๋ฐ”๋‹ฅ์˜ ๋น„๋ฐ€] 3์žฅ. ๋ฉ”๋ชจ๋ฆฌ Memory

ibelieveinme 2025. 1. 26. 23:28
728x90

3.1 ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ณธ์งˆ, ํฌ์ธํ„ฐ์™€ ์ฐธ์กฐ

 

1bit = 0, 1 ๋”ฑ 2๊ฐ€์ง€ ์ •๋ณด๋งŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์œ„.

1byte = 8bit = 2^8 = 256๊ฐ€์ง€ = 0 ~ 255 ์ˆซ์ž ํ‘œํ˜„.

4byte = 2^32 = 4,294,967,297๊ฐœ

12byte = intํ˜• ๋ณ€์ˆ˜ 3๊ฐœ ํ‘œํ˜„. ๊ตฌ์กฐ์ฒด. ๊ฐ์ฒด.

 

  • ๋ชจ๋“  ๋ฐ”์ดํŠธ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. memory address. addressing.
  • 4byte ์ •๋„๋Š” ๋˜์–ด์•ผ ์ˆซ์ž๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜๊ธฐ์— int ํ˜• ๋ณ€์ˆ˜์˜ ํฌ๊ธฐ๊ฐ€ 4byte๋กœ ๊ณ ์ฐฉํ™” ๋˜์—ˆ๋‹ค.(int ํ˜• ๋ณ€์ˆ˜์˜ ํฌ๊ธฐ๋Š” 32bit, 64bit ์‹œ์Šคํ…œ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.)

- 8byte ํฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ.

- 0~7์ด ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ.

- 1+2 ์—ฐ์‚ฐ์„ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ˆซ์ž 1,2๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹นํ•ด์•ผ ํ•œ๋‹ค.

- ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์™€ ๊ฐ’์˜ ํ‘œํ˜„์ด ๋ชจํ˜ธํ•˜๋‹ˆ ์ฃผ์†Œ๋Š” $๋ฅผ ๋ถ™์ธ๋‹ค.

- ์ฆ‰, ๋ณ€์ˆ˜๋Š” ๊ฐ’ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.(ํฌ์ธํ„ฐ)

 

  1. ๊ฐ„์ ‘ ์ฃผ์†Œ ์ง€์ • ๋ฐฉ์‹: ์ฃผ์†Œ1 → ์ฃผ์†Œ2 → ๋ฐ์ดํ„ฐ        # ์–ด์…ˆ๋ธ”๋ฆฌ์–ด ์ˆ˜์ค€
  2. ์ง์ ‘ ์ฃผ์†Œ ์ง€์ • ๋ฐฉ์‹ : b → ๋ฐ์ดํ„ฐ                             # ๊ณ ๊ธ‰์–ธ์–ด ์ˆ˜์ค€

 

ํฌ์ธํ„ฐ vs ์ฐธ์กฐ

ํฌ์ธํ„ฐ: ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ์Œ.

์ฐธ์กฐ: ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ ํ•„์š”์—†์ด ํฌ์ธํ„ฐ๋ฅผ ํ•œ๋ฒˆ ๋” ์ถ”์ƒํ™” ํ•œ ๊ฒƒ. ์—ฐ์‚ฐ์€ ๋ถˆ๊ฐ€.



3.2 ํ”„๋กœ์„ธ์Šค๋Š” ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์—์„œ ์–ด๋–ค ๋ชจ์Šต์„ ํ•˜๊ณ  ์žˆ์„ ๊นŒ?

 

์ปค๋„

 

์Šคํƒ ์˜์—ญ : ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ์‚ฌ์šฉ. ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฐ˜ํ™˜ ์ฃผ์†Œ, ๋ ˆ์ง€์Šคํ„ฐ ๋“ฑ์˜ ์ •๋ณด.

ํž™ ์˜์—ญ : ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์— ์‚ฌ์šฉ. malloc

 

๋ฐ์ดํ„ฐ ์˜์—ญ

์ฝ”๋“œ ์˜์—ญ : ์ฝ”๋“œ, ๋ฐ์ดํ„ฐ ์˜์—ญ์€ ์‹คํ–‰ํŒŒ์ผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ์ƒ์„ฑ.

 

  • ํ”„๋กœ์„ธ์Šค์˜ ์ฝ”๋“œ ์˜์—ญ์€ 0x400000 ์—์„œ ์‹œ์ž‘
  • ์ฆ‰, ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋‘๊ฐœ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด malloc ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด 0x7f64cb8์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋“ฑ ๋™์ผํ•œ ์‹œ์ž‘ ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’๋‹ค.

 

  • ์‹ค์ œ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ณด์—ฌ์ฃผ๋Š” ๋ชจ์Šต์€ ์œ„์™€ ๊ฐ™๋‹ค.
  • ๋™์ผํ•œ ํฌ๊ธฐ์˜ chunk ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋‰˜์–ด ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ๋‹ค. ๋ชจ๋“  ์กฐ๊ฐ์€ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ์ „์ฒด์— ๋ฌด์ž‘์œ„๋กœ ํฉ์–ด์ ธ ์žˆ๋‹ค.
  • ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์™€ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์—ฐ๊ฒฐํ•ด ์ฃผ๋Š” mapping ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”(page table)์ด ์žˆ๋‹ค.
  • ์ฆ‰, ๋‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ๊ธฐ๋กํ•˜๋”๋ผ๋„ ๋™์ผํ•œ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋‹ค๋ฅธ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— mapping ์‚ฌ์ƒํ•˜๊ธฐ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง„ ์•Š๋Š”๋‹ค.

 

3.3 ์Šคํƒ์˜์—ญ

  • ABCD ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ์Šคํƒ์˜์—ญ๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค.
  • ๋ชจ๋“  ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœ, ๋ฐ˜ํ™˜์˜ ํ๋ฆ„์ด ํ›„์ž… ์„ ์ถœ ๊ตฌ์กฐ์ธ ์Šคํƒ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค. (call stack)
  • ์ด ๋•Œ ํ”„๋กœ์„ธ์Šค ์Šคํƒ ์˜์—ญ์˜ ๋†’์€ ์ฃผ์†Œ๊ฐ€ ๋งจ ์œ„์— ์žˆ๊ณ  ๋‚ฎ์€ ์ฃผ์†Œ ๋ฐฉํ–ฅ์œผ๋กœ ์ปค์ง„๋‹ค.(์•„๋ž˜๋กœ)
  • ์Šคํƒ ์˜์—ญ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊นŠ์ด์— ๋”ฐ๋ผ ์ฆ๊ฐ€ํ•˜๊ณ  ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์™„๋ฃŒ๋  ์ˆ˜๋ก ๊ฐ์†Œํ•œ๋‹ค.
  • ๋ฐ˜ํ™˜ ์ •๋ณด๊ฐ€ ์Šคํƒ ํ”„๋ ˆ์ž„ ํ•˜๋‹จ์— ์ถ”๊ฐ€์ €์žฅ๋œ๋‹ค.

  • ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’๋„ ์Šคํƒ ํ”„๋ ˆ์ž„์— ์ถ”๊ฐ€์ถ”๊ฐ€ ๋œ๋‹ค.
  • ์ง€์—ญ๋ณ€์ˆ˜๋Š” ๋ ˆ์ง€์Šคํ„ฐ ์ˆ˜๋ณด๋‹ค ๋งŽ์„ ๋•Œ ์Šคํƒ ํ”„๋ ˆ์ž„์— ์ €์žฅ๋œ๋‹ค. (๊ธฐ๋ณธ์€ ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅ)
  • ๋ ˆ์ง€์Šคํ„ฐ์— ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ธฐ ์ „์— ๋ ˆ์ง€์Šคํ„ฐ์— ์›๋ž˜ ์ €์žฅ๋˜์—ˆ๋˜ ์ดˆ๊ธฐ๊ฐ’์„ ๊บผ๋ƒˆ๋‹ค ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋‚˜๋ฉด ๋‹ค์‹œ ๊ทธ ์ดˆ๊ธฐ๊ฐ’์„ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋ ˆ์ง€์Šคํ„ฐ ์ดˆ๊ธฐ๊ฐ’๋„ ์Šคํƒ ํ”„๋ ˆ์ž„์— ์ €์žฅ๋œ๋‹ค.

  • ์ด ๋ชจ๋“  ๋‚ด์šฉ์ด ์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์Šคํƒ์˜์—ญ ๋‚ด๋ถ€์— ์žˆ๋‹ค. ์Šคํƒ์˜์—ญ(ํ•จ์ˆ˜ A ์Šคํƒํ”„๋ ˆ์ž„, ํ•จ์ˆ˜ B ์Šคํƒํ”„๋ ˆ์ž„)
  • ์ฆ‰, ๋„ˆ๋ฌด ํฐ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋‹จ๊ณ„๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์œผ๋ฉด stack overflow ๊ฐ€ ๋ฐœ์ƒํ•˜๋‹ˆ ์ฃผ์˜ํ•˜์ž.
  • stack overflow ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด stack ์˜์—ญ ๋ฐ‘์— ์œ ํœด ์˜์—ญ์ด ์žˆ๋‹ค.(free segment)

 

3.4 ํž™ ์˜์—ญ

  • ํž™ ์˜์—ญ: ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ํŠน์ • ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ.
  • ํž™ ์˜์—ญ์— ํ• ๋‹น๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ํšŸ์ˆ˜์™€ ๊ด€๊ณ„์—†์ด ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์˜ ์‚ฌ์šฉ์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๊ณ  ํ™•์‹ ํ•  ๋•Œ๊นŒ์ง€ ์œ ํšจํ•˜๋‹ค.
  • C/C++ ์˜ malloc ํ•จ์ˆ˜, new ์˜ˆ์•ฝ์–ด.ํ•ด์ œ๋Š” free ํ•จ์ˆ˜.

  • ํž™ ์˜์—ญ์˜ ๋ฌธ์ œ์ด์ž ํ•ต์‹ฌ์€ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์š”์ฒญ์˜ ํฌ๊ธฐ๊ฐ€ ์ผ์ •ํ•˜์ง€ ์•Š์•„์„œ ์ ์ ˆํ•  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ.
  • ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ž ์•ˆ์˜ ์—ฌ์œ  ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์ด ๋ถ€์กฑํ•ด์ง€๋ฉด ์ด ์—ญ์‹œ ์œ ํœด ์˜์—ญ์— ์ ์œ ๋œ๋‹ค.

์ฆ‰, stack ์˜์—ญ๊ณผ heap ์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•ด์ง€๋ฉด ์œ ํœด ๊ณต๊ฐ„์ด ์ ์  ์ž‘์•„์ง€๊ฒŒ ๋œ๋‹ค.

  • ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” heap ์—์„œ ๋ถ€์กฑํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์œ ํœด๊ณต๊ฐ„์—์„œ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด brk ๋ผ๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ด ๋•Œ, malloc์˜ ํ˜ธ์ถœ์ด ๋ฐ˜ํ™˜๋˜๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋ฐ›์•„ ์˜ค๋Š” ๋ฉ”๋ชจ๋ฆฌ๋Š” ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์ด๋‹ค. ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์‚ฌ์šฉ๋˜๋Š” ์ˆœ๊ฐ„์— ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ฒŒ ๋œ๋‹ค. ์ฆ‰, ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์™€ ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ํŽ˜์ด์ง€ ๋ˆ„๋ฝ ์˜ค๋ฅ˜  page fault ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

<Heap ์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ 1๊ฐœ ๋‚ด๋ถ€>

1) header ์ •๋ณด: 4byte(32bit) ํฌ๊ธฐ์˜ header์— ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.

                         31bit: ์กฐ๊ฐ ํฌ๊ธฐ ๊ธฐ๋ก.

                         1bit: ์กฐ๊ฐ์˜ ํ• ๋‹น/์œ ํ›„ ์ƒํƒœ์ •๋ณด.

     → ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์€ header ๋กœ ์ฐพ์•„๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

2) ํŽ˜์ด๋กœ๋“œ(payload): ํ• ๋‹น ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ.

3) ๋ฉ”๋ชจ๋ฆฌ ์ „์ฒด ๋(0/1)์—๋„ 4byte๋กœ ๋์„ ์•Œ๋ ค์ฃผ๋Š” ํŠน์ˆ˜ ํ‘œ์‹œ๊ฐ€ ์žˆ๋‹ค.

 

<Heap์˜ ์—ฌ์œ  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์ „๋žต>

1) ์ตœ์ดˆ ์ ํ•ฉ ๋ฐฉ์‹: ์ฒ˜์Œ๋ถ€ํ„ฐ ์ญ‰ ์ฐพ๊ธฐ. ๋‹จ์ˆœํ•œ ๋ฐฉ๋ฒ•.

2) ๋‹ค์Œ ์ ํ•ฉ ๋ฐฉ์‹: ์ด์ „ ํ• ๋‹น ์œ„์น˜๋ถ€ํ„ฐ ์ญ‰ ์ฐพ๊ธฐ.

3) ์ตœ์  ์ ํ•ฉ ๋ฐฉ์‹: ํ• ๋‹น ๊ฐ€๋Šฅํ•œ ์—ฌ์œ  ๊ณต๊ฐ„์„ ๋ชจ๋‘ ์ฐพ๊ณ  ๊ทธ ์ค‘์—์„œ ์ตœ์ ์˜ ๊ณต๊ฐ„ ์ฐพ๊ธฐ. ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ์ž˜ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ 1)2) ๋ฐฉ๋ฒ•๋ณด๋‹ค ๋Š๋ฆฌ๋‹ค.

 

<Heap ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œํ•˜๊ธฐ>

- ์ฃผ์†Œ๋งŒ ์ „๋‹ฌํ•˜๋ฉด ์ฃผ์†Œ -4 ๋กœ header ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์–ด์„œ ๊ฐ„๋‹จํžˆ ํ•ด์ œ ๊ฐ€๋Šฅํ•˜๋‹ค.

- ์ธ์ ‘ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์ด ๋น„์–ด์žˆ์„ ๋•Œ๋Š” ๋” ํฐ ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์œผ๋กœ ์„œ๋กœ ๋ณ‘ํ•ฉํ•ด์„œ ๋ฏธ๋ฆฌ ๋Œ€๋น„ํ•˜๋Š” ๊ฒŒ ๋‚˜์€ ๋ฐฉ์‹์ด๋‹ค. ์ด๋Š” ์•ž header ์ •๋ณด์ฒ˜๋Ÿผ ๋’ค์—๋„ footer ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์ข€ ๋” ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

3.5 ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•  ๋•Œ ์ €์ˆ˜์ค€ ๊ณ„์ธต์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ

 

         ์ปค๋„                                                                                 kernel mode

์‹œ๋™ ์ค€๋น„ ํ”„๋กœ๊ทธ๋žจ                                                                     | 

   ์‘์šฉํ”„๋กœ๊ทธ๋žจ                                                                          user mode

 

- kernel mode

: CPU๊ฐ€ ์šด์˜ ์ฒด์ œ์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ปค๋„ ์ƒํƒœ์— ๋†“์ธ๋‹ค.

: ์ปค๋„ ์ƒํƒœ์—์„œ๋Š” CPU๊ฐ€ ๋ชจ๋“  ๊ธฐ๊ณ„ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ชจ๋“  ์ฃผ์†Œ ๊ณต๊ฐ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์ œํ•œ ์—†์ด ํ•˜๋“œ์›จ์–ด์—๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

- user mode

: ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ž‘์„ฑํ•œ ์ผ๋ฐ˜์ ์ธ ์ฝ”๋“œ๋ฅผ CPU๊ฐ€ ์‹คํ–‰ํ•  ๋•Œ๋Š” ์‚ฌ์šฉ์ž ์ƒํƒœ์— ํ•ด๋‹นํ•œ๋‹ค.

: ํŠน์ • ์ฃผ์†Œ ๊ณต๊ฐ„์— ์ ˆ๋Œ€ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๊ทธ ์ฃผ์†Œ ๊ณต๊ฐ„์— ์ ‘๊ทผ์„ ์‹œ๋„ํ•˜๋ฉด segmentation fault ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

- system call

: ํ”„๋กœ๊ทธ๋žจ์ด ํŒŒ์ผ ์ฝ๊ธฐ๋‚˜ ์“ฐ๊ธฐ, ๋„คํŠธ์›Œํฌ ๋ฐ์ดํ„ฐ์˜ ์†ก์ˆ˜์‹  ๋“ฑ ์šด์˜์ฒด์ œ ์„œ๋น„์Šค๋ฅผ ์š”์ฒญํ•ด์•ผํ•  ๋•Œ๋Š” system call ์„ ์‚ฌ์šฉํ•œ๋‹ค.(ex. malloc, brk)

 

- ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(standard library)

: ์šด์˜์ฒด์ œ์— ๊ด€๊ณ„์—†์ด ํ”„๋กœ๊ทธ๋žจ์ด system call ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•. malloc ๋˜ํ•œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์†ํ•œ๋‹ค.

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ
ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
์šด์˜ ์ฒด์ œ
ํ•˜๋“œ์›จ์–ด

์ฆ‰, ์ „์ฒด ์‹œ์Šคํ…œ์˜ ๋ชจ์Šต์€ ์œ„์™€ ๊ฐ™๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๊ณผ ์šด์˜์ฒด์ œ ์‚ฌ์ด์— ‘ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ’๊ฐ€ ์žˆ๋Š” ๋ชจ์Šต.

 

 

3.6 ๊ณ ์„ฑ๋Šฅ ์„œ๋ฒ„์˜ ๋ฉ”๋ชจ๋ฆฌ ํ’€์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋ ๊นŒ?

- malloc ๊ณผ ๊ฐ™์€ system call ๊ณผ ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๊ฒƒ์ด ๋ฉ”๋ชจ๋ฆฌ ํ’€์ด๋‹ค.

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ(๋ฉ”๋ชจ๋ฆฌ ํ’€)
ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(malloc)
์šด์˜ ์ฒด์ œ
ํ•˜๋“œ์›จ์–ด

 

<๋ฉ”๋ชจ๋ฆฌ ํ’€์˜ ์›๋ฆฌ>

- ํ•œ๋ฒˆ์— ํฐ ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์„ ์š”์ฒญํ•˜๊ณ  ๊ทธ ์œ„์—์„œ ์ž์ฒด์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ํ•ด์ œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹.

- ์ฆ‰, ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์šด์˜์ฒด์ œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

- ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๋Š” ์š”์ฒญ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ํ•œ๋ฒˆ์— ๋ฉ”๋ชจ๋ฆฌ ํ’€ ์ „์ฒด๋ฅผ ํ•ด์ œํ•˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ์˜ ๋ถ€๋‹ด์ด ์ ๋‹ค.

- ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์‹œ ์—ฌ์œ  ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์˜ ์‹œ์ž‘ ์œ„์น˜๋ฅผ Free_ptr ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์–ด์„œ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

- ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ๊ฐ ์Šค๋ ˆ๋“œ ๋ณ„ ์ „์šฉ ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ž์‹ ์˜ ์Šค๋ ˆ๋“œ ํ’€๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

3.7 ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ จ ๋ฒ„๊ทธ

1) ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ํฌ์ธํ„ฐ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ธฐ

int* func() 
{
     int a = 2;
     return &a;
}
void main()
{
     int* p = func();
     *p = 20;
}

: ์ง€์—ญ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜ ์ข…๋ฃŒ ์‹œ, ํ•จ์ˆ˜์˜ ํ•ด๋‹น ์Šคํƒ ํ”„๋ ˆ์ž„๋„ ํ•ด์ œ๋œ๋‹ค. 

 

2) ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์˜ ์ž˜๋ชป๋œ ์ดํ•ด

int sum(int* arr, int len) 
{
     int sum = 0;

     for(int = 0; i < len; i++)
     {
         sum += *arr;
         arr += sizeof(int);
     }
     return sum;
}

: ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์—์„œ 1์„ ๋”ํ•˜๋Š” ๊ฒƒ == ๋ฐ์ดํ„ฐ ํ˜•์‹์˜ ํฌ๊ธฐ๋งŒํผ ์ด๋™ํ•˜๋Š” ๊ฒƒ.

์ฆ‰, ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐ์ดํ„ฐ ํ˜•์‹์˜ ํฌ๊ธฐ๋Š” ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ์•Œ์•„์„œ ๋œ๋‹ค.

arr += sizeof(int); → arr++; ๋กœ ๊ฐ„๋‹จํžˆ ์ž‘์„ฑํ•˜์ž.

 

3) ๋ฌธ์ œ ์žˆ๋Š” ํฌ์ธํ„ฐ ์—ญ์ฐธ์กฐํ•˜๊ธฐ

int a;
scanf(“%d”, a);

: ์ง€์—ญ๋ณ€์ˆ˜๋Š” ๊ฐ’์ด ๊ณ ์ •๋˜์–ด ์žˆ์ง€ ์•Š์•„์„œ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค. ์ฆ‰, ์ผ์ •ํ•œ ๋‹ต์ด ๋‚˜์˜ค์ง€ ์•Š๋Š”๋‹ค.

 

     โ‘  a ๊ฐ’์ด ์ฝ”๋“œ ์˜์—ญ์ด๋‚˜ ๊ธฐํƒ€ ์ฝ๊ธฐ ์ „์šฉ ์˜์—ญ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ ๊ฐ’์ผ ๋•Œ → ๊ฐ•์ œ ์ข…๋ฃŒ

     โ‘ก a ๊ฐ’์ด ์Šคํƒ ์˜์—ญ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ ๊ฐ’์ผ ๋•Œ 

         → ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์Šคํƒ ํ”„๋ ˆ์ž„์ด ํŒŒ๊ดด๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•  ์ง€ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†์Œ.

     โ‘ข a ๊ฐ’์ด ํž™ ์˜์—ญ ๋˜๋Š” ๋ฐ์ดํ„ฐ ์˜์—ญ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ์ผ ๋•Œ 

         → ํ”„๋กœ๊ทธ๋žจ์ด ๋™์ ์œผ๋กœ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํŒŒ๊ดด๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•  ์ง€

             ์˜ˆ์ธกํ•  ์ˆ˜ ์—†์Œ.

 

4) ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ ์ฝ๊ธฐ

void add()
{
     int* a = (int*)malloc(sizeof(int));
     *a += 10;
}

: ํž™ ์˜์—ญ์— ๋™์ ์œผ๋กœ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ•ญ์ƒ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๋Š”๋‹ค. ์ˆ˜๋™ ์ดˆ๊ธฐํ™” ํ•„์š”.

 

5) ์ด๋ฏธ ํ•ด์ œ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ

void add()
{
     int* a = (int*)malloc(sizeof(int));
     …
     free(a);
     int b = *a;
}

: ํ•ด์ œ๋œ ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์„ ์ฐธ์กฐํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์˜ ํ–‰๋™์„ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋‹ค.

 

6) ๋ฐฐ์—ด ์ฒจ์ž๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.

void init()
{
     int* arr = (int*)malloc(sizeof(int));
     for(int i = 0; i<=n; i++)
     {
          arr[i] = i;
     }
}

: ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ ์ ‘๊ทผํ•  ๋•Œ ์ฃผ์˜ํ•˜๋ผ.

 

7) ์Šคํƒ ๋„˜์นจ

void buffer_overflow()
{
     char buf[32];
     gets(but);
     return;
}

: gets ๋กœ ์ž…๋ ฅ์„ ๋ฐ›์„ ๋•Œ 32 ํฌ๊ธฐ๊ฐ€ ๋„˜์œผ๋ฉด stack buffer overflow๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

8) ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜

void memory_leak()
{
     int *p = (int *)malloc(sizeof(int));
     return;
}

: ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ ํ›„ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ์ „๊นŒ์ง€ ๋‹ค์‹œ ํ•ด์ œํ•  ๋ฐฉ๋ฒ•์ด ์—†์–ด์„œ memory leak ์ด ์ผ์–ด ๋‚œ๋‹ค.

 

728x90