Seonghyeon

전원이 꺼졌는데 어떻게 0과 1을 기억할 수 있을까? - HDD와 SSD의 원리 살펴보기

개발

지난 글에선 컴퓨터가 사용하는 전류는 어디서 왔고, 컴퓨터는 이 전기 흐름을 어떻게 제어하는지 살펴봤다. 이제 트랜지스터로 0과 1을 제어해 논리회로를 만든다는 건 알겠는데, 어떻게 이 전기적 상태를 기억할 수 있을까? 원래 1비트를 기억하는 소자인 플립플롭의 원리를 살펴보려고 했지만, 최근 회사에서 재밌는 일을 겪어서 전원 공급 없이도 HDD와 SSD가 데이터를 기억하는 원리가 궁금해졌다.

데스크톱 사양이 좋은데 부팅이 5분 넘게 걸렸던 이유

난 회사에서 받은 데스크톱에 윈도우를 직접 설치해 쓰고 있다. 지금까진 맥북만 썼기 때문에 처음에는 좀 당황스러웠지만 지금은 잘 적응해서 쓰고 있다. 마침 Unity로 개발할 일도 생겨서 그래픽 카드도 달고 16GB짜리 메모리 카드도 직접 붙였다.

그런데 문제는 컴퓨터 사양이 괜찮은데도 전원 버튼을 누르고나면 켜지는데 5분 넘게 걸리는 것이었다. 크롬이나 VS Code같은 프로그램을 실행하면 엄청 끊기고 느렸다. 이것저것 찾아보면서 온갖 Windows 최적화는 다 해봤지만 소용이 없었다. 이런 환경에서 개발해야 한다는 게 너무 끔찍했다.

열 받음

한 이틀 정도 이렇게 써보다가 도저히 안되겠다는 생각이 들었다. 코드보다도 개발 환경부터 개선해야 했다. 가장 의심스러운 건 일단 프로그램 실행 자체가 오래 걸리는 것이었다. 프로그램을 디스크에서 메모리로 올릴 때 무조건 병목이 있겠다 싶었다. SSD가 있었는데 설마 HDD에서 가져오고 있나? 생각이 들었다.

Powershell 명령어로 이렇게 쳐보면 현재 컴퓨터의 디스크 목록을 볼 수 있다.

Get-PhysicalDisk | Select FriendlyName, MediaType, BusType

Samsung SSD 980 1TB SSD NVMe
WDC WD20EZBX-00AYRA0 HDD SATA

C: 드라이브가 어느 디스크인지 확인했더니

Get-Partition -DriveLetter C | Get-Disk | Select FriendlyName

WDC WD20EZBX-00AYRA0 HDD SATA (?!)

역시나 하드디스크였다.

처음에 컴퓨터를 받았을 때 우분투가 깔려 있어서 USB로 윈도우를 설치했는데 이때 HDD에 설치한 것 같다. 이후 Hasleo Disk Clone Free 프로그램을 통해 HDD를 통째로 SSD로 복사했고 HDD는 정리해줬다. 마침내 5분 넘게 걸리던 부팅 시간은 1분 이내로 줄었고, 더 이상 끊김 없이 프로그램이 실행됐다!

Get-Partition -DriveLetter C | Get-Disk | Select FriendlyName

Samsung SSD 980 1TB SSD NVMe (!)

이 문구를 보는 순간 너무 기뻤다. 계속 맥북만 썼거나 이미 잘 세팅된 PC를 받았다면 아마 못 해봤을 경험이다.

시원함

전원이 꺼졌는데 어떻게 0과 1을 기억할 수 있을까?

원래 'SSD는 빠르다~' 정도로 알고 있었는데 처음으로 왜 빠른지 궁금해졌다. 또 RAM은 그렇다쳐도 컴퓨터 전원이 꺼졌을 때는 어떻게 데이터를 기억할 수 있을까?

HDD와 SSD

HDD(Hard Disk Drive)를 알아보자

CD처럼 생긴 원판을 플래터라고 부른다. 플래터는 자성 입자들이 코팅되어 있고 수많은 섹터로 나눠져 있다.

HDD 섹터

하나의 섹터에는 4KB 크기의 데이터가 저장된다. 시작 위치 정보, 실제 데이터, 자동으로 오류를 잡아내고 고치는 ECC 코드(Error Correcting Code)가 기록된다. 1TB 기준으로 약 2억 4천개의 섹터가 존재한다고 한다. 아래 사진에서 바늘 같이 생긴 게 Read/Write 헤드다.

