비메모리(프로세서)와 메모리
- 프로세서: 명령어를 실행해주는 장치. 메모리에서 데이터가 오면 계산을 해서 다시 메모리에 보내준다. 이렇게 데이터간 이동이 빈번하다. 최근에는 메모리와 프로세스를 하나의 장치로 만드는 기술도 생기고 있다고.
- 메모리: 우리가 앞으로 배울 장치. 대표적으로 4가지 SRMA, SSD, DRAM, HDD가 있고 최근에는 PCM, STT-MRAM, DNA, glass 등등 메모리를 저장하는 새로운 장치들을 찾고 있다한다.
메모리간 분류
휘발성
메모리상 데이터가 증발하는지 않하는지로 메모리 종류를 나눌 수 있다.
- 휘발성: SRAM, DRAM로 주로 메모리라 부른다. SRAM은 캐쉬, DRAM은 메인 메모리라 부르기도 한다.
- 비휘발성: SSD, HDD로 주로 스토리지라 부른다. HDD는 실제로 arm이 있어 돌아가는 판을 읽는다. SSD는 반대로 모두 전자식이라 한다.
속도와 비용
기기를 만드는 기술의 고유 특징에 따라 속도와 비용이 다르다.
속도는 SRAM, DRAM, SSD, HDD 순으로 빠르고, 비용은 HDD, SSD, DRAM, SRAM 순으로 크다.
HDD는 큰 메모리를 가지지만, 속도가 너무 느려 cpu에서 바로 데이터를 가져 올 수 없다.
메모리/저장소 계층 구조
cpu(프로세서)와 직접 데이터를 주고 받는 메모리는 SRAM이다. 다른 메모리/저장소와는 일절 연결이 없다. 이때, SRAM에 데이터가 모두 담기지 않고 HDD 데이터의 일부만 SRAM에 올라와있다. cpu가 보기에는 엄청 큰 메모리와 작업하는 듯 하도록 한다.
이렇게 계층 구조를 만든 이유는 시스템의 속도를 위해서다.
SSD 구조
크게 4가지로 볼 수 있다.
- Host-storage interface: 물리적/논리적으로 host와 SSD를 연결한다.
- NAND flash chips (packages): SSD에서 실제로 데이터가 저장되는 메모리다. 그래서 학술적으로는 flash 기반의 SSD라고 부른다고 한다. flash는 channel로 연결되어 한 channel당 2개로 묶이기도 한다.
I/O가 Host-storage interface로 들어오면 SSD 내부 channel을 타고 flash로 간다. 반대도 마찬가지.
- SSD controller: SSD를 컨트롤 하는 부분으로 내부에 Processor, Buffer manager, Flash controller가 들어있다.
Flash controller의 경우 flash는 회사마다 다르게 만들어 그 연결을 맞춰주기 위해 필요하다.
- DRAM: I/O 데이터가 임시적으로 머무는 버퍼의 역할과 SSD의 특별한 소프트웨어가 구동될 수 있는 메모리 역할을 해준다. 이 DRAM을 SSD에 넣는다면 가격이 비싸진다고 한다.
NAND Flash Chip (Package)
- 초기에는 2D로 하나의 층만 있었다면, 지금은 몇 나노미터로 되어있는 레이어가 층층이 쌓여 있다.
- 하나의 Block안에는 수백의 Page가 있고, 다시 하나의 Page에는 4KB에서 32KB에 달하는 Cell이 있다.
- 읽고 쓰는 최소 단위는 Page다. 이게 매우 중요하니 기억하자.
- 하나의 Cell은 한 bit를 저장하면 SLC(Single-Level Cell), 두 bit를 저장하면 (Multi-Level Cell), 세 bit를 저장하면 (Triple-Level Cell)이라 부른다. 비트 수는 전하량으로 정한다.
Host-Storage Interface
연결 방법은 크게 2가지로 물리적 연결과 프로토콜이 있다.
- 물리적 연결: SAS와 SATA는 전통적인 방법으로 지금도 사용이 된다.
PCIe는 새로 등장한 방법으로 하나의 줄은 초당 1G의 데이터를 보낼 수 있다. 하나의 PCIe는 보통 16개의 줄이 있으니 무려 초당 16G를 보낼 수 있는 격.
물론, SATA와 PCIe는 SSD 기술과 상관없는 기술이지만, 속도에 따라 SSD의 성능이 달라진다.
- 프로토콜: 통신을 위해서는 정해진 프로토콜이 필요하다. 어떤 경로로 어떻게 데이터를 보낼지를 먼저 정의해야 한다. 그 정의대로 시스템은 움직인다.
AHCI는 SATA가 어떻게 작동할지 약속의 집합체를 부르는 명칭이다.
NVMe는 최근 나온 PCIe에 최적화된 프로토콜로 PCIe를 만드는 회사마다 다르다. 하지만 약속은 되어있으며 이를 스펙이라 부른다.
SSD Controller + DRAM
- SSD에서 돌아가는 특별한 스프트웨어. 데이터가 저장되고 써지는 방식이 flash와 HDD가 서로 달라 필요하다.
우선 새로운 데이터가 들어와 빈 자리에 써지는 방식은 flash와 HDD가 동일하다. 하지만, 새로운 데이터, 주로 업데이트 된 데이터, 를 쓰기 위해 기존에 있던 옛 데이터를 처리하는 방식은 서로 다르다. HDD는 그냥 덮어 씌우지만, flash는 구조상 덮어 씌우지 못하고 지워야 한다.
이때 Host 입장에서는 데이터가 써지는 메모리가 flash인지, HDD인지 알고 싶지 않고 그냥 I/O 명령을 보내고 싶다. 이때 Host와 메모리를 연결해주는 기기가 FTL. FTL은 Host에게 HDD인지 SSD인지 상관말고 그냥 데이터를 던지라고 한다. FTL은 HDD와 SSD의 서로 다른 특징을 가려주는 역할을 해준다.
- DRAM은 I/O가 이동하기 전의 버퍼 역할과 FTL이 돌아가도록 메모리 역할을 해주는 것이다.
- Flash Controller은 DRAM과 flash 사이 연결을 도와준다.
데이터 저장 방식
Flash Chip Architecture
다시 flash 메모리로 돌아가보자. 이전에 block, page, cell을 언급했는데, 단위는 더 있다.
- 하나의 Chip 안에는 1~4개의 plane이 있다.
- 하나의 plane 안에는 수천개의 block이 있다.
- 하나의 block 안에는 수백개의 page가 있다.
- 하나의 page 안에는 수십개에서 수백개의 cell이 있다.
Chip > Plane > Block > Page > Cell
SSD의 크기는 "Chip의 개수" * "Chip의 크기"로 알 수 있고 그 아래 단위도 동일하게 구할 수 있다.
Over-Provisioning(OP) Space
우리가 사용하는 SSD는 실제로 전체 용량을 사용하지 않는다.
SSD를 만들면 OP라는 빈공간이 있고 이 부분은 유저 입장에서는 쓰지 못한다. 128G의 SSD 용량에서 7%를 OP로 남기고 남은 120G를 유저가 사용할 수 있다.
그렇다면 왜 비우는가. OP 공간이 클수록 SSD 성능과 수명이 커진다. 하지만, 제조사 입장에서는 크게 잡을 수록 생산 단가가 올라가 OP를 적게 잡으며 성능을 올리는 방법을 연구한다고.
SSD 명령들
크게 3가지. read, write(program), erase. 더 있지만 이 정도만 배울 것이라고. write가 program이라 불리는 이유는 저장 방식이 전하를 사용해서라 한다. (자세히는 모르겠다.)
여기서 중요한 점은, read와 write는 page 단위이지만, erase는 block 단위라는 것. 중요하니 기억하자.
Write (Program) Operation
- 기존에 있던 값이 업데이트 되면 HDD는 그냥 덮어 씌운다. 하지만 SSD는 덮어 씌우지 못한다. 그래서 기존 데이터를 지우고 써야하지만, 이때 erase는 block 단위임을 기억하자. 지우려면 다른 page들도 다 지워야 한다.
- 그래서 지우는 방식이 아닌, 빈 공간에 업데이트 된 값을 쓰고, 이전 값은 상태 표시를 invalid로 합니다. Block에 invalid만 남아 있다면 그때 erase로 block 단위로 지웁니다.
- block 단위로 지우는 상황에서 어떨 때는 문제가 생길 수 있는데, 새로운 데이터를 쓰기 위해 block을 지워야 하는데, 모든 block들에 valid 데이터가 있을 경우다. 이럴 때 이 데이터를 다른 block으로 옮겨준다.