NANDフラッシュは不揮発性記憶媒体であり、一般的なUSBフラッシュドライブ、TFカード/SDカード、およびほとんどのSSDはNANDフラッシュで構成されています。この記事では、その構成と動作原理について説明します。
以下では、説明の便宜上、NANDフラッシュのみを指します。
Flash基本構成単位: SLC/MLC/TLC
例えばSLCの場合、トランジスタ内の電子数が50%未満で1、50%以上で0を表します。
SLCは電子の数を一次的に定量化するものなので、トランジスタは0と1の2つの状態を表すことができます。トランジスタ内の電子の数を二次的に定量化すると、トランジスタは4つの状態を表すことができます。
もちろん、トランジスタ内の電子数を3次的に定量化することも可能で、1つのトランジスタで000、001、010、011、100、101、110、111の8つの状態を表現することができます。
言い換えれば、量子化レベルが高いほど、トランジスタが表現できる状態が多くなり、記憶密度が高くなり、同じ数の記憶ユニットからなる記憶媒体の記憶容量が高くなります。
上図のように、トランジスタはバケツに、トランジスタ内の電子は水に例えることができます:
- NANDフラッシュの寿命は、使用されているメモリセルの種類に大きく影響され、1つのトランジスタに格納される状態が多いほど耐障害性が低くなり、寿命が短くなります。1つのトランジスタに保存される状態が多ければ多いほど、耐障害性は低くなり、寿命は短くなります。
フラッシュの性能と寿命に及ぼすさまざまなコンポーネント・ユニットの影響
上記の原理からわかるように、SLC、MLC、TLCは性能と寿命が低下し、ストレージ密度が高くなっています。具体的なデータを示します:
上の写真でおわかりのように:
- 各セルで表現されるビット数が増加するにつれて、消費される読み出し、書き込み、消去時間も増加します。
- SLCであろうとMCLであろうとTLCであろうと、消去時間は読み書き時間よりはるかに長い。
- SLCの消去・書き込み可能回数はMLCやTLCよりはるかに多く、これは長寿命を意味します。
- SLCは1トランジスタあたり1ビットしか表現できず、記憶密度の点で最も低く、TLCは記憶密度が最も高く、MLCはその次に高い。
全体として、SLCはパフォーマンス、寿命、安定性の点でMLCより優れており、もちろんより高価です。
Flashの構造と特徴
Flash
フラッシュにはいくつかの基本的な概念があります:パッケージ、ダイ、プレーン、ブロック、ページ(ページは、セクタ内の通常のハードディスクHDDに対応し、つまり、しばしばセクターと呼ばれる)。以下は、大きなものから小さなものまで分解した概略図です:
- パッケージはメモリチップで、SSDやSDカードを分解した後に見えるNANDフラッシュ粒子です。
- 各パッケージには1つ以上のダイが含まれており、ダイは独立してコマンドを実行し、ステータスを報告することができる最小のユニットです。
- 各ダイには1つまたは複数のプレーンが含まれており、いくつかの制限はありますが、異なるプレーン同士を同時に動作させることができます。
- 各プレーンには複数のブロック*があり、ブロックは最小の消去単位です。
- 各ブロックは複数のページを含み、ページは最小の読み書き単位です。
ここに注目すべき点があります:
- 読み書きの操作はページ単位で行われ、通常は512バイトまたは2KBです。
- 消去対象は、通常32ページまたは64ページを含むブロックです。
- 各ブロックは、書き込む前に消去する必要があります。
- ブロックを消去する前に、このブロック上のすべてのページに有効なデータが含まれていないことを確認する必要があります。
Program/Erase Cycles
Flashにはもうひとつ重要な特徴があります。Flashは更新操作をサポートしていません。厳密に言えば、インプレース更新をサポートしていないはずです。もし、あるページにすでにデータを書き込んでいて、そのページの内容を変更したい場合、次の方法でしかできません:
- このページが属するブロックのすべてのデータを最初に読み出します。
- 次に、対応するページの内容を変更します。
- 次に、ブロック全体を消します。
- 次に、ブロック全体を消去します。
フラッシュ・チップ上でブロックを消去できる回数は制限されており、消去可能な最大回数はPEサイクルと呼ばれます。上記の方法でインプレース更新を行うと、フラッシュは簡単に使い切ってしまいます。妥協案としては、次の図のように、新しいデータを新しいページに書き込み、元のページを無効としてマークする方法があります:
そうすることで、別の問題が生じます:
- データが掲載されているページが変更されました。
- 無効なページがリサイクルされるのはどのような場合ですか?
- フラッシュ全体の消去バランスを確保するための新しいページの選択方法
次のFTLは上記の問題を解決します。注意しなければならないのは、**消去にかかる時間は読み書きにかかる時間よりもはるかに大きく、関連するロジックをうまく処理しないとパフォーマンスに影響が出るということです。**FTLには多くの最適化アルゴリズムがあります。
ブランク・ページが1111 1111のようにすべて1だとすると、書き込み操作によって一部のビットを1から0に変更できるだけで、0を1に変更することはできません。
論理アドレスマッピング
論理アドレスマッピングは、NANDフラッシュが登場する以前から存在し、物理ブロックアドレス(PBA)の詳細をファイルシステムの上位層から保護し、アドレッシングをよりシンプルで柔軟にするために設計されました。
以下は、論理アドレスと物理アドレスのマッピングの概略図です:
このマッピングの欠点は、FTL 内で多数のマッピング関係が維持されることですが、利点は管理が容易なことです。
実際には、以下のようなブロック間のマッピングが一般的です:
ブロック間マッピングは、下図のように、マッピング関係を維持する数が少なく、記憶領域を節約できるという利点がある反面、データ更新時に手間がかかるという欠点があります:
- ステップ2 最初の2ページのデータを更新するには:まず新しいデータを新しいブロックに書き込み、元のブロックの対応するページは無効としてマークされます。
- ステップ3 次の2ページを元のブロックから新しいブロックに移動します。
- ステップ4 FTLマッピング関係を更新して新しいブロックを指すようにし、元のブロックを消去します。
ブロック間のマッピングアプローチでは、データ更新時に余分なデータのコピーが作成されるため、高いコストが必要となります。この問題を解決するために、FAST、BASTなどのアルゴリズムが登場しました。
ページとページのマッピングであれ、ブロックとブロックのマッピングであれ、Flash内部のマッピング関係は変更されていますが、FTLのマッピングテーブルは外部から変更されていないため、ファイルシステムからは透過的に変更されていることがわかります。
ウェア・レベリング
各ブロックの最大消去回数は基本的に同じであり、**ウェア・レベリング**の役割は、すべてのブロックの消去回数が基本的に同じになるようにすることです。このため、ウェア・レベリング・アルゴリズムでは、消去処理をすべてのブロックに均等に分散させる必要があります。
すべてのブロックのデータが頻繁に更新される場合、ウェア・レベリング・アルゴリズムはほとんど問題なく動作します。一部のブロックにコールド・データがある場合、これらのデータを強制的に移動させ、特定のポリシーに従って対応するブロックを消去しなければなりません。もちろん、この操作はシステム負荷を増加させ、システム全体の消耗も増加させます。
実際、ウェア・レベリング・アルゴリズムが積極的であればあるほど、システムの磨耗は進みます。しかし、ウェア・レベリング・アルゴリズムがネガティブすぎると、あるブロックは頻繁に消去され、あるブロックはあまり消去されないという二極化が生じます。
ゴミ収集
Flashの消去単位はブロックであるため、ゴミ収集の最小単位もブロックとなります。ブロック・リサイクルの際には、消去するブロックに有効なデータがないことを確認する必要があります。
ゴミ収集が必要な理由
単純な記憶媒体に5つのブロックだけがあり、各ブロックに10ページが含まれているとします。初期化状態では、すべてのページが空で、記憶媒体の空き容量は100%です。
次にデータを書き込みます。下のイメージからわかるように、いくつかのページはすでに占有されており、ウェア・レベリング・アルゴリズムのために異なるブロックにまたがっています:
さらにデータの書き込みを続けると、50%の領域が占有され、データはブロックに分散されます:
この時点でデータが更新された場合、FTLは新しいデータを書き込むために空のページを選択し、以下のように古いページにstale状態をマークします。
このとき、一番左のブロックには2つのステイル・ステート・ページと4つの使用済みステート・ページがあります。ステイル・ステート・ページを回復するには、まず4つの使用済みステート・ページを他のブロックにコピーしてから、一番左のブロックを消去する必要があります。この操作を行わずに新しいデータの書き込みを続けると、すべての空きステート・ページを使い果たしてしまいますが、ステイル・ステート・ページはまだ残っています。
そのため、FlashのFTLレイヤーは、古い状態のページを解放するためのゴミ収集戦略を実装する必要があります。
書き込み増幅率
上記でお分かりのように、ウェアレベリングとゴミ収集はどちらもバックグラウンドでのデータ処理をある程度トリガーします。これらの処理はFlash内部で実行されるため、外部からどのような方法で監視することもできません。 外部から感じられるのは、例えばある書き込みに非常に時間がかかるなど、パフォーマンスに影響が出ることだけです。
この現象は書き込み増幅と呼ばれ、次の式で測定できます。値が大きいほど効率が低いことを示し、ストレージメディアの性能と寿命に悪影響を及ぼします:
式の分子はフラッシュに実際に書き込まれたデータ量、分母は実効データ量です。例えば、一度に5KBのデータを書き込むが、ウェアレベリングやゴミ収集の結果、バックグラウンドでデータ処理が行われ、実際に書き込まれたデータ量が10KBであった場合、書き込み増幅率は2となります。
予約領域
一般的に、記憶媒体の実際の記憶領域は公称領域より大きく、余分な記憶領域は予約領域と呼ばれ、ユーザーが使用することはできません。予約領域は、データの消去、ゴミの回収、消去、書き込みの均等化が正常に行われるようにするため、また不良ブロックが発生した場合、その上の代替ブロックとして使用することができます。
詳しくはご覧ください。