HDD 헤드

0과 1을 쓰는 원리

어떻게 헤드가 지나갈 때 섹터 안에 자성이 찍힐까?

쓰기 헤드(Write Head)에는 미세하게 감긴 코일을 통해 자기장을 한 곳으로 모아주는 극소형 자기 코어가 있다. 헤드의 코일에 전류가 흐르면 전자기 유도에 의해 자기장이 생기는데, 코어가 이를 한 곳에 모아준다. 여기에 H-Bridge라는 스위치 회로가 전류의 방향을 나노초 단위로 뒤집어주면서 자기장의 극성(N/S)을 바꿔준다. 이 자기장에 의해 플래터 표면의 자성 입자들은 한 방향으로 정렬된다.

정렬되더라도 섹터 안의 자성이 서로 간섭하지 않을까?

데이터의 밀도가 높아질수록 인접한 자성 입자들 간에 영향을 주게 된다. 초기에는 수평으로 자성을 기록했지만 입자들끼리 자성이 겹쳐 데이터 손실이 일어나는 문제가 있었다고 한다. 따라서 현재는 수직 자기 기록(PMR) 방식을 사용하게 되었다. 위 사진을 보면 자성이 수평이 아닌 수직 방향으로 정렬된다. 이러면 옆 입자들 간 간섭이 줄어들고 헤드의 코어에 의해 모인 강력한 자기장만 영향을 주게 된다. 그리고 플래터 표면에는 자성 입자뿐만 아니라 그 사이에 비자성 물질도 함께 집어넣는다. 이 비자성 물질이 자성 입자들을 자기적으로 분리시킨다.

0과 1을 읽는 원리

그럼 읽기 헤드(Read Head)는 0과 1을 어떻게 읽어낼까? 처음에는 각 입자의 자성 방향을 보고 읽는다고 생각했지만 아니었다. 자성의 방향이 바뀌는 지점을 감지해서 읽는다. 아래와 같이 방향이 바뀌는 구간은 1로, 바뀌지 않는 구간은 0으로 읽는다.

HDD R/W

문제는 헤드가 읽는 건 디지털 신호가 아닌 아날로그 신호다.

이 아날로그 신호는 전기 신호 자체가 작을 뿐만 아니라, 아무리 각 섹터의 자성 입자들이 수직 자기 기록으로 정렬되었더라도, 밀집도가 높기 때문에 각 비트들의 간격이 헤드의 크기보다도 작다. 이 말은 헤드가 읽을 때 인접한 자성 입자들 여러 개가 걸치게 된다는 뜻이다.

따라서 헤드가 전기 신호를 읽기 전에는 전처리를 해줘야 한다. 먼저 작은 신호를 증폭시키고 크기도 어느 정도 맞춰준다. 신호가 약하게 들어왔다면 증폭률을 올려서 크게 만들고 신호가 강하게 들어왔다면 증폭률을 낮춰 줄여준다. 이후에는 노이즈를 제거하고 파형을 다듬는 필터링 과정을 거친다. 이후에는 ADC(Analog-to-Digital Converter)가 클럭 주기에 맞춰 아날로그 신호의 값을 측정해 샘플 값들을 추출하는데 이를 샘플링이라고 한다.

샘플링이 끝나면 마지막으로 PRML 알고리즘을 통해 여러 후보들을 비교하며 오차가 가장 적은 후보를 골라 데이터를 복원한다. 예를 들어 클럭마다 찍은 샘플 값이 [ 0.1V, 0.6V, 0.4V, -0.7V ] 처럼 나왔다면 간섭까지도 고려하는 알고리즘을 통해 원래 데이터는 0, 1, 0, 1 이었구나라고 복원하는 것이다.

자성의 방향이 바뀌는 지점을 감지해서 데이터를 읽는다면 데이터 하나가 빠지게 되는 거 아닌가? 생각이 들었다. ㅁ을 박스라고 생각해보면, ㅁ ㅁ ㅁ은 박스 3개가 있지만 그 사이 구간은 2개이기 때문이다.

왜 매 섹터마다 Preamble이 존재할까?

섹터 안에는 데이터의 시작 위치 정보 뿐만 아니라 극성의 기준점을 잡아주는 Preamble 구간이 존재한다. 이 구간에서 클럭 주기 또한 함께 동기화한다.

