스킬캠퍼스

오늘 끝나면

쓰기 정책과 메모리 컨트롤러

  • 쓰기 정책과 메모리 컨트롤러의 핵심 문제를 한 문장으로 설명한다
  • 오른쪽 실습에서 쓰기이 어떻게 움직이는지 관찰한다
  • 다음 강의와 이어지는 한계를 말할 수 있다

실습 미션

write-through/back·dirty·DRAM row/bank 스케줄링 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.

성공 조건

  • 실습의 기본값을 먼저 관찰
  • 입력값이나 모드를 한 번 이상 바꿔 결과 비교
  • 왜 결과가 바뀌었는지 한 문장으로 설명

반도체 설계 · 26

쓰기 정책과
메모리 컨트롤러

읽기는 캐시가 빨라도 쓰기는 다른 문제다.
바뀐 값을 언제 메모리에 내리느냐가 정책이다.
그 한 줄 결정이 속도와 정합성을 가른다.

P.01반도체 설계 · 26

write-through vs write-back

CPU가 값을 쓰면 캐시는 바뀐다. 문제는 메모리도 같이 바꿀지다.

write-through는 쓸 때마다 캐시와 메모리를 동시에 바꾼다. 둘이 항상 똑같으니 일관성이 단순하다.
대신 쓰기마다 느린 메모리를 건드린다. 같은 줄에 100번 쓰면 메모리 쓰기도 100번이다.

write-back은 캐시만 바꾸고 메모리는 그대로 둔다. 그 줄에 ‘바뀜’ 표시(dirty)만 켜둔다.
메모리 반영은 그 줄이 쫓겨날 때 딱 한 번 몰아서 한다. 100번 써도 메모리 쓰기는 한 번이다.
여기서 고른 정책이 그대로 최종 MyChip 캐시의 쓰기 동작이 된다.

쓰기 한 번, 메모리까지 갈까 캐시에만 남을까
쓰기 한 번, 어디까지 가나
write-through캐시 + 메모리 동시
CPU캐시메모리즉시

둘이 항상 같다 · 쓰기마다 느린 메모리

write-back캐시만 · 나중에 몰아서
CPU캐시메모리D나중에

dirty만 켜둔다 · 쫓겨날 때 한 번

P.02반도체 설계 · 26

dirty 비트와 eviction

write-back의 핵심은 줄마다 붙은 한 비트, dirty다.

그 줄을 캐시에서 한 번이라도 고쳤으면 dirty=1이다. 캐시 값이 메모리보다 새것이라는 표시다.
dirty=0이면 메모리와 같다는 뜻이라, 쫓아내도 잃을 게 없다.

새 줄이 들어와 자리가 없으면 기존 줄을 내보낸다. 이게 eviction이다.
나갈 줄이 clean이면 그냥 버린다. dirty면 먼저 메모리에 write-back한 뒤 버린다.
그래서 read miss인데도 느릴 때가 있다. 쫓겨나는 줄이 dirty라 메모리 쓰기가 끼어들기 때문이다.

바뀐 줄에 깃발 하나, 쫓겨날 때만 내린다
dirty 깃발 · 쫓겨날 때만 write-back
캐시 4줄, D = dirty
·0x10clean, 메모리와 같다
D0x24dirty, 캐시가 새것쫓겨난다
·0x38clean
D0x4Cdirty
dirty 0x24write-back메모리

clean 줄은 그냥 버린다 · dirty 줄만 메모리에 먼저 쓴다

P.03반도체 설계 · 26

DRAM은 row·bank, 순서가 곧 속도

캐시 너머 메인 메모리는 DRAM이다. DRAM은 평평한 칸이 아니라 격자다.

DRAM은 bank로 나뉘고, 각 bank는 row(행) × column(열)이다. 어떤 칸을 읽으려면 그 칸의 행을 통째로 감지증폭기(row buffer)에 먼저 열어야 한다.
이미 열린 행 안의 칸이면 바로 읽는다. 이게 row hit이고 빠르다.

다른 행을 건드리면 열린 행을 닫고(precharge) 새 행을 여는 데 시간이 든다. row miss이고 느리다.
그래서 같은 주소 양이라도 접근 순서에 따라 속도가 몇 배 갈린다.
메모리 컨트롤러가 요청 순서를 같은 행끼리 묶어 재배열하는 이유다.

같은 행이면 빠르고 행 바꾸면 느리다
DRAM bank, 열린 행만 빠르다
한 bank · 행 × 열 격자
row 0
row 1
열림
row 2
row 3
row hit

