19 ํ์ด์ง: ๋ ๋น ๋ฅธ ๋ณํ(TLB)
- ๋งคํ ์ ๋ณด ์ ์ฅ(ํ์ด์ง ํ ์ด๋ธ ์ ์ฅ)์ ์ํด ํฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ์๊ตฌ๋จ
- ๊ฐ์ ์ฃผ์์์ ๋ฌผ๋ฆฌ ์ฃผ์๋ก์ ์ฃผ์ ๋ณํ์ ์ํด ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ๋ ๋งคํ์ ๋ณด๋ฅผ ์ฝ์ด์ผํจ.
ํต์ฌ ์ง๋ฌธ: ์ฃผ์ ๋ณํ ์๋๋ฅผ ์ด๋ป๊ฒ ํฅ์ํ ๊น?
- ์ฃผ์ ๋ณํ์ ๋น ๋ฅด๊ฒ ํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ ๋ณํ-์์ธ ๋ฒํผ(translation-lookaside-buffer) ์ค์ฌ์ TLB๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ ๋์ ํ๋ค.
- ์นฉ์ MMU(memory-management unit)์ ์ผ๋ถ๋ผ๊ณ ํ๋ค.
- ์์ฃผ ์ฐธ์กฐ๋๋ ๊ฐ์์ฃผ์ - ์ค์ฃผ์ ๋ณํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ํ๋์จ์ด ์บ์์ด๋ค.
- ์ฃผ์-๋ณํ ์บ์๊ฐ ์ข ๋ ์ ํฉํ ๋ช ์นญ์ด๋ค.
19.1 TLB์ ๊ธฐ๋ณธ ์๊ณ ๋ฆฌ์ฆ
// ๊ฐ์ ์ฃผ์์์ VPN(๊ฐ์ ํ์ด์ง ๋ฒํธ) ์ถ์ถ
VPN = (VirtualAddress & VPN_MASK) >> SHIFT;
// TLB ์กฐํ (TLB ํํธ ์ฌ๋ถ ํ์ธ)
(Success, TlbEntry) = TLB_Lookup(VPN);
if (Success == True) { // TLB Hit
if (CanAccess(TlbEntry.ProtectBits) == True) {
// ๊ฐ์ ์ฃผ์์์ ์คํ์
์ถ์ถ
Offset = VirtualAddress & OFFSET_MASK;
// TLB์์ ๊ฐ์ ธ์จ PFN์ ์ฌ์ฉํ์ฌ ๋ฌผ๋ฆฌ ์ฃผ์ ๊ณ์ฐ
PhysAddr = (TlbEntry.PFN << SHIFT) | Offset;
// ๋ฌผ๋ฆฌ ์ฃผ์์์ ๋ฐ์ดํฐ ์ฝ๊ธฐ
Register = AccessMemory(PhysAddr);
} else {
// ์ ๊ทผ ๊ถํ ์์ โ ๋ณดํธ ์ค๋ฅ ๋ฐ์
RaiseException(PROTECTION_FAULT);
}
} else { // TLB Miss โ ํ์ด์ง ํ
์ด๋ธ ์ ๊ทผ
// ํ์ด์ง ํ
์ด๋ธ ์ํธ๋ฆฌ(PTE) ์ฃผ์ ๊ณ์ฐ
PTEAddr = PTBR + (VPN * sizeof(PTE));
// PTE ๊ฐ์ ธ์ค๊ธฐ
PTE = AccessMemory(PTEAddr);
if (PTE.Valid == False) {
// ํ์ด์ง๊ฐ ์ ํจํ์ง ์์ โ ์ธ๊ทธ๋ฉํ
์ด์
์ค๋ฅ ๋ฐ์
RaiseException(SEGMENTATION_FAULT);
} else if (CanAccess(PTE.ProtectBits) == False) {
// ์ ๊ทผ ๊ถํ ์์ โ ๋ณดํธ ์ค๋ฅ ๋ฐ์
RaiseException(PROTECTION_FAULT);
} else {
// TLB์ ์๋ก์ด ํญ๋ชฉ ์ฝ์
TLB_Insert(VPN, PTE.PFN, PTE.ProtectBits);
// ๊ฐ์ ๋ช
๋ น์ด๋ฅผ ๋ค์ ์คํํ์ฌ ๋ณํ๋ ์ฃผ์ ์ฌ์ฉ
RetryInstruction();
}
}
- ๋ชจ๋ ์บ์์ ์ค๊ณ ์ฒ ํ์ฒ๋ผ, TLB์ญ์ ์ฃผ์ ๋ณํ ์ ๋ณด๊ฐ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์บ์์ ์๋ค๋ผ๋ ๊ฐ์ ์ ์ ์ ๋ก ๋ง๋ค์ด์ก๋ค.
- TLB๋ ํ๋ก์ธ์ฑ ์ฝ์ด์ ๊ฐ๊น์ด๊ณณ์ ์์นํ๊ณ ์์ด ์ฃผ์๋ณํ์ ๊ทธ๋ค์ง ๋ถ๋ด์ค๋ฌ์ด์์ ์ด์๋๋ค.
- ๋ค๋ง ๋ฏธ์ค๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ ์์ฒญ๋๊ฒ ์ปค์ง๋ค.
19.2 ์์ : ๋ฐฐ์ด ์ ๊ทผ
- ๊ฐ๋จํ ์บ์ ํํธ ๊ด๋ จ ์์
- ๋ค๋ง ํ์ด์ง ํฌ๊ธฐ๊ฐ TLB ํจ์ฉ์ฑ๊ณผ ์ฑ๋ฅ์ ๋งค์ฐ ์ค์ํ ์ญํ ์ ๋ณด์ฌ์ฃผ๋ ์์ ์ด๋ค.
- (a[0]๋ถํฐ) : miss, hit, hit, miss, hit, hit, hit, miss, hit, hit
- ์ด ์์์์ ์ ๋ง ์ฒซ์ ๊ทผ๋ถํฐ ๋ฏธ์ค๋ก ๋ค์ด๊ฐ๋๋ฐ 70%์ ํํธ์จ์ ์๋ํ๋ค.
- ์ด๊ฑด ๊ณต๊ฐ ์ง์ญ์ฑ(Spatial Locality)๋๋ฌธ์ ๊ทธ๋ ๋ค
- ํ์ฌ ์ฐธ์กฐํ ๋ฐ์ดํฐ์ ๊ฐ๊น์ด ์ฃผ์์ ๋ฐ์ดํฐ๋ ๊ณง ์ฐธ์กฐ๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
- ์: ๋ฐฐ์ด(Array)๋ ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ.
- ๊ทธ๋ฆฌ๊ณ ์ดํ์๋ ํํธํ ํ๋ฅ ์ด ๋๋์๋ฐ (tlb์ ๋จ์์๋ ๋์ ๋ค์ ์ฐธ์กฐ๊ฐ ์ผ์ด๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค)
- ์ด๊ฒ๋ ์๊ฐ ์ง์ญ์ฑ(Temoporal Locality)๋๋ฌธ์ด๋ค.
- ์ต๊ทผ์ ์ฐธ์กฐํ ๋ฐ์ดํฐ๋ ๊ณง ๋ค์ ์ฐธ์กฐ๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
- ์: ๋ฃจํ(loop)์์ ๊ฐ์ ๋ณ์๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ฐธ์กฐํจ.
19.3 TLB ๋ฏธ์ค๋ ๋๊ฐ ์ฒ๋ฆฌํ ๊น?
- ์์ ์๋ ์ฃผ๋ก ํ๋์จ์ด
- ์์ฆ์๋ os๊ฐ ํธ๋ฉ ํธ๋ค๋ฌ๋ก ์ฒ๋ฆฌํ๊ธฐ๋ ํจ
19.4 TLB์ ๊ตฌ์ฑ: ๋ฌด์์ด ์๋?
- ์ผ๋ฐ์ ์ผ๋ก ํ์ด์งํ ์ด๋ธ์ ์๋ ๊ฒ๋ค์ค ์ผ๋ถ
- protection bit
- valid bit (๊ทผ๋ฐ ํ์ด์ง ํ
์ด๋ธ์ valid-bit๋์ ๋ค๋ฆ!!!!)
- ํ์ด์ง ํ ์ด๋ธ์ : ์์ง ํ ๋น๋๋ ์์ ๋ฌผ๋ฆฌ ํ์ด์ง ํ๋ ์
- tlb๋ : ์ค์ ์ ํจํ ์บ์์ธ์ง๋ฅผ ๋ฐ์ง, ์ปจํ ์คํธ ์ค์์นญ์ invalid๋ก ๋ค๋ฅธ ํ๋ก์ธ์ค๋ก๋ถํฐ์ ์ ๊ทผ์ ๋ง์!
- dirty bit
- ๋ฑ๋ฑ..
19.5 TLB์ ๋ฌธ์ : ๋ฌธ๋งฅ ๊ตํ
- ์์ฝํ์๋ฉด ์ปจํ ์คํธ ์ค์์นญ์ ์ด์ ํ๋ก์ธ์ค์ tlb๊ฐ ๋จ์์ ๋ฌธ์ ๋ผ๋๊ฑด๋ฐ,
- ๋น์ฐ๋ ๋ฐฉ์์ ์ค๋ฒํค๋๋ฅผ ํฌ๊ฒ ๋ง๋ ๋ค (valid bit๋ฅผ ๊ฑด๋ค์ด๋ ๋ง์ฐฌ๊ฐ์ง)
- ๊ทธ๋์ ์ฃผ์ ๊ณต๊ฐ ์๋ณ์๋ฅผ ๋๊ฑฐ๋ ํ๋ก์ธ์ค ์๋ณ์๋ฅผ ๋๋ ๋ฐฉ์์ผ๋ก ๋ณด์ํ๋ค.
19.6 ์ด์: ๊ต์ฒด ์ ์ฑ
์บ์ ๊ต์ฒด ์ ์ฑ ์ด ๋งค์ฐ ์ค์ํ๋ค. ํต์ฌ ์ง๋ฌธ: TLB ๊ต์ฒด ์ ์ฑ ์ ์ด๋ป๊ฒ ์ค๊ณํด์ผํ๋๊ฐ? ๋ชฉํ๋ ๋ฏธ์ค์จ์ ์ค์ด๊ณ ํํธ์จ์ ์ฆ๊ฐ์์ผ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ๊ฒ์ด๋ค.
- ์ผ๋จ ๊ฐ๋ฅํ๊ฑด ์ง์ญ์ฑ์ ์ต๋๋ก ํ์ฉํ๋ LRU(least-recently-used)๊ฐ ์๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ์ต๊ทผ์ ์ฐธ์กฐ๋์ง ์์ ์ ๋ค์ผ์๋ก ๋ค์ ์ฐธ์กฐ๋ ๊ฐ๋ฅ์ฑ์ด ์ ์
- ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋๋ค์ธ๋ฐ ์กฐ๊ธ๋ ์์ ์ ์ธ ๋ฉด์ด ์๊ณ ์ ๋์ํ๋ค.
๊ณ ์ฅ๋ ์๊ณ๋ 2๋ฒ์ ๋ง์ง๋ง ๋ฑ 1์ด ํ๋ฆฐ ์๊ณ๋โฆ.
- 4๊ฐ๋ฅผ ์ ์ฅํ ์์๋๋ฐ ๋ค์ฏ๊ฐ(p1,p2,p3,p4,p5)์ธ ์ํฉ์์
- p5 ์ง์ ์์ ์ p1์ ๋ฒ๋ฆฌ๊ณ , ๋ค์์ ๊ทผ์ด p1์ด๋ผ ๋ง๋ฌผ๋ ค ๋ฏธ์ค๊ฐ ๋๋๊ฑธ ์๋ฏธ
20 ํ์ด์ง: ๋ ์์ ํ ์ด๋ธ
ํต์ฌ ์ง๋ฌธ: ํ์ด์ง ํ ์ด๋ธ์ ์ด๋ป๊ฒ ๋ ์๊ฒ ๋ง๋ค๊น ๋จ์ํ ๋ฐฐ์ด ๊ธฐ๋ฐ์ ํ์ด์ง ํ ์ด๋ธ์ ํฌ๊ธฐ๊ฐ ํฌ๋ฉฐ ์ผ๋ฐ์ ์ธ ์์คํ ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณผ๋ํ๊ฒ ์ฐจ์งํ๋ค.
- 32๋นํธ ์ฃผ์๊ณต๊ฐ์์ 4kb๋ 4mb์ ํ์ด์งํ ์ด๋ธ์ ๊ฐ์ง๋ค.
20.1 ๊ฐ๋จํ ํด๋ฒ: ๋ ํฐ ํ์ด์ง
- 32๋นํธ ์ฃผ์๊ณต๊ฐ์์ 16kb๋ฅผ ๊ฐ์ ํด๋ณด์, ์ด์ ๋ 18๋นํธ vpn๊ณผ 14๋นํธ์ ์คํ์ ์ ๊ฐ๊ฒ๋๋ค.
- ๋ฌธ์ ๋ ์ด๋ฌ๋ฉด ๋ด๋ถ ๋จํธํ๊ฐ ์ฌํด์ง๋ค.
- ๊ฒฐ๋ก ์ ์ผ๋ก ์ณ๋ฐ๋ฅธ ํด๊ฒฐ๋ฐฉ๋ฒ์ ์๋๋ค.
20.2 ํ์ด๋ธ๋ฆฌ๋ ์ ๊ทผ ๋ฐฉ๋ฒ: ํ์ด์ง๊ณผ ์ธ๊ทธ๋จผํธ
- ํ ์ฝ๋, ์คํ ์ธ๊ทธ๋จผํธ์ ๋ํ ํ์ด์ง ํ ์ด๋ธ์ ๋ฐ๋ก ์ฃผ๋๊ฒ์ด๋ค.
- ์ผ๊ฒฌ ์ข์๋ณด์ด๊ธฐ๋ ํ์ง๋ง, ์ธ๋ถ๋จํธํ, ๋ด๋ถ๋จํธํ๊ฐ ์ฌํ๋ค.
20.3 ๋ฉํฐ ๋ ๋ฒจ ํ์ด์ง ํ ์ด๋ธ
ํ์ด์ง ํ ์ด๋ธ์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ํํํ๋ค. ๋งค์ฐ ํจ์จ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ง์ ํ๋ ์์คํ ์์ ์ฌ์ฉ๋๊ณ ์๋ค.
- ๊ธฐ๋ณธ ๊ฐ๋
์ ๊ฐ๋จํ๋ค.
- ๋จผ์ , ํ์ด์ง ํ ์ด๋ธ์ ํ์ด์ง ํฌ๊ธฐ์ ๋จ์๋ก ๋ค๋๋ค.
- ๊ทธ ๋ค์, ํ์ด์ง ํ ์ด๋ธ์ ํ์ด์ง๊ฐ ์ ํจํ์ง ์์ ํญ๋ชฉ์ด ์์ผ๋ฉด, ํด๋น ํ์ด์ง๋ฅผ ํ ๋นํ์ง ์๋๋ค.
- ํ์ด์ง ๋๋ ํฐ๋ฆฌ๋ผ๋ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด์ง ํ
์ด๋ธ ๊ฐํ์ด์ง์ ํ ๋น ์ฌ๋ถ์ ์์น๋ฅผ ํ์
ํ๋ค.
- pfn์ page frame number
- valid๋ ๊ทธ ํ์ด์ง ๋ด์ validํ ํ์ด์ง๊ฐ ์๋์ง
- ์์ผ๋ฉด ๊ทธ๋ฅ ๋ฉ๋ชจ๋ฆฌ์ ์์ฌ๋ฆฐ๋ค.
- ์ฅ์ ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์์ฒด๊ฐ ์ ๋ฆฌํ๊ณ , ์ฌ์ฉ๋ ์ฃผ์ ๊ณต๊ฐ์ ํฌ๊ธฐ์ ๋น๋กํ์ฌ ํ์ด์ง ํ ์ด๋ธ ๊ณต๊ฐ์ด ์๊ธด๋ค๋๊ฒ
- ์ถ๊ฐ ๋น์ฉ์ tlb๋ฏธ์ค์ ์ฃผ์ ๋ณํ์ ์ํด ๋๋ฒ์ ๋ฉ๋ชจ๋ฆฌ ๋ก๋๊ฐ ํ์ํ๋ค๋๊ฒ
- ๋ฆฌ๋ ์ค(x86-64)์์๋ **4๋จ๊ณ ํ์ด์ง ํ ์ด๋ธ(PML4, PDPT, PD, PT)**์ ์ฌ์ฉํ์ฌ ํ์ํ ๋ถ๋ถ๋ง ๋์ ํ ๋นํ๋ค.
- ์ต์ Intel CPU์์๋ 5-Level ํ์ด์ง ํ ์ด๋ธ์ ์ง์ํ์ฌ ๋ ๋์ ์ฃผ์ ๊ณต๊ฐ์ ๊ด๋ฆฌํ๋ค.
- 64bit, 4kb๊ธฐ์ค
- 2^64/2^12 = (64๋นํธ / 4kb) = 2^52๊ฐ์ ์ํธ๋ฆฌ์ด๊ณ ,
- ๊ฑฐ๊ธฐ์ 8byte๋ฅผ ๊ณฑํ๋ฉด 32(PB)
VPN = (VirtualAddress & VPN_MASK) >> SHIFT;
(Success, TlbEntry) = TLB_Lookup(VPN);
if (Success == True) { // TLB ํํธ (TLB์์ ํด๋น ๊ฐ์ ํ์ด์ง ๋ฒํธ๋ฅผ ์ฐพ์)
if (CanAccess(TlbEntry.ProtectBits) == True) { // ์ ๊ทผ ๊ถํ ํ์ธ
Offset = VirtualAddress & OFFSET_MASK;
PhysAddr = (TlbEntry.PFN << SHIFT) | Offset; // ๋ฌผ๋ฆฌ ์ฃผ์ ๊ณ์ฐ
Register = AccessMemory(PhysAddr); // ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ
} else {
RaiseException(PROTECTION_FAULT); // ์ ๊ทผ ๊ถํ์ด ์์ผ๋ฉด ์์ธ ๋ฐ์
}
} else { // TLB ๋ฏธ์ค (TLB์ ํด๋น ํญ๋ชฉ์ด ์์)
PDIndex = (VPN & PD_MASK) >> PD_SHIFT; // ํ์ด์ง ๋๋ ํฐ๋ฆฌ์์ ์ธ๋ฑ์ค ์ถ์ถ
PDEAddr = PDBR + (PDIndex * sizeof(PDE)); // ํ์ด์ง ๋๋ ํฐ๋ฆฌ ์ํธ๋ฆฌ ์ฃผ์ ๊ณ์ฐ
PDE = AccessMemory(PDEAddr); // ํ์ด์ง ๋๋ ํฐ๋ฆฌ ์ํธ๋ฆฌ ๊ฐ์ ธ์ค๊ธฐ
if (PDE.Valid == False) { // ํ์ด์ง ๋๋ ํฐ๋ฆฌ ์ํธ๋ฆฌ๊ฐ ์ ํจํ์ง ์์
RaiseException(SEGMENTATION_FAULT); // ์ธ๊ทธ๋ฉํ
์ด์
์ค๋ฅ ๋ฐ์
} else {
// ํ์ด์ง ๋๋ ํฐ๋ฆฌ ์ํธ๋ฆฌ๊ฐ ์ ํจํจ -> ํ์ด์ง ํ
์ด๋ธ์์ PTE ์กฐํ
PTIndex = (VPN & PT_MASK) >> PT_SHIFT; // ํ์ด์ง ํ
์ด๋ธ ์ธ๋ฑ์ค ์ถ์ถ
PTEAddr = (PDE.PFN << SHIFT) + (PTIndex * sizeof(PTE)); // ํ์ด์ง ํ
์ด๋ธ ์ํธ๋ฆฌ ์ฃผ์ ๊ณ์ฐ
PTE = AccessMemory(PTEAddr); // ํ์ด์ง ํ
์ด๋ธ ์ํธ๋ฆฌ ๊ฐ์ ธ์ค๊ธฐ
if (PTE.Valid == False) { // ํ์ด์ง ํ
์ด๋ธ ์ํธ๋ฆฌ๊ฐ ์ ํจํ์ง ์์
RaiseException(SEGMENTATION_FAULT);
} else if (CanAccess(PTE.ProtectBits) == False) { // ์ ๊ทผ ๊ถํ ํ์ธ
RaiseException(PROTECTION_FAULT);
} else {
TLB_Insert(VPN, PTE.PFN, PTE.ProtectBits); // TLB์ ํ์ด์ง ํ
์ด๋ธ ์ํธ๋ฆฌ ์ถ๊ฐ
RetryInstruction(); // ๋ค์ ๋ช
๋ น์ด ์คํ
}
}
}
20.5 ํ์ด์ง ํ ์ด๋ธ์ ๋์คํฌ๋ก ์ค์ํํ๊ธฐ
- ๋ง ๊ทธ๋๋ก ๋๋ฌด ์ฌํ๋ฉด ๋์คํฌ๋ก ์ค์
21 ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ์ ๊ทน๋ณต: ๋ฉ์ปค๋์ฆ
ํต์ฌ ์ง๋ฌธ: ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ์ด์์ผ๋ก ๋์๊ฐ๊ธฐ ์ํด์ ์ด๋ป๊ฒํ ๊น ์ด์์ฒด์ ๋ ์ด๋ป๊ฒ ํฌ๊ณ ๋๋ฆฐ ์ฅ์น๋ฅผ ์ฌ์ฉํ๋ฉด์ ๋ง์น ์ปค๋ค๋ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ด ์๋ ๊ฒ์ฒ๋ผ ํ ์ ์์๊น?
- ๋ฉํฐํ๋ก๊ทธ๋๋ฐ ์์คํ ์ด ๋ฐ๋ช ๋๋ฉด์ ๋ง์ ํ๋ก์ธ์ค๋ค์ ํ์ด์ง๋ฅผ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์ ๋ถ ์ ์ฅํ๋๊ฒ์ด ๋ถ๊ฐ๋ฅํ๊ฒ ๋์๋ค.
- ๊ทธ๋์ ์ผ๋ถ ํ์ด์ง๋ค์ ์ค์ ์์ํ๋ ๊ธฐ๋ฅ์ด ํ์ํ๊ฒ ๋์๋ค.
- ๋ฉํฐํ๋ก๊ทธ๋จ๋ฐ๊ณผ ์ฌ์ฉ ํธ์์ฑ ๋ฑ์ ์ด์ ๋ก ์ค์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ณด๋ค ๋๋ง์ ์ฉ๋์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ๊ฒ ๋ญใ ๋ค.
- ์ด๊ฒ ํ๋ Virtual Memory์ ์ญํ ์ด๋ค.
21.1 ์ค์ ๊ณต๊ฐ
- ๋จผ์ ๋์คํฌ์ ํ์ด์ง๋ค์ ์ ์ฅํ ์ ์๋ ์ผ์ ๊ณค๊ฐ์ ํ๋ณดํ๋๊ฒ ํ์ํ๋ค.
- ์ด ์ฉ๋์ ๊ณต๊ฐ์ ์ค์ ๊ณต๊ฐ์ด๋ผ๊ณ ํ๋ค.
- ์ด์์ฒด์ ๋ ์ค์ ๊ณต๊ฐ์ ์๋ ๋ชจ๋ ํ์ด์ง๋ค์ ๋์คํฌ ์ฃผ์๋ฅผ ๊ธฐ์ตํด์ผํ๋ค.
- ์ด๋ฌ๋ฉด ์ด์์ฒด์ ๋ ํ๋ก์ธ์ค๋ค์๊ฒ ๋งค์ฐ ํฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ์๋๊ฒ์ฒ๋ผ ์ฌ๊ฒจ์ง๊ฒ ํ ใ ใ ์๋ค.
21.2 Present Bit
๋ง๊ฐ์ ์ด์ฉํ ์ ๋ด์ฉ ์ ๋ฆฌ: ๋ง์ฝ vpn์ tlb์์ ์ฐพ์ ์ ์๋ค๋ฉด, ํ๋์จ์ด๋ ํ์ด์ง ํ ์ด๋ธ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ํ์ ํ๊ณ (ํ์ด์ง ํ ์ด๋ธ ๋ฒ ์ด์ค ๋ ์ง์คํฐ ์ด์ฉ) vpn์ ์ธ๋ฑ์คํ์ฌ ์ํ๋ ํ์ด์ง ํ ์ด๋ธ ํญ๋ชฉ์ ์ถ์ถํ๋ค. ํด๋น ํ์ด์ง ํ ์ด๋ธ ํญ๋ชฉ์ด ์ ํจํ๊ณ ๊ด๋ จ ํ์ด์ง๊ฐ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ๋ค๋ฉด ํ๋์จ์ด๋ pte์์ pfn์ ๋ณด๋ฅผ ์ถ์ถํ๊ณ ๊ทธ ์ ๋ณด๋ฅผ tlb์ ํ์ฌํ ๋ช ๋ น์ด๋ฅผ ์ฌ์คํํ๋ค.
- ์ฌ๊ธฐ์ ๋์คํฌ ์ค์์ด ๊ฐ๋ฅํ๋ ค๋ฉด, ํ๋์จ์ด๊ฐ pte์์ ํด๋น ํ์ด์ง๊ฐ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ์ง ์๋๋ค๋๊ฒ์ ํํํด์ผํ๋ค. ๊ทธ๊ฑธ present bit๋ฅผ ์ด์ฉํด์ ํ๋๋ฐ, ๋ง์ฝ ํด๋น ๋นํธ๊ฐ 0์ด๋ฉด ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ์ง ์๋๋ค๋ ๊ฒ์ด๊ณ , ๊ทธ ์ํฉ์ page fault๋ผ๊ณ ํ๋ค.
- ํ์ด์ง ํดํธ๊ฐ ๋ฐ์ํ๋ฉด page fault handler ๊ฐ ์คํ๋๋ค.
21.3 ํ์ด์ง ํดํธ
- ํ์ด์ง ํดํธ๋ ๋ณดํต ์ด์์ฒด์ ์์ ์ฒ๋ฆฌ๋๋ค.
- ๊ทธ๋ฌ๋ฉด ์์ฐ์ ์ผ๋ก ๋๋ ์๋ฌธ์ด ์๋ค. โ๋์คํฌ ์ด๋์ ์๋ ์ง ์ด๋ป๊ฒ ์์ง?โ
- ํด๋น ์ ๋ณด๋ ํ์ด์ง ํ ์ด๋ธ์ ์ ์ฅ๋๋ค
- pfn๊ณผ ๊ฐ์ pte ๋นํธ๋ค์ ํ์ด์ง ๋์คํฌ ์ฃผ์๋ฅผ ๋ํ๋ด๋๋ฐ ์ฌ์ฉํ ์ ์๋ค.
- ์ดํ ์ฌ์คํํ๋ฉด tlb๋ฏธ์ค๊ฐ ๋ฐ์ํ ๊ฑฐ๊ณ ๊ทธ ๋ฏธ์ค๋ฅผ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์์ tlb๊ฐ์ด ๊ฐฑ์ ๋๋ค.
- ๋ฌผ๋ก ์ด ๊ณผ์ ์ I/O์ ์ก์ค์ ์ฐจ๋จ๋ ์ํ๊ฐ ๋๋ค.
VPN = (VirtualAddress & VPN_MASK) >> SHIFT;
(Success, TlbEntry) = TLB_Lookup(VPN);
if (Success == True) { // TLB ํํธ (TLB์์ ํด๋น ๊ฐ์ ํ์ด์ง ๋ฒํธ๋ฅผ ์ฐพ์)
if (CanAccess(TlbEntry.ProtectBits) == True) { // ์ ๊ทผ ๊ถํ ํ์ธ
Offset = VirtualAddress & OFFSET_MASK;
PhysAddr = (TlbEntry.PFN << SHIFT) | Offset; // ๋ฌผ๋ฆฌ ์ฃผ์ ๊ณ์ฐ
Register = AccessMemory(PhysAddr); // ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ
} else {
RaiseException(PROTECTION_FAULT); // ์ ๊ทผ ๊ถํ์ด ์์ผ๋ฉด ์์ธ ๋ฐ์
}
} else { // TLB ๋ฏธ์ค (TLB์ ํด๋น ํญ๋ชฉ์ด ์์)
PTEAddr = PTBR + (VPN * sizeof(PTE)); // ํ์ด์ง ํ
์ด๋ธ ์ํธ๋ฆฌ ์ฃผ์ ๊ณ์ฐ
PTE = AccessMemory(PTEAddr); // ํ์ด์ง ํ
์ด๋ธ ์ํธ๋ฆฌ ๊ฐ์ ธ์ค๊ธฐ
if (PTE.Valid == False) { // ํ์ด์ง ํ
์ด๋ธ ์ํธ๋ฆฌ๊ฐ ์ ํจํ์ง ์์
RaiseException(SEGMENTATION_FAULT);
} else {
if (CanAccess(PTE.ProtectBits) == False) { // ์ ๊ทผ ๊ถํ ํ์ธ
RaiseException(PROTECTION_FAULT);
} else if (PTE.Present == True) { // ํ์ด์ง๊ฐ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ๋ ๊ฒฝ์ฐ
// ํ๋์จ์ด ๊ด๋ฆฌ TLB๋ฅผ ๊ฐ์
TLB_Insert(VPN, PTE.PFN, PTE.ProtectBits); // TLB์ PTE ์ ๋ณด ์ฝ์
RetryInstruction(); // ๋ค์ ๋ช
๋ น์ด ์คํ
} else if (PTE.Present == False) { // ํ์ด์ง๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ
RaiseException(PAGE_FAULT); // ํ์ด์ง ํดํธ ์์ธ ๋ฐ์
}
}
}
- ํ๋์จ์ด์์
PFN = FindFreePhysicalPage(); // ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฌผ๋ฆฌ ํ์ด์ง๋ฅผ ์ฐพ์
if (PFN == -1) { // ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฌผ๋ฆฌ ํ์ด์ง๊ฐ ์์
PFN = EvictPage(); // ํ์ด์ง ๊ต์ฒด ์๊ณ ๋ฆฌ์ฆ ์คํ (๊ธฐ์กด ํ์ด์ง๋ฅผ ์ ๊ฑฐ)
}
DiskRead(PTE.DiskAddr, PFN); // ๋์คํฌ์์ ํ์ด์ง๋ฅผ ์ฝ์ด ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ (I/O ๋๊ธฐ)
PTE.present = True; // ํ์ด์ง ํ
์ด๋ธ ๊ฐฑ์ : ํ์ด์ง๊ฐ ์ด์ ๋ฉ๋ชจ๋ฆฌ์ ์์
PTE.PFN = PFN; // ํ์ด์ง ํ๋ ์ ๋ฒํธ(PFN) ์ค์
RetryInstruction(); // ์๋ ๋ช
๋ น์ด ์ฌ์๋
- ์ํํธ์จ์ด์์
21.4 ๋ฉ๋ชจ๋ฆฌ์ ๋น ๊ณต๊ฐ์ด ์์ผ๋ฉด
- ํ์ด์ง ๊ต์ฒด๋ฅผ ํตํด์ ๋ฌผ๋ฆฌ๋ฉ๋ชจ๋ฆฌ์์ ํ์ด์ง๋ฅผ ๋์คํฌ๋ก ๋ด๋ณด๋ธ๋ค.
- ๋ค์์ฅ์ ์ ์ฑ ์์ ๋ค๋ฃธ!
๋ฌผ๋ฆฌ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ์ ๊ทน๋ณต : ์ ์ฑ
์์ ์ธ๊ธ๋ ๋น ๊ตฅ๊ฐ์ด ์์ผ๋ฉด (๋์คํฌ์์ ๋ถ๋ฌ์ฌ๋) ๋ฉ๋ชจ๋ฆฌ์ ์๋ ํ์ด์ง๋ฅผ evictํด์ผ ํ๋๋ฐ ์ด๊ฑธ ๊ต์ฒด์ ์ฑ ์ด๋ผ๊ณ ํ๋ค. ํต์ฌ ์ง๋ฌธ : ๋ด๋ณด๋ผ ํ์ด์ง๋ ์ด๋ป๊ฒ ๊ฒฐ์ ํ๋๊ฐ?
22.1 ์บ์ ๊ด๋ฆฌ
- ์ผ๋จ ์ด ์ํฉ ์์ฒด๋ฅด ์บ์๋ก ๋ณผ ์ ์๋ค.
- ์์คํ ์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง๋ฅผ ๊ฐ์ ธ๋ค ์ข๊ธฐ ์ํ ์บ์๋ก ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๊ฐ ํ ์ ์๋ค.
- ๊ทธ๋ ๋ค๋ฉด ์ด ๊ด๋ฆฌ ์ ์ฑ ์ ์บ์ ๋ฏธ์ค๋ฅผ ์ต์ํํ๊ณ ์บ์ ํํธ๋ฅผ ์ต๋ํ ํ๋ ๋ฐฉ์์ผ๋ก ์ ๊ทผ ํ ์ ์๋ค.
- ๊ทธ๋ฆฌ๊ณ ๋ฏธ์ค์ ํํธ ์ ๋ณด๋ฅผ ์๋ค๋ฉด ํ๋ก๊ทธ๋จ์ amat (ํ๊ท ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์๊ฐ)์ ๊ณ์ฐ ํ ์์๋ค.
- AMAT = TimeToMemory + (PageMissPercent * TimeToDiskk)
- ํ๋ ์์คํ ์์๋ ๋์คํฌ ์ ๊ทผ ๋น์ฉ์ด ๋๋ฌด ํฌ๊ธฐ ๋๋ฌธ์ ์์ฃผ ์์ ๋ฏธ์ค๊ฐ ์ ์ฒด์ ์ธ AMAT์ ํฐ ์ํฅ์ ์ฃผ๊ฒ ๋๋ค.
22.2 ์ต์ ๊ต์ฒด ์ ์ฑ
- Belady๋ ๊ฐ์ฅ ๋์ค์ ์ ๊ทผ๋ ํ์ด์ง๋ฅผ ๊ต์ฒดํ๋ ๊ฒ์ด ์ต์ ์ด๋ฉฐ, ๊ฐ์ฅ ์ ์ ํ์์ ๋ฏธ์ค๋ฅผ ๋ฐ์์ํจ๋ค๋ ๊ฒ์ ์ฆ๋ช ํ๋ค. ์ด ์ ์ฑ ์ ๊ฐ๋จํ์ง๋ง ๊ตฌํํ๊ธฐ๋ ์ด๋ ค์ด ์ ์ฑ ์ด๋ค.
- ์์ฃผ์์ฃผ ์ฌ๊ฐํ ๋งน์ ์ด ์๋ค, ๋ฏธ๋๋ฅผ ๋ณด๋ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค!
- ํ์ง๋ง ํ์คํ๊ฑด ์ด๊ฑด ์ต์ ์ ์ ํ์ด๋ผ๋ ๊ฒ์ด๋ค ์ฆ ์ฑ๋ฅ ํ๋จ์ ์งํ๊ฐ ๋ฏธ๋๋ฅผ ๋ณด๊ณ ์ค์ผ์ค๋งํ์๋์ ์ต์ ์ 100์ ์ผ๋ก ๋๋ ๊ฒ์ด๋ค.
22.3 ๊ฐ๋จํ ์ ์ฑ : FIFO
- ๊ฐ๋จํ์ง๋ง ์ฑ๋ฅ์ด ์์ข๋ค
- ์์ ์ต์ ์ด๋ ๋น๊ตํ์์ coldstart ์ ์ธ 57ํผ์ผํธ ์ ๋
22.4 ๋ ๋ค๋ฅธ ๊ฐ๋จํ ์ ์ฑ : ๋ฌด์์ ์ ํ
- ์์ ์ ์ฑ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ตฌํ์ด ํธํ์ง๋ง ์ฑ๋ฅ์ด ๋ค์ฅ๋ ์ฅํ๋ค.
22.5 ๊ณผ๊ฑฐ ์ ๋ณด์ ์ฌ์ฉ: LRU
- least recently used๊ฐ ์ ํ๋์ด ๋๊ฐ๋ค.
- ๋น๋์(frequency), ์ต๊ทผ์ฑ(recency)์ ๊ณ ๋ คํ๋ค.
- ์ง์ญ์ฑ ์์น์ ์ด์ฉํ๋ ์ ์ฑ ์ด๋ค.
- ํ์ค์ ์ผ๋ก ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ค.
22.6 ์ํฌ๋ก๋์ ๋ฐ๋ฅธ ์ฑ๋ฅ ๋น๊ต
- ์ง์ญ์ฑ์ด ์๋ ๊ฒฝ์ฐ : LRU, FIFO, Random ๋ชจ๋ ๋์ผํ ์ฑ๋ฅ์ ๋ณด์ธ๋ค.
- 80:20 ์ํฌ๋ก๋ : 20ํผ์ผํธ๊ฐ 80ํผ์ผํธ์ ์ฐธ์กฐ๋ฅผ ์ ๋ฐํ๋ ์์์ ๋ชฐ๋ฆฐ ์ํฌ๋ก๋, lru์ฑ๋ฅ์ด ๋งค์ฐ ์ข๋ค
- ์์ฐจ ๋ฐ๋ณต ์ํฌ๋ก๋ : ์์ฐจ์ ์ผ๋ก ๋ฐ๋ณต ์ฐธ์กฐ๊ฐ ์ผ์ด๋๋ ์ํฌ๋ก๋
22.7 ๊ณผ๊ฑฐ ์ด๋ ฅ ๊ธฐ๋ฐ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ
- LRU๋ ๊ทธ๋๋ ํน์ ์ํฌ๋ก๋์ ํ๊ท ์ ์ผ๋ก ๋งค์ฐ ํ๋ฅญํ์ง๋ง, ๊ตฌํ์ด ๋๋ฌด ์ด๋ ต๋ค.
- ๊ณผ๊ฑฐ์ ์ ๋ณด๋ฅผ ๊ธฐ๋กํด์ผํ๋๋ฐ ์ด์์ฒด์ ์ ๊ฐ์ ๋ถ๋ถ์์๊ทธ๋ฐ๊ฑธ ์๋ชปํ๋ฉด ํฌ๊ฒ ์ฑ๋ฅ์ด ๊ฐ์ํ๋ค.
23 ์๋ฒฝํ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์คํ
ํต์ฌ ์ง๋ฌธ : ์์ ํ VM ์์คํ ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ
- 2๊ฐ์ ์์คํ ์ ์์ธํ ์ดํด๋ณด๋ฉด์ ์ด๋ฌํ ๊ตฌํ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณผ ์์ ์ด๋ค.
- ์ฒซ ๋ฒ์งธ๋ 1970๋ ๋ ์ด ๊ฐ๋ฐ๋ ๊ฒ์ผ๋ก โํ๋์ ์ธโ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์์ ์ต์ด ์ฌ๋ก์ค ํ๋๋ก VAX/VMS์ด์์ฒด์ ์์ ์ฐพ์ ์ ์๋ค.
- ๋ ๋ฒ์งธ๋ Linux ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์คํ ์ผ๋ก์ ๊ฐ์ฅ ํ์ฅ์ฑ์ด ๋ฐ์ด๋ ๋ค์ค ์ฝ์ด ์์คํ ์์ ํจ๊ณผ์ ์ผ๋ก ์คํ๋๋ค.
23.1 vax/vms ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ
- 512๋ฐ์ดํธ์ ํ์ด์ง ํฌ๊ธฐ๋ฅผ ๊ฐ์ง vms์ ์ค๊ณ์๋ค์ ๊ฐ์ฅ ํฐ ์ด์๋ ํ์ด์ง ํฌ๊ธฐ์๋ค. (์ ํ ํ์ด์ง์์)
- ๋๊ฐ์ง ๋ฐฉ๋ฒ์ ์ด์ฉํด์ ๋ฉ๋ชจ๋ฆฌ ์๋ฐ์ ์ด๊ฒจ๋๋ค.
- ์ฒซ์งธ, ์ฌ์ฉ์ ์ฃผ์๊ณต๊ฐ์ ๋๊ฐ์ ์ธ๊ทธ๋จผํธ๋ก ๋๋์ด ํ๋ก์ธ์ค๋ง๋ค ๊ฐ ์์ญ์ ์ํ ํ์ด์งํ ์ด๋ธ์ ๊ฐ์ง๋๋ก
- ๋๋, ์ฌ์ฉ์ ํ์ด์ง ํ ์ด๋ธ๋ค์ ์ปค๋์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐฐ์น