모든 디지털 장비엔 클럭이 있는데, 클럭은 전압의 HIGH와 LOW 상태가 일정하게 반복되는 신호를 말한다. 디지털 장비는 이 클럭 신호에 맞춰 데이터를 읽고 쓰는 것이다. 밴드에서 드럼이 흔들리면 모든 악기가 흔들리게 되는 것처럼, 클럭이 흔들리면 데이터 유실 또는 에러가 발생할 수 있다.

그런데 HDD는 CPU같은 회로 기반이 아니라 모터가 물리적으로 플래터 원판을 돌린다. 따라서 섹터의 맨 앞 구간에 10101010... 처럼 일정하게 자화 방향이 바뀌는 신호를 써놓고 헤드가 이것부터 읽으면서 박자를 미리 맞추고 데이터 구간으로 진입한다.

초당 120바퀴 정도 회전하면서 미세한 흔들림이 발생할 수 있다. 또 000000...이나 11111111...처럼 전기 신호의 변화가 없다면 읽을 때 오차가 생길 수 있다. 메트로놈을 딱 처음 3초만 들려주고 정확하게 10초를 맞추라고 하면 어려운 것처럼 말이다. 헤드가 읽는 건 나노 미터 단위이기 때문에 더더욱 오차가 생기면 안된다. 그래서 HDD는 중간 중간 데이터를 인코딩한다. 만약 데이터가 0000 0000이라면 0001이나 0101같은 패턴으로 자화 방향을 바꿔서 디스크에 자석을 배열하고, 헤드가 이 구간을 지날 때 변조된 신호를 읽어서 클럭 타이밍을 동기화한다. 이후 변조된 신호를 역산해서 원래 값으로 되돌려준다.

HDD는 물리적인 한계로 인해 외부 충격에 취약하다. 또한 모터가 플래터를 매우 빠르게 돌리기 때문에 발열과 소음이 발생한다. 또한 데이터를 처리하기 위해 매번 헤드가 움직여야 한다. 그래서 반도체 회로만으로 데이터를 읽고 쓰는 SDD가 등장했다.

SSD(Solid State Drive)를 알아보자

SSD는 플래터나 헤드같은 장치를 안 쓰는 대신 2cm22cm^2 정도 크기의 NAND 플래시 메모리 칩에 데이터를 저장한다.

NAND 플래시와 NOR 플래시

왜 NAND일까?

NAND 게이트는 NOR 게이트와 함께 범용 게이트로 불린다. NAND 게이트만으로 OR, AND, NOT 게이트를 다 만들 수 있고 모든 논리회로를 효율적으로 구성할 수 있기 때문이다. 게이트 수를 최소화해야 트랜지스터 개수도 줄이고 회로의 집적도를 높일 수 있다. 그래서 실제 회로는 거의 NAND나 NOR 게이트로 구성된다.

1988년 인텔이 속도에 초점을 맞춘 NOR 플래시 메모리를 출시했지만, 동일한 면적에 셀을 더 많이 배치할 수 있는 NAND 플래시 메모리가 주류로 자리잡게 되었다.

아래 설명도 가볍게 읽어보자.

낸드 플래시 메모리

플래시 메모리는 반도체 칩 내부의 전자회로 형태에 따라 직렬로 연결된 낸드 플래시와 병렬로 연결된 노어 플래시로 구분된다.

낸드 플래시는 용량을 늘리기 쉽고 쓰기 속도가 빠른 반면 노어 플래시는 읽기 속도가 빠른 장점을 갖고 있다. 낸드 플래시는 저장단위인 셀을 수직으로 배열하는 구조이기 때문에 좁은 면적에 많은 셀을 만들 수 있어 대용량화가 가능하다. 또한 데이터를 순차적으로 찾아가 읽기 때문에 노어 플래시보다 읽기 속도는 느리지만, 별도로 셀의 주소를 기억할 필요가 없어 쓰기속도는 훨씬 빠르다. 이처럼 낸드 플래시는 소형화, 대용량화가 가능하기 때문에 다양한 모바일 기기 및 전자제품의 저장장치로 사용되고 있다.

출처: 삼성반도체 - 낸드 플래시 메모리

이처럼 NAND 플래시는 직렬 구조다. NOR 플래시는 병렬 구조이기 때문에 모든 셀이 개별적으로 배선에 연결되어야 한다. 여러 개의 셀을 담으려면 더 많은 공간이 필요한 것이다. 이번 글에서는 NAND 플래시 메모리를 기준으로 설명한다.

SSD를 만드는 과정을 살펴보자