열린 행 안의 칸이라 바로 읽는다. 빠르다.

row miss

행 닫고(precharge) 새 행을 연다. 느리다.

같은 주소 양이라도 접근 순서로 속도가 갈린다
P.04반도체 설계 · 26

직접 정책을 골라 써본다

write-through와 write-back을 토글하며 같은 주소열에 한 접근씩 써본다.

write-back에서 같은 줄을 여러 번 쓰면 메모리 쓰기 카운트가 안 늘어난다. 미뤘기 때문이다.
꽉 찬 줄에 새 주소를 쓰면 eviction이 뜨고, 쫓겨나는 줄이 dirty면 DRAM에 write-back이 끼어든다.
여기서 정한 정책이 MyChip에 들어간다.

정책 토글, dirty·eviction·pending queue·DRAM 스케줄
쓰기 정책 시뮬 · 한 접근씩
정책, 바꾸면 처음부터

캐시만 바꾸고 dirty 표시 · 쫓겨날 때만 메모리

쓰기 시퀀스, ▶ 가 지금 쓸 주소
ST 0x00줄 0 · slot 0
ST 0x04줄 0 · slot 0
ST 0x10줄 1 · slot 1
ST 0x08줄 0 · slot 0
ST 0x20줄 2 · slot 0
ST 0x24줄 2 · slot 0
ST 0x14줄 1 · slot 1
예측 먼저, 이 쓰기, 느린 메모리까지 갈까?
캐시(2슬롯) · write buffer · DRAM
캐시slot 0비어 있음slot 1비어 있음write buffer···대기 0DRAM bankrow 0row 1row 2row 3

D = dirty(캐시가 새것) · write buffer = 메모리로 갈 대기 쓰기 · 열린 row만 빠름

근거 패널, 캐시 · dirty · 메모리 쓰기 · queue · row
정책CPU 쓰기메모리 쓰기큐 대기
WB000
캐시 슬롯, 줄 · dirty

slot0: 비움 slot1: 비움

DRAM 열린 row · 방금 접근

열린 row = 없음

예측을 고르고 STEP을 눌러 한 접근씩 실행해 본다.

P.05반도체 설계 · 26

쓰기는 공짜가 아니다

읽기는 캐시가 가려준다. 쓰기는 결국 누군가 느린 메모리에 값을 내려야 한다.

그 비용을 숨기는 장치가 write buffer다. CPU는 버퍼에 던지고 바로 다음 일을 한다. 버퍼가 한가할 때 메모리에 조용히 흘려보낸다.
버퍼가 차면 그때서야 CPU가 기다린다. 쓰기 폭주를 평탄하게 펴주는 완충이다.

그리고 write allocate는 write miss(캐시에 없는 주소에 쓰기)일 때 그 줄을 캐시로 끌어와 두는 정책이다.
한 번 쓴 데 또 쓰는 경우가 많으니, 끌어와 두면 다음 쓰기들이 캐시에서 끝난다.
write-back, write allocate, write buffer. 이 세 선택이 MyChip의 쓰기 경로를 완성한다.

Q. write-back이 미루는 일은 무엇인가?정답은 캐시에서 메모리로 쓰는 일이다.
쓸 때는 캐시만 바꾸고 dirty 깃발만 켜둔다. 메모리 반영은 그 dirty 줄이 eviction으로 쫓겨날 때 딱 한 번 몰아서 한다.
그래서 같은 줄에 여러 번 써도 메모리 쓰기는 한 번으로 줄어든다.
write buffer, 정책 선택의 무게
write buffer · MyChip 쓰기 경로
CPU에서 버퍼 거쳐 메모리로
CPU즉시 던짐write buffer한가할 때메모리
write-back캐시만 바꾸고 dirty 후 나중에 반영
write allocatewrite miss 줄을 캐시로 끌어온다
write buffer쓰기를 완충해 CPU가 안 기다린다
이 세 선택이 MyChip 쓰기 경로를 완성한다

3줄 요약

  1. 1write-through/back·dirty·DRAM row/bank 스케줄링
  2. 2쓰기 정책과 메모리 컨트롤러은 비트·게이트 → ALU → 시간·메모리 → 나만의 CPU → 메모리·GPU·SoC 흐름 안의 한 칸이다.
  3. 3개념을 외우는 것보다 입력을 바꾸면 무엇이 달라지는지 보는 것이 우선이다.

완료 전 점검

복습 카드

쓰기

write-through/back·dirty·DRAM row/bank 스케줄링

ALU

산술·논리 연산을 하는 회로

ISA

CPU가 이해하는 명령어 집합과 인코딩