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๋นํธ)
- ์ฒซ์ค์ ์ด๋ ๊ฒ ๋๋๋ ค๊ณ 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. ๋น ๊ณต๊ฐ ๊ด๋ฆฌ
์์์ ์ธ๊ทธ๋จผํธ๋ก ๋๋์ผ๋ก์จ, ๋ด๋ถ ๋จํธํ๋ฅผ ํด๊ฒฐํ์ง๋ง ์ธ๋ถ ๋จํธํ ๋ฌธ์ ๊ฐ ์ฃผ์ํ๊ฒ ๋จ์์๋ค. ์ฆ ๊ณ ์ ๋ฉ๋ชจ๋ฆฌ ๋ฒ์๋ฅผ ์ฌ์ฉํ๋ฉด์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ์ธ๊ทธ๋จผํธ ๋จ์๋ก ์ ์ฌํ๋ฉด์ ํด๊ฒฐํ์ง๋ง, ์ธ๊ทธ๋จผํธ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌํ๋๋ฐ ๋ฐ์ํ๋ ๋ฌธ์ ๊ฐ ์ธ๋ถ ๋จํธํ์ด๋ค.
- ๋ฌธ์ ๋ฅผ ๋๋ฌด ์ ์์ฝํด์ ์ฑ
์ ๋ฐ์ทํ๋ฉด,
๊ด๋ฆฌํด์ผ ํ๋ ๊ณต๊ฐ์ด ๊ฐ๋ณ ํฌ๊ธฐ์ ๋น ๊ณต๊ฐ์ผ๋ก ๋๋์ด์ ธ ์๋ ์ด์๋ฅผ ํด๊ฒฐํด์ผํ๋ค. - ์์ ์์์ฒ๋ผ, ๋น๊ณต๊ฐ์ 20๋ฐ์ดํธ๋ ์๋๋ฐ, 15๋ฐ์ดํธ ํ ๋น์ ์คํจํ๋ค.
17.1 ๊ฐ์
์ด ๋ ผ์์ ๋๋ถ๋ถ์ ์ฌ์ฉ์ ์์ค์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฐ์ ์ญ์ฌ๋ฅผ ์ค์ฌ์ผ๋ก ํ๋ค. (malloc()๊ณผ free()๋ ์ค์๊ฐ์ผ๋ก ํ ์ธ๊ทธ๋จผํธ ๋ด๋ถ์ ๋น ๊ณต๊ฐ์ ์กฐ์ ํด์ผ ํ๋ ์ญํ ์ ํ์ฐ์ ์ผ๋ก ๊ฐ์ง๊ฒ ๋๋ค.)
- ์ธ๋ถ ๋จํธํ๋ฅผ ํด๊ฒฐํ๋๋ฐ ์ด์ ์ ๋ง์ถ๋ค.
- ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ ๋ค๋ฅธ ์์น๋ก ์ด๋ํ ์ ์๋ค.
17.2 ์ ์์ค์ ๊ธฐ๋ฒ๋ค
- ๋น๊ณต๊ฐ list ๋ง๋ค๊ธฐ
- ๋น ๊ณต๊ฐ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์์ฒ๋ผ ๋ง ๊ทธ๋๋ก ๋น ๊ณต๊ฐ์ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด์ ๊ด๋ฆฌํ๋ค.
- ๋ถํ
- ๋น ๊ณต๊ฐ์ ๋๋์ด์ ํ ๋นํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ์ผ๋จ ์์ฒญ์ด ์ฒญํฌ๋ณด๋ค ์์ผ๋ฉด, ์ฒญํฌ๋ฅผ ๋๋์ด ์ฌ์ฉ์์๊ฒ ํ ๋นํ๊ณ , ๋จ์ ๋ถ๋ถ์ ๋ฆฌ์คํธ์ ๋จ๊ธด๋ค.
- ๋ณํฉ
- ๋ฐํ๋ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ณํฉ์ํค๋ ๋ฐฉ๋ฒ์ด๋ค.
- ๋ฌธ์ ๋ ์ฌ๊ธฐ์ ๋ฐ์ํ๋ค.
- ์์ ์ฌ์ง์์ 10์ ์ฌ์ฉํ๋ ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ฐํ๋์๋, 10์ ์๋ฏธํ๋ ๋น๊ณต๊ฐ ๋ฆฌ์คํธ์ ์ธ๊ฐ์ ๋ ธ๋๊ฐ ์กด์ฌํ๊ฒ ๋๊ณ , ์ฌ์ค์ 30์ด ์ฐ๋ฌ์ ์์ด ์ฌ์ฉํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ 30์ด ๋์ด์ผ ํ๋๋ฐ,
- list๋ฅผ ์ํํ๋ฉฐ 10์ด ๋๋ ์์ฒญ์ ๋ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ์ง ๋ชปํ๋๋ก ๋์ด์๋ค.
์ฌ์ค ๋ณํฉ์ ๋ฌธ์ ๋ ๊ฐ๋จํ ํด๊ฒฐ ํ ์ ์๋ค, ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ฐํ๋๋ ‘์์ ’์
๋น๊ณต๊ฐ ๋ฆฌ์คํธ์ ์ธ์ ํ ๋ ธ๋๋ฅผ ๊ฒ์ฌํ๊ณ ๋ณํฉ์ํค๋ฉด ๋๋ค. ์ฐธ๊ณ ๋ก ํฌ์ธํฐ๋ ํค๋๊ฐ ์์ด์ ์ค์ ํ ๋นํ๋ ค๊ณ ํ๋ฉด, ์์ฒญํ ๋ฉ๋ชจ๋ฆฌ + ํค๋ ํฌ๊ธฐ๋งํผ ํ ๋นํ๋ค.
๋น ๊ณต๊ฐ ๋ฆฌ์คํธ ๋ด์ฅ
- ์๋ก์ด ๋
ธ๋๋ฅผ ์ํ ๊ณต๊ฐ์ด ํ์ํ ๋
malloc()์ ํธ์ถํจ - ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฃจํด์์๋ ์ด๊ฒ ๋ถ๊ฐ๋ฅํ๊ณ , ๋์ ๋น ๊ณต๊ฐ ๋ด์ ๋ฆฌ์คํธ๋ฅผ ๊ตฌ์ถํด์ผํจ
typdef struct __node_t {
int size;
struct __node_t *next
} node_t
...
node_t *head = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, -1, 0);
head->size = 4096 - sizeof(node_t);
head->next = NULL;
- ์ด๋ ๊ฒ ์ด๊ธฐํ๋ ํด๋๊ณ ,
- ๋ฉ๋ชจ๋ฆฌ ์ฒญํฌ (์์ 100๋ฐ์ดํธ)๊ฐ ์์ฒญ๋๋ฉด ๋จผ์ ์ถฉ๋ถํ ํฌ๊ธฐ์ ์ฒญํฌ๋ฅผ ์ฐพ๋๋ค.
- ์ง๊ธ์ 4088์ ํ๋์ ์ฒญํฌ๋ง์ด ์กด์ฌํ๋๊น ์ฌ๊ธฐ๊ฐ ์ ํ๋๋ค.
- ๊ทธ ํ ํค๋๋ฅผ ํฌ์ธํฐ ์์ ์ ๊ณ , 100๋ฐ์ดํธ๋ฅผ ํ ๋นํ๊ณ ์คํ๋ฆฃํ๋ค.
- ์ง๊ธ๊น์ง์ ๊ณผ์
- ๊ทธ๋ฆฌ๊ณ ์ธ๊ฐ์ 100๋ฐ์ดํธ ์ฒญํฌ๊ฐ ์๋ค๊ฐ ๊ฐ์ด๋ฐ ํ๋๊ฐ ํด์ ๋๋ ์ํฉ์ ๊ฐ์ ํ๋ค.
- ๊ทธ๋ฌ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋น๊ณต๊ฐ๋ฆฌ์คํธ์ ํด๋น ๋ฐํ๋ ๊ณต๊ฐ์ ์ฝ์ ํ๋ค. (๋จํธํ ๋ฐ์)
- ๊ทธ๋ฆฌ๊ณ ๋๋จธ์ง๊ฐ ๋ฐํ๋๋ฉด ์ฌ๋ฌ๊ฐ์ ๋น๊ณต๊ฐ ๋ฆฌ์คํธ๊ฐ ์๊ธด๋ค.
- ์๊ฑธ ๋ค์ ๋ฆฌ์คํธ์ํํด์ ์ธ์ ํ ๋ฆฌ์คํธ๋ผ๋ฆฌ ํฉ์ณ์ ํ๋์ ๋น๊ณต๊ฐ์ผ๋ก ๋ง๋ ๋ค.
#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์ ๊ฑฐ๋ญ์ ๊ณฑ ํฌ๊ธฐ๋ก ํ ๋นํ๋ฏ๋ก, ์ผ๋ถ ๊ฒฝ์ฐ ์ธ๋ถ ๋จํธํ๊ฐ ๋ฐ์ํ ์ ์๋ค.
18. ํ์ด์ง: ๊ฐ์
๊ฐ๋ณ ํฌ๊ธฐ์ ์กฐ๊ฐ์ ์ฒญํฌ๋ก ๋ถํ ํ ๋ ๊ณต๊ฐ์์ฒด๊ฐ ๋จํธํ๋๊ณ , ํ ๋น์ ์ ์ ๋ ์ด๋ ค์์ง๋ค. ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ธ ๊ณต๊ฐ์ ๋์ผํ ์กฐ๊ฐ์ผ๋ก ๋ถํ ํ๋ ๊ฒ์ ๊ณ ๋ คํด๋ณผ ํ์๊ฐ ์๋ค. ๋ ผ๋ฆฌ์ ๋จ์๊ฐ ์๋ ๊ณ ์ ํฌ๊ธฐ๋ก ๋๋๋ ๋ฐฉ๋ฒ์ด๊ณ ๊ทธ ํฌ๊ธฐ ๋จ์๋ฅผ Page ๋ฉ๋ชจ๋ฆฌ๋ Page frame์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ณ ์ ํฌ๊ธฐ์ ์ฌ๋กฏ์ ๋ฐฐ์ด๋ก ๋ฐ๋ผ๋ณธ๋ค.
ํต์ฌ ์ง๋ฌธ : ํ์ด์ง๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ป๊ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ํ ํ ์ ์์๊น?
18.1 ๊ฐ๋จํ ์์ ๋ฐ ๊ฐ์
- 128 ๋ฐ์ดํธ์ (๋นํ์ค์ ์ผ๋ก ์์) ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์์
- ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ ํ์ด์ง๋ค์ ๋ฌผ๋ฆฌ๋ฉ๋ชจ๋ฆฌ ์ ์ฒด์ ๋ถ์ฐ ๋ฐฐ์น๋์ด์๋ค.
- ์ด์ ๋ฐฉ์์ ๋นํด ๋ค์ํ ์ฅ์ ์ ๊ฐ์ง๊ณ ์๋ค.
- ์ผ๋จ ๋จผ์ ์ ์ฐํ๋ค. ํ๊ณผ ์คํ์ด ์ด๋ ํ ๋ฐฉ์์ผ๋ก ์ปค์ง๋๊ฐ, ์ด๋ป๊ฒ ์ฌ์ฉ๋๋๊ฐ์ ๋ํ ๊ฐ์ ์ด ํ์ ์๋ค.
- ๋ค์์ผ๋ก ๋จ์ํ๋ค. 64๋ฐ์ดํธ ์ฃผ์๊ณต๊ฐ์ 8ํ์ด์ง ๋ฌผ๋ฆฌ๋ฉ๋ชจ๋ฆฌ์ ๋ฐฐ์นํ๋ค๊ณ ํ์ ๋, 4๊ฐ์ ๋น์ด์๋ ํ์ด์ง๋ง ์ฐพ์ผ๋ฉด ๋๋ค.
- ์ฃผ์๊ณต๊ฐ์ ๊ฐ ๊ฐ์ ํ์ด์ง์ ๋ํ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ์์น ๊ธฐ๋ก์ ์ํ์ฌ ์ด์์ฒด์ ๋ ํ๋ก์ธ์ค๋ง๋ค ํ์ด์ง ํ ์ด๋ธ์ด๋ผ๋ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ค.
- ์ฃผ์๊ณต๊ฐ์ ๊ฐ์ํ์ด์ง ์ฃผ์ ๋ณํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋๊ฒ์ด๋ค. (virtual page 1 -> physical page 7) …
- ํ์ด์ง ํ ์ด๋ธ์ ํ๋ก์ธ์ค๋ง๋ค ์กด์ฌํ๋ค.
- ํ๋ก์ธ์ค๊ฐ ์์ฑํ ๊ฐ์ ์ฃผ์์ ๋ณํ์ ์ํด ๋จผ์ ๊ฐ์ ์ฃผ์๋ฅผ ๊ฐ์ ํ์ด์ง ๋ฒํธ(Virtual Page Number)์ ํ์ด์ง ๋ด์ ์คํ์ 2๊ฐ์ ๊ตฌ์ฑ ์์๋ก ๋ถํ ํ๋ค.
๊ฐ์ ํ์ด์ง ๋ฒํธ(VPN) ๊ณ์ฐ โข 0x1C34A8 = 0001 1100 0011 0100 1010 1000โ โข ์์ 20๋นํธ๊ฐ VPN: 0001 1100 0011 0โ = 0x1C3 โข VPN = 0x1C3 (10์ง์: 451)
ํ์ด์ง ์คํ์ ๊ณ์ฐ โข ํ์ 12๋นํธ: 0100 1010 1000โ = 0x4A8 โข ์คํ์ = 0x4A8 (10์ง์: 1192)
ํ ์ด๋ธ์์ ๋ฌผ๋ฆฌ ํ์ด์ง ์ฃผ์ ์ป๊ธฐ
- 0x1C3 -> 0x2F5
๋ฌผ๋ฆฌ ์ฃผ์ ๊ณ์ฐ
๋ฌผ๋ฆฌ ์ฃผ์ = (PFN « 12) | Offset = (0x2F5 « 12) | 0x4A8 = 0x2F5000 + 0x4A8 = 0x2F54A8 (10์ง์: 3099432)
18.2 ํ์ด์ง ํ ์ด๋ธ์ ์ด๋์ ์ ์ฅ๋๋๊ฐ
- ๊ธฐ๋ณธ์ ์ผ๋ก ์ถ์ ํ๋ฉด ํ์ด์ง ํ ์ด๋ธ์ ์ฉ๋์ ์ฐ์ ์ ์ผ๋ก ์์ฒญ ํผ
- ๊ฐ ํ๋ก์ธ์ค์ ํ์ด์ง ํ ์ด๋ธ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋๋ฐ, ๋น๋ถ๊ฐ์ ์ด์์ฒด์ ๊ฐ ๊ด๋ฆฌํ๋ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์์ฃผํ๋ค๊ณ ๊ฐ์ ํ์.
18.3 ํ์ด์ง ํ ์ด๋ธ์๋ ์ค์ ๋ฌด์์ด ์๋๊ฐ
- ๊ฐ์ฅ ๊ฐ๋จํ ํํ๋ ์ ํ ํ์ด์ง ํ ์ด๋ธ์ด๊ณ ๋จ์ํ ๋ฐฐ์ด์ด๋ค.
- VPN์ผ๋ก ๋ฐฐ์ด์ ํญ๋ชฉ์ ์ ๊ทผํ๊ณ , ๊ทธํญ๋ชฉ์ ํ์ด์ง ํ ์ด๋ธ ํญ๋ชฉ(PTE)๋ฅผ ๊ฒ์ํ๋ค. (๊ณ ๊ฐ์ )
Valid bit: ํน์ ๋ณํ์ ์ ํจ ์ฌ๋ถ๋ฅผ ๋ํ๋ด๊ธฐ ์ํด์ ํฌํจ (๋ชจ๋ ๋ฏธ์ฌ์ฉ ๊ณต๊ฐ์ invalid) ๋ง์ฝ ๊ฑฐ๊ธฐ ์ ๊ทผํ๋ฉด ์ด์์ฒด์ ์ ํธ๋ฉ์ ๋ฐ์์ํจ๋ค. ๋ํ ํ ๋นํ์ง ์์ ์ฃผ์๊ณต๊ฐ์ด๋ผ๋ ํ์์ผ๋ก์จ ๊ธฐ๋ฅํ ์ค์ ๋ฌผ๋ฆฌ ํ๋ ์์ ํ ๋นํ ํ์์ ์์ ๋๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ๋ค.Protection bit: ์ฝ๊ธฐ, ์ฐ๊ธฐ, ์คํ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํฌํจํ๋ ๋นํธ์ด๋ค. ํ์ฉ๋์ง ์์ ๋ฐฉ์์ ์ ๊ทผ์ ํธ๋ฉ์ ์์ฑํ๋ค.Present bit: ํ์ด์ง๊ฐ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์๋์ง, (ํน์ ์ค์์์ ๋์๋์ง) ํ์ธํ๋ค.Dirty bit: ํ์ด์ง๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋ ์ดํ ๋ณ๊ฒฝ๋์๋์ง๋ฅผ ์ถ์ ํ๋ค.reference bit: ํ์ด์ง๊ฐ ์ ๊ทผ๋์๋์ง๋ฅผ ์ถ์ ํ๋ค, ์ด๋ค ํ์ด์ง๊ฐ ์ธ๊ธฐ์๋์ง ํ์ธํ๊ณ ํ์ด์ง ๊ต์ฒด ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉ๋๋ค.
18.4 ํ์ด์ง: ๋๋ฌด ๋๋ฆผ
movl 2l, %eax
- ๊ฐ์์ฃผ์ (21)์ ์ ํํ ๋ฌผ๋ฆฌ์ ์ฃผ์ (117)๋ก ๋ณํํด์ผํ๋ค.
- 117์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ํ๊ธฐ ์ ์ ์์คํ ์ ํ๋ก์ธ์ค์ ํ์ด์ง ํ ์ด๋ธ์์ ์ ์ ํ ํ์ด์ง ํ ์ด๋ธ ํญ๋ชฉ์ ๊ฐ์ ธ์์ผํ๊ณ ,
- ๋ณํ์ ์ํํ ํ, ๋ฌผ๋ฆฌ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ํ์ฌํ๋ค.
- ํ๋์จ์ด๋ ํ์ฌ ์คํ์ค์ธ ํ๋ก์ธ์ค์ ํ์ด์ง ํ ์ด๋ธ์ ์์น๋ฅผ ์์์ผ ํ๋ค.
- ๋น๋ถ๊ฐ ํ๋์ ํ์ด์ง ํ ์ด๋ธ ๋ฒ ์ด์ค ๋ ์ง์คํฐ๊ฐ ํ์ด์ง ํ ์ด๋ธ์ ์์ ์ฃผ์(๋ฌผ๋ฆฌ์ฃผ์)๋ฅผ ์ ์ฅํ๋ค๊ณ ๊ฐ์ ํ๋ค. (์์ ๋ฌผ๋ฆฌ ์ฃผ์ ๊ณ์ฐ ์ดํ์ ๊ณ์ฐ์ ์งํํด์ผํจ)