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가지 질문

  1. Block placement(어디에 둘 것인가?)
  2. Finding a block(어떻게 찾는가?)
  3. Replacement(미스 시 무엇을 버릴까?)
  4. 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)
  • 멀티프로세서에서 메모리 시스템 설계는 특히 더 중요