동적 임의 접근 메모리(Dynamic Random Access Memory, DRAM)는 작은 커패시터에 전하를 담아 비트를 저장한다. 문제는 이 전하가 시간이 지나면서 새어 나간다는 점이다. 내용이 지워지기 전에 읽어 다시 써야 하므로, 메모리 컨트롤러는 주기적으로 리프레시를 실행한다.
구조와 동작
- 셀
- 커패시터 전하로 1비트를 저장
- 리프레시
- 전하 누수 때문에 주기적으로 다시 쓴다
- 뱅크·로우
- Row Hit이면 빠르고 Row Miss면 다시 여는 비용이 든다
- 병렬성
- 뱅크를 나눠 접근하면 대기 시간을 숨길 수 있다
셀은 행과 열의 배열로 묶이고, 여러 배열이 뱅크를 이룬다. 데이터를 읽을 때에는 먼저 행을 활성화해 Row Buffer로 가져온 뒤, 그 안에서 열을 선택한다. 이미 열린 행을 다시 읽는 Row Hit는 바로 데이터를 찾을 수 있어 빠르다. 다른 행이 필요한 접근은 새 행을 여는 비용이 들고, 기존 행까지 닫아야 하는 경우에는 대기시간이 더 길어진다.
여러 뱅크와 뱅크 그룹을 두는 이유는 작업을 한곳에 몰아 두지 않기 위해서다. 한 뱅크가 내부 타이밍을 기다리는 동안 다른 뱅크를 처리할 수 있다. 메모리 데이터 전송률이 올라가도 DRAM 셀 배열의 동작은 같은 비율로 빨라지지 않는다. 그래서 전송을 묶어 처리하는 Prefetch·Burst와 뱅크 병렬성이 높은 전송률을 뒷받침한다.
행을 열고 읽거나 쓴 뒤 다시 정리하는 과정에는 각 단계 사이의 최소 대기가 필요하다. 이 간격은 tRCD, tRP, tRAS 같은 타이밍으로 표현된다. 여기 적힌 숫자는 클럭 주기의 개수다. 실제 시간을 비교하려면 데이터 전송률까지 넣어 계산해야 한다.
DRAM 칩은 모듈 PCB 위에서 Rank를 이루고, CPU는 채널을 통해 이 모듈과 통신한다. 모듈의 SPD에는 기본 동작 정보가 들어 있어 플랫폼이 초기 설정을 찾는 데 쓰인다. DDR5의 On-Die ECC는 DRAM 칩 내부 셀 오류를 보정해 제조와 고밀도 동작을 돕는다. 다만 CPU가 보는 데이터 경로 전체를 보호하는 시스템 ECC와 같은 기능은 아니다.
행 적중과 행 충돌
열려 있는 행이 없는 상태의 접근과, 같은 뱅크에 다른 행이 열려 있는 상태는 다르다. 후자는 먼저 Precharge로 기존 행을 닫고 새 행을 Activate해야 한다. 따라서 흔히 Row Miss라고 묶어 부르는 접근도 닫기 과정이 필요한 Row Conflict인지에 따라 지연이 달라진다.
리프레시는 저장된 전하를 보존하지만 그 대상 영역이 명령을 처리할 수 없는 시간을 만든다. 컨트롤러는 뱅크 병렬성과 명령 스케줄링으로 이를 일부 가리지만, 모든 메모리 접근에 고정된 지연 하나를 적용할 수는 없다. 이 차이는 메모리 타이밍과 실제 지연시간에서 CL만으로 전체 지연을 계산할 수 없는 이유와 연결된다.
관련: 메모리 타이밍과 실제 지연시간, ECC 메모리