DRAM 내부 구조, 뱅크와 로우와 컬럼으로 찾아가는 방식
큰 우체국의 분류실에는 구역별로 분류대가 놓여 있고, 분류대마다 가로 선반 줄과 세로 칸이 격자처럼 나뉘어 있습니다. 편지 한 통을 찾으려면 구역, 선반 줄, 칸 순서로 좁혀 가면 되죠.
이 글의 주제인 DRAM 내부 구조도 같은 방식으로 데이터의 위치를 정합니다. 뱅크가 구역, 로우가 선반 줄, 컬럼이 칸에 해당하고, 주소 하나가 이 세 단계의 좌표로 풀려 원하는 셀에 닿습니다.
분류실과 다른 점이 있습니다. 편지는 칸 하나만 열면 꺼낼 수 있지만, DRAM은 줄 전체를 통째로 불러온 뒤에야 그 안의 칸을 읽을 수 있습니다. 그리고 구역마다 독립적으로 작업할 수 있어서, 한 구역이 정리하는 동안 다른 구역이 일을 이어 가는 것이 가능합니다.
DRAM 내부 구조는 어떤 층으로 나뉘는가
DRAM 내부 구조를 바깥에서 안쪽으로 따라가면 채널, 랭크, 칩, 뱅크 그룹, 뱅크, 셀 배열 순서로 층이 나뉩니다. 컨트롤러는 이 모든 층을 주소 비트로 구분해 접근할 곳을 정합니다.
칩 안으로 들어가면 셀은 뱅크(Bank)라는 독립된 단위 여러 개에 나뉘어 있습니다. 각 뱅크는 다시 셀이 행과 열로 놓인 2차원 배열이며, 행을 로우(Row), 열을 컬럼(Column)이라고 부릅니다.
이렇게 나누는 이유는 한 덩어리로 만들면 배선이 너무 길어지기 때문입니다. 배열이 크면 워드라인과 비트라인의 부하가 커져 신호가 느려지므로, 작은 배열 여러 개로 쪼개어 속도와 전력을 관리합니다.
로우와 컬럼이 만드는 2차원 배열과 센스 앰프
배열의 같은 행에 있는 셀들은 하나의 워드라인을 함께 쓰고, 같은 열의 셀들은 하나의 비트라인을 함께 씁니다. 워드라인이 켜지면 그 행의 모든 셀이 동시에 각자의 비트라인에 전하를 내보냅니다.
비트라인 끝에는 센스 앰프(Sense Amplifier)가 줄지어 있어서, 이 미세한 신호를 0과 1로 판정해 보관합니다. 이 센스 앰프 묶음을 로우 버퍼(Row Buffer)라고 하고, 한 행 전체의 사본이 담긴 임시 저장소로 생각하면 됩니다.
열린 행의 크기는 칩 하나당 대체로 1 KB 안팎에서 제품 구성에 따라 달라집니다. 컬럼은 로우 버퍼 안에서 어느 비트를 골라 내보낼지 정하는 선택자 역할이고, 이 구조 덕분에 같은 행 안의 데이터는 연속해서 빠르게 읽을 수 있습니다.
주소 하나가 데이터가 되기까지의 접근 방식
컨트롤러가 받은 물리 주소가 실제 셀에 닿는 과정은 다음과 같이 정리됩니다. 세부적인 대기 시간은 별도의 타이밍 규칙이 정하므로, 여기서는 순서와 역할만 봅니다.
주소 한 개가 읽기 데이터가 되는 길
- 메모리 컨트롤러가 물리 주소를 채널, 랭크, 뱅크, 로우, 컬럼 번호로 나눕니다.
- 해당 뱅크에 로우 주소와 함께 ACT 명령을 보내면 로우 디코더가 그 행의 워드라인을 켭니다.
- 행 전체의 신호가 센스 앰프에 올라가 로우 버퍼에 담깁니다.
- 이어서 컬럼 주소와 함께 RD 명령을 보내면 컬럼 디코더가 로우 버퍼에서 원하는 위치를 고릅니다.
- 선택된 데이터가 입출력 회로를 거쳐 버스트 단위로 칩 밖으로 나갑니다.
- 사용이 끝나면 PRE 명령으로 행을 닫고 비트라인을 되돌립니다.
DRAM은 행 주소와 열 주소를 같은 주소 핀으로 시간을 나누어 보내는 방식이 오래 이어져 왔습니다. 먼저 ACT 때 행 주소를, 이어서 RD나 WR 때 열 주소를 보내므로 핀 수를 절반 가까이 줄일 수 있습니다.
한 번의 읽기 명령으로 연속된 여러 컬럼의 데이터가 이어서 나오는 것을 버스트 전송이라고 합니다. 예를 들어 DDR4에서 채널 폭 64비트에 버스트 길이 8이면 한 번에 64바이트가 오가는데, 이는 일반적인 캐시 라인 크기와 맞아떨어집니다.
뱅크가 여러 개인 이유, 지연을 겹쳐 숨기는 방법
한 뱅크는 한 번에 하나의 행만 열어 둘 수 있습니다. 같은 뱅크에서 다른 행을 읽으려면 지금 행을 닫고 새 행을 여는 과정이 필요하고, 그동안 그 뱅크는 다른 요청을 받지 못합니다.
뱅크가 여러 개이면 이 대기를 겹쳐 숨길 수 있습니다. 한 뱅크가 행을 닫고 여는 동안 다른 뱅크가 데이터를 내보내도록 요청을 번갈아 보내는 것을 뱅크 인터리빙(Bank Interleaving)이라고 합니다.
DDR4부터는 뱅크를 묶은 뱅크 그룹이라는 단위가 도입되었습니다. 같은 그룹 안의 뱅크에 연속으로 접근하면 더 긴 간격이 필요하고 다른 그룹을 번갈아 접근하면 간격이 짧아지는 경향이 있어, 컨트롤러는 요청을 그룹에 골고루 흩어 보내려고 합니다.
가상 칩으로 계산해 보는 용량과 주소 비트
가상 계산 예시, 칩 용량과 주소 비트실제 제품 값이 아니라 설명을 위한 가정입니다. 뱅크 8개, 뱅크당 로우 65,536개(2의 16제곱), 로우당 컬럼 1,024개(2의 10제곱), 컬럼 하나가 8비트인 칩을 생각합니다.
총 비트 수는 8 × 65,536 × 1,024 × 8 = 4,294,967,296비트이고, 이는 2의 32제곱으로 4 Gb, 바이트로는 512 MB입니다. 주소에 필요한 비트는 뱅크 3 + 로우 16 + 컬럼 10 = 29비트입니다.
한 행의 크기는 1,024 × 8비트 = 8,192비트, 곧 1 KB입니다. 같은 행 안의 1 KB는 로우 버퍼에 한 번 올려 두고 컬럼만 바꿔 가며 읽을 수 있는 범위입니다.
DRAM 내부 구조에서 용량이 두 배로 커질 때는 보통 뱅크 수나 로우 수 같은 한 가지 차원을 늘리고, 그만큼 주소 비트가 하나 늘어납니다. 반대로 같은 용량이라도 로우와 컬럼의 비율을 어떻게 나누느냐에 따라 행 크기와 배선 길이가 달라집니다.
주소 매핑과 접근 패턴이 성능을 가르는 방식
여기서 DRAM은 어느 주소를 읽어도 걸리는 시간이 똑같다는 말은 흔한 오해입니다. 이름의 Random Access는 임의 순서로 접근할 수 있다는 뜻이지, 접근 시간이 같다는 뜻이 아닙니다.
이미 열린 행에 다시 접근하면 컬럼 선택만으로 끝나지만, 닫혀 있거나 다른 행이 열려 있으면 행을 열고 닫는 시간이 더해집니다. 같은 요청이라도 로우 버퍼의 상태에 따라 지연이 크게 달라지는 셈입니다.
컨트롤러는 이 특성을 활용해 주소 비트를 어떻게 배치할지 정합니다. 연속된 주소가 여러 채널과 뱅크에 걸쳐 흩어지도록 매핑하면 병렬성이 올라가고, 같은 행의 요청을 묶어 처리하면 행을 여닫는 횟수가 줄어듭니다.
뱅크와 로우와 컬럼 비교 표
| 구분 | 뱅크 | 로우 | 컬럼 |
|---|---|---|---|
| 무엇인가 | 독립적으로 동작하는 셀 배열 단위 | 워드라인을 공유하는 셀의 가로줄 | 로우 버퍼 안에서 고르는 위치 |
| 선택하는 명령 | 모든 명령에 뱅크 주소 포함 | ACT와 함께 로우 주소 전달 | RD와 WR과 함께 컬럼 주소 전달 |
| 동시에 열어 둘 수 있는 수 | 여러 뱅크가 각자 동작 | 뱅크당 하나 | 열린 행 안에서 자유롭게 선택 |
| 접근 비용 | 다른 뱅크로 요청을 돌려 지연을 숨김 | 열고 닫는 시간이 큼 | 선택만 하면 되어 비용이 작음 |
| 놓치기 쉬운 점 | 어느 주소든 접근 시간이 같다는 오해, 열린 행에 다시 접근하는지에 따라 지연이 달라집니다. | ||
핵심 정리
DRAM 내부 구조는 채널과 랭크 아래의 칩이 여러 뱅크로 나뉘고, 뱅크마다 로우와 컬럼의 2차원 배열과 로우 버퍼를 갖는 층 구조입니다. 주소는 뱅크와 로우와 컬럼으로 풀려 ACT로 행을 열고 RD로 열을 골라 데이터를 꺼내는 순서로 접근됩니다.
분류실의 구역이 많을수록 작업을 겹쳐 진행하기 쉽듯, 뱅크가 여럿이면 열고 닫는 대기를 감출 수 있습니다. 다만 같은 선반 줄의 편지를 이어서 꺼내는 편이 빠르듯, 같은 행에 접근을 모으는 쪽이 유리합니다.
면접 대비 질문
면접 대비 질문DRAM이 행과 열의 2차원 배열에 로우 버퍼를 두는 구조인 이유와, 뱅크를 여러 개 두는 이유를 성능 관점에서 설명해 보세요.
[답변 포인트] 배열이 커질수록 워드라인과 비트라인이 길어져 느려지므로 작은 뱅크로 나눈다는 점으로 시작합니다. 행 전체를 센스 앰프에 올려 로우 버퍼로 쓰고 컬럼으로 그 안에서 고르는 구조라서, 같은 행에 접근하면 빠르고 다른 행으로 가면 닫고 여는 시간이 더해진다고 설명합니다. 뱅크는 한 번에 하나의 행만 열 수 있어서 뱅크가 여러 개일 때 한 뱅크의 대기를 다른 뱅크의 전송으로 가리는 뱅크 인터리빙이 가능하다는 점, 컨트롤러의 주소 매핑이 이를 활용한다는 점을 덧붙이면 좋습니다.









