16. ์ธ๊ทธ๋ฉํ ์ด์
16.1 ๋ฒ ์ด์ค ๋ฐ์ด๋์ ์ผ๋ฐํ
์ง๊ธ ๊ฐ์ ์ ๋จ๊ณ์์ ๋ด๋ถ๋จํธํ๊ฐ ๋ฐ์ํ๋ ์์ธ์
์คํ๊ณผ ํ ์ฌ์ด์ ์ฌ์ฉํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์กด์ฌ
ํ๋ ๊ฒ์ด๋ค.
-
์ธ๊ทธ๋ฉํ ์ด์
์ 60๋ ๋์ ์ด๋ฏธ ์ฌ์ฉ๋๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ๋ฒ์ด๋ค. -
๊ธฐ๋ณธ์ ์ผ๋ก
์ธ๊ทธ๋ฉํ ์ด์
์์ธ๊ทธ๋จผํธ
๋ง๋ค๋ฒ ์ด์ค
์๋ฐ์ด๋
๋ฅผ ๊ฐ์ง๊ณ ์๋ค. -
์ธ๊ทธ๋จผํธ๋ ๋ ผ๋ฆฌ์ ์ธ ๋จ์๋ก, ํ๋ก๊ทธ๋จ์ด๋ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ ๋ ผ๋ฆฌ์ ์ธ ๋จ์์ด๋ค. (์คํ, ํ, ๋ฐ์ดํฐ์์ญ, ์ฝ๋์์ญ ๋ฑ)
-
์ฆ ๋ ผ๋ฆฌ์ ์ธ ๋จ์๋ก ๋๋์ด์ง ์ธ๊ทธ๋จผํธ(๋ ผ๋ฆฌ์ ๋จ์)์ ๊ฐ๊ฐ ๋ฒ ์ด์ค์ ๋ฐ์ด๋๋ฅผ ์ฃผ๋ ๊ฒ์ด๋ค.
- ๊ทธ์ธ์๋ ๋ฒ ์ด์ค ๋ฐ์ด๋ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ค. ์๋ฅผ๋ค์ด ๊ฐ์์ฃผ์๊ฐ 100, ๋ฒ ์ด์ค๊ฐ 50, ๋ฐ์ด๋๊ฐ 110์ด๋ผ๋ฉด, ๋ฒ ์ด์ค ์ฃผ์์ธ 50์ผ๋ก ๊ฐ์ 100์ ๋ํ๋ฉด 150์ด ๋๋๋ฐ, ์ด๋ ๋ฐ์ด๋๋ณด๋ค ํฌ๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. (๋๊ฐ์)
์ฐธ๊ณ ๋ก ๋ฒ ์ด์ค + ์คํ์ (๊ฐ์์ฃผ์)์ด ๋ฐ์ด๋๋ณด๋ค ํฌ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋๋ฐ, ์ด๊ฑธ
Segment Fault
๋ผ๊ณ ํ๋ค.
‘์ผ๋ฐํ’ ๋ผ๋ ๋จ์ด๊ฐ ๋ญ๊ฐ ๋ฌํ๊ฒ ์ด์ธ๋ฆฌ์ง ์๋ ๊ฒ ๊ฐ์์ ์ฝ๊ฐ ํท๊ฐ๋ฆด ์ ์์ง๋ง ์ด๋ ค์ด ๋ด์ฉ์ ์๋๋ค.
16.2 ์ธ๊ทธ๋จผํธ ์ข ๋ฅ์ ๋ํ ํ์
๋น์ฐํ๊ฒ๋ ๋ญํ๋ ์๋์ผ๋ก ๋๋๊ฑด ์๋ค. ์ธ๊ทธ๋จผํธ๋ฅผ ๋ฒ ์ด์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฐธ์กฐํ์๋ ์ด ์ธ๊ทธ๋จผํธ๊ฐ ์ด๋ค ์ข ๋ฅ์ธ์ง๋ ์ ์ ์๋๋ก ์กฐ์นํด์ผํ๋ค.
- ์ฒ์์๋ ๋คํธ์ํฌ์์ ํค๋ ๋ถ์ด๋ ๊ฒ์ฒ๋ผ ์ฃผ์๊ฐ์ ์ต์์ ๋ช ๋นํธ๋ฅผ ์ด์ฉํด์ ๊ตฌ๋ถํ๋ค.
Segment = (VirtualAddress & SEGMENT_MASK) >> SEGMENT_SHIFT
Offset = VirtualAddress & OFFSET_MASK
if Offset > SegmentSize[Segment] then
Raise Exception(SEGMENTATION_FAULT)
else
PhysicalAddress = Base[Segment] + Offset
Register = Memory[PhysicalAddress]
ํด์
์ฌ๊ธฐ์ ๋ชฉํ๋ ์๋์ ๊ฐ์
๊ฐ์ ์ฃผ์: 1100 0101 0010 1101 1010 1111 0001 0011 (32๋นํธ)
์ธ๊ทธ๋จผํธ ๋ฒํธ: 1100 (์์ 4๋นํธ)
์คํ์
: 0101 0010 1101 1010 1111 0001 0011 (ํ์ 28๋นํธ)
๊ทผ๋ฐ ์ฐ๋ฆฌ๋ ์๋๊น ์์ 4๋นํธ๋ฅผ ๋ผ์ด๋ด์ ์ธ๊ทธ๋จผํธ ๋ฒํธ๋ฅผ ๊ตฌํ ์ ์๋๋ฐ, ์ปดํจํฐ๋ ๋ฉ์ฒญํด์ ๊ทธ๊ฒ ์๋๋ค.
์ฒซ์ค์ ์ด๋ ๊ฒ ๋๋๋ ค๊ณ SEGMENT_MASK๋ก &์ฐ์ฐ์ ํด์ ์ธ๊ทธ๋จผํธ ๋ฒํธ๋ฅผ ๊ตฌํ๋ ์ฝ๋
SEGMENT_MASK: 1111 0000 0000 0000 0000 0000 0000 0000 (32๋นํธ)
VirtualAddress: 1100 0101 0010 1101 1010 1111 0001 0011
SEGMENT_MASK: 1111 0000 0000 0000 0000 0000 0000 0000
๊ฒฐ๊ณผ: 1100 0000 0000 0000 0000 0000 0000 0000
์ฌ๊ธฐ์ ๊ฒฐ๊ณผ๊ฐ์ ์ฌํํธ ์ฐ์ฐ์ผ๋ก ๋ค ๋ฐ์ด๋ฒ๋ฆฌ๋ฉด ์ธ๊ทธ๋จผํธ ๋ฒํธ๊ฐ ๋์จ๋ค.
๋น์ทํ ๊ณผ์ ์ ๊ฑฐ์ณ ์คํ์ ์ ๊ตฌํ๋ค.
Base[Segment] : ํด๋นํ๋ ์ธ๊ทธ๋จผํธ์ ๋ฒ ์ด์ค ์ฃผ์, ์ฌ๊ธฐ๋ค ์คํ์ ์ ๋ํ๋ฉด ๋ฌผ๋ฆฌ์ฃผ์๊ฐ ๋์จ๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋น ์ฃผ์๊ฐ์ ์ฐธ์กฐํ๊ธฐ!
๋ฌธ์ ์
-
๋ฌธ์ ๋ ์ด๋ฌํ ๋ฐฉ์์ ์ต๋ ์ธ๊ทธ๋จผํธ์ ํฌ๊ธฐ์ ๊ฐ์ ๊ฒ๋ค์ด ‘๊ณ ์ ’์ด๊ณ , ‘์ฝ์’์ด ๋์ด ์๋ค๋ ๊ฒ!
-
๋ํ ์์ ์ฃผ์ ๋นํธ๋ฅผ ์ด์ฉํด์ ์ธ๊ทธ๋จผํธ๋ฅผ ๊ตฌ๋ถํ๋๋ฐ ์ฐ๋๊ฒ๋ ์๊ฐ๋ณด๋ค ๋ ๋น์ฉ์ด ๋ง์ด ๋ ๋ค.
-
์๋ฅผ๋ค์ด ์์ ๋ค ๋นํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ค์ offset์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๋นํธ๊ฐ 2^4๋งํผ ์ค์ด๋ ๋ค.
-
16์ต๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฌ์ฉํ ์ ์์์๊ฑด๋ฐ ๋นํธ ๋ค๊ฐ๋ฅผ ๊น๋ฒ๋ฆฌ๋ฉด 1์ต๊ฐ๋ง ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
16.3 ์คํ
์คํ์ด๋ผ๊ณ ์๊ฐ๋ฅผ ํ์ง๋ง, ์ฌ์ค ์ธ๊ทธ๋จผํธ์ ํน์ฑ์ ๋ฐ๋ผ ๊ด๋ฆฌ์ ํ๋์ด ๋ฌ๋ผ์ง๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๋ ์์
-
์คํ์ด๋ผ๋ ์ธ๊ทธ๋จผํธ๋ ์ฃผ์๊ฐ ์์ ์ฑ์ฅ์ ํ๋ค. ์ด๊ฑฐ cpp๋ณด๋ฉด ์ง์ง ๊ทธ๋ผ
-
์ด์ ์๋ฐฉํฅ์ผ๋ก ์ฆ๊ฐํ๋์ง ์ฌ๋ถ๋ฅผ ์ด๋๊ฐ์ ์ ์ฅํด์ผํ๋ค.
-
๊ทธ๋์ ์คํ ์ธ๊ทธ๋จผํธ์๋
๋ฐฉํฅ ๋นํธ
๋ฅผ ์ถ๊ฐํด์ ์ด๋ ๋ฐฉํฅ์ผ๋ก ์ฆ๊ฐํ๋์ง๋ฅผ ํ์ํ๋ค.
16.4 ๊ณต์ ์ง์(Support for Sharing)
์ฌ๊ธฐ๋ ๋ฒ์ญ์ด ๋๋ฌด ์ด์ํ๋ค. ์์์ ๋ํ ์ค๋ช ์ด ๋ถ์กฑํ๋ฐ ๊ฐ์๊ธฐ ๋ณดํธ๋นํธ ์ด์ผ๊ธฐ๊ฐ ๋์์ ๋นํฉํ์ค๋ฌ์..
-
๊ฒฐ๋ก ์ ์ผ๋ก๋ ์ผ๋จ, ํน์ ์ธ๊ทธ๋จผํธ๋ฅผ ๊ณต์ ํ๋๊ฒ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํจ์จ์ ์ผ ์ ์๋๋ฐ, ๋ฐ๋ก ‘code’๋ฅผ ๊ณต์ ํ๋ ๊ฒ์ด๋ค.
-
๊ฐ์ฅ ์ง๊ด์ ์ผ๋ก ๋น์ ํ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ์ ๊ฒ์ ๊ณต์ ํ๋ ๊ฒ์ด๋ค.(์ ํํ์ง๋ ์์ง๋ง c๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ด ์ฌ๋ฟ์ธ๋ฐ, stl์ ์ฌ๋ฌ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆด ์ด์ ๊ฐ ์์!)
-
์ด๊ฑด ์ง์ง ์ข๊ธด ํ์ง๋ง ์ํํ๋๊น, ๊ณต์ ๋ฅผ ์ํด
๋ณดํธ ๋นํธ
๋ฅผ ์ถ๊ฐํด์ ๊ณต์ ํ๋ค๋๊ฒ ์ฃผ์ ๋ด์ฉ์ด๋ค.
์ฌ๊ธฐ๊น์ง ์ธ๊ทธ๋จผํธ ๋ ์ง์คํฐ์ ์ ์ฅํด์ผํ ๋ฐ์ดํฐ๋ ์๋์ ๊ฐ๋ค.
16.5 ์๋จ์๋ ๋๋จ์ ์ธ๊ทธ๋ฉํ ์ด์
-
์ง๊ธ์ ๋๋จ์ ์ธ๊ทธ๋ฉํ ์ด์ ์ ํ๋ค. (์คํ, ํ, ์ฝ๋, ๋ฐ์ดํฐ) ์์ ๋๋ก๋ง ํฌ๊ฒํฌ๊ฒ ๋๋ ์ ๋๋จ์๋ผ๊ณ ํจ
-
๊ทธ๋ฐ๋ฐ ํ์์ฑ์ ๋ฐ๋ผ์, ๋ ์์ ๋จ์๋ก ๋๋์ด์ ์ธ๊ทธ๋ฉํ ์ด์ ์ ํ ์๋ ์๋ค.
-
์ด๋ ๊ฒ ์ธ๊ทธ๋จผํธ๋ฅผ ์ค์ด๊ณ ๋ง์ด ๊ฐ์ง๊ณ ์์ผ๋ฉด ์ธ๊ทธ๋ฉํธ ํ ์ด๋ธ ๊ฐ์ ์๋ก์ด ํ๋์จ์ด ์ง์์ด ํ์ํ๋ค.
16.6 ์ด์์ฒด์ ์ ์ง์
์ธ๊ทธ๋ฉํ ์ด์ ๋๋ถ์ ๋ญ๋น๋๋ ‘๋ฌผ๋ฆฌ’๋ฉ๋ชจ๋ฆฌ ์์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ ๋์๋ค. ๊ทผ๋ฐ ๋น์ฐํ๊ฒ๋ ์ธ๊ทธ๋จผํธ๊ฐ ์ผ๊ธฐํ๋ ๋ฌธ์ ๊ฐ ์๊ณ , ์ธ๊ทธ๋จผํธ๊ฐ ์์ง ํด๊ฒฐ ๋ชปํ ๋ฌธ์ ๋ ์๋ค. ์ธ๊ทธ๋จผํธ๊ฐ ์ผ๊ธฐํ๋ ๋ฌธ์ ์ ์ธ๊ทธ๋จผํธ๋ก ํด๊ฒฐ ๋ชปํ ๋ฌธ์ ๋ง์ง๋ง์ผ๋ก ๊ทธ๊ฑธ ์ด์์ฒด์ ๊ฐ ์ด๋ป๊ฒ ํด๊ฒฐ ํ ์ ์๋์ง ์์๋ณธ๋ค.
- ์ธ๊ทธ๋จผํธ๊ฐ ์ผ๊ธฐํ๋ ๋ฌธ์
- ์ปจํ
์คํธ ์ค์์น ์ ์ธ๊ทธ๋จผํธ ๋ ์ง์คํฐ ๊ด๋ฆฌ ๋ฌธ์
- ๊ฐ ํ๋ก์ธ์ค๋ ์์ ์ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ ๊ฐ์ง๊ณ ์์ด, ์ปจํ ์คํธ ์ค์์น ์ ์ด์์ฒด์ ๊ฐ ์ธ๊ทธ๋จผํธ ๋ ์ง์คํฐ๋ฅผ ์ ์ฅํ๊ณ ๋ณต์ํด์ผ ํ๋ค.(์ค๋ฒํค๋๊ฐ ์ปค์ง๊ฒ ์ง!)
- ์ธ๊ทธ๋จผํธ ํฌ๊ธฐ ๋ณ๊ฒฝ ์์ ๋ฌธ์
- ํ๋ก๊ทธ๋จ์ด malloc()์ ํธ์ถํ ๋, ๊ธฐ์กด ํ์์ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉด ํ ์ธ๊ทธ๋จผํธ๊ฐ ์ปค์ ธ์ผ ํ๋ค.
- ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์คํ ํธ์ถ์ ํตํด ํ์ ํ์ฅํ๊ณ , ์ด์์ฒด์ ๋ ํ์ ํ์ฅํ์ฌ ์ธ๊ทธ๋จผํธ ํฌ๊ธฐ ๋ ์ง์คํฐ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ , ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฑ๊ณต์ ์๋ฆฐ๋ค.
- ์ด์์ฒด์ ๋ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๊ฑฐ๋ ํธ์ถ๋ ํ๋ก์ธ์ค๊ฐ ์ด๋ฏธ ๋๋ฌด ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๊ณ ํ๋จํ๋ฉด ์์ฒญ์ ๊ฑฐ๋ถํ ์ ์๋ค.
- ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ๋น ๊ณต๊ฐ ๊ด๋ฆฌ ๋ฌธ์
- ์๋ก์ด ์ฃผ์ ๊ณต๊ฐ์ ์์ฑํ ๋ ์ด์์ฒด์ ๋ ์ธ๊ทธ๋จผํธ์ ๋ํ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฐพ์์ผ ํ๋ค.
- ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ ๋น ๊ณต๊ฐ๋ค๋ก ๋๋์ด ์๋ก์ด ์ธ๊ทธ๋จผํธ๋ฅผ ํ ๋นํ๊ฑฐ๋ ๊ธฐ์กด ์ธ๊ทธ๋จผํธ๋ฅผ ํ์ฅํ๊ธฐ ์ด๋ ค์์ง๋ค. ์ด๋ฅผ ์ธ๋ถ ๋จํธํ(external fragmentation)๋ผ๊ณ ํ๋ค.
- ์ธ๊ทธ๋จผํธ๊ฐ ์์ง ํด๊ฒฐ ๋ชปํ ๋ฌธ์
- ์ธ๋ถ ๋จํธํ ๋ฌธ์
- ์ธ๊ทธ๋จผํธ๊ฐ ๊ฐ๋ณ ํฌ๊ธฐ์ด๊ธฐ ๋๋ฌธ์ ๋น ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ ์กฐ๊ฐ๋ค๋ก ๋๋์ด์ ธ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์ฒญ์ ์ถฉ์กฑํ๊ธฐ ์ด๋ ต๊ฒ ๋๋ค.
- ์์ ํ ์ผ๋ฐํ๋ ํฌ๋ฐํ ์ฃผ์ ๊ณต๊ฐ ์ง์ ๋ถ์กฑ ๋ฌธ์
- ํฐ ๋ ผ๋ฆฌ์ ์ธ๊ทธ๋จผํธ(์: ํฌ๋ฐํ ํ)๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์์ ํ ์์ฃผํด์ผ ํ๋ค.
- ์ฃผ์ ๊ณต๊ฐ ์ฌ์ฉ ๋ชจ๋ธ์ด ์ธ๊ทธ๋ฉํ ์ด์ ์ค๊ณ ๋ฐฉ์๊ณผ ์ผ์นํ์ง ์์ผ๋ฉด ์ธ๊ทธ๋ฉํ ์ด์ ์ด ์ ์๋ํ์ง ์๋๋ค.
- ์ด์์ฒด์ ๊ฐ ์ธ๊ทธ๋ฉํ ์ด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
- ๋ฉ๋ชจ๋ฆฌ ์์ถ ๋ฐฉ๋ฒ ์ด์์ฒด์ ๋ ํ๋ก์ธ์ค๋ฅผ ๋ฉ์ถ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ผ๋ก ๋ณต์ฌํ๊ณ , ์ธ๊ทธ๋จผํธ ๋ ์ง์คํฐ ๊ฐ์ ์๋ก์ด ๋ฌผ๋ฆฌ์ ์์น๋ก ๋ณ๊ฒฝํ์ฌ ํฐ ๋น ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๋ค. ๊ทธ๋ฌ๋ ๋ฉ๋ชจ๋ฆฌ ์์ถ์ ๋น์ฉ์ด ๋ง์ด ๋ ๋ค.
- ์์ ๋ฆฌ์คํธ ๊ด๋ฆฌ ์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉ ํฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์งํ๋ ค๊ณ ์๋ํ๋ ์์ ๋ฆฌ์คํธ ๊ด๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค. ๋ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก๋ best-fit, worst-fit, first-fit, buddy algorithm ๋ฑ์ด ์๋ค.
์ด๋ฌํ ์๊ณ ๋ฆฌ์ฆ์ ์ธ๋ถ ๋จํธํ๋ฅผ ์ต์ํํ๋ ค๊ณ ์๋ํ๋ค. ์ธ๊ทธ๋ฉํ ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ํ์์ ์ฌ๋ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ง, ์ฌ์ ํ ์ธ๋ถ ๋จํธํ์ ํฌ๋ฐํ ์ฃผ์ ๊ณต๊ฐ ์ง์ ๋ถ์กฑ ๋ฌธ์ ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ด์์ฒด์ ๋ ๋ฉ๋ชจ๋ฆฌ ์์ถ๊ณผ ๋ค์ํ ์์ ๋ฆฌ์คํธ ๊ด๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ํตํด ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ๋ ธ๋ ฅํ์ง๋ง, ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๋ ์ฌ์ ํ ์กด์ฌํ๋ฏ๋ก ๋ ๋์ ์๋ฃจ์ ์ด ํ์ํ๋ค.
17. ๋น ๊ณต๊ฐ ๊ด๋ฆฌ
์์์ ์ธ๊ทธ๋จผํธ๋ก ๋๋์ผ๋ก์จ, ๋ด๋ถ ๋จํธํ๋ฅผ ํด๊ฒฐํ์ง๋ง ์ธ๋ถ ๋จํธํ ๋ฌธ์ ๊ฐ ์ฃผ์ํ๊ฒ ๋จ์์๋ค. ์ฆ ๊ณ ์ ๋ฉ๋ชจ๋ฆฌ ๋ฒ์๋ฅผ ์ฌ์ฉํ๋ฉด์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ์ธ๊ทธ๋จผํธ ๋จ์๋ก ์ ์ฌํ๋ฉด์ ํด๊ฒฐํ์ง๋ง, ์ธ๊ทธ๋จผํธ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌํ๋๋ฐ ๋ฐ์ํ๋ ๋ฌธ์ ๊ฐ ์ธ๋ถ ๋จํธํ์ด๋ค.
- ๋ฌธ์ ๋ฅผ ๋๋ฌด ์ ์์ฝํด์ ์ฑ
์ ๋ฐ์ทํ๋ฉด,
๊ด๋ฆฌํด์ผ ํ๋ ๊ณต๊ฐ์ด ๊ฐ๋ณ ํฌ๊ธฐ์ ๋น ๊ณต๊ฐ์ผ๋ก ๋๋์ด์ ธ ์๋ ์ด์
๋ฅผ ํด๊ฒฐํด์ผํ๋ค.
17.1 ๊ฐ์
์ด ๋ ผ์์ ๋๋ถ๋ถ์
์ฌ์ฉ์ ์์ค์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ ๋ฐ์ ์ญ์ฌ๋ฅผ ์ค์ฌ์ผ๋ก ํ๋ค. (malloc()
๊ณผfree()
๋ ์ค์๊ฐ์ผ๋ก ํ ์ธ๊ทธ๋จผํธ ๋ด๋ถ์ ๋น ๊ณต๊ฐ์ ์กฐ์ ํด์ผ ํ๋ ์ญํ ์ ํ์ฐ์ ์ผ๋ก ๊ฐ์ง๊ฒ ๋๋ค.)
- ์ธ๋ถ ๋จํธํ๋ฅผ ํด๊ฒฐํ๋๋ฐ ์ด์ ์ ๋ง์ถ๋ค.
- ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ ๋ค๋ฅธ ์์น๋ก ์ด๋ํ ์ ์๋ค.
17.2 ์ ์์ค์ ๊ธฐ๋ฒ๋ค
- ๋น๊ณต๊ฐ list ๋ง๋ค๊ธฐ
- ๋น ๊ณต๊ฐ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์์ฒ๋ผ ๋ง ๊ทธ๋๋ก ๋น ๊ณต๊ฐ์ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด์ ๊ด๋ฆฌํ๋ค.
- ๋ถํ
- ๋น ๊ณต๊ฐ์ ๋๋์ด์ ํ ๋นํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ์ผ๋จ ์์ฒญ์ด ์ฒญํฌ๋ณด๋ค ์์ผ๋ฉด, ์ฒญํฌ๋ฅผ ๋๋์ด ์ฌ์ฉ์์๊ฒ ํ ๋นํ๊ณ , ๋จ์ ๋ถ๋ถ์ ๋ฆฌ์คํธ์ ๋จ๊ธด๋ค.
- ๋ณํฉ
- ๋ฐํ๋ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ณํฉ์ํค๋ ๋ฐฉ๋ฒ์ด๋ค.
- ๋ฌธ์ ๋ ์ฌ๊ธฐ์ ๋ฐ์ํ๋ค.
- ์์ ์ฌ์ง์์ 10์ ์ฌ์ฉํ๋ ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ฐํ๋์๋, 10์ ์๋ฏธํ๋ ๋น๊ณต๊ฐ ๋ฆฌ์คํธ์ ์ธ๊ฐ์ ๋ ธ๋๊ฐ ์กด์ฌํ๊ฒ ๋๊ณ , ์ฌ์ค์ 30์ด ์ฐ๋ฌ์ ์์ด ์ฌ์ฉํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ 30์ด ๋์ด์ผ ํ๋๋ฐ,
- list๋ฅผ ์ํํ๋ฉฐ 10์ด ๋๋ ์์ฒญ์ ๋ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ์ง ๋ชปํ๋๋ก ๋์ด์๋ค.
์ฌ์ค ๋ณํฉ์ ๋ฌธ์ ๋ ๊ฐ๋จํ ํด๊ฒฐ ํ ์ ์๋ค, ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ฐํ๋๋ ‘์์ ’์
๋น๊ณต๊ฐ ๋ฆฌ์คํธ
์ ์ธ์ ํ ๋ ธ๋๋ฅผ ๊ฒ์ฌํ๊ณ ๋ณํฉ์ํค๋ฉด ๋๋ค.
์ฐธ๊ณ ๋ก ํฌ์ธํฐ๋ ํค๋๊ฐ ์์ด์ ์ค์ ํ ๋นํ๋ ค๊ณ ํ๋ฉด, ์์ฒญํ ๋ฉ๋ชจ๋ฆฌ + ํค๋ ํฌ๊ธฐ๋งํผ ํ ๋นํ๋ค.
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <unistd.h>
typedef struct __node_t {
int size;
struct __node_t *next;
} node_t;
#define MAGIC 1234567
typedef struct {
int size;
int magic;
} header_t;
node_t *head = NULL;
// ํ ์ด๊ธฐํ ํจ์
void init_heap(int size) {
head =
mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
if (head == MAP_FAILED) {
perror("mmap");
exit(1);
}
head->size = size - sizeof(node_t);
head->next = NULL;
}
// ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํจ์
void *my_malloc(int size) {
node_t *current = head;
node_t *prev = NULL;
while (current != NULL) {
if (current->size >= size + sizeof(header_t)) {
header_t *hptr = (header_t *)((char *)current + sizeof(node_t));
hptr->size = size;
hptr->magic = MAGIC;
node_t *new_free = (node_t *)((char *)hptr + sizeof(header_t) + size);
new_free->size = current->size - sizeof(header_t) - size - sizeof(node_t);
new_free->next = current->next;
if (prev == NULL) {
head = new_free;
} else {
prev->next = new_free;
}
return (void *)(hptr + 1);
}
prev = current;
current = current->next;
}
return NULL; // ํ ๋น ์คํจ
}
// ๋ฉ๋ชจ๋ฆฌ ํด์ ํจ์
void my_free(void *ptr) {
header_t *hptr = (header_t *)ptr - 1;
assert(hptr->magic == MAGIC);
node_t *free_block = (node_t *)hptr;
free_block->size = hptr->size + sizeof(header_t);
node_t *current = head;
node_t *prev = NULL;
while (current != NULL && current < free_block) {
prev = current;
current = current->next;
}
free_block->next = current;
if (prev == NULL) {
head = free_block;
} else {
prev->next = free_block;
}
// ๋ณํฉ
if (free_block->next != NULL &&
(char *)free_block + free_block->size + sizeof(node_t) ==
(char *)free_block->next) {
free_block->size += free_block->next->size + sizeof(node_t);
free_block->next = free_block->next->next;
}
if (prev != NULL &&
(char *)prev + prev->size + sizeof(node_t) == (char *)free_block) {
prev->size += free_block->size + sizeof(node_t);
prev->next = free_block->next;
}
}
// ํ ์ํ ์ถ๋ ฅ ํจ์
void print_heap() {
node_t *current = head;
printf("Free list:\n");
while (current != NULL) {
printf("Address: %p, Size: %d\n", current, current->size);
current = current->next;
}
}
int main() {
init_heap(4096); // 4KB ํ ์ด๊ธฐํ
void *a = my_malloc(100);
void *b = my_malloc(100);
void *c = my_malloc(100);
print_heap();
my_free(b);
print_heap();
my_free(a);
my_free(c);
print_heap();
return 0;
}
17.3 ํ์ ํ์ฅ ๊ธฐ๋ณธ ์ ๋ต
ํ์ ํ์ฅ์ ๋น ๊ณต๊ฐ์ด ๋ถ์กฑํ ๋, ๋ ํฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋นํ๋ ๊ฒ์ ์๋ฏธํ๋ค. ์์ผ๋ฉด NULL์ ๋ฐํํ๋ค -๋- ์ด ์๋๊ณ
- ์๋์ ๊ฐ์ ๊ธฐ๋ณธ ์ ๋ต๋ค์ด ์๋ค.
1. ์ต์ ์ ํฉ (Best-Fit)
- ๋์ ๋ฐฉ์:
- ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์ฒญ ์, ์ ์ฒด ์์ ๋ฆฌ์คํธ๋ฅผ ํ์ํ์ฌ ์์ฒญ๋ ํฌ๊ธฐ์ ๊ฐ์ฅ ๊ฐ๊น์ด(์ฆ, ์์ฒญ ํฌ๊ธฐ์ ๊ฐ์ฅ ์ ๊ฒ ๋จ๋) ์์ ๋ธ๋ก์ ์ ํํ๋ ๋ฐฉ์์ด๋ค.
- ์ ํ๋ ๋ธ๋ก์ ํ ๋นํ๊ณ ๋จ์ ๋ถ๋ถ์ ๋ค์ ์์ ๋ฆฌ์คํธ์ ์ถ๊ฐํ๋ ๋ฐฉ์์ด๋ค.
- ์ฅ์ :
- ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ต์ํ์ผ๋ก ๋ญ๋นํ๊ฒ ํ์ฌ ์ธ๋ถ ๋จํธํ๋ฅผ ์ค์ด๋ ๋ฐ ๋์์ด ๋๋ค.
- ๋จ์ :
- ์ ์ฒด ์์ ๋ฆฌ์คํธ๋ฅผ ํ์ํด์ผ ํ๋ฏ๋ก ํ์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด ์ ์๋ค.
- ์์ ์กฐ๊ฐ๋ค์ด ๋ง์ด ๋จ์ ๋ด๋ถ ๋จํธํ๊ฐ ์ฆ๊ฐํ ์ ์๋ค.
2. ์ต์ด ์ ํฉ (First-Fit)
- ๋์ ๋ฐฉ์:
- ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์ฒญ ์, ์์ ๋ฆฌ์คํธ์ ์ฒซ ๋ฒ์งธ๋ถํฐ ์์ํ์ฌ ์์ฒญ๋ ํฌ๊ธฐ๋ฅผ ๋ง์กฑํ๋ ์ฒซ ๋ฒ์งธ ๋ธ๋ก์ ์ ํํ๋ ๋ฐฉ์์ด๋ค.
- ์ ํ๋ ๋ธ๋ก์ ํ ๋นํ๊ณ ๋จ์ ๋ถ๋ถ์ ๋ค์ ์์ ๋ฆฌ์คํธ์ ์ถ๊ฐํ๋ ๋ฐฉ์์ด๋ค.
- ์ฅ์ :
- ํ์ ์๊ฐ์ด ์งง์ ํจ์จ์ ์ด๋ค.
- ๋์ฒด๋ก ๋น ๋ฅธ ํ ๋น์ด ๊ฐ๋ฅํ๋ค.
- ๋จ์ :
- ์ด๊ธฐ ๋ถ๋ถ์ ์์ ์กฐ๊ฐ๋ค์ด ๋ง์ด ๋จ์ ์ธ๋ถ ๋จํธํ๊ฐ ๋ฐ์ํ ์ ์๋ค.
- ์์ฃผ ์ฌ์ฉ๋๋ ์์ญ์ ๋จํธํ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
3. ์ต์ ์ ํฉ (Worst-Fit)
- ๋์ ๋ฐฉ์:
- ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์ฒญ ์, ์ ์ฒด ์์ ๋ฆฌ์คํธ๋ฅผ ํ์ํ์ฌ ๊ฐ์ฅ ํฐ ์์ ๋ธ๋ก์ ์ ํํ๋ ๋ฐฉ์์ด๋ค.
- ์ ํ๋ ๋ธ๋ก์ ํ ๋นํ๊ณ ๋จ์ ๋ถ๋ถ์ ๋ค์ ์์ ๋ฆฌ์คํธ์ ์ถ๊ฐํ๋ ๋ฐฉ์์ด๋ค.
- ์ฅ์ :
- ํฐ ๋ธ๋ก์ ๋ถํ ํ์ฌ ํฐ ์กฐ๊ฐ๋ค์ด ๋จ์ ํฐ ๋ฉ๋ชจ๋ฆฌ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ฝ๋ค.
- ๋จ์ :
- ํฐ ๋ธ๋ก์ ๋ถํ ํ๋ฉด์ ์์ ์กฐ๊ฐ๋ค์ด ๋ง์ด ๋จ์ ์ธ๋ถ ๋จํธํ๊ฐ ์ฆ๊ฐํ ์ ์๋ค.
4. ๋ค์ ์ ํฉ (Next-Fit)
- ๋์ ๋ฐฉ์:
- ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์ฒญ ์, ์ด์ ํ ๋น์ด ๋๋ ์์น๋ถํฐ ์์ํ์ฌ ์์ฒญ๋ ํฌ๊ธฐ๋ฅผ ๋ง์กฑํ๋ ์ฒซ ๋ฒ์งธ ๋ธ๋ก์ ์ ํํ๋ ๋ฐฉ์์ด๋ค.
- ์ ํ๋ ๋ธ๋ก์ ํ ๋นํ๊ณ ๋จ์ ๋ถ๋ถ์ ๋ค์ ์์ ๋ฆฌ์คํธ์ ์ถ๊ฐํ๋ ๋ฐฉ์์ด๋ค.
- ์ฅ์ :
- ์ต์ด ์ ํฉ๊ณผ ์ ์ฌํ ์ฑ๋ฅ์ ๊ฐ์ง๋ฉฐ, ์์ฃผ ์ฌ์ฉ๋๋ ์์ญ์ ๋จํธํ๊ฐ ๋ ๋ฐ์ํ๋ค.
- ๋จ์ :
- ์์ ๋ฆฌ์คํธ๊ฐ ์ํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ฏ๋ก ๋ฆฌ์คํธ์ ๋์์ ๋ค์ ์์ํด์ผ ํ ๊ฒฝ์ฐ ํ์ ์๊ฐ์ด ๊ธธ์ด์ง ์ ์๋ค.
5. ๊ฐ๋ณ ๋ฆฌ์คํธ (Segregated List)
- ๋์ ๋ฐฉ์:
- ํฌ๊ธฐ๋ณ๋ก ์ฌ๋ฌ ๊ฐ์ ์์ ๋ธ๋ก ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
- ์์ฒญ๋ ํฌ๊ธฐ์ ๋ง๋ ๋ฆฌ์คํธ์์ ๋ธ๋ก์ ํ ๋นํ๊ณ , ํ์ ์ ๋ ํฐ ๋ธ๋ก์ ๋ถํ ํ์ฌ ํ ๋นํ๋ค.
- ์ฅ์ :
- ํน์ ํฌ๊ธฐ์ ๋ธ๋ก์ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์์ด ํ์ ์๊ฐ์ด ์งง๋ค.
- ํฌ๊ธฐ๋ณ๋ก ๊ด๋ฆฌํ๋ฏ๋ก ํน์ ํฌ๊ธฐ์ ๋ธ๋ก๋ค์ด ์ ์ ํ ๋ถ๋ฆฌ๋์ด ๋จํธํ๋ฅผ ์ค์ด๋ ๋ฐ ๋์์ด ๋๋ค.
- ๋จ์ :
- ์ฌ๋ฌ ๋ฆฌ์คํธ๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ฏ๋ก ๊ตฌํ์ด ๋ณต์กํ ์ ์๋ค.
- ํฌ๊ธฐ๋ณ ๋ฆฌ์คํธ์ ๋ฐ๋ผ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๊ฐ ๋ฐ์ํ ์ ์๋ค.
6. ๋ฒ๋ ํ ๋น๊ธฐ (Buddy Allocation)
- ๋์ ๋ฐฉ์:
- ๋ฉ๋ชจ๋ฆฌ๋ฅผ 2์ ๊ฑฐ๋ญ์ ๊ณฑ ํฌ๊ธฐ๋ก ๋ถํ ํ์ฌ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
- ์์ฒญ๋ ํฌ๊ธฐ์ ๊ฐ์ฅ ์ ํฉํ ํฌ๊ธฐ์ ๋ธ๋ก์ ํ ๋นํ๋ฉฐ, ํ์ ์ ๋ธ๋ก์ ๋ถํ ํ๋ค.
- ์ฅ์ :
- ๋ฉ๋ชจ๋ฆฌ ๋ณํฉ์ด ์ฝ๊ณ ๋น ๋ฅด๋ฉฐ, ๋ด๋ถ ๋จํธํ๊ฐ ์ ๋ค.
- ๋จ์ :
- ํญ์ 2์ ๊ฑฐ๋ญ์ ๊ณฑ ํฌ๊ธฐ๋ก ํ ๋นํ๋ฏ๋ก, ์ผ๋ถ ๊ฒฝ์ฐ ์ธ๋ถ ๋จํธํ๊ฐ ๋ฐ์ํ ์ ์๋ค.