NAND page를 작은 조각으로 계속 덧쓰면 왜 안 될까
NAND의 지워진 bit를 1에서 0으로 program할 수 있으니, page의 빈 부분을 조금씩 채워도 괜찮을까. 전기적으로 가능한 방향을 아는 것만으로 command가 허용되는지는 결정할 수 없다. Partial Page Program에는 page당 program 횟수, 순서와 ECC 단위 같은 조건이 붙는다.
특히 cache에 data를 여러 번 입력하는 것과 array의 같은 page를 여러 번 program하는 것은 다른 작업이다. 이 둘을 구분하지 않으면 serial 입력 기능을 무제한 덧쓰기 기능으로 오해하기 쉽다.
byte 위치를 지정할 수 있다는 뜻부터 읽기
Alliance Memory SPI NAND Rev.1.0의 6절 Program Operations은 Program Load가 column에서 data를 cache에 넣고, Program Execute가 지정 row의 array에 기록하는 순서를 설명한다. 같은 문서의 10.2절 parameter table에서 byte 110, Number of programs per page는 01h다.
이 수치는 해당 부품의 page당 program 제한을 확인하는 직접적인 근거다. 32byte만 전달했으니 page program을 32/2048회만 사용했다고 셀 수는 없다. 한 번 execute한 뒤 같은 page에 두 번째 execute를 하는 허용 여부를 byte 수로 나누어 판단하지 않는다.
다른 NAND에서 여러 partial program을 허용할 수 있어도 그 횟수와 ECC 조건을 해당 문서에서 확인해야 한다. 이 제품의 한 번이라는 조건을 모든 NAND에 확대하거나, 다른 제품의 네 번이라는 숫자를 가져오는 것 모두 부정확하다.
data의 1→0만 확인하면 놓치는 부분
작은 ECC를 대신하는 원리 예로 4bit data와 even parity 한 bit를 생각하자. data 1100에는 1이 두 개이므로 parity는 0이다. 다음에 data의 한 bit를 더 내려 1000으로 바꾸면 1이 한 개가 되어 새 parity는 1이어야 한다.
data 자체는 1100→1000이라는 1→0 변경뿐이다. 그러나 전체 record는 parity 0→1을 요구한다. 이미 program된 같은 위치에서 erase 없이 이 변화를 만든다고 가정하면 저장 방식과 맞지 않는다.
이는 실제 NAND의 BCH나 LDPC code가 아니라, 좁은 data 영역의 허용 방향이 보호 정보 전체의 허용 방향과 같지 않음을 보이는 가상 parity 예다. 실제 ECC parity는 더 많은 data bits와 연결되며, 한 codeword의 일부만 바꾸어도 parity 여러 bits의 재계산이 필요할 수 있다.
이미 기록한 page의 남은 1 bits가 모두 앞으로 자유롭게 쓸 수 있는 공간이라는 해석도 위험하다. codeword 단위와 기존 ECC 정보, program 횟수를 먼저 확인해야 한다.
cache에서 여러 조각을 합치는 것은 별도 경로다
host가 32byte씩 여러 조각을 만들었다면 volatile buffer에서 최종 page image를 준비하고, 허용된 한 번의 array program으로 내보내는 방식을 생각할 수 있다. 여기서 조각 수와 execute 횟수는 같지 않다.
이 datasheet의 일반 PAGE PROGRAM sequence에서는 Program Load를 한 번만 사용하도록 정해져 있다. 여러 일반 load command로 cache가 알아서 원하는 조각을 유지한다고 가정할 수 없다.
7절은 별도의 Internal Data Move sequence에서 read-to-cache 뒤 Program Load Random Data를 여러 번 사용할 수 있다고 설명한다. 그 기능은 정해진 sequence와 대상 조건을 갖는다. 이를 읽고 모든 write 경로에서 임의 partial load·execute를 반복해도 된다고 해석하면 범위를 벗어난다. 새로운 대상 page와 기존 page의 재program도 구분해야 한다.
작은 업데이트를 저장하는 비용
예를 들어 application이 16byte counter를 자주 바꾸지만 저장 단위는 2048byte page라고 하자. 새로운 record를 매번 새 page에 기록한다면 main data program량만 2048/16=128배다. 이는 가상 layout의 수량 계산이며 실제 SSD 전체 write amplification 측정값은 아니다.
여러 업데이트를 buffer에 모으면 이 비율을 줄일 수 있지만, buffer의 data를 언제 비휘발성 완료로 인정할지 정해야 한다. 다른 선택은 새로운 record를 append하고 최신 유효 record를 찾는 format이다. 어느 방식이든 page당 제한과 recovery 조건을 피해 갈 수 있는 무료 경로는 없다.
program pulse를 다시 가하는 동작은 셀의 상태와 주변 stress에도 영향을 줄 수 있다. 명령이 원하는 bits를 받아들였고 한 번 읽혔다는 사실만으로 vendor의 누적 program 조건을 대체하지 않는다.
Partial Page Program의 허용 범위는 “1을 0으로 바꿀 수 있다”보다 좁을 수 있다. cache 입력 횟수·array execute 횟수·ECC record의 갱신을 따로 세면, 작은 byte들을 계속 덧쓰는 방식이 왜 유효한 NAND 저장 format이 아닐 수 있는지 드러난다.