SSD는 수억~수십억 개의 메모리 셀이 아파트처럼 층을 이루고 있는 구조로 이루어져있다. 이를 V-NAND(Vertical NAND)라고 한다. 이 메모리 셀 하나의 크기는 20nm로 눈에 보이지 않을 정도로 작다.

NAND 플래시 메모리 - SSD

나는 처음에는 메모리 셀이 진짜 하나의 부품이라고 생각했는데 아니었다. SSD의 원리를 쉽게 이해하려면 V-NAND를 만드는 과정을 살펴보는 게 좋다.

  1. 가로 판(Word Line, 그림의 초록색 라인)을 아파트처럼 높게 쌓는다.
  2. 이후 맨 위부터 맨 아래 바닥까지 수직으로 드릴로 층을 뚫는다. 그럼 층마다 구멍이 생긴다.
  3. 구멍의 가장 겉면에 전자를 막아주는 절연막을 형성시킨다.
  4. 그 안에 전자들을 가두는 성질을 가진 질화규소 막을 만들어준다. 이걸 Charge Trap이라고 한다.
  5. 그 안에도 절연막을 칠해준다.
  6. 그 안에는 전자들이 위아래로 이동할 수 있도록 실리콘 채널을 형성한다.
  7. 남은 빈공간도 절연체로 가득 메워준다.

그래서 이 플래시 메모리를 Charge Trap Flash Memory라고도 부른다. 아래에 보이는 빨간 영역이 Charge Trap이다. 그림에서는 단면으로 표현했지만 실제로 Charge Trap이나 수직 Channel은 모두 3D 도넛 형태다.

SSD의 원리

즉, 메모리 셀은 별도의 부품이 아니라 가로판에 뚫린 구멍에 공정을 거쳐 형성된 것이라는 걸 알 수 있다. 각 판을 드릴로 뚫은, 셀들을 잇는 실리콘 채널을 통해 전자들이 위 아래로 움직일 수 있게 된다. 그리고 각 레이어가 절연막으로 감싸져 있기 때문에 SSD 컨트롤러가 걸어주는 전압이 절연막을 뚫어서 실리콘 채널에 전자들이 모이면서 길이 열리기도 하고, 전압이 채널까지 공급되지 못해 지나갈 수 없게 되기도 한다. 지난 글에서 순수한 실리콘은 전기가 쉽게 흐를 수 없다고 했던 내용을 떠올려보자.

실리콘 채널의 맨 아래에는 전자가 각 채널로 들어갈 수 있도록 제어하는 트랜지스터 스위치가 있다. 이 스위치를 이은 라인을 소스 셀렉트 라인(Source Select Line)이라고 하며, 채널 가장 꼭대기의 구멍들을 연결한 라인을 비트 라인(Bit Line)이라고 한다. 이 비트라인에 전자가 도달했는지 여부를 검사해 0과 1을 판별한다. 아래에서 자세히 설명한다.

0과 1을 쓰는 원리: 인간은 개똑똑하다

만약 5층 3열의 메모리 셀에 0을 쓰려면 어떻게 해야 할까?

유튜브 영상만으로는 잘 이해가 안됐는데 제미나이랑 계속 티키타카를 하면서 이해할 수 있었다. 이해하고나서 든 생각은 인간은 진짜 천재적이란 생각이 들었다.

기억할 내용

  • 전자는 - 성질을 띠고 있으므로 자신보다 + 전압이 훨씬 높은 쪽으로 빨려간다. 그러므로 전위차가 크다는 말은 결국 전자를 끌어당기는 + 성질이 크다는 뜻이다.
  • 가로판인 Word Line은 1층, 2층, .. 5층, 10층과 같이 층으로 생각할 수 있다.
  • 실리콘은 기본적으로는 전류가 잘 흐르지 않는 물질이다.

