서울대학교 컴퓨터공학과 김진수 교수님의 "고급 운영체제" 강의를 필기한 내용입니다.
다소 잘못된 내용과 구어적 표현 이 포함되어 있을 수 있습니다.
Flash Memory Basics
Floating-gate MOSFET
- 원래 트랜지스터라는 것이 말이여
- Source 에서 Drain 으로 전류가 흘러야 하는데 이것이
- Gate 에 전압을 걸어줄 때만 흐른다 이거여
- 근데 이 트랜지스터의 gate 위에 Control Gate (CG) 놈을 하나 더 올려서 기존의 gate 를 중간에 샌드위치시켜버린 것이 Floating-gate MOSFET (FGMOS) 랜다.
- 이 샌드위치 gate 를 Floating Gate (FG) 라고 한다.
- 이놈의 특징은
- Source, Drain (사진에서는 Bit) 과 CG 어떻게 잘 전압을 걸어주면 이 FG 에 전자가 갇히게 되고,
- 전자가 갇혀있을 때에는 더 CG 높은 전압을 걸어줘야 Source 와 Drain 사이에 전류가 흐르게 된다.
- 그럼 이 특징에 대해 좀 더 자세히 알아보며 실제로 데이터를 어떻게 저장하는지 알아보자.
그리고 그것을 활용한 NAND flash memory
Programming (Write)
- 이 FG에 전자를 채움으로써 데이터를 저장하게 된다.
- 채워져 있는 것이
0
, 비워져 있는 것이1
. - 왜 비워져 있는 것이
1
이지? 라고 생각할 수 있는데, 아래에서 설명하는 것처럼 전류가 흐르느냐의 유무로0
과1
을 판단하기 때문이다. - 즉, sensing 을 하면 비워져 있는 경우에 전류가 흐르므로
1
이 되는 것.
- 채워져 있는 것이
- CG 에 적당한 전압을 걸어주고 Source 와 Drain 에도 전압을 걸어주면 전류가 흐른다고 했자나?
- 근데 이때 Source 와 Drain 에 전압차를 크게 걸어주게 되면 전류가 이 FG 전자가 으로 튀어올라 갇히게 된다.
- 이렇게 전자를 가둬서 cell 의 상태를
0
으로 만들게 된다.
Sensing (Read)
- 일단 Source 와 Drain 에 적당한 전압차를 걸어주고
- 비어있을 때와 전자가 채워져 있을 때의 Vth 중간 값을 CG 에 걸어주게 되면 비어있는 cell 은 전류가 흐를 것이고 채워져 있는 cell 은 전류가 흐르지 않을 것이여.
- 그럼 이 전류가 흐르냐 안흐르냐를 sensing 하면 해당 cell 에 저장되어 있는 값을 읽을 수 있게 된다.
Erasing
- Erase 한다는 것은 cell 을 다시
1
로 바꾸는 것을 말한다. - 이때는 CG 와 Source 간의 전압차를 크게 걸어주면 뭔 Fowler-Nordheim tunneling 이라는 현상 때문에 FG 에 있던 전자가 방출된다고 한다.
- 이 원리로 다시
1
로 바꾸게 되는 것.
Page, Block
- page 단위 r/w, block 단위 erase - 알고계시죠?
- 처음에는 page 를 disk sector 사이즈로 맞춰 512byte 였지만 요즘은 4k 등으로 한댄다
- 그리고 요즘은 block 안에 page 를 수백개를 넣어서 block 은 Mb 단위라고 한다
- page 에는 spare area 를 둬서 ECC 혹은 metadata 를 저장한다고 하더라
- Plane: block 들이 수직으로 배치되고, 맨 아래 register 가 있어서 여기에 있던 내용이 block 의 page 로 program 되거나 그 반대로 sensing 된다.
- 이 단위를 plane 이라고 하는 것.
- 요즘은 이 plane 도 여러개 둬서 한번에 여러개의 page 가 r/w 된다고 한다
- 그리고 뭐 Plane 이 모여 Die 가 되고
- Die 도 모여 chip 이 된다
- 뭐 SLC, MLC, TLC, QLC 뭔지 다 아시죠?
- 다만 sensing Vth 를 한개 둬서 SLC 되고 두개 둬서 MLC 되고 이렇게 된다는 것
- 그리고 전에 창민형이 말한 것처럼 sensing Vth 들 간의 간격이 시간이 갈수록 점점 좁아지기 때문에 QLC 로 갈수록 수명이 짧아진다.
- 3D NAND (V-NAND)
- 이전에는 NAND 들을 평면상에 직렬로 연결시켰는데
- 이 기술은 이 평면을 수직으로 세워서 층을 가지게 되었음
- 삼성에서 처음으로 만들었다고 한다
Garbage Collection
- Erase-before-write: “가장 아름다운 글씨를 쓰기 위해서는 우선 가장 깨끗한 종이가 필요하다.”
- Cell 의 상태가
1
이어야0
으로 write 할 수 있기 때문에, overwrite (in-place update) 가 안되고, 우선 먼저 erase를 해야 한다.
- Cell 의 상태가
- 근데 이 erase 는 block 단위로 수행되기에, 우선 block 내의 valid data 를 딴 곳으로 옮겨야 하는데, 이것을 Garbase Collection (GC) 라고 하더라..
- 이 GC 는 항상 문제가 된다; 기존에 있던 valid data 를 옮겨야 하기 때문에
- 이 오버헤드때문에 성능하락이 있고
- Flash 의 수명 (뒤에서 설명할 P/E cycle limit) 도 짧아 진다.
여기부터는
2024-03-28
강의
PECycle, Wear Leveling, Hot/Cold separation
- 일단 데이터는 hot/cold 가 존재한다 (hot: 자주 변경되는 데이터, cold: 그렇지 않은 것)
- Hot data 는 fs 의 metadata, dbms 의 table 등
- Cold data 는 image, video 등
- Flash NAND 는 program 과 erase 를 무한정 할 수 있는 것이 아니고, 수명이 존재한다.
- 이것을 Program/Erase Cycle (P/E Cycle) 이라 한다,, 아시죠?
- 이 P/ECycle 을 고르게 분배하기 위해 (즉, 일부만 수명이 다하는 것을 방지하기 위해) Wear leveling 이라는 것을 한다.
- P/ECycle 이 높은 block (old) 에는 cold 를 넣어서 속도를 늦추고
- 낮은 block (young) 에는 hot 을 넣어서 old 와 P/ECycle 수준을 비슷하게 맞춤
- 그리고 이렇게 냅두게 되면 나중에는 young 이 old 가 되고 old 가 young 으로 바뀌게 되니까 (상대적으로) 그때 다시 swap 을 해서 pecycle 이 골고루 차게끔
- 또한 어떤 블럭은 선천적으로 수명이 약한게 있어서 이런것도 Wear leveling 에 고려한다더라.
RW Latency
- HW 적인 측면에서 보자면 read 보다 write 가 더 느리다.
- 보통 DRAM 으로 이것을 해결한다.
- SSD 에서 DRAM 에만 들어가면 write 가 완료됐다고 보고, DRAM 에 있는 데이터를 background 로 실제로 write 하는 것
- DRAM 에 있다가 전원이 나가서 데이터가 손실되는 것은 어쩔 수 없다
- 그래서 완전히 저장되는 것을 보장받고 싶으면 commit? flush? 같은 별도의 명령어를 사용해라
- 따라서 host level 에서 속도 측정을 해보면 write 가 더 속도가 잘나온다
- Read 는 flash -> DRAM -> host 순서지만
- Write 는 host -> DRAM 까지만 이기 때문
MLC Programming
- MLC 부터는 셀 하나에 여러개의 비트가 저장되는데
- 이 저장된 비트들이 하나의 page 에 들어간다고 생각하기 쉽지만 실제로는 그렇지 않다.
- MLC 기준으로, 2개의 page 각각의 한 bit (따라서 도합 2bit) 가 하나의 cell 에 들어가는 것.
- 즉, 하나의 cell line (Word) 에는 MLC 기준 2개의 page 가 저장된다.
- Cell 의 bit 는 가로방향이 아니라 세로방향이다 라고 비유할 수 있는 것.
- 대강 이런식으로 단계적으로 program 한다고 한다.
- Cell 하나의 두 bit 중 왼쪽을 Least Significant Bit (LSB), 오른쪽을 Most Significant Bit (MSB) 라고 할 때
- 물론 MSB, LSB 정의가 오른쪽 왼쪽은 아니겠지만 일단 넘어가부러
- 첫 단계에서는 LSB 를 program 한다: 0 을 program 할 경우 가 를 넘어가도록 전자를 채움.
- 두번째에서는 MSB 를 program 한다: 현재의 에서 쬐끔만 전자를 채워 미세 조정을 한다.
- 만약 LSB 가 1 이고 MSB 에 0 을 program 하고 싶다면, 를 는 넘어가도록 하되 은 안넘어가게 쬐끔만 채우고
- LSB 가 0 이고 MSB 에 0 을 program 하고 싶다면, 가 (즉, 이전에 LSB program 할때는 이었던) 에서 로 움직이도록 쬐끔만 채우는 식
- Cell 하나의 두 bit 중 왼쪽을 Least Significant Bit (LSB), 오른쪽을 Most Significant Bit (MSB) 라고 할 때
- 따라서 첫번째 페이지를 쓸 때에보다 두번째 페이지를 쓸 때 를 미세조정해야 하기 때문에 조금 더 오래걸린다고 한다.
- 위 그래프 보면 오잉진짜네 소리가 나옴
- TLC 에서는 이것에 대한 방안으로 page 3개를 DRAM 에 모았다가 (3bit/cell) 이것이 정해지면 그때 한번에 program 을 하면서 한번에 Vth 를 옮기는 one-shot programming 기법을 사용하기도 한다고 한다.
ECC
#draft Record
28'
- bit 가 깨질 것이 당연하다고 생각, ECC 가 spare area 에 들어간다.
- Data area 를 512byte 단위로 쪼갠 다음, (8개) 이것 각각에 대한 ECC 를 spare area 에 넣어놓은다
- 위 그림 보면 이해 된다; ECC 코드 크기 정보도 아래 그림 보고 참고하자
Concerns on Flash NAND
Reliability
- Write disturbance; write 하기 위해서는 에 높은 전압을 걸기 떄문에 아무리 해당 word 에만 전류를 걸어준다 하더라도 주변 cell 들이 영향을 받는다
- Read disturbance 의 경우에도 비슷하다; 맨 아래에서 sensing 을 하기 위해 모두 전압을 걸어 전류가 흐르는지 봐야 하고, 이 과정에서 다른 cell 들이 영향을 받는다
- Retension error: 전자를 넣어서 write 를 했을 때, 아무짓도 안하고 그냥 냅둬도 전자들이 슬슬 도망치면서 데이터가 깨지는 경우가 있더라
- 이것을 방지하기 위해서는
- 구매한지 얼마 안돼서 floating gate 가 튼튼한 SSD 를 사용하거나
- 사용하지 않더라도 power 를 넣어둔 상태로 유지 (background job 을 돌아가게 해서 이러한 retension error 를 방지하는 것)
- Bad block
- 반도체 제조 공정부터 100% 에러가 없을 수는 없다.
- 그래서 문제 가 있는 block 을 bad block 이라 하고, 얘네들은 마킹해 뒀다가 firmware 에서 제외시킨다.
- 제조단계 (선천적) 에서가 아닌, 사용중 (후천적) 으로 이런 Bad block 이 날 수도 있다고 한다 (Runtime Bad-block)
Page programming constraints
- Number of Partial-page (NOP)
- page 의 일부만 사용하고 일부는 사용하지 않은 경우 남은 일부분을 사용하자
- 종류 (SLC, MLC, TLC) 에 따라 저 “일부” 가 정해진다고 하는데
- 근데 page 가 깨질 염려가 있어 이제 이 방법은 사용하지 못하도록 제한했다고 한다.
- Sequential page program
- Page 는 block 내에서 순서대로 program 되어야 한다.
- 즉, block 내 중간중간에 program 하지는 못한다는 소리.
- SLC Mode
- LSB 만 사용하도록 해서 MLC 를 SLC 처럼 쓰기도 한다고 한다.
- 중요한 데이터 보관용
Pros/cons for NAND flash
- 장점은
- 작고 빠르고 저렴하고 전력소모도 적고
- 단점은
- 뭐 overwrite 가 안되거나 erase 단위가 program 단위보다 더 큰 등의 특징들에서 오는 오버헤드들
- 예를 들면 WAF 같은거
- Flash 의 단점들을 커버하기 위해 firmware/FTL 이 필요하고 이것은 성능에 아주 중요한 영향을 미친다.