ウェアレベリング

ウェアレベリング (wear levelling / wear leveling) とは、コンピュータの記憶媒体に用いられる技術の1つ。書き換え限度回数が存在する媒体において、その使用寿命を延ばすための手法。
"wear leveling"を日本語訳すると「摩耗平滑化」といった意味になるが、日本語では英語をそのままカタカナにして「ウェアレベリング」と呼ばれることが多い。
概要.
コンピュータの記憶媒体には、保持データを書き換えると少しずつ劣化してゆくというものがいくつかある。電源を切っても内容が保持される媒体においてそれは顕著で、CD-RW、DVD-RW、フラッシュメモリなど、書き換え可能回数が数百から数千回程度のものが近年では多用されてきている。
一般的に、これらの記憶媒体の書き換え限度回数は、媒体全体に対しての回数ではなく、記憶素子1つに対しての回数である。このことより、書き換えが1つの素子に集中せず、1個の媒体中の各素子にできるだけ均等に分散するように制御ができれば、媒体全体としての書き換え限度回数は飛躍的に向上することになる。
この、データの書き換えを媒体中の記憶素子にできるだけ均等に分散させる技術のことを、ウェアレベリングと呼ぶ。ウェアレベリングの技術を用いることにより、媒体としての書き換え限度回数は各素子の書き換え限度回数の数百から数千倍になる。
2022年、シラキュース大学とフロリダ国際大学の研究者が「ウェアレベリングは耐久性の限界が数百回程度となっている現況では有用性より害が上回る」とする研究結果を発表した。この論文では既存のウェアレベリングアルゴリズムを複数種調査し、いずれの場合でも書き込みの増幅率が大きいことを示している。そして、従来の固定容量のブロックデバイスとしてSSDを抽象化するのではなく、可変容量の抽象化方式を採用することで2.94倍寿命を延ばせるとしている。抽象化技術としてはF2FSやNVMeで新しく定義されたZoned Namespace（ZNS）などが挙げられている。
技術の具体例.
ウェアレベリングを実現する技術はいくつもあるが、大きく分けると、記憶媒体のモジュール内のハードウェアを工夫することによるアプローチと、記憶媒体への読み書きフォーマット（ファイルシステム）を工夫するソフトウェア上のアプローチの2つになる。
ハードウェアの工夫.
読み書きをしようとする記憶素子（ブロック）をCPUなどが指定する場合に、その指定されたアドレスを直接用いるのではなく、アドレスの変換テーブルなどを用いることによって実際にアクセスされる記憶素子を間接指定する仕掛けを、ハードウェアで実現しておく。記憶媒体への書き込みを行なう際には、このアドレス変換テーブルの値を調整することにより、まだあまり書き換え回数が多くない素子に実際の書き換え操作が発生するようにする。
この技術が有効なのは、CDなどのような記録媒体だけが個別に販売されるようなものではなく、コンパクトフラッシュのような記憶素子へのアクセス制御回路がセットになった状態で取り扱われるものにおいてである。近年、多用されつつあるNAND型フラッシュメモリを使った記憶媒体では、一部プロフェッショナル向けの高価格帯製品において、この技術を取り入れたものの商品化が始まっている。
ハードウェアレベルのウェアレベリングは、具体的には記憶素子の各ブロック毎の更新回数をデバイスで記録、管理しておき、（例えばファイルシステムの管理情報などの）更新が頻繁なブロックと、変更回数が少ないまたは空きのブロックとを物理的に「スワップ」することである。つまり、あるブロックについての更新回数の値が、全ブロックの状態から計算される値など一定値を下回った場合に当該ブロックの内容を空きブロックに転送し、移動させる（空きブロックが少ないか無い場合は、変更回数が少ないブロックとの間でブロックを転送し、入れ替える）。このようにして記憶媒体全体の変更回数を平準化させ、該当ブロックを「スワップ」した後は前述のアドレス変換テーブルを更新する。これにより、ソフトウェアからはウェアレベリング動作を（積極的には）関知せずに読み書きを続けられる。
以上のことから、ウェアレベリングのアルゴリズムにもよるが、更新頻度の高いデータブロックほど記憶媒体全般の記憶ブロックに渡って書き込みが行われることになるため、データの完全消去の観点からするとHDDに対する従来の伝統的な消去手法は適用できないことになる。
ソフトウェアの工夫.
コンピュータシステムが補助記憶装置にデータを保管する際には、ファイルと呼ばれる単位で読み書きをすることが圧倒的に多い。この際、「どのファイルが媒体のどの位置に格納されているのか」という情報を管理する機構のことを、ファイルシステムと呼ぶ。このファイルシステムの構成を工夫することにより、ウェアレベリングを実現できる。
書き換え回数制限がほぼ無いに等しい一般的なハードディスクを前提としたファイルシステムの場合、あるファイルが使用する記憶素子は一度割り当てられると変更されることが無いため、書き換え頻度が高いファイル（動作の履歴を書き込むファイルなど）に割り当てられた記憶素子に書き換えが集中してしまう。これに対し、ウェアレベリングに対応したファイルシステムでは、書き込みの度に使用する記憶素子を次々と取り替え、書き換えが同じ素子に集中しないように制御される。
また、ファイルシステムの管理情報、すなわちファイル本体が媒体中のどこにあるかを示すデータや媒体中の未使用の領域がどこであるかを示すデータは、最も書き換え頻度が高くなるので、この情報が1か所に集中しないように制御する工夫も必要になる。場合によっては、管理情報だけは書き換え回数制限が無い別の媒体に保存するという手法がとられることもある。
NAND型フラッシュメモリのように、1バイト単位での書き換えができず、書き換えはある程度まとまったブロック単位で行なわれるという素子を用いる場合、ファイルシステムのほうでそれを考慮し、ファイルのうち書き換えが必要な部分だけを1つのブロックにまとめるという操作をすることもある。
組み込み機器の世界でよく用いられているJFFSまたはその派生版のJFFS2というファイルシステムは、ウェアレベリングに対応したファイルシステムの代表格である（JFFSには、上記のNAND型フラッシュメモリに対応する機構は含まれていない）。
Microsoft Windows 7では「TRIMコマンド」への対応がなされた。これはOS側のファイルシステムで、ファイルの変更や削除などにより使用されなくなった（ファイルシステムとしては書き込んだデータが保持されなくてもよい）記憶ブロックのアドレスを、前述のハードウェアレベルのウェアレベリングに対応した記憶媒体（具体的には対応Flash SSD）に通知する。これにより、記憶媒体側でウェアレベリングなどの動作の際に不必要なデータブロックまで読み書きなどの管理動作をする必要がなくなり、オーバーヘッドや寿命の改善に資するという。従来は、記憶媒体側では1回でも書き込みがあったブロックは無条件にデータを保持し続けるため、ウェアレベリング動作の際もブロックの「スワップ」の際に本来は保持の必要のないブロックも読み書きを行うことにより、オーバーヘッドなどの無駄が生じていた。