5층 3열에 0 또는 1을 기록하는 원리

  • 구조 상 SSD의 Word Line(가로 줄)은 하나의 통판으로 만들어진다. 따라서 Word Line 한 행에 10V를 걸면 모든 열에 10V가 공유된다.
  • 이때 전자를 5층으로 이동시키려면 SSD 컨트롤러는 5층 Word LIne에 20V의 고전압을 걸고, 중간에 이 전하가 지나갈 수 있는 통로를 열기 위해 아래 층들에도 10V 전압을 걸어준다. (실리콘으로 형성된 수직 채널에 전자가 지나갈 수 있어야 하므로)
  • 그런데 이때 3열의 입구는 전압을 0V로 낮춰버린다. 3열의 입구 또한 10V로 하면 주변과 전압이 같기 때문에 전위차가 없으므로 전자가 이동을 하지 않기 때문이다.
  • 그래도 5층 Word Line에는 20V 전압이 걸려 있으니 이동을 할 수 있지 않을까? 라는 생각이 들었다.
  • 하지만 물리적으로 막혀버린다. 각 열의 바닥에는 스위치가 존재하는데(MOSFET 트랜지스터), 이 바닥 스위치에 0V를 걸면 스위치가 열리고, 10V를 걸면 닫혀버린다.
  • 따라서 10V가 걸려있다면 물리적으로도 전자가 이동할 수 없다.
  • 5층까지 이동하면 전압으로 인해 절연체를 뚫고 전자가 Charge Trap이라는 공간에 들어간다. Charge Trap은 절연체로 덮여있어 고전압을 받지 않는 이상 들어올 수 없다.

0보다 1을 쓰는 게 더 빡세다

지금까지는 0을 쓰는 방법을 알아봤다. 그럼 1은 어떻게 쓸까?

간단하다! 전압을 반대로 걸면 된다. 컨트롤 게이트에 0V를 걸어주고, 바닥에 20V를 걸어주면 Charge Trap에 있던 전자들이 밖으로 밀려나게 되기 때문이다. 하지만 여기서 구조적인 문제가 있다. SSD의 Word Line은 하나의 통판으로 만들어져서 전압이 공유되므로 해당 Word Line의 모든 행이 1이 되어버리는 것이다.

실제로 수천~수만 개의 셀이 모여 있는 블록 전체가 1로 초기화되며, 0이 들어가야 하는 위치에만 아까 살펴본 과정을 적용해 0을 채워넣는다. 따라서 SSD와 플래시 메모리는 항상 1을 기준으로 초기화 시켜놓고 필요한 곳에 0을 넣는다. 이를 반도체 용어로 Program-Erase(P/E) Cycle이라고 한다.

0과 1을 읽는 원리

그럼 0과 1은 어떻게 판단할까?

기본적인 컨셉은 이렇다. 만약 V-NAND 5층에 있는 데이터를 읽으려고 한다면 5층에 확인용 전압을 2V 정도로 살짝만 걸어서 전자가 5층을 통과해서 0과 1 판별 센서가 있는 꼭대기 10층까지 도달할 수 있는지 없는지 여부로 0과 1을 판별한다.

전자가 꼭대기 층에 도달하기 위해서는 기본적으로 1-4층과 6-10층은 통로가 되어야 한다. 따라서 이 층들에는 SSD 컨트롤러가 6V 정도의 전압을 걸어준다. 그래야 전자를 끌어올릴 수 있기 때문이다. 반도체에서는 이걸 치트키 전압(Pass Voltage)이라고 한다.

만약 Charge Trap에 전자가 없는 상태라면 이 전압이 중간에 상쇄되지 않고 바닥 스위치까지 전달되어 스위치가 열리게 된다. 그래서 전자가 맨 꼭대기의 센서까지 쭉 올라가 1으로 판별된다.

하지만 Charge Trap에 전자가 가득하다면 바닥 스위치로 전달되는 힘이 상쇄되어 1-4층까지는 잘 올라왔지만 5층에서 막히게 되어 꼭대기 층까지 전자가 이동하지 못하므로 0으로 판별된다.

마치며

이번 글은 틈틈히 공부하면서 쓰느라 거의 3주가 걸렸다. 개인적으로 클로드를 못쓰고 있는 상황이라 해외 유튜브 영상과 글, 제미나이 등 이것저것 참고했다. 영상에서 원리를 깊게 다루지 않아서 막상 쉽게 쓰려고 하니 찾아볼 게 꽤 많았는데, 나름 낭만 있었다. 앞으로도 블로그 글만큼은 AI를 돌리지 않고 직접 쓰려고 한다.

특히 NAND 플래시 메모리 구조를 이해하면서 '이런 설계를 할 수 있구나..'라는 걸 간접적으로나마 배울 수 있어서 너무 재밌었다.

HDD와 SSD는 매우 복잡한 기술이다. 모든 과정을 이해하는 건 거의 불가능하기 때문에 많은 내용이 빠져있지만, 최대한 정확하게 설명하려고 노력했다. HDD와 SSD의 원리가 궁금한 분들에게 도움이 되길 바란다. 부족한 설명이나 틀린 내용이 있다면 언제든 피드백 주시면 감사하겠다!

레퍼런스