1. 신뢰성/가용성(Dependable memory hierarchy) & ECC
1.1. Dependability 기본 개념
- Fault(구성요소 고장)가 항상 Failure로 이어지지는 않음
- MTTF, MTTR, MTBF=MTTF+MTTR
- Availability = MTTF / (MTTF+MTTR)
1.2. Hamming 코드(SEC, SEC/DED)
- 해밍 거리 최소 2 → 1bit 오류 검출(패리티 등)
- 해밍 거리 최소 3 → 1bit 오류 수정 + 2bit 오류 검출(SEC)
- SEC 인코딩: 2의 거듭제곱 위치가 패리티 비트, 각 패리티가 특정 데이터 비트 커버
- SEC 디코딩: 패리티 비트 값이 오류 위치를 알려줌(예: 1010 → bit10 flip)
- SEC/DED: 전체 워드 패리티(pn) 추가 → 거리 4, 2bit 오류 검출 강화
- ECC DRAM은 보통 64비트당 8비트로 SEC/DED 구현
2. 가상 머신(Virtual Machines)
- 호스트가 게스트 OS/자원을 에뮬레이트, 격리·신뢰성·자원공유 개선
- 성능 오버헤드는 있으나 현대 시스템에서는 실용적
- VMM(모니터): 가상 자원을 물리 자원으로 매핑, 특권 명령/보호 자원 접근 시 trap 처리
- 타이머 가상화 예시: 물리 타이머 인터럽트를 VMM이 받아 VM별로 가상 타이머 인터럽트 제공
- ISA 지원: user/system 모드, privileged instruction, 가상화 지원의 부활(현대 ISA 적응)
3. 가상 메모리(Virtual Memory)
3.1. DRAM을 디스크의 캐시로
- 메인 메모리를 2차 저장장치의 캐시로 사용
- 각 프로세스는 독립적인 가상 주소 공간을 가지며 보호됨
- VM의 블록=페이지(page), VM 미스=페이지 폴트(page fault)
3.2. 주소 변환(Address translation)
- 고정 크기 페이지(예: 4KB), 가상 페이지 번호 + 페이지 오프셋
3.3. 페이지 폴트의 비용
- 디스크에서 페이지를 가져오므로 수백만 사이클 수준
- 따라서 페이지 폴트율 최소화가 절대적
- placement는 사실상 fully associative, replacement는 고급 알고리즘 사용
3.4. 페이지 테이블(Page tables)
- VPN으로 인덱싱되는 PTE 배열
- PTE에 PPN(물리 페이지 번호) + status bits(참조/더티 등)
- 메모리에 없으면 스왑 공간의 디스크 위치를 가리킴
3.5. replacement & write
- LRU 선호(참조 비트 reference/use bit를 OS가 주기적으로 관리)
- 디스크는 개별 주소 쓰기 불가 → write-through 불가, write-back 사용
- dirty bit는 페이지가 수정되면 set
4. TLB(Translation Look-aside Buffer)
4.1. 왜 필요한가
- 주소 변환은 (1) PTE 접근 + (2) 실제 메모리 접근 → 추가 참조가 생김
- 하지만 페이지 테이블도 지역성이 좋아서 CPU 내부에 PTE 캐시를 둠 = TLB
- 전형적 수치: 16–512 PTE, hit 0.5–1 cycle, miss 10–100 cycles, miss rate 0.01%–1%
4.2. TLB miss 처리
- 페이지가 메모리에 있으면 PTE를 메모리에서 읽어 TLB에 적재 후 재시도(하드웨어/소프트웨어 가능)
- 페이지가 없으면 page fault → OS가 페이지를 가져오고 테이블 업데이트 후 재시작
4.3. TLB와 캐시 상호작용
- 캐시 태그가 물리 주소면: 캐시 lookup 전에 번역 필요
- 가상 주소 태그를 쓰면: aliasing(같은 물리 주소에 다른 가상 주소) 문제 발생
5. 메모리 보호(Protection)
- 프로세스 간 주소 공간 일부 공유 가능하지만, 잘못된 접근으로부터 보호 필요
- OS 지원 + 하드웨어 지원(커널 모드, privileged instruction, page table 보호)
- 시스템 콜 예: RISC-V ecall
6. 공통 프레임워크: 모든 계층은 캐싱 문제
모든 메모리 계층에서 반복되는 4가지 질문
- Block placement(어디에 둘 것인가?)
- Finding a block(어떻게 찾는가?)
- Replacement(미스 시 무엇을 버릴까?)
- Write policy(쓰기 반영은 어떻게?)
6.1. Block placement = associativity
- direct mapped / n-way / fully associative
- 연관도↑ → miss rate↓ but 복잡도·비용·access time↑
6.2. Finding a block
- direct: index 후 tag 비교 1회
- n-way: set index 후 n개 비교
- fully: 전체 비교(#entries)
- VM은 full lookup table 방식도 가능(하드웨어 캐시와 요구사항이 다름)
6.3. Replacement
- LRU vs Random
- VM은 하드웨어 지원을 이용해 LRU 근사
6.4. Write policy
- write-through vs write-back
- VM은 디스크 지연 때문에 write-back만 현실적
7. 미스의 종류(3C)
- Compulsory(cold start): 첫 접근
- Capacity: 캐시 용량 한계로 교체된 블록을 나중에 다시 접근
- Conflict(collision): 완전 연관이 아닌 구조에서 set 경쟁으로 발생(fully associative면 사라짐)
8. 캐시 설계 트레이드오프 요약
| 설계 변경 | 미스율 효과 | 부정적 영향 |
|---|---|---|
| 캐시 크기 증가 | capacity miss 감소 | access time 증가 가능 |
| 연관도 증가 | conflict miss 감소 | access time 증가 가능 |
| 블록 크기 증가 | compulsory miss 감소 | miss penalty 증가, 너무 크면 pollution으로 miss 증가 가능 |
9. 단순 캐시 제어: FSM 기반 컨트롤러
- 예시 캐시: direct-mapped, write-back, write-allocate, 16B block(4워드), 16KB(1024블록), valid/dirty 포함, blocking cache
- CPU↔Cache↔Memory 인터페이스 신호(Valid/Address/Data/Ready 등)와 메모리가 멀티사이클이라는 점 강조
- FSM 기본: 상태 레지스터 + 다음상태 함수 fn + 출력 함수 fo
- 컨트롤러 FSM 도식(페이지 91): Idle → Compare Tag → (Hit이면 Ready) / (Miss이면 Allocate 또는 Write-back 상태로 전이)
10. 병렬성: 캐시 일관성(Coherence)과 일관성(Consistency)
10.1. Coherence 문제(왜 발생?)
- 두 코어가 같은 물리 주소 공간을 공유하면, 각자의 캐시 값이 달라질 수 있음
- write-through만 써도 다른 코어 캐시에 남아있는 오래된 값 문제가 생김
10.2. Coherence 정의
-
읽기는 가장 최근에 쓰인 값을 반환해야 한다.
-
공식 조건
- P가 X 쓰고, 중간에 다른 write 없으면 다시 읽을 때 그 값이어야 함
- P1이 쓰고 P2가 충분히 나중에 읽으면 그 값이어야 함
- P1, P2가 X에 쓰면, 모든 프로세서가 쓰기 순서를 동일하게 관찰해야 함
10.3. Coherence 프로토콜 개요
- snooping: 각 캐시가 버스를 모니터링
- directory 기반: 공유 상태를 디렉터리에 기록
- invalidate 기반 snooping: 쓰기 전에 invalidate를 broadcast → 다른 캐시는 미스 발생, 최신 값은 소유 캐시가 제공
10.4. Memory consistency
- 다른 프로세서가 언제 write를 보게 되는가의 문제
- 즉시 반영될 수 없으며, write 순서/가시성에 대한 가정이 필요
- 예: P가 X 쓰고 Y 쓰면, Y의 새 값을 본 프로세서는 X도 새 값이어야 함(일관된 순서)
11. 실제 시스템 예시(ARM A53 vs Intel Core i7)
- 다중 발행 지원: 멀티뱅크 캐시, requested word first, non-blocking cache(hit-under-miss, miss-under-miss), prefetching
12. RISC-V 관련 시스템 명령(메모리/번역/CSR)
- fence.i, fence, sfence.vma(주소 변환 fence)
- CSR 접근(csrrw/csrrs/csrrc 계열), ecall/ebreak/sret/wfi
13. 오류/함정(Fallacies & Pitfalls)
- 바이트 주소 vs 워드 주소 혼동(같은 ‘36’도 의미가 달라짐)
- 메모리 시스템 효과를 무시한 코드(행/열 순회 등) → stride 커지면 locality 악화
- 멀티코어에서 L2/L3 공유 시: 코어 수 대비 연관도가 낮으면 conflict miss 증가
- OoO 프로세서 성능을 AMAT만으로 평가하는 함정(비차단 접근 효과 무시) → 시뮬레이션 권장
- 세그먼트로 주소 확장(예: 80286)의 복잡성, 가상화 비친화 ISA에서 VMM 구현 난점
14. 결론(Concluding remarks)
- 빠른 메모리는 작고, 큰 메모리는 느리다.
- 캐싱이 빠르고 큰 메모리의 환상을 제공한다.
- 지역성 + 계층(L1↔L2↔…↔DRAM↔disk)
- 멀티프로세서에서 메모리 시스템 설계는 특히 더 중요