(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024004522
(43)【公開日】2024-01-17
(54)【発明の名称】メモリシステム
(51)【国際特許分類】
G06F 12/00 20060101AFI20240110BHJP
G06F 12/02 20060101ALI20240110BHJP
G06F 11/14 20060101ALI20240110BHJP
【FI】
G06F12/00 550Z
G06F12/02 510A
G06F11/14 641D
【審査請求】未請求
【請求項の数】14
【出願形態】OL
(21)【出願番号】P 2022104111
(22)【出願日】2022-06-29
(71)【出願人】
【識別番号】318010018
【氏名又は名称】キオクシア株式会社
(74)【代理人】
【識別番号】110001737
【氏名又は名称】弁理士法人スズエ国際特許事務所
(72)【発明者】
【氏名】福冨 和弘
【テーマコード(参考)】
5B160
【Fターム(参考)】
5B160AA14
5B160NA03
(57)【要約】
【課題】不揮発性メモリの疲弊を抑えることができるメモリシステムを提供すること。
【解決手段】実施形態に係るメモリシステムは、複数の領域を含む不揮発性メモリと、揮発性メモリと、不揮発性メモリと揮発性メモリに接続されるコントローラと、を具備する。コントローラは、複数の領域のうちの少なくとも一部の領域毎のアクセス回数を表す複数の第1カウンタ値と、複数の第1カウンタ値にそれぞれ対応する複数の第2カウンタ値と、を揮発性メモリに記憶させる。コントローラは、第1領域の第2カウンタ値が閾値以上になったことに応じ、第1領域の第1カウンタ値を不揮発性メモリに書き込み、第1領域の第2カウンタ値をリセットする。
【選択図】
図19
【特許請求の範囲】
【請求項1】
複数の領域を含む不揮発性メモリと、
揮発性メモリと、
前記不揮発性メモリと前記揮発性メモリとに接続されるコントローラと、を具備し、
前記コントローラは、
前記複数の領域のうちの少なくとも一部の領域毎のアクセス回数を表す複数の第1カウンタ値と、前記複数の第1カウンタ値にそれぞれ対応する複数の第2カウンタ値と、を前記揮発性メモリに記憶させ、
前記少なくとも一部の領域のうちの第1領域の前記第2カウンタ値が閾値以上になったことに応じ、前記第1領域の前記第1カウンタ値を前記不揮発性メモリに書き込み、前記第1領域の前記第2カウンタ値をリセットする
メモリシステム。
【請求項2】
前記コントローラは、前記第1領域の前記第2カウンタ値が前記閾値以上になったことに応じ、前記第1領域の前記第2カウンタ値を前記揮発性メモリから削除する、請求項1記載のメモリシステム。
【請求項3】
前記コントローラは、
前記複数の領域のうちの第2領域のアクセス回数が更新され、前記揮発性メモリが前記第2領域の前記第2カウンタ値を記憶している場合、前記揮発性メモリが記憶している前記第2領域の前記第2カウンタ値を更新し、
前記第2領域のアクセス回数が更新され、前記揮発性メモリが前記第2領域の前記第2カウンタ値を記憶していない場合、前記第2領域の前記第2カウンタ値を前記揮発性メモリに書き込む、請求項1記載のメモリシステム。
【請求項4】
前記コントローラは、
前記第2領域のアクセス回数が更新され、前記揮発性メモリが前記第2領域の前記第2カウンタ値を記憶しておらず、かつ、前記揮発性メモリが記憶する前記複数の第2カウンタ値の容量の合計が第1容量以上の場合、前記揮発性メモリが記憶する前記複数の第2カウンタ値の中の最も小さい値の第2カウンタ値を前記揮発性メモリから削除し、前記第2領域の前記第2カウンタ値を前記揮発性メモリに書き込む、請求項3記載のメモリシステム。
【請求項5】
前記不揮発性メモリは、前記複数の領域毎に上書き可能なメモリである、請求項1記載のメモリシステム。
【請求項6】
前記複数の第1カウンタ値は、前記不揮発性メモリの前記複数の領域の全ての領域毎のアクセス回数を表す、請求項1記載のメモリシステム。
【請求項7】
前記コントローラは、前記第1領域の前記第2カウンタ値が前記閾値以上になったことに応じ、前記少なくとも一部の領域のうちの第1数の領域の前記第1カウンタ値を前記不揮発性メモリに書き込む、請求項1記載のメモリシステム。
【請求項8】
前記コントローラは、前記第1数の前記第1カウンタ値を前記不揮発性メモリに書き込む毎に、前記不揮発性メモリへ書き込まれるべき前記第1数の前記第1カウンタ値が記憶されている前記揮発性メモリの領域を他の領域に変更する、請求項7記載のメモリシステム。
【請求項9】
前記揮発性メモリが記憶する前記第2カウンタ値は、対応する前記少なくとも一部の領域の前記第1カウンタ値が前記不揮発性メモリに書き込まれた以降の、前記少なくとも一部の領域に対するアクセス回数に対応する、請求項1記載のメモリシステム。
【請求項10】
前記第1カウンタ値は、前記少なくとも一部の領域に対してリードアクセスがあった場合に第1値更新され、前記少なくとも一部の領域に対してライトアクセスがあった場合に前記第1値よりも大きい第2値更新される、請求項1記載のメモリシステム。
【請求項11】
複数の領域を含む不揮発性メモリと、
揮発性メモリと、
前記不揮発性メモリと前記揮発性メモリに接続されるコントローラと、を具備するメモリシステムであって、
前記コントローラは、
前記複数の領域のうちの少なくとも一部の領域毎のアクセス回数を表す複数の第1カウンタ値と、前記複数の第1カウンタ値にそれぞれ対応する複数の第2カウンタ値と、を前記揮発性メモリに記憶させ、
前記メモリシステムへの電力供給が断たれたことに応じ、前記少なくとも一部の領域のうちの第2数の領域の前記第1カウンタ値を前記不揮発性メモリに書き込み、
前記第2数の領域は、前記第2カウンタ値が大きい順に選ばれる
メモリシステム。
【請求項12】
前記不揮発性メモリは、前記複数の領域毎に上書き可能なメモリである、請求項11記載のメモリシステム。
【請求項13】
バックアップ電源をさらに具備し、
前記第2数は、前記バックアップ電源の容量に応じている、請求項11記載のメモリシステム。
【請求項14】
前記コントローラは、
シャットダウンコマンドを伴わない前記メモリシステムへの電力供給が断たれたことに応じ、前記第2数の領域の前記第1カウンタ値を前記不揮発性メモリに書き込み、
シャットダウンコマンドを伴い前記メモリシステムへの電力供給が断たれたことに応じ、前記第2数以上である第3数の領域の前記第1カウンタ値を前記不揮発性メモリに書き込む、
請求項13記載のメモリシステム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明の実施形態は、不揮発性メモリを備えるメモリシステムに関する。
【背景技術】
【0002】
上書き可能な不揮発性メモリを備えるメモリシステムが開発されている。上書き可能な不揮発性メモリのある読み書き単位領域に対するアクセス回数が積み重なるのに伴い、当該読み書き単位領域の不揮発性メモリ素子は疲弊しデータの記憶能力が劣化する。上書き可能な不揮発性メモリには、ライトアクセスのみでなく、リードアクセスによっても疲弊が蓄積するものがある。リードアクセスによって蓄積された疲弊が、ライトアクセスによって回復する効果(いわゆるライトによるリフレッシュ効果)が見込めないようなメモリもある。また、ライトアクセスとリードアクセスでは、疲弊の蓄積度合いが異なるメモリもある。このようなメモリにおいて、例えば、1回のライトアクセスによる疲弊の蓄積度合いは、100回のリードアクセスによる疲弊の蓄積度合いと等しい。
【0003】
通常稼働中、メモリシステムは、不揮発性メモリの読み書き単位領域毎のアクセス回数をカウントし、アクセス回数を疲弊度として記憶する。メモリシステムは、外部機器から指定された論理アドレスを不揮発性メモリの物理アドレスに変換して、データの読み込み先または書き込み先を決定する。メモリシステムは、不揮発性メモリの全ての読み書き単位領域の疲弊度が平準化されるように、ウェアレベリング処理を行う。ウェアレベリング処理では、メモリシステムは、論理アドレスと物理アドレスのマッピングを変更してデータの読み書き位置を変更する。
【0004】
通常稼働中、メモリシステムは、読み書き単位領域毎の疲弊度情報を揮発性メモリに保持し、参照または更新する。外部機器からシャットダウンコマンドを受信すると、メモリシステムは、疲弊度情報を揮発性メモリから読み出し、不揮発化し(すなわち、不揮発性メモリに書き込み)、シャットダウンする。起動時、メモリシステムは、不揮発性メモリから疲弊度情報を読み出し、揮発性メモリに書き込む。
【0005】
不揮発性メモリには全ての読み書き単位領域の疲弊度情報が記憶される。しかしながら、揮発性メモリの容量によっては、揮発性メモリには一部の読み書き単位領域の疲弊度情報しか記憶できない。揮発性メモリに疲弊度情報が記憶されている読み書き単位領域以外の不揮発性メモリの領域がアクセスされた場合、メモリシステムは、揮発性メモリに記憶されている読み書き単位領域の疲弊度情報について追い出し処理を実施する必要がある。この追い出し処理は、例えば、一般に知られているメモリ階層構造におけるキャッシュミス時の追い出し処理である。この追い出し処理によって、疲弊度情報が不揮発性メモリに不揮発化される。また、シャットダウン処理時に、揮発性メモリに記憶されている全ての疲弊度情報を不揮発性メモリに不揮発化すると時間がかかる。このため、メモリシステムは、通常稼働中、疲弊度情報が更新されると、更新された疲弊度情報を適宜不揮発性メモリに不揮発化することがある。一般に、ランダムアクセスの場合、多くの読み書き単位領域がアクセスされるので、上述した2つの不揮発化処理が実行される可能性が高い。また、ライトによるリフレッシュ効果が見込めない不揮発性メモリを採用したメモリシステムでは、疲弊度情報は、ライトアクセスに限らずリードアクセスの場合でも更新されるため、ライトによるリフレッシュ効果が見込める不揮発性メモリを採用したメモリシステムより、不揮発化処理が実行される可能性が高くなる。
【0006】
外部機器によるデータの読み書きのアクセスだけではなく、外部機器によるアクセスに起因する疲弊度情報の不揮発化によっても、不揮発性メモリは疲弊する。ここで、ライトアクセスとリードアクセスで疲弊の蓄積度合いが異なる場合、疲弊の蓄積度合いが少ないアクセス(リードアクセス)の都度、疲弊度情報を不揮発化すると、データのリード自体による疲弊の蓄積量に比して、疲弊度情報の不揮発化(ライトアクセス)に伴う疲弊の蓄積量のペナルティが非常に大きくなる。この結果、不揮発性メモリの寿命が短くなるという問題がある。
【先行技術文献】
【特許文献】
【0007】
【特許文献1】米国特許第11074183号明細書
【特許文献2】米国特許第9612953号明細書
【特許文献3】米国特許第10007462号明細書
【発明の概要】
【発明が解決しようとする課題】
【0008】
実施形態の一つは、不揮発性メモリの疲弊を抑えることができるメモリシステムを提供する。
【課題を解決するための手段】
【0009】
実施形態に係るメモリシステムは、複数の領域を含む不揮発性メモリと、揮発性メモリと、不揮発性メモリと揮発性メモリに接続されるコントローラと、を具備する。コントローラは、複数の領域のうちの少なくとも一部の領域毎のアクセス回数を表す複数の第1カウンタ値と、複数の第1カウンタ値にそれぞれ対応する複数の第2カウンタ値と、を揮発性メモリに記憶させる。コントローラは、少なくとも一部の領域のうちの第1領域の第2カウンタ値が閾値以上になったことに応じ、第1領域の第1カウンタ値を不揮発性メモリに書き込み、第1領域の第2カウンタ値をリセットする。
【図面の簡単な説明】
【0010】
【
図1】実施形態に係るメモリシステムを含む情報処理システムの一例を示すブロック図。
【
図2】実施形態に係るメモリシステムのコントローラに含まれるCPUの機能の一例を示す機能ブロック図。
【
図3】実施形態に係るパワーロスプロテクション(PLP)一括方式における疲弊情報のデータ構造の一例を示す図。
【
図4】実施形態に係るセグメント・ログ方式における疲弊情報のデータ構造の一例を示す図。
【
図5】実施形態に係るセグメント・ログ方式におけるセグメントとログの不揮発化の一例を説明するための図。
【
図6】実施形態に係るセグメント・ログ方式におけるセグメントとログの不揮発化の一例を説明するための図。
【
図7】実施形態に係るセグメント・ログ方式におけるセグメントとログの不揮発化の一例を説明するための図。
【
図8】実施形態に係るセグメント・ログ方式におけるセグメントとログの不揮発化の一例を説明するための図。
【
図9】実施形態に係るセグメント・ログ方式におけるセグメントとログの不揮発化の一例を説明するための図。
【
図10】実施形態に係るセグメント・ログ方式におけるテーブルの復元の一例を説明するための図。
【
図11】実施形態に係る部分/全体キャッシュ方式における疲弊情報のデータ構造の一例を説明するための図。
【
図12】実施形態に係る差分方式の原理を説明するための図。
【
図13】実施形態に係るセグメント・ログ・差分方式における不揮発化の一例を説明するための図。
【
図14】実施形態に係るセグメント・ログ・差分方式における不揮発化の一例を説明するための図。
【
図15】実施形態に係るセグメント・ログ・差分方式における不揮発化の一例を説明するための図。
【
図16】実施形態に係るセグメント・ログ・差分方式における不揮発化の一例を説明するための図。
【
図17】実施形態に係るセグメント・ログ・差分方式における不揮発化の一例を説明するための図。
【
図18】実施形態に係るセグメント・ログ・差分方式における不揮発化の一例を説明するための図。
【
図19】実施形態に係るセグメント・ログ・差分方式における疲弊情報の不揮発化と復元の手順の一例を説明するためのフローチャート。
【
図20】実施形態に係る部分/全体キャッシュ・差分方式における不揮発化の一例を説明するための図。
【
図21】実施形態に係る部分/全体キャッシュ・差分方式における不揮発化の一例を説明するための図。
【
図22】実施形態に係る部分/全体キャッシュ・差分方式における不揮発化の一例を説明するための図。
【
図23】実施形態に係る部分/全体キャッシュ・差分方式における不揮発化の一例を説明するための図。
【
図24】実施形態に係る部分/全体キャッシュ・差分方式における不揮発化の一例を説明するための図。
【
図25】実施形態に係る部分/全体キャッシュ・差分方式における不揮発化の一例の例を説明するための図。
【
図26】実施形態に係る部分/全体キャッシュ・差分方式における疲弊情報の不揮発化の手順の一例を説明するためのフローチャート。
【発明を実施するための形態】
【0011】
以下、図面を参照して、実施形態を説明する。以下の説明は、実施形態の技術的思想を具体化するための装置や方法を例示するものであって、実施形態の技術的思想は、以下に説明する構成要素の構造、形状、配置、材質等に限定されるものではない。当業者が容易に想到し得る変形は、当然に開示の範囲に含まれる。説明をより明確にするため、図面において、各要素のサイズ、厚み、平面寸法又は形状等を実際の実施態様に対して変更して模式的に表す場合もある。複数の図面において、互いの寸法の関係や比率が異なる要素が含まれることもある。複数の図面において、対応する要素には同じ参照数字を付して重複する説明を省略する場合もある。いくつかの要素に複数の呼称を付す場合があるが、これら呼称の例はあくまで例示であり、これらの要素に他の呼称を付すことを否定するものではない。また、複数の呼称が付されていない要素についても、他の呼称を付すことを否定するものではない。なお、以下の説明において、「接続」は直接接続のみならず、他の要素を介した接続も含む場合もある。
【0012】
以下、図面を参照しながら実施形態について詳細に説明する。
【0013】
[実施形態]
[システム構成]
図1は、実施形態に係るメモリシステム20を含む情報処理システムの構成の一例を示すブロック図である。情報処理システムは、メモリシステム20とホスト10を含む。ホスト10は、情報処理装置である。ホスト10は、メモリシステム20にアクセスする外部機器である。ホスト10は、大量且つ多様なデータをメモリシステム20に保存するサーバ(ストレージサーバ)であってもよいし、パーソナルコンピュータであってもよい。メモリシステム20は、ホスト10のストレージとして使用され得る。また、メモリシステム20は、ホスト10のメモリ(主記憶)として使用され得る。メモリシステム20は、ホスト10に内蔵されてもよいし、ホスト10の外部に設けられ、ケーブルまたはネットワークを介してホスト10に有線または無線で接続されてもよい。
【0014】
メモリシステム20は、バックアップ電源28と、揮発性メモリ30と、不揮発性メモリ32と、コントローラ34とを含む。コントローラ34は、揮発性メモリ30及び不揮発性メモリ32にデータを書き込み、並びに、揮発性メモリ30及び不揮発性メモリ32からデータを読み出す。
【0015】
不揮発性メモリとして、単純上書き不可能なメモリと単純上書き可能なメモリが知られている。単純上書き不可能なメモリにおいては、読み書き単位領域よりも大きい消去単位領域でデータの消去処理を実施したのちに、データの書き込み処理を実施する必要がある。単純上書き可能なメモリにおいては、消去処理が不要で、読み書き単位領域にデータの上書きが可能である。単純上書き不可能なメモリの例は、フラッシュメモリである。単純上書き可能なメモリの例は、PCM(Phase Change Memory)である。単純上書き可能なメモリであるため、PCMは、ホストのメモリを拡張するSCM(Storage Class Memory)で使われる不揮発性メモリに好適である。
【0016】
フラッシュメモリはメモリ素子にチャージされた電荷の量でデータのビットを判別する。フラッシュメモリがリードされると、メモリ素子にチャージされた電荷が次第に抜けていき、やがて正しいビットを判別できなくなる。しかし、このリードによる疲弊は、ライトにより再び正しい量の電荷がメモリ素子にチャージされることで回復する(いわゆるリフレッシュライト)。
【0017】
一方で、PCMは、メモリ素子の構造を変化させることでデータのビットを判別する。リードによってもメモリ素子に弱いストレスが蓄積するため、リードによってメモリ素子に蓄積された疲弊はライトされても回復しない。このように、PCMはライトアクセスに限らず、リードアクセスによっても疲弊が蓄積する。したがって、ウェアレベリング処理を実施するにあたり、ライトアクセスによる疲弊だけでなく、リードアクセスによる疲弊も管理する必要がある。
【0018】
本実施形態では、不揮発性メモリ32は単純上書き可能なメモリである。以降の説明では、不揮発性メモリ32はPCM32と称される。
【0019】
揮発性メモリ30は、例えば、DRAM(Dynamic Random Access Memory)である。揮発性メモリ30は、DRAMより高速アクセスが可能なSRAM(Static Random Access Memory)であってもよい。以降の説明では、揮発性メモリ30はRAM30と称される。RAM30は、コントローラ34の外部に設けられるだけではなく、コントローラ34の内部に設けられてもよい。
【0020】
RAM30は、管理情報36と、バッファデータ38を記憶する。管理情報36の例は、これらに限定されないが、疲弊情報36aとアドレス変換情報36bである。管理情報36は、その他の情報を含んでいてもよい。管理情報36は、通常稼働中の適宜なタイミングでPCM32に書き込まれ、不揮発化される。不揮発化は、通常稼働中に複数回行われることもある。
【0021】
疲弊情報36aは、PCM32の疲弊度を示す情報を含む。疲弊情報36aは、疲弊度を求めるための疲弊カウンタを備える。疲弊カウンタは、PCM32の読み書き単位領域毎に設けられる。疲弊カウンタ値は、PCM32へのアクセスが生じると、更新される。疲弊カウンタ値は疲弊度に対応する。PCM32の読み書き単位領域は、フラッシュメモリの読み書き単位領域に比べて小さく、例えばホスト10が具備するCPUのメモリアクセスの粒度に近い。そのため、全ての読み書き単位領域の疲弊カウンタ値を保持するために必要なメモリ容量は非常に大きくなる。
【0022】
以降の説明では、PCM32の読み書き単位領域は、記録領域とも称される。
【0023】
PCM32に対する1回のリードアクセスによる疲弊度と1回のライトアクセスによる疲弊度とは異なる。例えば、1回のライトアクセスによる疲弊度は、100回のリードアクセスによる疲弊度と等しい。疲弊カウンタ値として、リードアクセスによる第1疲弊カウンタ値と、ライトアクセスによる第2疲弊カウンタ値が管理される。第2疲弊カウンタ値は、例えば100倍され、リードアクセスによるカウンタ値に換算される。そして、換算後の第2疲弊カウンタ値と第1疲弊カウンタ値との和が疲弊カウンタ値とされる。疲弊カウンタ値は、PCM32へのアクセスに応じて更新される。
【0024】
アドレス変換情報36bは、論理アドレスとPCM32のアドレス(物理アドレスと称される)との対応関係を示す。ホスト10は、メモリシステム20にホストライトコマンドまたはホストリードコマンドを送信する。ホストライトコマンドは、ホスト10により指定された論理アドレスとライトデータを含む。ホストリードコマンドは、ホスト10により指定された論理アドレスを含む。ホストライトコマンドまたはホストリードコマンドを受信したコントローラ34は、アドレス変換情報36bを参照して、論理アドレスを物理アドレスに変換する。コントローラ34は、変換して取得した物理アドレスにより特定されるPCM32の読み書き単位領域にアクセスする。PCM32の読み書き単位領域は、物理アドレスにより特定される。そのため、疲弊情報36aは、PCM32の物理アドレス毎の疲弊カウンタ値を含む。
【0025】
バッファデータ38は、一時的に記憶されるデータである。バッファデータ38は、PCM32から読み出したリードデータや、PCM32に書き込まれるライトデータを含む。
【0026】
PCM32は、ユーザデータ記録領域32aと、管理情報不揮発化領域32bとを含む。ユーザデータ記録領域32aは、ホスト10からのホストライトコマンドに伴って受信したデータを記憶する領域である。管理情報不揮発化領域32bは、RAM30から不揮発化された管理情報36を記憶する領域である。
【0027】
コントローラ34は、SoC(System on a Chip)のような回路によって実現され得る。コントローラ34の各部の機能は、専用ハードウェア、プログラムを実行するプロセッサ、またはこれらの組み合わせにより実現され得る。
【0028】
コントローラ34は、ホストインタフェース(ホストI/F)回路40、CPU42、不揮発性メモリインタフェース(PCM I/F)回路44、及び揮発性メモリインタフェース(RAM I/F)回路46を備える。ホストI/F回路40、CPU42、PCM I/F回路44、及びRAM I/F回路46はバスライン48に接続される。CPU42はPCM32に記憶されているファームウェアを実行し、種々の機能を実現する。種々の機能の一例は、RAM30に記憶されている管理情報36の不揮発化を含む。
【0029】
ホスト10はホストI/F回路40に電気的に接続され、PCM32はPCM I/F回路44に電気的に接続され、RAM30はRAM I/F回路46に電気的に接続される。
【0030】
図2は、実施形態に係るコントローラ34に含まれるCPU42の機能の一例を示す機能ブロック図である。
図2は、CPU42の機能の一例である管理情報の不揮発化処理と復元処理に関する機能を示す。
図2では、管理情報36の不揮発化処理と復元処理の例として疲弊情報36aの不揮発化処理と復元処理を説明する。実施形態に係る疲弊情報36aの不揮発化処理と復元処理は、他の管理情報36(例えばアドレス変換情報36b)の不揮発化処理と復元処理についても同様に適用可能である。
【0031】
CPU42はファームウェアを実行することにより、リード部52、ライト部54、電源異常断イベント通知部56、疲弊情報管理部58、ウェアレベリング部60、及び疲弊情報復元部62として機能する。
【0032】
リード部52とライト部54は、ホストI/F回路40に接続される。ホストI/F回路40は、ホスト10から送信されたホストリードコマンドとホストライトコマンドとシャットダウンコマンドを受信する。ホストI/F回路40は、ホストリードコマンドをリード部52に送信する。ホストI/F回路40は、ホストライトコマンドをライト部54に送信する。ホストI/F回路40は、シャットダウンコマンドを疲弊情報管理部58に送信する。
【0033】
リード部52は、疲弊情報管理部58に接続される。リード部52は、RAM I/F回路46(
図2では省略)を介してRAM30に接続される。リード部52は、PCM I/F回路44(
図2では省略)を介してPCM32に接続される。リード部52は、アドレス変換情報36bを参照して、ホストリードコマンドに含まれる論理アドレスに対応する物理アドレスを取得する。リード部52は、取得した物理アドレスを持つユーザデータ記録領域32aの記録領域からデータをリードする。リード部52は、リードデータをバッファデータ38としてRAM30に一旦記憶してから、ホスト10に送信する。リード部52は、ユーザデータ記録領域32aからデータをリードした時、リードした記録領域の物理アドレスを疲弊情報管理部58に通知する。
【0034】
ライト部54は、疲弊情報管理部58に接続される。ライト部54は、RAM I/F回路46を介してRAM30に接続される。ライト部54は、PCM I/F回路44を介してPCM32に接続される。ライト部54は、アドレス変換情報36bを参照して、ホストライトコマンドに含まれる論理アドレスに対応する物理アドレスを取得する。ライト部54は、取得した物理アドレスを持つユーザデータ記録領域32aの記録領域にホストライトコマンドに含まれるライトデータをライトする。ライト部54は、ライトデータをバッファデータ38としてRAM30に一旦記憶してから、PCM32に書き込む。ライト部54は、ユーザデータ記録領域32aにデータをライトした時、ライトした記録領域の物理アドレスを疲弊情報管理部58に通知する。
【0035】
疲弊情報管理部58は、RAM I/F回路46を介してRAM30に接続される。疲弊情報管理部58は、PCM I/F回路44を介してPCM32に接続される。疲弊情報管理部58は、リード部52またはライト部54から通知された物理アドレスに対応する疲弊カウンタ値を増加、すなわち疲弊情報36aを更新する。
【0036】
メモリシステム20へは、ホスト10から電力が供給される。コントローラ34は、ホスト10からのパワーオンコマンドによりメモリシステム20内の各部へ電力を供給する。コントローラ34は、ホスト10からのシャットダウンコマンドを受信すると、RAM30に記憶されている管理情報36やバッファデータ38をPCM32に書き込むことにより、不揮発化する。コントローラ34は、不揮発化後、各部への電力の供給を停止し、ホスト10にシャットダウンしてもよい旨を応答する。
【0037】
電源異常断イベント通知部56は、意図しない電源断イベントを検出する。意図しない電源断イベントとは、停電等のイベントであり、ホスト10からのシャットダウンコマンドを伴わない電力の供給停止イベントである。以降、意図しない電源断は電源異常断と称される。電源異常断イベント通知部56は、疲弊情報管理部58に電源異常断イベント通知を送信する。メモリシステム20は、電源異常断イベントが通知された時、RAM30に記憶されているデータが消失しないようにするためのパワーロスプロテクション(Power Loss Protection、PLPと称される)という機能を備える。メモリシステム20は、PLPのためのバックアップ電源28を備える。バックアップ電源28の一例はキャパシタである。
【0038】
疲弊情報管理部58は、シャットダウンコマンド、または、電源異常断イベント通知を受信した時に、RAM30から疲弊情報36aを読み出し、管理情報不揮発化領域32bへ書き込む。PLPで不揮発化できるデータサイズは、バックアップ電源28の電力供給能力により制限される。そのため、電源異常断イベントが通知された時、全ての疲弊情報36aを不揮発化することができない場合がある。
【0039】
ウェアレベリング部60は、RAM I/F回路46を介してRAM30に接続される。ウェアレベリング部60は、PCM I/F回路44を介してPCM32に接続される。ウェアレベリングとは、少なくともPCM32のユーザデータ記録領域32aの全ての読み書き単位領域の疲弊度が平準化されるように読み書き単位領域間でデータを入れ替える処理である。PCM32の管理情報不揮発化領域32bの全ての読み書き単位領域も疲弊度の平準化対象に含めてもよい。ウェアレベリング部60は、所定の判断基準に基づき疲弊度が高いと判断した読み書き単位領域の物理アドレスを交換元の物理アドレスとして決定する。ウェアレベリング部60は、所定の判断基準に基づき疲弊度が低いと判断した読み書き単位領域の物理アドレスを交換先の物理アドレスとして決定する。ウェアレベリング部60は、例えば、疲弊情報36aの疲弊カウンタ値を参照して、読み書き単位領域の疲弊度を判断する。ウェアレベリング部60は、ユーザデータ記録領域32aの交換元の物理アドレスと交換先の物理アドレスからデータを読み出す。ウェアレベリング部60は、ユーザデータ記録領域32aの交換先の物理アドレスと交換元の物理アドレスに夫々読み出したデータを書き込むことにより、データの記録位置を入れ替える。ウェアレベリング部60は、データの記録位置の入れ替えに応じてアドレス変換情報36bを更新する。これにより、ユーザデータ記録領域32aの中の、疲弊度が高い読み書き単位領域は更新頻度が低いデータを記憶し、疲弊度が低い読み書き単位領域は更新頻度が高いデータを記憶することになる。その後、ホストライトコマンドまたはホストリードコマンドによるアクセスがウェアレベリング前と同様に継続すると、交換した読み書き単位領域間の疲弊度が平準化されることが期待される。したがって、ユーザデータ記録領域32aの全ての領域の疲弊度の平準化が期待される。
【0040】
ウェアレベリング部60は、更新したアドレス変換情報36bを、管理情報不揮発化領域32bに適宜なタイミングで書き込み、不揮発化する。
【0041】
疲弊情報復元部62は、RAM I/F回路46を介してRAM30に接続される。疲弊情報復元部62は、PCM I/F回路44を介してPCM32に接続される。疲弊情報復元部62は、メモリシステム20に電力が供給されると、管理情報不揮発化領域32bに記憶されている管理情報を所定の手順に従って復元する。疲弊情報復元部62は、復元結果をRAM30に管理情報36として書き込む。
【0042】
[管理情報管理方式]
管理情報の管理方式を説明する。コントローラ34は、PCM32にアクセスするために管理情報36を必要とする。管理情報36は、疲弊情報36aやアドレス変換情報36b等の多くの種類の情報を含む。管理情報36は、その種類毎に、容量、更新頻度、重要性等が異なり、適切な管理方式を採用する必要がある。以降、管理情報36の中の疲弊情報36aの不揮発化に関する管理を説明する。まず、本実施形態の基礎となる疲弊情報36aの不揮発化に関するいくつかの方式を説明する。
【0043】
[PLP一括方式(基本的な方式)]
PLP一括方式が用いられる場合、メモリシステム20の起動時、疲弊情報復元部62は、管理情報不揮発化領域32bに記憶されている全ての読み書き単位領域分の疲弊情報36aを復元し、復元結果をRAM30に書き込む。また、シャットダウンコマンド、または、電源異常断通知を受信した時に、疲弊情報管理部58は、RAM30に記憶されている全ての読み書き単位領域分の疲弊情報36aを管理情報不揮発化領域32bに書き込むことにより不揮発化する。この方式では、PCM32の記録領域は、
図1と
図2に示したように、ユーザデータ記録領域32aと、管理情報不揮発化領域32bとに物理的に分けられる。管理情報不揮発化領域32bは、ウェアレベリングの対象外の領域である。管理情報不揮発化領域32bは、アドレス変換なしにアクセスできる領域である。
【0044】
管理情報不揮発化領域32bの容量を疲弊情報36aに比べて十分に大きくし、疲弊情報36aが書き込まれる管理情報不揮発化領域32b内の位置を不揮発化ごとにずらせば、ウェアレベリングを行わなくても、管理情報不揮発化領域32bの全読み書き単位領域の疲弊度を平準化させることができる。例えば、管理情報不揮発化領域32bがリングバッファにより構成されれば、疲弊情報36aはリングバッファに周回的に書き込まれる。これにより、管理情報不揮発化領域32bの疲弊度が平準化される。製品寿命期間中に想定される回数の不揮発化処理に伴う読み書きによって蓄積される疲弊度が、エンデュランスに比べて十分に少ない場合は、PCM32上に確保する管理情報不揮発化領域32bの容量は疲弊情報36aの容量と同じでも良い。エンデュランスとは、PCM32の記憶能力が一定レベル以上であり得る疲弊度の上限(例えば疲弊カウンタ値の上限値)である。エンデュランスは、リードアクセス回数と、リードアクセス回数に換算されたライトアクセス回数と、に基づき決定され得る。
【0045】
図3は、PLP一括方式における疲弊情報36aのデータ構造の一例を示す。
図3(a)は、RAM30に記憶されている疲弊情報36aのデータ構造の一例を示す。疲弊情報36aは「疲弊情報本体」と「不揮発化回数」と「記録領域識別子」とを含む。「記録領域識別子」の例は、これに限定されないが「記録領域番号」である。以降では、「記録領域識別子」として「記録領域番号」が用いられる場合を例示する。
【0046】
「疲弊情報本体」は、ユーザデータ記録領域32aの全ての読み書き単位領域の疲弊カウンタ値である。後述するように管理情報不揮発化領域32bのウェアレベリング処理は不要である。「不揮発化回数」は、疲弊情報本体の不揮発化回数である。「記録領域番号」は、データブロックの識別番号を示している。例えば、データブロック数がN個の場合、「記録領域番号」には、0~N-1の値が格納され得る。「記録領域番号」は、不揮発化の対象外である。
【0047】
図3(b)は、管理情報不揮発化領域32bに記憶される不揮発化された疲弊情報のデータ構造の一例を示す。管理情報不揮発化領域32bは、N個のデータブロックB
0、B
1、…B
N‐1を記憶する。1回の不揮発化時に、「疲弊情報本体」と「不揮発化回数」が、データブロックB
0、B
1、…B
N‐1の何れかとして、管理情報不揮発化領域32bに書き込まれる。Nは製品寿命中に想定される回数のパワーサイクル(すなわち電源オン・オフの回数)に伴う読み書きによって蓄積される疲弊度とエンデュランスとの比(小数点以下は切り上げ)により求められる。
【0048】
メモリシステム20の起動時に、疲弊情報復元部62は、最新の不揮発化された「疲弊情報本体」を復元し、復元した「疲弊情報本体」をRAM30に書き込む。このために、疲弊情報復元部62は、管理情報不揮発化領域32bに記憶されている全てのデータブロックB0、B1、…BN‐1に含まれる「不揮発化回数」を読み出し、そのうち最大の「不揮発化回数」を有するデータブロック(「疲弊情報本体」及び「不揮発化回数」)を管理情報不揮発化領域32bから読み出す。疲弊情報復元部62は、読み出したデータブロックに含まれる「疲弊情報本体」及び「不揮発化回数」を、疲弊情報36aとしてRAM30に書き込む。
【0049】
疲弊情報復元部62は、疲弊情報36aの「不揮発化回数」をインクリメントして更新する。
【0050】
疲弊情報復元部62は、次回の不揮発化時に疲弊情報36aを書き込む管理情報不揮発化領域32bの記録領域番号を、次の式に従って計算する。
【0051】
新たな記録領域番号=(ロード元記録領域番号+1)mod(データブロック数)
ロード元記録領域番号とは、メモリシステム20の起動時に「疲弊情報本体」及び「不揮発化回数」が読み出された記録領域の記録領域番号、すなわち、最大の「不揮発化回数」を有するデータブロックが記憶されていた記録領域の記録領域番号である。データブロック数はNである。疲弊情報復元部62は、算出した新たな記録領域番号を、疲弊情報36aの「記録領域番号」に格納する。
【0052】
このように、管理情報不揮発化領域32bにおける疲弊情報36aの書き込み先を、不揮発化のたびにリングバッファ状に変えることにより、ウェアレベリング部60によるウェアレベリングをしなくても、管理情報不揮発化領域32bの各読み書き単位領域の疲弊度が平準化される。
【0053】
通常稼働時は、疲弊情報管理部58は、PCM32へのリードアクセスとライトアクセスに応じて、RAM30に記憶されている疲弊情報36aのみを更新し、更新後の疲弊情報36aの不揮発化を実行しない。
【0054】
シャットダウンコマンド、または、電源異常断イベント通知を受信した時は、疲弊情報管理部58は、RAM30に記憶されている疲弊情報36aの「疲弊情報本体」と「不揮発化回数」を「記録領域番号」の指し示す管理情報不揮発化領域32bの記録領域に書き込むことにより、不揮発化する。
【0055】
図3(b)で説明したように、PCM32の管理情報不揮発化領域32bは、エンデュランスに応じたN個のデータブロックを格納するための記録領域を必要とする。PLP一括方式は、PLPにより全ての疲弊情報36aが不揮発化されることを前提としている。通常稼働中は、RAM30に記憶されている疲弊情報36aが更新されるだけであり、不揮発化は実行されないので、PCM32への追加のアクセスは発生しない。そのため、PLP一括方式における通常稼働時の疲弊情報36aの管理コストは非常に低い。一方、PLP一括方式は、PLPにより不揮発化できない大容量の疲弊情報36aには適用することができない。管理コストは、バックアップ電源28の電力供給能力とのトレードオフである。
【0056】
[セグメント・ログ方式(基本的な方式)]
セグメント・ログ方式においてもPLP一括方式と同じく、管理情報不揮発化領域32bはアドレス変換とウェアレベリングの対象ではない。この方式でも、PCM32の記録領域は、
図1と
図2に示したように、ユーザデータ記録領域32aと、管理情報不揮発化領域32bとに物理的に分けられる。この方式では、疲弊情報36aは、疲弊カウンタ値とログを含む。
【0057】
図4は、セグメント・ログ方式におけるRAM30に記憶される疲弊情報36aのデータ構造の一例を示す図である。疲弊情報36aは、第1テーブル102と第2テーブル106を含む。
図4(a)は、第1テーブル102の一例を示す。第1テーブル102は、複数の第1エントリを含む。複数の第1エントリは、ユーザデータ記録領域32aの全ての読み書き単位領域の疲弊カウンタ値を記憶するものである。第1テーブル102の第1エントリの数は、ユーザデータ記録領域32aの読み書き単位領域の数と等しい。各第1エントリに記憶される疲弊カウンタ値の初期値は0である。各第1エントリには第1インデックスが関連付けられる。第1インデックスは、読み書き単位領域を示す識別情報に対応する。第1テーブル102は、複数のセグメントに分割されている。各セグメントは、いくつかの第1エントリを含む。メモリシステム20の稼働中の或るタイミングで、第1テーブル102に記憶されている疲弊カウンタ値は、管理情報不揮発化領域32bに書き込まれ、不揮発化される。第1テーブル102に記憶されている疲弊カウンタ値は、セグメント毎に不揮発化される。第1テーブル102は、次に不揮発化される疲弊カウンタ値を記憶するセグメントを指すセグメントポインタを備える。
【0058】
図4(b)は、第2テーブル106の一例を示す。第2テーブル106は、複数の第2エントリを含む。複数の第2エントリは、第1テーブル102の直近の数回の更新の様子を示すログを記憶するものである。ログは、第1テーブル102の更新された第1エントリの第1インデックス値と疲弊カウンタ値の組である。各第2エントリには第2インデックスが関連付けられる。疲弊情報管理部58は、ログの更新順に第2テーブル106の第2エントリを並べる。第2インデックス0の第2エントリが最も過去のログを記憶する。第2テーブル106の第2エントリの数は、第1テーブル102の第1エントリの数より少ない。メモリシステム20の起動時は、第2テーブル106の各第2エントリは、第1インデックス値を示す無効データxと疲弊カウンタ値を示す無効データxの組を記憶する。無効データxの組を記憶する第2エントリは空き第2エントリと称される。更新された第1エントリの第1インデックス値と疲弊カウンタ値の組であるログが、空き第2エントリに記憶される。空き第2エントリにログが書き込まれると、空き第2エントリはログ記憶第2エントリとなる。第2テーブル106に記憶されているログの数、すなわち第2テーブル106のログ記憶第2エントリの数が一定数(例えば2)になると、疲弊情報管理部58は、第1テーブル102の1つのセグメントに含まれる複数の第1エントリにそれぞれ記憶されている疲弊カウンタ値と、第2テーブル106のログ記憶第2エントリに記憶されているログと、を管理情報不揮発化領域32bに書き込み、不揮発化する。
【0059】
メモリシステム20の起動時に、疲弊情報復元部62は、不揮発化されている疲弊カウンタ値とログを管理情報不揮発化領域32bから読み出し、ログを解析することにより、疲弊カウンタ値を復元する。
【0060】
シャットダウンコマンド、または、電源異常断イベント通知を受信した時に、疲弊情報管理部58は、少なくともログを全て不揮発化する必要がある。そのため、第2テーブル106に含まれ得るログ記憶第2エントリの数は、一度に不揮発化されるログの容量がPLPにより不揮発化できるデータの容量以下になるように、決められている。このように、セグメント・ログ方式においては、第1テーブル102(PLP一括方式における「疲弊情報本体」に相当)のサイズは、PLPにより不揮発化できるデータの容量に依存しない。したがって、セグメント・ログ方式は、PLP一括方式に比べて、より大きな疲弊情報36aを取り扱うことができる。
【0061】
セグメント・ログ方式を使うに当たって、復元処理に必要な情報は、不揮発化された第1テーブル102(つまり全てのセグメントに記憶されていた疲弊カウンタ値)と、第1テーブル102の全セグメントに記憶されていた疲弊カウンタ値が不揮発化されるまでに不揮発化されたログ(第2テーブル106に記憶されているログ)である。管理情報不揮発化領域32bはリングバッファにより構成され、疲弊カウンタ値とログはリングバッファに周回的に書き込まれる。そのため、管理情報不揮発化領域32bとして、第1テーブル102の容量と、第1テーブル102の全セグメントに記憶されている疲弊カウンタ値が不揮発化されるまでに不揮発化されるログの合計容量と、の和未満の容量しか確保されていない場合、復元処理に必要な情報がリングバッファ上で上書きされて失われてしまう。したがって、管理情報不揮発化領域32bとしてPCM32に確保すべき容量は、少なくとも上記和である。
【0062】
一方、PLP一括方式と同様の理由から、仮に管理情報不揮発化領域32bの容量が上記和よりも多くても、管理情報不揮発化領域32bの容量がある程度少なければ、製品寿命期間中に想定される回数の不揮発化処理に伴う読み書きによって蓄積される疲弊度が、エンデュランスより多くなる場合がある。したがって、製品寿命期間中に想定される回数の不揮発化処理に伴う読み書きによって蓄積される疲弊度がエンデュランスを下回るように、大きな容量を有する管理情報不揮発化領域32bを確保する必要がある。なぜなら、製品寿命期間中に想定される回数の不揮発化処理に伴う読み書きによって蓄積される疲弊度は一定であるのに対して、リングバッファのサイズを大きくすれば、リングバッファへの上書き回数が減るからである。
【0063】
セグメント・ログ方式における通常稼働時の疲弊カウンタ値とログの不揮発化の具体的な処理フローは以下のようになる。
【0064】
(1)第1テーブル102の更新を引き起こすイベントが発生する。第1テーブル102の更新を引き起こすイベントとは、例えば、ホストリードコマンドまたはホストライトコマンドに伴うPCM32へのアクセスである。これにより疲弊情報36aを更新する必要性が生じる。
【0065】
(2)疲弊情報管理部58は、PCM32の或る読み書き単位領域の疲弊カウンタ値が増加する、すなわち疲弊カウンタ値が更新されると、RAM30に記憶されている第1テーブル102の、当該読み書き単位領域に対応する第1インデックスの第1エントリの記憶データ(疲弊カウンタ値)を更新する。
【0066】
(3)疲弊情報管理部58は、第1テーブル102の1つの第1エントリに記憶されている疲弊カウンタ値の更新に応じて、RAM30の第2テーブル106の空き第2エントリに、第1テーブル102の更新のログを書き込む。空き第2エントリはログ記憶第2エントリとなる。
【0067】
(4)疲弊情報管理部58は、RAM30の第2テーブル106に含まれるログ記憶第2エントリの数が一定数になると、次の処理を行う。
【0068】
(ア)疲弊情報管理部58は、セグメントポインタが指すセグメントに記憶されている疲弊カウンタ値を不揮発化する。セグメントポインタの初期値は任意である。セグメントに記憶されている疲弊カウンタ値の不揮発化後、疲弊情報管理部58は、セグメントポインタを(ウ)に示す手順に従い更新する。
【0069】
(イ)疲弊情報管理部58は、第2テーブル106に記憶されているログを全て不揮発化する。疲弊情報管理部58は、不揮発化後の第2テーブル106の第2エントリ(ログ記憶第2エントリ)に無効データを書き込み、ログ記憶第2エントリを空き第2エントリとする。
【0070】
(ウ)疲弊情報管理部58は、セグメントポインタを1セグメント進める。セグメントポインタが最後のセグメントを指している場合は、疲弊情報管理部58は、最初のセグメントを指すようにセグメントポインタを更新する。
【0071】
図5乃至
図9はセグメント・ログ方式における、通常稼働時の疲弊カウンタ値とログの不揮発化を時間の経過に従い説明するための図である。
【0072】
図5(a)は、或るタイミングにおけるRAM30に記憶されている第1テーブル102の一例を示す。
図5(b)は、同じ或るタイミングにおけるRAM30に記憶されている第2テーブル106の一例を示す。
図5乃至
図9では、第1テーブル102は、例えば12個の第1エントリを含む。第1テーブル102は、例えばセグメントA、セグメントB、セグメントCに分割される。セグメントA~セグメントCのそれぞれは、例えば4個の第1エントリを含む。第2テーブル106は、例えば2個の第2エントリを含む。第2テーブル106に含まれるログ記憶第2エントリの数が一定数(例えば2)に達すると、第2テーブル106は不揮発化される。
【0073】
或るタイミングにおいて、第1インデックス5に対応する読み書き単位領域の疲弊カウンタ値が50であるとする。第1エントリe1は、疲弊カウンタ値50を記憶する。5以外の第1インデックスのエントリに記憶される疲弊カウンタ値は0である。このタイミングにおいて、第1テーブル102のセグメントポインタは、セグメントBを指しているものとする。また、第2インデックス0の第2エントリe2は、第1インデックス値5と疲弊カウンタ値50の組であるログを記憶している。第2インデックス1の第2エントリe3は、無効データxである第1インデックス値と無効データxである疲弊カウンタ値の組を記憶している。すなわち、第2エントリe3は空き第2エントリである。
【0074】
ここで、ホストライトコマンドまたはホストリードコマンドに伴いPCM32へのデータの書き込みまたはPCM32からのデータの読み出しが数回行われたとする。疲弊情報管理部58は、ライト部54またはリード部52から通知された物理アドレスに応じて、第1テーブル102と第2テーブル106を更新する。
図6(a)は、更新後の第1テーブル102を示す。
図6(b)は、更新後の第2テーブル106を示す。
図6(a)は、第1インデックス3の第1エントリe4に対応する読み書き単位領域の疲弊カウンタ値が30に更新された場合の第1テーブル102を示す。
図6(b)は、第2エントリe3が、第1インデックス値3と、第1エントリe4に記憶されている更新後の疲弊カウンタ値30の組であるログを記憶している場合の第2テーブル106を示す。なお、ホストライトコマンドまたはホストリードコマンドによって、同じ読み書き単位領域に対して、連続して読み出しまたは書き込み処理が実施された場合、疲弊情報管理部58は、読み出しまたは書き込み処理毎に第2テーブル106の空き第2エントリを確保してログを記憶する必要はない。疲弊情報管理部58は、一つの空き第2エントリにまとめてログを記憶してもよい。
図6(b)は、例えば、1回の読み出し処理で疲弊カウンタ値が1上昇する場合に、第1インデックス5の読み書き単位領域に対して50回の読み出し処理が連続で実施され、第1インデックス3の読み書き単位領域に対して30回の読み出し処理が連続で実施されたことを示している。
【0075】
これにより、第2テーブル106のログ記憶第2エントリの数が2になる。すなわち、第2テーブル106の空き第2エントリの数が0になる。第2テーブル106は、ログをこれ以上記憶できないフル状態になる。疲弊情報管理部58は、第1テーブル102の1つのセグメントに記憶されている疲弊カウンタ値を不揮発化する。疲弊情報管理部58は、セグメントポインタが指すセグメントBに記憶されている疲弊カウンタ値を不揮発化する。疲弊情報管理部58は、セグメントBの4個の第1エントリに記憶されている疲弊カウンタ値を管理情報不揮発化領域32bに書き込むことにより不揮発化する。疲弊情報管理部58は、セグメントBに記憶されている疲弊カウンタ値の不揮発化後、セグメントポインタを1セグメント進める。セグメントポインタはセグメントCを指す。
【0076】
疲弊情報管理部58は、セグメントBに記憶されている疲弊カウンタ値を管理情報不揮発化領域32bに書き込むことにより疲弊カウンタ値を不揮発化するとともに、第2テーブル106に記憶されている2つのログを管理情報不揮発化領域32bに書き込むことにより2つのログを不揮発化する。疲弊情報管理部58は、疲弊カウンタ値とログとともに、不揮発化した順番を表す情報も管理情報不揮発化領域32bに書き込む。順番を表す情報は、例えば不揮発化した時刻であってもよい。
【0077】
図7(a)は、セグメントBに記憶されている疲弊カウンタ値の不揮発化後の第1テーブル102を示す。セグメントBの4個の第1エントリに記憶されている疲弊カウンタ値は、不揮発化されても削除されず、RAM30に記憶されている。これは、ウェアレベリング部60がウェアレベリング処理を実施する際に参照する疲弊情報36aは、第1テーブル102に記憶されている疲弊カウンタ値であるから、実際の疲弊度に応じたウェアレベリング処理を実施するためにそのまま残しておく必要があるためである。
図7(b)は、第2テーブル106の不揮発化後の第2テーブル106を示す。不揮発化後、第2テーブル106の全ての第2エントリe2、e3に無効データの組が書き込まれる。これにより、第2テーブル106の全ての第2エントリe2、e3は空き第2エントリとなる。
【0078】
その後、ホストライトコマンドまたはホストリードコマンドに伴いPCM32へのデータの書き込みまたはPCM32からのデータの読み出しが数回行われたとする。疲弊情報管理部58は、ライト部54またはリード部52から通知された物理アドレスに応じて、第1テーブル102と第2テーブル106を更新する。
図8(a)は、更新後の第1テーブル102を示す。
図8(b)は、更新後の第2テーブル106を示す。
図8(a)は、第1インデックス1の第1エントリe5に対応する読み書き単位領域の疲弊カウンタ値が100に更新され、第1インデックス9の第1エントリe6に対応する読み書き単位領域の疲弊カウンタ値が900に更新された場合の第1テーブル102を示す。疲弊カウンタ値の更新の順番は、先ず、第1エントリe5に対応する読み書き単位領域の疲弊カウンタ値が100に更新され、次に、第1エントリe6に対応する読み書き単位領域の疲弊カウンタ値が900になったものとする。
図8(b)は、第2エントリe2が第1インデックス値1と、第1エントリe5に記憶されている更新後の疲弊カウンタ値100の組であるログを記憶し、第2エントリe3が第1インデックス値9と、第1エントリe6に記憶されている更新後の疲弊カウンタ値900の組であるログを記憶している場合の第2テーブル106を示す。
【0079】
これにより、第2テーブル106のログ記憶第2エントリの数が2になる。すなわち、第2テーブル106の空き第2エントリの数が0になる。第2テーブル106は、ログをこれ以上記憶できないフル状態になる。疲弊情報管理部58は、第1テーブル102の1つのセグメントに記憶されている疲弊カウンタ値を不揮発化する。疲弊情報管理部58は、セグメントポインタが指すセグメントCに記憶されている疲弊カウンタ値を不揮発化する。疲弊情報管理部58は、セグメントCの4個の第1エントリに記憶されている疲弊カウンタ値を管理情報不揮発化領域32bに書き込むことにより不揮発化する。疲弊情報管理部58は、セグメントCに記憶されている疲弊カウンタ値の不揮発化後、セグメントポインタを1セグメント進める。セグメントポインタはセグメントAを指す。
【0080】
疲弊情報管理部58は、セグメントCに記憶されている疲弊カウンタ値を管理情報不揮発化領域32bに書き込むことにより疲弊カウンタ値を不揮発化するとともに、第2テーブル106に記憶されている2つのログを管理情報不揮発化領域32bに書き込むことにより2つのログを不揮発化する。疲弊情報管理部58は、疲弊カウンタ値とログとともに、不揮発化した順番を表す情報も管理情報不揮発化領域32bに書き込む。
【0081】
その後、ホストライトコマンドまたはホストリードコマンドに伴いPCM32へのデータの書き込みまたはPCM32からのデータの読み出しが数回行われたとする。疲弊情報管理部58は、ライト部54またはリード部52から通知された物理アドレスに応じて、第1テーブル102と第2テーブル106を更新する。
図9(a)は、更新後の第1テーブル102を示す。
図9(b)は、更新後の第2テーブル106を示す。
図9(a)は、第1インデックス4の第1エントリe7に対応する読み書き単位領域の疲弊カウンタ値が2に更新され、第1インデックス2の第1エントリe8に対応する読み書き単位領域の疲弊カウンタ値が1に更新された場合の第1テーブル102を示す。疲弊カウンタ値の更新の順番は、先ず、第1エントリe7に対応する読み書き単位領域の疲弊カウンタ値が2に更新され、次に、第1エントリe8に対応する読み書き単位領域の疲弊カウンタ値が1になったものとする。
図9(b)は、第2エントリe2が第1インデックス値4と、第1エントリe7に記憶されている更新後の疲弊カウンタ値2の組であるログを記憶し、第2エントリe3が第1インデックス値2と、第1エントリe8に記憶されている更新後の疲弊カウンタ値1の組であるログを記憶している場合の第2テーブル106を示す。
【0082】
これにより、第2テーブル106のログ記憶第2エントリの数が2になる。すなわち、第2テーブル106の空き第2エントリの数が0になる。第2テーブル106は、ログをこれ以上記憶できないフル状態になる。疲弊情報管理部58は、第1テーブル102の1つのセグメントに記憶されている疲弊カウンタ値を不揮発化する。疲弊情報管理部58は、セグメントポインタが指すセグメントAに記憶されている疲弊カウンタ値を不揮発化する。疲弊情報管理部58は、セグメントAの4個の第1エントリに記憶されている疲弊カウンタ値を管理情報不揮発化領域32bに書き込むことにより不揮発化する。疲弊情報管理部58は、セグメントAに記憶されている疲弊カウンタ値の不揮発化後、セグメントポインタを1セグメント進める。セグメントポインタはセグメントBを指す。
【0083】
疲弊情報管理部58は、セグメントAに記憶されている疲弊カウンタ値の不揮発化とともに、第2テーブル106に記憶されている2つのログを管理情報不揮発化領域32bに書き込むことにより2つのログを不揮発化する。疲弊情報管理部58は、疲弊カウンタ値とログとともに、不揮発化した順番を表す情報も管理情報不揮発化領域32bに書き込む。
【0084】
シャットダウンコマンド、または、電源異常断イベント通知を受信した時に、疲弊情報管理部58は、少なくとも第2テーブル106に記憶されているログを不揮発化する。
【0085】
次に復元のフローを説明する。復元とは、不揮発化されている疲弊カウンタ値とログを管理情報不揮発化領域32bから読み出し、RAM30に記憶されている第1テーブル102の第1エントリに疲弊カウンタ値を書き込むことである。
図10は、実施形態に係るセグメント・ログ方式の第1テーブル102の復元シーケンスの一例を示す。
図10(a)は、管理情報不揮発化領域32bに記憶されている不揮発化セグメントと不揮発化第2テーブルを示す。不揮発化セグメントは、不揮発化された疲弊カウンタ値を記憶する。不揮発化第2テーブルは、不揮発化されたログを記憶する。
図10(a)は、概念的な図であり、不揮発化セグメントと不揮発化第2テーブルは管理情報不揮発化領域32bの物理的に隣接した領域に交互に記憶されていなくてもよい。
図10(b)は、RAM30に書き込まれた復元された第1テーブル102の時系列的な変化を示す。
【0086】
図10(a)は、セグメントAに記憶されている疲弊カウンタ値、セグメントBに記憶されている疲弊カウンタ値、セグメントCに記憶されている疲弊カウンタ値、セグメントAに記憶されている疲弊カウンタ値、の順番で不揮発化された例を示す。管理情報不揮発化領域32bはリングバッファ状に利用され、不揮発化されるセグメントと第2テーブル106はリングバッファに周回的に書き込まれる。これにより、管理情報不揮発化領域32bの疲弊度が平準化される。
【0087】
第1テーブル102に記憶されている疲弊カウンタ値はセグメント毎に不揮発化されるので、第1テーブル102に記憶される疲弊カウンタ値はセグメント毎に復元される。復元順番は、不揮発化順と同じ順序でも逆の順序でも良い。
【0088】
第1テーブル102の一部の第1エントリに記憶されている疲弊カウンタ値は、そのまま不揮発化されるとともに、その疲弊カウンタ値を記憶する第1エントリの第1インデックス値と組にされ、ログとしても不揮発化される。そのため、疲弊情報復元部62は、不揮発化されたセグメントの第1エントリに記憶されている疲弊カウンタ値、又は、不揮発化された第2テーブルに記憶されているログの中の疲弊カウンタ値を管理情報不揮発化領域32bから読み出す。以降の説明では、不揮発化されたセグメントの第1エントリに記憶されている疲弊カウンタ値、又は、不揮発化された第2テーブルに記憶されているログの中の疲弊カウンタ値は、不揮発化疲弊カウンタ値と称される。疲弊情報復元部62は、不揮発化疲弊カウンタ値を第1テーブル102の対応する第1エントリに疲弊カウンタ値として書き込み、セグメントの疲弊カウンタ値を復元する。疲弊情報復元部62は、これから復元する第1テーブル102のセグメントの第1エントリが既に有効データ、すなわち疲弊カウンタ値を記憶している場合は、当該第1エントリへの不揮発化疲弊カウンタ値の書き込みをスキップする。
【0089】
このようにして、疲弊情報管理部58がシャットダウンコマンド、または、電源異常断イベント通知を受信した時の疲弊カウンタ値を第1テーブル102の全ての第1エントリが記憶するまで、疲弊情報復元部62は復元を続ける。
【0090】
より具体的に、
図10(b)を参照して、不揮発化順と逆の順序でセグメントの復元が行われる方式を説明する。ここでは不揮発化順と逆の順序で復元される場合の例を説明するが、不揮発化順と同じ順序で復元される場合の例に対しても、以下の説明を適宜読み替えて適用可能である。
【0091】
管理情報不揮発化領域32bに記憶されている4つの不揮発化セグメントの中で最後に不揮発化されたセグメントAは、4つの第1エントリ(すなわち、疲弊カウンタ値1000を記憶する第1インデックス0の第1エントリ、疲弊カウンタ値100を記憶する第1インデックス1の第1エントリ、疲弊カウンタ値22を記憶する第1インデックス2の第1エントリ、及び疲弊カウンタ値30を記憶する第1インデックス3の第1エントリ)を含む。管理情報不揮発化領域32bに記憶されている4つの不揮発化第2テーブルの中で最後に不揮発化された第2テーブルは、2つの第2エントリ(すなわち、第1インデックス値6と疲弊カウンタ値6の組であるログを記憶する第2インデックス0の第2エントリと、第1インデックス値9と疲弊カウンタ値900の組であるログを記憶する第2インデックス1の第2エントリ)を含む。
【0092】
復元開始時、疲弊情報復元部62は、RAM30に記憶されている第1テーブル102の全ての第1エントリに無効データxを書き込む。
【0093】
時刻t1で、疲弊情報復元部62は、最後に不揮発化されたセグメントAの中の、第1インデックス0に対応する不揮発化疲弊カウンタ値1000を読み出し、第1インデックス1に対応する不揮発化疲弊カウンタ値100を読み出し、第1インデックス2に対応する不揮発化疲弊カウンタ値22を読み出し、第1インデックス3に対応する不揮発化疲弊カウンタ値30を読み出す。また、時刻t1で、疲弊情報復元部62は、最後に不揮発化された第2テーブルの中の、第2インデックス0に対応するログ(第1インデックス値6と不揮発化疲弊カウンタ値6の組)を読み出し、第2インデックス1に対応するログ(第1インデックス値9と不揮発化疲弊カウンタ値900の組)を読み出す。
【0094】
疲弊情報復元部62は、最後に不揮発化されたセグメントAから読み出した、第1インデックス0に対応する不揮発化疲弊カウンタ値1000を、RAM30に記憶されている第1テーブル102の中の、第1インデックス0の第1エントリに書き込む。疲弊情報復元部62は、最後に不揮発化されたセグメントAから読み出した、第1インデックス1に対応する不揮発化疲弊カウンタ値100を、RAM30に記憶されている第1テーブル102の中の、第1インデックス1の第1エントリに書き込む。疲弊情報復元部62は、最後に不揮発化されたセグメントAから読み出した、第1インデックス2に対応する不揮発化疲弊カウンタ値22を、RAM30に記憶されている第1テーブル102の中の、第1インデックス2の第1エントリに書き込む。疲弊情報復元部62は、最後に不揮発化されたセグメントAから読み出した、第1インデックス3に対応する不揮発化疲弊カウンタ値30を、RAM30に記憶されている第1テーブル102の中の、第1インデックス3の第1エントリに書き込む。また、疲弊情報復元部62は、最後に不揮発化された第2テーブルから読み出した、第1インデックス値6に対応する不揮発化疲弊カウンタ値6を、RAM30に記憶されている第1テーブル102の中の、第1インデックス6の第1エントリに書き込む。疲弊情報復元部62は、最後に不揮発化された第2テーブルから読み出した、第1インデックス値9に対応する不揮発化疲弊カウンタ値900を、RAM30に記憶されている第1テーブル102の中の、第1インデックス9の第1エントリに書き込む。
【0095】
管理情報不揮発化領域32bに記憶されている4つの不揮発化セグメントの中で最後から2番目に不揮発化されたセグメントCは、4つの第1エントリ(すなわち、疲弊カウンタ値88を記憶する第1インデックス8の第1エントリ、疲弊カウンタ値900を記憶する第1インデックス9の第1エントリ、疲弊カウンタ値0を記憶する第1インデックス10の第1エントリ、及び疲弊カウンタ値30を記憶する第1インデックス11の第1エントリ)を含む。管理情報不揮発化領域32bに記憶されている4つの不揮発化第2テーブルの中で最後から2番目に不揮発化された第2テーブルは、2つの第2エントリ(すなわち、第1インデックス値8と疲弊カウンタ値88の組であるログを記憶する第2インデックス0の第2エントリと、第1インデックス値0と疲弊カウンタ値1000の組であるログを記憶する第2インデックス1の第2エントリ)を含む。
【0096】
時刻t2で、疲弊情報復元部62は、最後から2番目に不揮発化されたセグメントCの中の、第1インデックス8に対応する不揮発化疲弊カウンタ値88を読み出し、第1インデックス9に対応する不揮発化疲弊カウンタ値900を読み出し、第1インデックス10に対応する不揮発化疲弊カウンタ値0を読み出し、第1インデックス11に対応する不揮発化疲弊カウンタ値30を読み出す。また、時刻t2で、疲弊情報復元部62は、最後から2番目に不揮発化された第2テーブルの中の、第2インデックス0に対応するログ(第1インデックス値8と不揮発化疲弊カウンタ値88の組)を読み出し、第2インデックス1に対応するログ(第1インデックス値0と不揮発化疲弊カウンタ値1000の組)を読み出す。
【0097】
第1テーブル102の中の、第1インデックス0と9の第1エントリは、時刻t1における復元で既に疲弊カウンタ値を記憶している。したがって、疲弊情報復元部62は、読み出した不揮発化疲弊カウンタ値のうち、第1インデックス0と9に対応する不揮発化疲弊カウンタ値以外の不揮発化疲弊カウンタ値、すなわち、第1インデックス8、10、及び11に対応する不揮発化疲弊カウンタ値88、0、及び30を、第1テーブル102の中の、第1インデックス8、10、及び11の第1エントリに疲弊カウンタ値として夫々書き込む。
【0098】
第1インデックス8に対応する疲弊カウンタ値は時刻t2における復元対象のセグメントCと不揮発化第2テーブルの両方に含まれている。同じタイミングで不揮発化されたセグメントの第1エントリと、第2テーブルの第2エントリとは、同じ疲弊カウンタ値を記憶する。そのため、不揮発化セグメントと不揮発化第2テーブルで第1インデックス(この例では第1インデックス8)が重複する場合、疲弊情報復元部62は、セグメントCの第1インデックス8に対応する不揮発化疲弊カウンタ値88と、第2テーブルの第1インデックス8に対応する不揮発化疲弊カウンタ値88の何れかを、第1テーブル102の第1インデックス8の第1エントリに書き込めばよい。
【0099】
管理情報不揮発化領域32bに記憶されている4セグメントの中で最後から3番目に不揮発化されたセグメントBは、4つの第1エントリ(すなわち、疲弊カウンタ値40を記憶する第1インデックス4の第1エントリ、疲弊カウンタ値50を記憶する第1インデックス5の第1エントリ、疲弊カウンタ値0を記憶する第1インデックス6の第1エントリ、及び疲弊カウンタ値30を記憶する第1インデックス7の第1エントリ)を含む。管理情報不揮発化領域32bに記憶されている4つの不揮発化第2テーブルの中で最後から3番目に不揮発化された第2テーブルは、2つの第2エントリ(すなわち、第1インデックス値5と疲弊カウンタ値50の組であるログを記憶する第2インデックス0の第2エントリと、第1インデックス値2と疲弊カウンタ値22の組であるログを記憶する第2インデックス1の第2エントリ)を含む。
【0100】
時刻t3で、疲弊情報復元部62は、最後から3番目に不揮発化されたセグメントBの中の、第1インデックス4に対応する不揮発化疲弊カウンタ値40を読み出し、第1インデックス5に対応する不揮発化疲弊カウンタ値50を読み出し、第1インデックス6に対応する不揮発化疲弊カウンタ値0を読み出し、第1インデックス7に対応する不揮発化疲弊カウンタ値30を読み出す。また、時刻t3で、疲弊情報復元部62は、最後から3番目に不揮発化された第2テーブルの中の、第2インデックス0に対応するログ(第1インデックス値5と不揮発化疲弊カウンタ値50の組)を読み出し、第2インデックス1に対応するログ(第1インデックス値2と不揮発化疲弊カウンタ値22の組)を読み出す。
【0101】
第1テーブル102の中の、第1インデックス2と6の第1エントリは、時刻t2までの復元で既に疲弊カウンタ値を記憶している。したがって、疲弊情報復元部62は、読み出した不揮発化疲弊カウンタ値のうち、第1インデックス2と6に対応する不揮発化疲弊カウンタ値以外の不揮発化疲弊カウンタ値、すなわち、第1インデックス4、5、及び7に対応する不揮発化疲弊カウンタ値40、50、及び30を、第1テーブル102の中の、第1インデックス4、5、及び7の第1エントリに疲弊カウンタ値として夫々書き込む。これにより復元は終了する。
【0102】
セグメント・ログ方式では、疲弊カウンタ値の更新頻度と第1テーブル102の容量から適切なパラメータ(セグメント長、ログの容量、及び管理情報不揮発化領域32bの容量)を選択する必要がある。第1テーブル102の容量は、1個の第1エントリ当たりのサイズ(バイト又はビット)×第1エントリの数である。
【0103】
第1テーブル102の容量をCTable、第1テーブル102の第1エントリの数をNTableEntry、セグメント長(1つのセグメントに含まれる第1エントリの数)をNsegment、1つのセグメントと同時に不揮発化されるログの容量をCLogとする。管理情報不揮発化領域32bには、第1テーブル102の容量(全セグメントの容量の和)と、セグメントポインタが第1テーブル102を1周する間に不揮発化されるログの合計容量との和に相当する容量の領域を少なくとも確保しなければならない。この最低の容量は、制約1と称される。
【0104】
制約1:管理情報不揮発化領域32bの容量≧CTable+(NTableEntry/Nsegment)×CLog
一方、疲弊カウンタ値が高頻度で更新される場合、疲弊カウンタ値の不揮発化のためのPCM32への書き込み回数も増える。このため、エンデュランスの観点から管理情報不揮発化領域32bの容量に制約が生じる。ここで、復元処理によるPCM32からの読み出しは、復元処理毎に1回ずつしか行われないのに対して、不揮発化処理によるPCM32への書き込みは、通常動作中に複数回行われる。したがって、ここでは計算の簡単化のために、疲弊の主要な要因となる書き込み回数のみに着目する。エンデュランス(ここでは書き込み回数を示す)をE、製品寿命期間中に想定される第1テーブル102の更新回数をNUpdate、第1テーブル102の第1エントリあたりの容量をCTableEntry、ログの第2エントリあたりの容量をCLogEntry、1セグメントが不揮発化される時に同時に不揮発化される第2テーブル106の第2エントリの数をNLogEntryとする。ここで、CTable=CTableEntry×NTableEntryである。また、CLog=CLogEntry×NLogEntryである。管理情報不揮発化領域32bの容量が大きければ、管理情報不揮発化領域32bへの上書き回数が減るので、製品寿命期間中に想定される回数の不揮発化処理に伴う読み書きによって蓄積される疲弊カウンタ値がエンデュランスを超えることがない。エンデュランスの観点から管理情報不揮発化領域32bに必要な容量は、制約2と称される。より詳細には、第1テーブル102がNUpdate回更新されると、不揮発化処理(つまり、セグメント1個とNLogEntry個のログの不揮発化)は、NUpdate/NLogEntry回発生する。不揮発化処理1回あたりの書き込み量は、(CTableEntry×Nsegment+CLogEntry×NLogEntry)である。管理情報不揮発化領域32bに必要な容量は、これをエンデュランスEで割ることにより求められる。
【0105】
制約2:管理情報不揮発化領域32bの容量≧((NUpdate/NLogEntry)×(CTableEntry×Nsegment+CLogEntry×NLogEntry))/E
制約1、制約2はどちらも満たす必要があるため、制約1、制約2のうち大きいほうが管理情報不揮発化領域32bとして必要な容量となる。
【0106】
[部分/全体キャッシュ方式(基本的な方式)]
図11は、部分/全体キャッシュ方式における疲弊情報のデータ構造の一例を説明するための図である。この方式は、一般に知られているメモリ階層構造におけるキャッシュのような構造のキャッシュを用いる方式である。
【0107】
この方式では、管理情報不揮発化領域32bはPCM32の全ての読み書き単位領域の疲弊カウンタ値を記憶する領域を備える。この領域は不揮発化テーブル116(
図11(c))と称される。不揮発化テーブル116は、複数の第3エントリを含む。複数の第3エントリは、PCM32の全ての読み書き単位領域の疲弊カウンタ値を記憶する。第3エントリの数は、PCM32の読み書き単位領域の数と等しい。各第3エントリには第3インデックスが関連付けられる。第3インデックスは、読み書き単位領域を示す識別情報に対応する。
【0108】
RAM30のキャッシュは、ダーティキャッシュ112(
図11(a))とクリーンキャッシュ114(
図11(b))に分割される。全体キャッシュ方式では、不揮発化テーブル116の全部の第3エントリに記憶される疲弊カウンタ値がRAM30にキャッシュされる。部分キャッシュ方式では、不揮発化テーブル116の一部の第3エントリに記憶される疲弊カウンタ値がRAM30にキャッシュされる。疲弊カウンタ値は、ダーティキャッシュ112またはクリーンキャッシュ114のいずれかから参照され得る。
【0109】
ダーティキャッシュ112は、複数の第4エントリを含む。各第4エントリには第4インデックスが関連付けられる。各第4エントリは、或る読み書き単位領域に対応する第3インデックス値とその読み書き単位領域の疲弊カウンタ値の組を記憶し得る。無効データxの組を記憶する第4エントリは空き第4エントリと称される。空き第4エントリにデータ(すなわち、第3インデックス値と疲弊カウンタ値の組)が書き込まれると、空き第4エントリはデータ記憶第4エントリとなる。或る読み書き単位領域の疲弊カウンタ値が更新されると、更新後の疲弊カウンタ値はダーティキャッシュ112のみに記憶され、クリーンキャッシュ114と不揮発化テーブル116には記憶されない。ダーティキャッシュ112に記憶されているデータは、更新されたものの不揮発化テーブル116に不揮発化されていない疲弊カウンタ値を含む。このため、不揮発化テーブル116が記憶する疲弊カウンタ値とダーティキャッシュ112が記憶する疲弊カウンタ値とは異なる。
【0110】
クリーンキャッシュ114は、複数(例えば6個)の第5エントリを含む。各第5エントリには第5インデックスが関連付けられる。各第5エントリは、或る読み書き単位領域に対応する第3インデックス値とその読み書き単位領域の疲弊カウンタ値の組を記憶し得る。無効データxの組を記憶する第5エントリは空き第5エントリと称される。空き第5エントリにデータ(すなわち、第3インデックス値と疲弊カウンタ値の組)が書き込まれると、空き第5エントリはデータ記憶第5エントリとなる。データ記憶第5エントリに記憶されている或る第3インデックスの疲弊カウンタ値は、不揮発化テーブル116の当該第3インデックスの第3エントリに記憶されている疲弊カウンタ値と同じである。そのため、シャットダウンコマンド、または、電源異常断イベント通知を受信した時に、疲弊情報管理部58は、クリーンキャッシュ114のデータを不揮発化する必要はない。
【0111】
疲弊情報管理部58は、クリーンキャッシュ114の第5エントリをキャッシュ効率の良い順に並べる。キャッシュ効率が良い順の一例は、LRU(Least Recently Used)順である。疲弊情報管理部58は、クリーンキャッシュ114の第5エントリを、記憶している疲弊カウンタ値が前回参照された時間またはクリーンキャッシュ114に追加された時間の新しい順に並べる。これにより、最も過去に参照された疲弊カウンタ値、または、最も過去にクリーンキャッシュ114に追加された疲弊カウンタ値から順にクリーンキャッシュ114から追い出される。
【0112】
疲弊情報管理部58は、ダーティキャッシュ112の第4エントリをキャッシュ効率の良い順に並べる。キャッシュ効率が良い順の一例は、LRU順である。疲弊情報管理部58は、ダーティキャッシュ112の第4エントリを、記憶している疲弊カウンタ値が前回更新された時間またはダーティキャッシュ112に追加された時間の新しい順に並べる。これにより、最も過去に更新された疲弊カウンタ値、または、最も過去にダーティキャッシュ112に追加された疲弊カウンタ値から順にダーティキャッシュ112から追い出される。
【0113】
疲弊カウンタ値が更新されると、疲弊カウンタ値はダーティキャッシュ112に書き込まれる。この時、ダーティキャッシュ112の全ての第4エントリが有効データを記憶していれば、疲弊情報管理部58は、例えば前述したキャッシュ効率が良い順に応じた追い出し対象の第4エントリの疲弊カウンタ値をダーティキャッシュ112から追い出す。疲弊情報管理部58は、ダーティキャッシュ112から追い出した疲弊カウンタ値を、不揮発化テーブル116に書き込み不揮発化するとともに、クリーンキャッシュ114に書き込む。
図11に示す例では、ダーティキャッシュ112から疲弊カウンタ値が未だ追い出されておらず、クリーンキャッシュ114は空の状態であり、不揮発化テーブル116の疲弊カウンタ値は更新されていない。
【0114】
或る読み書き単位領域の疲弊カウンタ値が更新され、当該疲弊カウンタ値がダーティキャッシュ112に記憶されている場合、ダーティキャッシュ112の疲弊カウンタ値は更新される。
【0115】
或る読み書き単位領域の疲弊カウンタ値が更新され、当該疲弊カウンタ値がダーティキャッシュ112に記憶されておらず、ダーティキャッシュ112が空き第4エントリを有する場合、ダーティキャッシュ112の空き第4エントリに当該読み書き単位領域の第3インデックス値と疲弊カウンタ値の組が記憶される。
【0116】
或る読み書き単位領域の疲弊カウンタ値が更新され、当該疲弊カウンタ値がダーティキャッシュ112に記憶されておらず、ダーティキャッシュ112が空き第4エントリを有しない場合、ダーティキャッシュ112の1つのデータ記憶第4エントリからデータ(すなわち、第3インデックス値と疲弊カウンタ値の組)が追い出され、1つのデータ記憶第4エントリが空き第4エントリとされる。追い出されたデータに含まれる疲弊カウンタ値は、不揮発化テーブル116に書き戻される(不揮発化される)。そして、当該読み書き単位領域の第3インデックス値と疲弊カウンタ値の組が空き第4エントリに記憶される。
【0117】
全体キャッシュ方式では、ダーティキャッシュ112の容量とクリーンキャッシュ114の容量とを併せた容量が、少なくとも不揮発化テーブル116の容量となる。部分キャッシュ方式では、ダーティキャッシュ112とクリーンキャッシュ114を併せた容量は、不揮発化テーブル116の容量未満である。
【0118】
管理情報36の全てがRAM30上で管理されるPLP一括方式またはセグメント・ログ方式が想定し得るにも関わらず、全体キャッシュ方式として管理情報36の全てがRAM30上にキャッシュできる場合を想定しているのは、次の理由による。すなわち、PLP一括方式またはセグメント・ログ方式では、管理情報不揮発化領域32bはリングバッファ状に利用され、不揮発化される情報がリングバッファに周回的に書き込まれる。これにより、管理情報不揮発化領域32bの疲弊が平準化される一方で、製品寿命期間中に想定される不揮発化処理回数に応じた大きさのリングバッファが必要になる。したがって、製品寿命期間中に想定される不揮発化処理回数によっては、疲弊カウンタ値を含む管理情報36のサイズがある程度大きい場合、ユーザデータを記憶可能な容量が大きく減ってしまう。この課題を解決するのが全体キャッシュ方式である。
【0119】
部分/全体キャッシュ方式では、例えば、一般に知られているメモリ階層構造におけるキャッシュミス時の追い出し処理を実施することで疲弊カウンタ値を不揮発化テーブル116に不揮発化することができる。更新された疲弊カウンタ値はダーティキャッシュ112に記憶され、不揮発化テーブル116には記憶されていない。そのため、シャットダウンコマンド、または、電源異常断イベント通知を受信した時などに、ダーティキャッシュ112に記憶されている疲弊カウンタ値は、不揮発化テーブル116に書き戻さないと、失われてしまう。通常動作においても、ダーティキャッシュ112に空き第4エントリが無い場合、疲弊カウンタ値が更新されると、1つのデータ記憶第4エントリのデータが追い出され、空き第4エントリが作られ、更新された疲弊カウンタ値が空き第4エントリに記憶される。追い出されたデータに含まれる疲弊カウンタ値は、不揮発化テーブル116に書き戻される。
【0120】
一般に、追い出し対象が決定される順序は不定なため、追い出し先の不揮発化テーブル116の読み書き単位領域間の疲弊がばらつくことになる。したがって、PLP一括方式またはセグメント・ログ方式とは異なり、管理情報不揮発化領域32bのウェアレベリング処理が必要になる。
【0121】
例えば、ユーザデータ記録領域32aのウェアレベリングを実行する際に、ウェアレベリング部60は、管理情報不揮発化領域32bもウェアレベリングの対象に含める。このために、PCM32の記録領域は、PLP一括方式またはセグメント・ログ方式とは異なり、ユーザデータ記録領域32aと管理情報不揮発化領域32bとで共用される。より詳細には、PCM32の記録領域は、ある時点ではユーザデータを記録するユーザデータ記録領域32aとして利用され、またある時点では管理情報36を記録する管理情報不揮発化領域32bとして利用され得る。ウェアレベリング部60は、PCM32の記録領域の疲弊度に基づいて、PCM32の記録領域の物理アドレスと論理アドレスとの割り当てを決定する。CPU42の各機能部は、PCM32の記録領域がユーザデータ記録領域32aであるか、または管理情報不揮発化領域32bであるかを、論理アドレスに基づいて知ることができる。例えば、CPU42の各機能部が論理アドレス空間の先頭アドレスから所定のアドレスまでをユーザデータ記録領域32aとして使い、所定のアドレスから論理アドレス空間の最終アドレスまでを管理情報不揮発化領域32bとして使う場合、CPU42の各機能部は、論理アドレスに基づいて、PCM32の記録領域がユーザデータ記録領域32aであるか、または管理情報不揮発化領域32bであるかを知ることができる。
【0122】
つまり、部分/全体キャッシュ方式では、管理情報36の不揮発化先を特定するための情報として論理アドレスが割り当てられ、管理情報36もウェアレベリングとアドレス変換の対象とされる。そのため、部分/全体キャッシュ方式によっては、ブートストラップに必要な管理情報、例えばアドレス変換情報36bを管理できない場合があり得る。部分/全体キャッシュ方式では、メモリシステム20の起動時に最初に取り出す必要がない管理情報、例えば疲弊カウンタ値を管理できる。
【0123】
部分/全体キャッシュ方式では、PLP一括方式またはセグメント・ログ方式と異なり、疲弊カウンタ値を記録するために確保しておくべき不揮発化テーブル116の容量は、疲弊カウンタ値の容量だけでよい。したがって、PLP一括方式またはセグメント・ログ方式と比べて、ユーザデータを記憶可能な容量を多く提供できる。
【0124】
部分/全体キャッシュ方式では、ダーティキャッシュ112の第4エントリの管理が必要になる。第4エントリの管理は、シャットダウンコマンド、または、電源異常断イベント通知を受信した時にダーティキャッシュ112のどのデータ記憶第4エントリに記憶されている疲弊カウンタ値を不揮発化するかを決定することを含む。この管理の実現方式は複数考えられる。
【0125】
一つの実現方式は、
図11に示すように、キャッシュをクリーンキャッシュ114とダーティキャッシュ112に分割し、ダーティキャッシュ112のデータ記憶第4エントリの数を、PLPで不揮発化できる容量以下のデータを記憶する数に制限することである。他にも、キャッシュ自体は1つであるが、ダーティキャッシュ112の第4エントリのアドレスとその数を別に管理しておき、ダーティキャッシュ112の第4エントリの数を制限しておくという方式もある。どのような管理方式にしろ、PLPでの不揮発化が必要ならば、ダーティキャッシュ112のデータ記憶第4エントリの数をPLPで不揮発化できる容量に合わせて制限する必要がある。これが、部分/全体キャッシュ方式の性能の制約である。
【0126】
例えば、PLPで不揮発化できるサイズが1MBであり、疲弊カウンタ値のサイズが100MBである場合を想定する。この場合、疲弊カウンタ値全体がランダムに更新されても、100MB中1MBしかダーティキャッシュ112として保持できない。このため、ランダムライト時に、ダーティキャッシュ112のいずれかのデータ記憶第4エントリに記憶されている疲弊カウンタ値が99%の確率で不揮発化テーブル116に書き込まれ、不揮発化される。すなわち、疲弊カウンタ値全体がランダムに更新されると、不揮発化の頻度が高くなってしまう。
【0127】
また、疲弊カウンタ値を参照する場合は、読み出し対象の疲弊カウンタ値がキャッシュされているかどうかで、不揮発化テーブル116からの不揮発化疲弊カウンタ値の読み出しの有無が変わる。読み出し対象の疲弊カウンタ値がキャッシュされている場合、ダーティキャッシュ112又はクリーンキャッシュ114から当該疲弊カウンタ値が読み出される。読み出し対象の疲弊カウンタ値がキャッシュされていない場合、不揮発化テーブル116から当該疲弊カウンタ値が読み出されキャッシュされる。したがって、ダーティキャッシュ112の容量だけでなく、クリーンキャッシュ114の容量に応じたリードキャッシュヒット率も重要な性能指標となる。
【0128】
不揮発化テーブル116への疲弊カウンタ値の書き込みは、Read-Modify-Writeで行われることがある。不揮発化テーブル116への疲弊カウンタ値の書き込みは、PCM32の読み書き単位領域毎に実行されるため、読み書き単位領域に複数の疲弊カウンタ値が含まれ得る。ランダムライトの場合、更新対象の疲弊カウンタ値が、読み書き単位領域に含まれる複数の疲弊カウンタ値のうちの一つとなることが大半である。この場合、まず読み書き単位領域分の複数の疲弊カウンタ値が不揮発化テーブル116から読み出され、その中の一つの疲弊カウンタ値が更新される。更新された疲弊カウンタ値はダーティキャッシュ112にキャッシュされる。読み出されたものの更新されなかった疲弊カウンタ値はクリーンキャッシュ114にキャッシュされる。更新された疲弊カウンタ値は、ダーティキャッシュ112から追い出される際に、クリーンキャッシュ114にキャッシュされた疲弊カウンタ値とともに、読み書き単位領域分の複数の疲弊カウンタ値として不揮発化テーブル116に書き込まれる。この観点からも、クリーンキャッシュ114の意義は存在する。すなわち、クリーンキャッシュ114により、Read-Modify-Writeの最初の不揮発化テーブル116からのリードが、ダーティキャッシュ112から疲弊カウンタ値が追い出される際には不要となり、メモリシステム20の書き込み性能が向上する。また、多くの疲弊カウンタ値は数バイトとPCM32の読み書き単位領域の大きさに比べて小さい。したがって、PCM32の読み書き単位領域毎にキャッシュが管理される場合、クリーンキャッシュ114又はダーティキャッシュ112の1エントリには、複数の疲弊カウンタ値が記憶される。したがって、シーケンシャルなアクセスでは、ダーティキャッシュ112の容量制約はあまり大きな問題とならない可能性はある。
【0129】
メモリシステム20の起動時には、一般に知られているメモリ階層構造におけるキャッシュと同様に、疲弊カウンタ値の復元処理は特段実施する必要はない。通常動作中に疲弊カウンタ値が参照される時に、疲弊カウンタ値が、適宜不揮発化テーブル116からダーティキャッシュ112又はクリーンキャッシュ114に読み込まれれば良い。なお、特に全体キャッシュ方式の場合は、メモリシステム20の起動時に全ての疲弊カウンタ値が不揮発化テーブル116からダーティキャッシュ112又はクリーンキャッシュ114に読み込まれても良い。これにより、通常動作中に疲弊カウンタ値が不揮発化テーブル116からダーティキャッシュ112又はクリーンキャッシュ114に読み込まれることがなくなり、通常動作中の性能を向上することができる。
【0130】
次に、本実施形態における疲弊情報36aの不揮発化に関するいくつかの方式を説明する。
【0131】
[差分方式]
管理情報の一つである疲弊カウンタ値は大容量で、かつ更新頻度は高い。このことは幾つかの問題を引き起こす。一つは、エンデュランスの消費の問題である。疲弊カウンタ値は、ホストアクセス1回ごとに少なくとも1回更新される。ホスト10によるリードアクセスの場合でも、疲弊カウンタ値は更新される。セグメント・ログ方式が用いられる場合、PLPにより不揮発化できるデータの容量以下になるように決められているログの数がN個である場合、平均して疲弊カウンタ値の更新N回につき、N個分のログと1個のセグメントに記憶されている疲弊カウンタ値の不揮発化が発生する。部分/全体キャッシュ方式が用いられる場合、ダーティキャッシュ112のヒット率にも依存するが、例えば数百MBの疲弊カウンタ値が1MBのダーティキャッシュ112で管理されるという条件において全面ランダムリードが行われると、1回の疲弊カウンタ値の更新に対して99%以上の確率でダーティキャッシュ112からの追い出しと不揮発化が発生する。リードアクセスによるPCM32の疲弊度は、ライトアクセスによるPCM32の疲弊度の百分の一程度であると想定されるため、ホストリード1回(あるいは数回)に対して疲弊カウンタ値の更新によるPCM32への書き込みが1回発生するというのは、エンデュランスの観点から望ましくない。
【0132】
もう一つの問題として、疲弊カウンタ値の不揮発化によるバンド幅消費の問題がある。ここでのバンド幅は、コントローラ34とPCM32との間の、単位時間あたりのデータ転送量である。疲弊カウンタ値の不揮発化により消費するバンド幅が、ホスト10とPCM32との間のユーザデータの転送性能に影響を与えることがある。部分/全体キャッシュ方式の例で言えば、ホストライト1回につき疲弊カウンタ値の不揮発化によるPCM32への書き込みがほぼ1回起きるということは、実質的にPCM32へは2倍のバンド幅を要求することになる。これは性能、コストの観点からかなり厳しい問題となる。
【0133】
PLP一括方式を採用することが可能であれば、ここで述べた問題は発生しない。しかし、PLP一括方式は、容量が大きい管理情報36の管理には適用できない。
【0134】
疲弊カウンタ値の不揮発化に伴う疲弊度の過度な上昇を抑制する方式として、実施形態に係る差分方式を説明する。差分方式は、セグメント・ログ方式のログ、又は部分/全体キャッシュ方式のキャッシュデータを差分として管理する方式である。
【0135】
差分は、現在の疲弊カウンタ値から既に不揮発化された疲弊カウンタ値(の合計)を減算した差を示す。疲弊情報36aは、差分値を求めるための差分カウンタを備える。差分カウンタは、PCM32の読み書き単位領域毎に設けられる。差分値は、疲弊カウンタ値が更新されると、更新される。差分値は、疲弊カウンタ値が不揮発化されると、0に戻る。これにより、差分値は、現在の疲弊カウンタ値から既に不揮発化された疲弊カウンタ値(の合計)を減算した差を示すことができる。
【0136】
疲弊情報管理部58は、差分値に基づいて疲弊カウンタ値の不揮発化を制御する。例えば、疲弊情報管理部58は、通常稼働中、或る読み書き単位領域のアクセスに伴い、差分値が所定の閾値以上になった場合、この或る読み書き単位領域の疲弊カウンタ値を管理情報不揮発化領域32bに書き込み、不揮発化する。疲弊情報管理部58は、この或る読み書き単位領域の疲弊カウンタ値を不揮発化すると、その読み書き単位領域の差分値を0にリセットする。疲弊情報管理部58は、差分値が所定の閾値未満の場合、疲弊カウンタ値の不揮発化を実行しない。差分値が小さい疲弊カウンタ値は失われたとしても、不揮発化を実行しないことを決定した時点よりも以前に不揮発化されている疲弊カウンタ値から復元される疲弊カウンタ値と実際の疲弊カウンタ値との差が小さいので、疲弊カウンタ値に基づくウェアレベリングの際、問題は殆ど生じないと考えられる。このようにすることで、アクセスの度に疲弊カウンタ値の不揮発化を実行することがないので、PCM32の疲弊を抑えることができる。
【0137】
RAM30が記憶できる疲弊カウンタ値の容量には上限がある。RAM30が記憶できる差分値の容量にも上限がある。RAM30は、一部の読み書き単位領域の差分値を記憶できない。RAM30が記憶する差分値に対応する読み書き単位領域の以外の読み書き単位領域がアクセスされ、当該読み書き単位領域の疲弊カウンタ値と差分値が更新された場合、疲弊情報管理部58は、更新後の疲弊カウンタ値と差分値をRAM30に書き込む。疲弊情報管理部58は、差分値をRAM30に書き込む前に、RAM30が既に記憶している差分値の容量を調べる。疲弊情報管理部58は、RAM30が既に記憶している差分値の容量が閾値容量以上の場合、RAM30の差分値記憶用領域の空き容量が不足していると判断する。この場合、疲弊情報管理部58は、値が小さい差分値をRAM30から追い出して、新たに書き込むべき差分値の記憶用領域を確保する。
【0138】
疲弊情報管理部58は、RAM30から追い出した差分値を不揮発化しない。上述したように、値が小さい差分は失われたとしても、不揮発化を実行しないことを決定した時点よりも以前に不揮発化されている疲弊カウンタ値から復元される疲弊カウンタ値と実際の疲弊カウンタ値との差が小さいので、疲弊カウンタ値に基づくウェアレベリングの際、問題は殆ど生じないと考えられる。
【0139】
疲弊情報管理部58は、シャットダウンコマンド、または、電源異常断イベント通知を受信した時に、差分値が大きい順に疲弊カウンタ値を不揮発化する。これに伴い、差分値が小さい疲弊カウンタ値は不揮発化されない可能性がある。しかし、上述したように、差分値が小さい疲弊カウンタ値は失われたとしても、問題は殆ど生じないと考えられる。
【0140】
図12(a)は、差分方式の原理を説明するための図である。
図12(a)は、RAM30が記憶する疲弊カウンタ値の分布を示す。疲弊カウンタ値の分布の形はあくまでも例であり、ここでは正規分布を仮定している。
図12(b)は、疲弊カウンタ値の差分の分布を示す。
図12(a)と(b)の横軸は、管理情報不揮発化領域32bの各読み書き単位領域の物理アドレスに対応する。
図12(a)に示した棒グラフの破線の縦棒は、不揮発化された疲弊カウンタ値の合計を示す。
図12(a)に示した棒グラフの実線の縦棒は、不揮発化されていない疲弊カウンタ値、すなわち差分値を示す。
図12(b)に示した破線は、疲弊カウンタ値を示し、実線は、差分値を示す。つまり、
図12(b)の実線に相当する差分値が、シャットダウンコマンド、または、電源異常断イベント通知が受信された時に不揮発化されずに失われる可能性がある。
図12(b)の実線に相当する差分値が全て失われたとしても、失われる差分値は、いずれも所定の閾値未満である。さらに、シャットダウンコマンド、または、電源異常断イベント通知が受信された時には、差分値が大きい順に疲弊カウンタ値が不揮発化されるため、実際に失われる差分値は、所定の閾値よりもかなり小さい値になることが期待できる。したがって、問題は殆ど生じないと考えられる。
【0141】
なお、シャットダウンコマンドを受信した時は、バックアップ電源28の電力供給能力に基づく不揮発化できるデータサイズの制限を受けないため、電源異常断イベント通知を受信した時と比べて、より多くの疲弊カウンタ値を不揮発化してもよい。これにより、失われる差分値をより少なくすることができる。
【0142】
以下、セグメント・ログ方式と部分/全体キャッシュ方式に差分方式を組み合わせた実施形態に係る疲弊情報管理方式を説明する。
【0143】
[セグメント・ログ・差分方式]
図4乃至
図10に示したセグメント・ログ方式と本方式との違いは、ログの内容である。セグメント・ログ方式では、ログは、更新された第1テーブル102の第1エントリの第1インデックス値と疲弊カウンタ値の組である。本方式では、ログは更新された第1テーブル102の第1エントリの第1インデックス値と、疲弊カウンタ値の差分との組である。
【0144】
図13乃至
図17は、セグメント・ログ・差分方式における、通常稼働時のセグメントとログの更新を時間の経過に従って説明するための図である。
【0145】
図13(a)は、或るタイミングにおけるRAM30に記憶されている第1テーブル202の一例を示す。第1テーブル202は、セグメント・ログ方式の第1テーブル102と対応する。第1テーブル202の構造及び作用のうち第1テーブル102の構造及び作用と同じものについての詳細な説明は省略する。
図13(b)は、或るタイミングにおけるRAM30に記憶されている第2テーブル206の一例を示す。第2テーブル206は、セグメント・ログ方式の第2テーブル106と対応する。第2テーブル206の構造及び作用うち第2テーブル106の構造及び作用と同じものについての詳細な説明は省略する。第1テーブル202と第2テーブル206は疲弊情報36aに含まれる。
図13乃至
図16では、第2テーブル206は、例えば6個の第2エントリを含む。
【0146】
第2テーブル206の複数の第2エントリは、第1テーブル202の直近の数回の更新の様子を示すログを記憶するものである。ログは、第1テーブル202の更新された第1エントリの第1インデックス値と、疲弊カウンタ値の差分との組である。疲弊情報管理部58は、差分値の大きい順に第2テーブル206の第2エントリを並べる。第2テーブル206に記憶されている或るログの差分値が所定のログ不揮発化閾値(例えば500)を超えると、第2テーブル206に記憶されているログは不揮発化される。第2テーブル206は、1回の不揮発化処理で不揮発化されるログの個数よりも多くの個数のログを記憶してもよい。これは、できるだけ多い数のログを第2テーブル206に保持することで、後述するログの破棄ができるだけ起こらないようにして、実際の疲弊カウンタ値との誤差をできるだけ少なくするためである。
【0147】
或るタイミングにおいて、第1テーブル202の全ての第1エントリの疲弊カウンタ値は50であり、疲弊カウンタ値は全て管理情報不揮発化領域32bにも記憶されている(すなわち、不揮発化されている)とする。このタイミングにおいて、第2テーブル206の全ての第2エントリは空き第2エントリであるとする。
【0148】
この状態からホストライトコマンドまたはホストリードコマンドに伴いPCM32へのデータの書き込みまたはPCM32からのデータの読み出しが数回行なわれたとする。疲弊情報管理部58は、ライト部54またはリード部52から通知された物理アドレスに応じて、第1テーブル202と第2テーブル206を更新する。
図13(a)は、更新後の第1テーブル202を示す。
図13(b)は、更新後の第2テーブル206を示す。
図13(a)は、第1インデックス2の第1エントリe11に対応する読み書き単位領域の疲弊カウンタ値が51に更新され、第1インデックス5の第1エントリe12に対応する読み書き単位領域の疲弊カウンタ値が150に更新された場合の第1テーブル202を示す。
【0149】
疲弊情報管理部58は、第1テーブル202の更新された第1インデックスの疲弊カウンタ値そのものではなく、更新前と更新後との差分値を第1インデックス値とともにログとして第2テーブル206に書き込む。
図13(b)は、この時RAM30に記憶される第2テーブル206を示す。疲弊情報管理部58は、差分値の大きい順に第2テーブル206の第2エントリを並べるので、第2インデックス0の第2エントリe13に、第1インデックス値5と差分値100(=150-50)の組であるログを書き込み、第2インデックス1の第2エントリe14に、第1インデックス値2と差分値1(=51-50)の組であるログを書き込む。これら2つの第2エントリe13、e14は、ログ記憶第2エントリである。その他の第2エントリe15、e16、e17、e18は、空き第2エントリである。
【0150】
その後、ホストライトコマンドまたはホストリードコマンドに伴いPCM32へのデータの書き込みまたはPCM32からのデータの読み出しが数回行なわれたとする。疲弊情報管理部58は、ライト部54またはリード部52から通知された物理アドレスに応じて、第1テーブル202と第2テーブル206を更新する。
図14(a)は、更新後の第1テーブル202を示す。
図14(b)は、更新後の第2テーブル206を示す。
図14(a)は、第1インデックス0の第1エントリe19の疲弊カウンタ値が150に更新され、第1インデックス5の第1エントリe12の疲弊カウンタ値が450に更新され、第1インデックス6の第1エントリe20の疲弊カウンタ値が82に更新され、第1インデックス7の第1エントリe21の疲弊カウンタ値が250に更新され、第1インデックス9の第1エントリe22の疲弊カウンタ値が53に更新された場合の第1テーブル202を示す。
【0151】
第1エントリe19の疲弊カウンタ値の差分値が100(=150-50)に更新され、第1エントリe12の疲弊カウンタ値の差分値が400(=450-50)に更新され、第1エントリe20の疲弊カウンタ値の差分値が32(=82-50)に更新され、第1エントリe21の疲弊カウンタ値の差分値が200(=250-50)に更新され、第1エントリe22の疲弊カウンタ値の差分値が3(=53-50)に更新される。疲弊情報管理部58は、差分値の大きい順に第2テーブル206の第2エントリを並べるので、第2エントリe13に、第1インデックス値5と差分値400の組であるログを書き込み、第2エントリe14に、第1インデックス値7と差分値200の組であるログを書き込み、第2エントリe15に、第1インデックス値0と差分値100の組であるログを書き込み、第2エントリe16に、第1インデックス値6と差分値32の組であるログを書き込み、第2エントリe17に、第1インデックス値9と差分値3の組であるログを書き込み、第2エントリe18に、第1インデックス値2と差分値1の組を記憶するログを書き込む。第2テーブル206の空き第2エントリの個数は0になる。
【0152】
その後、ホストライトコマンドまたはホストリードコマンドに伴いPCM32へのデータの書き込みまたはPCM32からのデータの読み出しが数回行なわれたとする。疲弊情報管理部58は、ライト部54またはリード部52から通知された物理アドレスに応じて、第1テーブル202と第2テーブル206を更新する。
図15(a)は、更新後の第1テーブル202を示す。
図15(b)は、更新後の第2テーブル206を示す。
図15(a)は、第1インデックス8の第1エントリe23の疲弊カウンタ値が150に更新された場合の第1テーブル202を示す。
【0153】
第1エントリe23の疲弊カウンタ値が更新されたので、差分値も更新される。第1エントリe23の疲弊カウンタ値の差分値は100(=150-50)に更新される。疲弊情報管理部58は、第2テーブル206に第1インデックス値8と差分100の組であるログを書き込む必要がある。しかし、第2テーブル206の空き第2エントリの個数は0であり、ログを第2テーブル206に書き込むことができない。すなわち、疲弊情報管理部58は、第2テーブル206に新たなログを書き込む前に、第2テーブル206に空き第2エントリがあるか否かを判定する。第2テーブル206に空き第2エントリがない場合、疲弊情報管理部58は、第2テーブル206に空き第2エントリを生成する。疲弊情報管理部58は、第2エントリe18に記憶されているログ(第1インデックス値2と差分値1の組)を、第2テーブル206から追い出す。疲弊情報管理部58は、第2エントリe16とe17にそれぞれ記憶されているログ(すなわち、第1インデックス値6と差分値32の組と、第1インデックス値9と差分値3の組)を、第2エントリe17とe18にそれぞれ書き込む。疲弊情報管理部58は、第1インデックス値8と差分値100の組であるログを第2エントリe16に書き込む(
図15(b))。
【0154】
第2テーブル206から追い出されるログの順番は、ログが記憶する差分値が小さい順である。したがって、第2テーブル206から追い出されるログに記憶されている差分値は、失われても問題は殆ど生じないと考えられる。そのため、疲弊情報管理部58は、第2テーブル206から追い出したログを不揮発化せずに、RAM30から削除する。これにより、差分の不揮発化の頻度が削減されることが期待できる。
【0155】
疲弊情報管理部58は、第2テーブル206から追い出した差分値である1を、第1テーブル202の第1エントリe11の疲弊カウンタ値51から減算せず、その第1エントリe11に疲弊カウンタ値51をそのまま残す。これは、ウェアレベリング部60がウェアレベリング処理を実施する際に参照する疲弊情報は、第1テーブル202であるから、実際の疲弊度に応じたウェアレベリング処理を実施するために疲弊カウンタ値をそのまま残しておく必要があるためである。また、残しておくことでさらに別の効果を奏する。その効果については後述する。
【0156】
新しいログを第2テーブル206に追加する際、差分値の大きい順に第2テーブル206の第2エントリを並べるというルールを厳密に守ると、第2テーブル206に追加されたログが直ぐに第2テーブル206から追い出される事態や、ログが第2テーブル206にそもそも追加できない事態が生じる可能性が考えられる。こうなると、第1テーブル202の更新パターンが変化しても、過去に多く更新された第1テーブル202の様子を示すログが第2テーブル206に残り続けるようになり、ログが第1テーブル202の更新パターンの変化に追従できなくなる。このため、第2テーブル206に追加されたログが少なくとも一定期間は追い出されないようにログの差分値に重みづけをしてもよい。また、たとえ差分値が第2テーブル206に記憶されている全てのログの差分値よりも小さくても、必ず一度はログが第2テーブル206に追加されるようにしてもよい。
【0157】
次に、
図15に示される状態からPCM32へのデータの書き込みまたはPCM32からのデータの読み出しが数回行なわれたとする。疲弊情報管理部58は、ライト部54またはリード部52から通知された物理アドレスに応じて、第1テーブル202と第2テーブル206を更新する。
図16(a)は、更新後の第1テーブル202を示す。
図16(b)は、更新後の第2テーブル206を示す。
図16(a)は、第1エントリe12の疲弊カウンタ値が550に更新された場合の第1テーブル202を示す。疲弊情報管理部58は、第2エントリe13のログ(
図15(b)に示す第1インデックス値5と差分値400の組)に記憶されている差分値400を、差分値500に更新する。
図16(b)は、この更新後の第2テーブル206の一例を示す。
【0158】
疲弊情報管理部58は、第1テーブル202と第2テーブル206を更新後、第2テーブル206のログに記憶されている差分値をログ不揮発化閾値と比較する。疲弊情報管理部58は、ログに記憶されている差分値がログ不揮発化閾値以上になったことを検出すると、不揮発化の対象となる第1テーブル202のセグメントと第2テーブル206のログとを選択する。セグメント・ログ方式と同様に、1回の不揮発化において、疲弊カウンタ値は第1テーブル202の1セグメント毎に不揮発化される。第2テーブル206のログは、差分値が多い順に所定個数ずつ不揮発化される。ここでは、所定個数が2個の例を示している。また、ここでは、ログ不揮発化閾値が500であるとする。この場合、
図16(b)に示すように、第2エントリe13のログに記憶されている差分値が500となると、疲弊情報管理部58は、第1テーブル202のセグメントAの疲弊カウンタ値と、第2テーブル206の第2エントリe13のログと、第2エントリe14のログと、を不揮発化の対象として選択する。つまり、第2テーブル206の1個の第2エントリ(例えば、e13)のログの差分値がログ不揮発化閾値以上になったことに応じ、差分値がログ不揮発化閾値以上である第2エントリのログが不揮発化されるとともに、差分値がログ不揮発化閾値以上になっていない、すなわち差分値の大きさが次に大きい第2エントリ(例えば、e14)のログも併せて不揮発化されることになる。
【0159】
PCM32の読み書き単位領域毎にログは不揮発化されるが、一般に、1個の第2エントリのサイズはPCM32の読み書き単位領域のサイズよりも小さい。このため、差分値がログ不揮発化閾値以上になっていないログも合わせて不揮発化することで、ログの不揮発化のサイズをPCM32の読み書き単位領域のサイズに一致させることができる。また、これにより、差分値がログ不揮発化閾値以上になったログのみを不揮発化する場合と比べて、不揮発化された疲弊カウンタ値と、実際の疲弊カウンタ値との誤差をできるだけ少なくすることができる。
【0160】
図17は、疲弊カウンタ値とログの不揮発化を説明するための図である。
図17(a)は、RAM30に記憶されている第1テーブル202の一例を示す。
図17(a)に示す第1テーブル202は、
図16(a)に示す第1テーブル202と同じである。
図17(b)は、ログの不揮発化が行われた後の、RAM30に記憶されている第2テーブル206の一例を示す。
図17(c)は、PCM32(管理情報不揮発化領域32b)に記憶されている不揮発化されたログを記憶する不揮発化第2テーブル208の一例を示す。
図17(d)は、PCM32(管理情報不揮発化領域32b)に記憶されている不揮発化された疲弊カウンタ値を記憶する不揮発化セグメント210の一例を示す。
【0161】
先ず、ログの不揮発化について説明する。セグメント・ログ・差分方式では、RAM30に記憶されている第2テーブル206の第2エントリは、第1インデックス値と差分値の組を記憶するログを記憶する。疲弊情報管理部58は、第2テーブル206の不揮発化の際、第1インデックス値と差分値の組を記憶するログを、第1インデックス値と疲弊カウンタ値の組を記憶するログに変更して不揮発化する。疲弊情報管理部58は、不揮発化する2つのログを、記憶されている差分値の大きい順に選ぶ。疲弊情報管理部58は、第2テーブル206を参照して、差分値の大きい2つのログを選ぶ。
図16(b)に示す例では、疲弊情報管理部58は、第2エントリe13のログ(第1インデックス値5と差分値500の組)と、第2エントリe14のログ(第1インデックス値7と差分値200の組)を選ぶ。そして、
図17(c)に示すように、疲弊情報管理部58は、第1インデックス値5と疲弊カウンタ値550の組をログ209aとして、第1インデックス値7と疲弊カウンタ値250の組を不揮発化ログ209bとして、それぞれ不揮発化第2テーブル208に書き込む。不揮発化第2テーブル208は2つの不揮発化第2エントリを含む。ここでは、疲弊情報管理部58は、第1インデックス値5と疲弊カウンタ値550の組である不揮発化ログ209aを第2インデックス0の不揮発化第2エントリに書き込み、第1インデックス値7と疲弊カウンタ値250の組である不揮発化ログ209bを第2インデックス1の不揮発化第2エントリに書き込む。
図17(c)は、この時の不揮発化第2テーブル208を示す。不揮発化第2テーブル208の不揮発化第2エントリの並び順は任意である。例えば、不揮発化第2テーブル208の不揮発化第2エントリの並び順は、差分値の大きい順でも疲弊カウンタ値の大きい順でもよい。
【0162】
疲弊情報管理部58は、不揮発化第2テーブル208として管理情報不揮発化領域32bに書き込んだ第2エントリe13のログ(第1インデックス値5と差分値500の組を記憶するログ)と、第2エントリe14のログ(第1インデックス値7と差分値200の組を記憶するログ)を第2テーブル206(
図16(b))から削除する。この削除により差分値の情報が失われる。すなわち、この削除は、[差分方式]で説明した、疲弊カウンタ値が不揮発化されたことに応じて差分値が0に戻ることに相当する。疲弊情報管理部58は、第2エントリe15~e18のログを、第2エントリe13~e16にそれぞれ書き込む。第2エントリe17とe18は、空き第2エントリとなる(
図17(b))。
【0163】
セグメントの不揮発化については、セグメント・ログ方式と同様に、疲弊情報管理部58は、セグメントポインタが指す1つのセグメントに記憶されている疲弊カウンタ値を管理情報不揮発化領域32bに書き込むことにより不揮発化する。ここでは、例えばセグメントAに記憶されている疲弊カウンタ値が不揮発化される。疲弊情報管理部58は、セグメントAに含まれる第1インデックス0、1、2、及び3の第1エントリの疲弊カウンタ値を、不揮発化セグメント210の第1インデックス0、1、2、及び3の不揮発化第1エントリに書き込む。
図17(d)は、この時の不揮発化セグメント210(不揮発化された第1テーブル202のセグメントA)を示す。
【0164】
第1インデックス0、1、2、及び3の疲弊カウンタ値は、不揮発化セグメント210として不揮発化された。したがって、これらの第1インデックスに対応するログは、第2テーブル206に保持しておく必要はなくなる。
【0165】
疲弊情報管理部58は、不揮発化セグメント210に不揮発化された第1エントリの第1インデックス値を記憶する第2テーブル206のログを、第2テーブル206から削除する。ここでは、疲弊情報管理部58は、第2エントリe13に記憶されている第1インデックス値0(不揮発化された第1エントリe19に対応する第1インデックス値)と差分値100の組であるログを第2テーブル206から削除する。
図17(b)は、第2エントリe13のログが第2テーブル206から削除される様子を示す。これにより、より多い個数のログが第2テーブル206に記憶されるようになる。
【0166】
この後、PCM32へのデータの書き込みまたはPCM32からのデータの読み出しが数回行なわれ、第2テーブル206のいずれかのログが記憶する差分値がログ不揮発化閾値以上になった場合、
図16~
図17に示す動作が繰り返される。
【0167】
図15を参照して説明した処理において、第1インデックス値2と差分値1の組を記憶するログが第2テーブル206から削除されたが、
図17を参照して説明した処理において、セグメントAに記憶されている疲弊カウンタ値が不揮発化されることにより、第1エントリe11の疲弊カウンタ値51が不揮発化される。このように、或る第1インデックスに対応する読み書き単位領域の差分値を記憶するログが不揮発化されずに削除され得る。しかし、メモリシステム20が稼働し続けることによって、少なくとも疲弊カウンタ値のセグメント毎の不揮発化処理が第1テーブル202の1周分完了すると、削除された差分値に対応する疲弊カウンタ値は必ず不揮発化される。このことは、削除されたログに記憶されている第1インデックス値2に対応する第1エントリe11に疲弊カウンタ値51を残したままとしたことによる効果である。この場合、第2テーブル206から追い出されて削除されたログに記憶されている差分値の合計に比べて、実際の疲弊カウンタ値と不揮発化された疲弊カウンタ値との誤差は少なくなることが期待できる。
【0168】
ランダムアクセス時、多くの読み書き単位領域の疲弊カウンタ値が増加するので、疲弊カウンタ値の差分値がログ不揮発化閾値に達する可能性は低い。したがって、疲弊カウンタ値が不揮発化ログ209a、209bとして不揮発化される可能性は低い。その結果、第2テーブル206の全てのログが不揮発化されずに、削除される状況になり得る。しかし、ランダムアクセスの場合は、ユーザデータ記録領域32aの全体にわたって自動的に疲弊が平準化されるため、そもそもウェアレベリングの必要性が低い。したがって、第2テーブル206の全てのログが削除されても影響が少ないと考えられる。
【0169】
シャットダウンコマンド、または、電源異常断イベント通知を受信した時に、疲弊情報管理部58は、少なくともPLPで不揮発化可能なデータサイズに対応したエントリの個数分のログを不揮発化する。疲弊情報管理部58は、不揮発化するログを、第2テーブル206に記憶されているログのうち、差分値の大きい順に選ぶ。以下では、PLPで不揮発化可能なデータサイズに対応したエントリの個数が2である場合について説明する。この場合、疲弊情報管理部58は、ログを、その差分値を第1テーブル202の第1エントリに記憶されている疲弊カウンタ値に変えて、不揮発化ログ209a、209bとして不揮発化する。疲弊情報管理部58は、これにより、実際の疲弊カウンタ値に対する不揮発化疲弊カウンタ値の誤差をできるだけ少なくしつつ、疲弊カウンタ値を不揮発化することができる。
【0170】
なお、通常動作中の不揮発化処理と、シャットダウンコマンドまたは電源異常断イベント通知を受信した時の不揮発化処理とで、処理ルーチンを共通化する場合、疲弊情報管理部58は、不揮発化したログ(ここでは2個)を第2テーブル206から削除してもよい。ただし、メモリシステム20への電力供給が絶たれれば、RAM30に記憶されているすべての情報が失われるため、この削除処理は必須ではない。
【0171】
図18は、
図17を参照して説明した不揮発化の後にシャットダウンコマンド、または、電源異常断イベント通知を受信した場合の不揮発化の一例を説明するための図である。疲弊情報管理部58は、第2エントリe14のログ(第1インデックス値8と差分値100の組)と、第2エントリe15のログ(第1インデックス値6と差分値32の組)を選ぶ。そして、
図18(c)に示すように、疲弊情報管理部58は、第1インデックス値8と疲弊カウンタ値150の組をログ209aとして、第1インデックス値6と疲弊カウンタ値82の組を不揮発化ログ209bとして、それぞれ不揮発化第2テーブル208に書き込む。疲弊情報管理部58は、第1インデックス値8と疲弊カウンタ値150の組である不揮発化ログ209aを第2インデックス0の不揮発化第2エントリに書き込み、第1インデックス値6と疲弊カウンタ値82の組である不揮発化ログ209bを第2インデックス1の不揮発化第2エントリに書き込む。
図18(c)は、この時の不揮発化第2テーブル208を示す。不揮発化第2テーブル208の不揮発化第2エントリの並び順は任意である。
【0172】
疲弊情報管理部58は、不揮発化第2テーブル208として管理情報不揮発化領域32bに書き込んだ第2エントリe14のログ(第1インデックス値8と差分値100の組を記憶するログ)と、第2エントリe15のログ(第1インデックス値6と差分値32の組を記憶するログ)を第2テーブル206(
図17(b))から削除する。
【0173】
なお、シャットダウンコマンドを受信した時は、バックアップ電源28の電力供給能力に基づく不揮発化できるデータサイズの制限を受けないため、電源異常断イベント通知を受信した時と比べて、より多くの個数のログを不揮発化してもよい。これにより、電源異常断イベント通知を受信した時と比べて、実際の疲弊カウンタ値に対する不揮発化疲弊カウンタ値の誤差をさらに少なくすることができる。
【0174】
メモリシステム20の起動時の復元処理は、
図10(b)に示したセグメント・ログ方式と同じである。
【0175】
図19は、実施形態に係るセグメント・ログ・差分方式における疲弊情報の不揮発化と復元の手順の一例を説明するためのフローチャートである。
【0176】
メモリシステム20の起動時に、疲弊情報復元部62は、不揮発化された疲弊カウンタ値を不揮発化セグメント210から読み出し、不揮発化されたログを不揮発化第2テーブル208から読み出す。疲弊情報復元部62は、読み出した疲弊カウンタ値とログとから、第1テーブル202復元する(ステップS102)。復元の手順は、例えば、
図10(b)を参照して説明した手順と同様である。
【0177】
疲弊情報管理部58は、シャットダウンコマンド、または電源異常断イベント通知を受信したか否かを判定する(ステップS118)。
【0178】
シャットダウンコマンド、または電源異常断イベント通知を受信した場合(ステップS118でYES)、疲弊情報管理部58は、第2テーブル206に記憶されているログの一部を不揮発化する(ステップS120)。疲弊情報管理部58は、ログを不揮発化する際、差分値を疲弊カウンタ値に変える。疲弊情報管理部58は、不揮発化するログを差分値の大きい順に選ぶ。電源異常断イベントが通知された場合に不揮発化されるログの個数は、バックアップ電源28の電力供給能力に応じ、任意に設計可能である。シャットダウンコマンドが受信された場合に不揮発化されるログの個数は、電源異常断イベントが通知された場合に不揮発化されるログの個数よりも多くしてもよい。その後、メモリシステム20は動作停止する。
【0179】
シャットダウンコマンド、または電源異常断イベント通知を受信していない場合(ステップS118でNO)、疲弊情報管理部58は、疲弊カウンタ値が更新されたか否かを判定する(ステップS104)。疲弊カウンタ値は、例えば、ホストライトコマンドに伴うPCM32へのデータの書き込み、またはホストリードコマンドに伴うPCM32からのデータの読み出しにより更新される。
【0180】
疲弊カウンタ値が更新された場合(ステップS104でYES)、疲弊情報管理部58は、第2テーブル206の空き第2エントリの数が0であるか否かを判定する(ステップS106)。
【0181】
第2テーブル206の空き第2エントリの数が0である場合(ステップS106でYES)、疲弊情報管理部58は、第2エントリに記憶されているログを第2テーブル206から追い出し、第2テーブル206に空き第2エントリを生成する(ステップS108)。この時第2テーブル206から追い出されるログは、例えば、差分値が最小のログである。
【0182】
第2テーブル206の空き第2エントリの数が0ではない場合(ステップS106でNO)、またはステップS108の後、疲弊情報管理部58は、第1テーブル202の疲弊カウンタ値を更新し、第2テーブル206にログを追加または第2テーブル206に記憶されているログ(より詳しくはログの差分値)を更新する(ステップS110)。なお、第2テーブル206に記憶されているログを更新する場合は、疲弊情報管理部58は、ステップS106及びステップS108の処理を省略してもよい。疲弊情報管理部58は、第2テーブル206にログを追加する際、追加したログが一定期間は追い出されないようにしてもよい。
【0183】
疲弊情報管理部58は、第2テーブル206のログに記憶されている差分値がログ不揮発化閾値以上であるか否かを判定する(ステップS112)。
【0184】
第2テーブル206のログに記憶されている差分値がログ不揮発化閾値以上である場合(ステップS112でYES)、疲弊情報管理部58は、第1テーブル202の1つのセグメントの疲弊カウンタ値をPCM32の不揮発化第1セグメント210に書き込み、第2テーブル206の所定個数のエントリのログをPCM32の不揮発化第2テーブル208に書き込む(ステップS114)。不揮発化されるセグメントは、セグメントポインタが指すセグメントである。疲弊情報管理部58は、ログを不揮発化第2テーブル208に書き込む際、差分値を疲弊カウンタ値に変える。不揮発化される所定個数のログは、差分値がログ不揮発化閾値以上であるログと、それ以外で差分値の大きい順に選ばれたログである。
【0185】
疲弊情報管理部58は、不揮発化された疲弊カウント値に対応するログ及び不揮発化されたログを第2テーブル206から削除し、ログを並べ直す(ステップS116)。疲弊情報管理部58は、例えば、差分値の大きい順にログを並べ替える。
【0186】
第2テーブル206のログに記憶されている差分値がログ不揮発化閾値以上ではない場合(ステップS112でNO)、疲弊情報管理部58は、ステップS118の判定を実行する。
【0187】
疲弊カウンタ値が更新されていない場合(ステップS104でNO)、疲弊情報管理部58は、シャットダウンコマンド、または電源異常断イベント通知を受信したか否かを判定する(ステップS118)。
【0188】
[部分/全体キャッシュ・差分方式]
図20乃至
図25は、部分/全体キャッシュ・差分方式における、疲弊カウンタ値の不揮発化を説明するための図である。部分/全体キャッシュ方式と同様に、この方式でも、管理情報不揮発化領域32bはPCM32の全ての読み書き単位領域の疲弊カウンタ値を記憶する領域を備える。この領域は不揮発化テーブル126(
図20(c))と称される。不揮発化テーブル126は、部分/全体キャッシュ方式の不揮発化テーブル116(
図11(c))と対応する。不揮発化テーブル126の構造及び作用のうち不揮発化テーブル116の構造及び作用と同じものについての詳細な説明は省略する。
【0189】
RAM30のキャッシュは、ダーティキャッシュ122(
図20(a))とクリーンキャッシュ124(
図20(b))に分割される。ダーティキャッシュ122は、部分/全体キャッシュ方式のダーティキャッシュ112(
図11(a))と対応する。ダーティキャッシュ122の構造及び作用のうちダーティキャッシュ112の構造及び作用と同じものについての詳細な説明は省略する。クリーンキャッシュ124は、部分/全体キャッシュ方式のクリーンキャッシュ114(
図11(b))と対応する。クリーンキャッシュ124の構造及び作用のうちクリーンキャッシュ114の構造及び作用と同じものについての詳細な説明は省略する。部分/全体キャッシュ方式では、疲弊情報管理部58は、ダーティキャッシュ112の第4エントリをキャッシュ効率の良い順に並べる。一方、部分/全体キャッシュ・差分方式では、ダーティキャッシュ122の第4エントリは差分値を含む。部分/全体キャッシュ・差分方式では、疲弊情報管理部58は、ダーティキャッシュ122の第4エントリを差分値の大きい順に並べる。
【0190】
クリーンキャッシュ114のデータ記憶第5エントリに記憶されている或る第3インデックスの疲弊カウンタ値は、部分/全体キャッシュ方式と異なり、必ずしも不揮発化テーブル126の当該第3インデックスの第3エントリに記憶されている疲弊カウンタ値と同じであるとは限らない。その具体例は
図22を参照して後述する。しかしながら、シャットダウンコマンド、または、電源異常断イベント通知を受信した時には、疲弊情報管理部58は、クリーンキャッシュ124のデータを不揮発化しない。
【0191】
或るタイミングにおいて、不揮発化テーブル126の全ての第3エントリの疲弊カウンタ値が50であるとする。PCM32への読み書きが進み、例えば、第3インデックス5の疲弊カウンタ値が150に更新され、差分値が100となり、第3インデックス2の疲弊カウンタ値が51に更新され、差分値が1となったとする。更新された疲弊カウンタ値は、ダーティキャッシュ122に書き込まれる。そのため、疲弊カウンタ値が更新された場合、疲弊情報管理部58は、ダーティキャッシュ122が空き第4エントリを含むか否かを判定する。ダーティキャッシュ122が空き第4エントリを含む場合、疲弊情報管理部58は、差分値の大きい順にダーティキャッシュ122の第4エントリを並べるため、第4インデックス0の第4エントリe31に第3インデックス値5と差分値100と疲弊カウンタ値150の組を書き込み、第4インデックス1の第4エントリe32に第3インデックス値2と差分値1と疲弊カウンタ値51の組を書き込む。
図20(a)は、この時RAM30に記憶されているダーティキャッシュ122を示す。
【0192】
図20(b)は、この時RAM30に記憶されているクリーンキャッシュ124を示す。このとき、クリーンキャッシュ124は空の状態である。
【0193】
図20(c)は、この時、管理情報不揮発化領域32bに記憶されている不揮発化テーブル126を示す。ここでは、前述した或るタイミング以降不揮発化が行なわれていないことを仮定しているので、不揮発化テーブル126の全ての第3エントリの疲弊カウンタ値は50のままである。
【0194】
PCM32への読み書きが進み、第3インデックス5の疲弊カウンタ値が450に更新され、差分値が400となり、第3インデックス11の疲弊カウンタ値が250に更新され、差分値が200になったとする。疲弊情報管理部58は、差分値の大きい順にダーティキャッシュ122の第4エントリを並べるため、第4インデックス0の第4エントリe31に記憶されている差分値100を400に更新し、疲弊カウンタ値150を450に更新し、第4インデックス1の第4エントリe32のデータ(第3インデックス値2、差分値1、疲弊カウンタ値51)を第4インデックス2の第4エントリe33にシフトし、第4エントリe32に第3インデックス値11と、差分値200と、疲弊カウンタ値250の組を書き込む。
図21(a)は、この時のダーティキャッシュ122を示す。
【0195】
図21(b)は、この時のクリーンキャッシュ124を示す。このとき、クリーンキャッシュ124は空の状態である。
【0196】
図21(c)は、この時の不揮発化テーブル126を示す。ここでも、前述した或るタイミング以降不揮発化が行なわれていないことを仮定しているので、不揮発化テーブル126の全ての第3エントリの疲弊カウンタ値は50のままである。
【0197】
PCM32への読み書きがさらに進み、第3インデックス14の第3エントリに対応する読み書き単位領域の疲弊カウンタ値が150に更新され、差分値が100になったとする。疲弊情報管理部58は、ダーティキャッシュ122が空き第4エントリを含むか否かを判定する。ダーティキャッシュ122が空き第4エントリを含まない場合、疲弊情報管理部58は、ダーティキャッシュ122の第4エントリe33のデータ(
図21(a)に示す第3インデックス値2、差分値1、疲弊カウンタ値51)をダーティキャッシュ122から追い出し、空き第4エントリ(第4エントリe33)を生成し、生成した空き第4エントリe33に、第3インデックス値14と差分値100と疲弊カウンタ値150の組を書き込む。
図22(a)は、この時のダーティキャッシュ122を示す。
【0198】
ダーティキャッシュ122から追い出された第4エントリe33のデータ(第3インデックス値2、差分値1、疲弊カウンタ値51)の中の疲弊カウンタ値51は、管理情報不揮発化領域32bの不揮発化テーブル126に不揮発化されない。ダーティキャッシュ122から追い出される第4エントリの順番は、差分値が小さい順であるので、ダーティキャッシュ122から追い出された第4エントリの疲弊カウンタ値は不揮発化されなくても問題は殆ど生じないと考えられる。これにより、不揮発化の頻度が低下することが期待される。
【0199】
ただし、一般に、データのアクセス局所性が知られており、ダーティキャッシュ122から追い出された第4エントリの疲弊カウンタ値が近い将来アクセスされる可能性はそれなりに高いと考えられる。特に、部分キャッシュ・差分方式の場合、ダーティキャッシュ122から追い出された第4エントリの疲弊カウンタ値をそのまま破棄してしまうと、当該疲弊カウンタ値が再びアクセスされた場合に管理情報不揮発化領域32bの不揮発化テーブル126から疲弊カウンタ値を読み出す必要があり、ペナルティが大きい。
【0200】
そのため、ダーティキャッシュ122から追い出された第4エントリの疲弊カウンタ値はクリーンキャッシュ124として活用される。ここで、クリーンキャッシュ124の第5エントリは、差分値を含まない。このため、疲弊情報管理部58は、ダーティキャッシュ122から追い出したエントリのデータに含まれる差分値を削除して、クリーンキャッシュ124に書き込む。
図22の例で言えば、疲弊情報管理部58は、ダーティキャッシュ122から追い出した第4エントリのデータに含まれる差分値1は破棄して、第3インデックス値2と疲弊カウンタ値51の組を、クリーンキャッシュ124の第5インデックス0の第5エントリe41に書き込む。このように、ダーティキャッシュ122から追い出された第4エントリに記憶されていたデータの一部をクリーンキャッシュ124の第5エントリに記憶することで、データのアクセス局所性に対応できる。また、このように、ダーティキャッシュ122から追い出された第4エントリに記憶されていたデータの一部をクリーンキャッシュ124の第5エントリに記憶する場合、クリーンキャッシュ124の第5エントリに記憶される疲弊カウンタ値は、不揮発化テーブル126の当該第3インデックスの第3エントリに記憶されている疲弊カウンタ値と同じになるとは限らない。ダーティキャッシュ122から追い出した第4エントリに記憶されていたデータの一部をクリーンキャッシュ124に記憶させておくことでさらに別の効果を奏する。その効果については後述する。
図22(b)は、この時のクリーンキャッシュ124を示す。
【0201】
図22(c)は、この時の不揮発化テーブル126を示す。ここでも、前述した或るタイミング以降不揮発化が行なわれていないことを仮定しているので、不揮発化テーブル126の全ての第3エントリの疲弊カウンタ値は50のままである。
【0202】
セグメント・ログ・差分方式と同様に、更新された疲弊カウンタ値の差分値を、第3インデックス値及び疲弊カウンタ値とともにダーティキャッシュ122に追加する際、差分値の大きい順にダーティキャッシュ122の第4エントリを並べるというルールを厳密に守ると、ダーティキャッシュ122に差分値を追加しても直ぐにダーティキャッシュ122から追い出される事態や、そもそもダーティキャッシュ122に差分値を追加できない事態が生じる可能性が考えられる。したがって、セグメント・ログ・差分方式と同様に、ダーティキャッシュ122に追加された差分値が、或る程度の期間、第3インデックス値及び疲弊カウンタ値とともにダーティキャッシュ122に留まっておけるような工夫が必要であると考えられる。例えば、ダーティキャッシュ122に追加されたデータ(すなわち、第3インデックス値、差分値、疲弊カウンタ値の組)が少なくとも一定期間は追い出されないように差分値に重みづけをしてもよい。
【0203】
次に、
図22に示される状態からPCM32への読み書きがさらに進み、第3インデックス5の第3エントリに対応する読み書き単位領域の疲弊カウンタ値が550(差分値が500)になったとする。疲弊情報管理部58は、第3インデックス値5を記憶するダーティキャッシュ122の第4エントリe31の差分値400(
図22(a))を500に更新し、疲弊カウンタ値450を550に更新する。
【0204】
疲弊情報管理部58は、疲弊カウンタ値450を550に更新した後、第4エントリe31、e32、及びe33に記憶されている差分値をダーティキャッシュ不揮発化閾値と比較する。疲弊情報管理部58は、何れかの第4エントリe31、e32、及びe33に記憶されている差分値がダーティキャッシュ不揮発化閾値以上になったことを検出すると、不揮発化を実行する。例えば、ダーティキャッシュ不揮発化閾値が500である場合、第4エントリe31に記憶されている差分値が500に更新されると、疲弊情報管理部58は、第4エントリe31に記憶されている疲弊カウンタ値550を不揮発化テーブル126の第3インデックス5の第3エントリe43に書き込むことにより不揮発化する。
図23(c)は、この時の不揮発化テーブル126を示す。
【0205】
不揮発化と同時に、疲弊情報管理部58は、不揮発化した第4エントリe31のデータ(第3インデックス値5と差分値500と疲弊カウンタ値550の組)をダーティキャッシュ122から削除する。この削除により差分値の情報が失われる。すなわち、この削除は、[差分方式]で説明した、疲弊カウンタ値が不揮発化されたことに応じて差分値が0に戻ることに相当する。疲弊情報管理部58は、第4エントリe32のデータ(第3インデックス値11と差分値200と疲弊カウンタ値250の組)と第4エントリe33のデータ(第3インデックス値14と差分値100と疲弊カウンタ値150の組)を、第4エントリe31とe32にそれぞれシフトする。ダーティキャッシュ122の第4エントリe33は、空き第4エントリとなる。
図23(a)は、この時のダーティキャッシュ122を示す。
【0206】
さらに、不揮発化と同時に、疲弊情報管理部58は、不揮発化した第4エントリe31に記憶されていた第3インデックス値5と疲弊カウンタ値550の組をクリーンキャッシュ124の第5インデックス0の第5エントリe41に書き込むことでクリーンキャッシュ124の第5エントリとして活用する。このように、不揮発化されたダーティキャッシュ122の第4エントリに記憶されていたデータの一部をクリーンキャッシュ124の第5エントリに記憶する場合、クリーンキャッシュ124の第5エントリに記憶されている疲弊カウンタ値は、不揮発化テーブル126の当該第3インデックスの第3エントリに記憶されている疲弊カウンタ値と同じになる。
【0207】
疲弊情報管理部58は、クリーンキャッシュ124の第5エントリを効率の良い順に並べる。効率が良い順の一例は、LRU(Least Recently Used)順である。疲弊情報管理部58は、クリーンキャッシュ124の第5エントリを、記憶している疲弊カウンタ値が前回参照された時間またはクリーンキャッシュ124に追加された時間の新しい順に並べる。ウェアレベリング部60は、ダーティキャッシュ122またはクリーンキャッシュ124に記憶されている疲弊カウンタ値を参照して、ウェアレベリングの必要性を判断し、必要な場合、ウェアレベリングを実行する。
【0208】
より具体的には、疲弊情報管理部58は、第3インデックス値5と疲弊カウンタ値550の組を、クリーンキャッシュ124の第5インデックス0の第5エントリe41に書き込む。疲弊情報管理部58は、クリーンキャッシュ124の第5インデックス0の第5エントリe41に記憶されていた第3インデックス値2と疲弊カウンタ値51の組を、クリーンキャッシュ124の第5インデックス1の第5エントリe42に書き込む。
図23(b)は、この時のクリーンキャッシュ124を示す。
【0209】
なお、クリーンキャッシュ124の6個の第5エントリの全てが有効データを記憶すると、クリーンキャッシュ124はフル状態となる。ダーティキャッシュ122からクリーンキャッシュ124へのデータ(すなわち、第3インデックス値と疲弊カウンタ値の組)の書き込みの必要性がさらに生じると、疲弊情報管理部58は、クリーンキャッシュ124が空き第5エントリを含むか否かを判定する。クリーンキャッシュ124が空き第5エントリを含まない場合、疲弊情報管理部58は、クリーンキャッシュ124のデータ記憶第5エントリのいずれかのデータをクリーンキャッシュ124から追い出し、そのデータ記憶第5エントリを空き第5エントリとする。追い出されるデータは、例えば、前回参照された時間が最も過去の第5エントリのデータである。
【0210】
図23に示される状態からPCM32への読み書きがさらに進み、クリーンキャッシュ124の第5エントリe42に記憶されている第3インデックス値2に対応する読み書き単位領域の疲弊カウンタ値が52(すなわち、クリーンキャッシュ124の第5エントリe42に記憶されている疲弊カウンタ値51からの差分値が1)になったとする。疲弊情報管理部58は、クリーンキャッシュ124の第5エントリe42のデータ(第3インデックス値2と疲弊カウンタ値51の組)と、差分値1とを含むデータをダーティキャッシュ122の第4エントリに移す。疲弊情報管理部58は、第5エントリe42のデータを移す際、疲弊カウンタ値が51から52に更新された状態を反映させる。疲弊情報管理部58は、第3インデックス値2と差分値1と疲弊カウンタ値52の組をダーティキャッシュ122に移す。差分値1は、ダーティキャッシュ122の第4エントリe31およびe32に記憶されている差分値(すなわち、200と100)よりも小さいので、疲弊情報管理部58は、ダーティキャッシュ122の第4エントリe33に、第3インデックス値2と、差分値1と、疲弊カウンタ値52の組を書き込む。
図24(a)は、この時のダーティキャッシュ122を示す。疲弊情報管理部58は、ダーティキャッシュ122に移した第5エントリe42のデータ(第3インデックス値2と疲弊カウンタ値51の組)をクリーンキャッシュ124から削除する。
図24(b)は、この時のクリーンキャッシュ124を示す。
図24(c)は、この時の不揮発化テーブル126を示す。
【0211】
ところで、クリーンキャッシュ124の第5エントリe42(
図23(b))に記憶されていた第3インデックス値2と疲弊カウンタ値51の組は、ダーティキャッシュ122の第4エントリe33(
図21(a))から追い出されたデータ(第3インデックス値2と差分値1と疲弊カウンタ値51の組)の一部であった。
【0212】
ダーティキャッシュ122の第4エントリe33から追い出され、クリーンキャッシュ124の第5エントリe42に書き込まれた際、差分値1は破棄され不揮発化はされてなかった。しかしながら、不揮発化テーブル126の第3インデックス2の第3エントリに記憶されている疲弊カウンタ値50から更新された疲弊カウンタ値51は、クリーンキャッシュ124の第5エントリe42(
図23(b))に保持されていた。
【0213】
したがって、ダーティキャッシュ122から追い出され、クリーンキャッシュ124に書き込まれたデータ(疲弊カウンタ値51)が、クリーンキャッシュ124からダーティキャッシュ122に移される際に更新されると(すなわち、疲弊カウンタ値51から52に更新されると)、以前の更新分を含めた疲弊カウンタ値52がダーティキャッシュ122に書き込まれることになる。
【0214】
第3インデックス2に対応する疲弊カウンタ値が、その後不揮発化の機会を得れば、すなわちダーティキャッシュ122の第4エントリに記憶されている第3インデックス値2に対応する差分値がダーティキャッシュ不揮発化閾値以上となると、第3インデックス値2に対応する疲弊カウンタ値は不揮発化される。このとき、以前にダーティキャッシュ122から追い出され、クリーンキャッシュ124に書き込まれた際に不揮発化されなかった第3インデックス値2に対応する疲弊カウンタ値の更新(すなわち、疲弊カウンタ値50から51への更新)も含めて、第3インデックス値2に対応する疲弊カウンタ値(差分値がダーティキャッシュ不揮発化閾値以上となった疲弊カウンタ値)が不揮発化されることになる。したがって、実際の疲弊カウンタ値と不揮発化された疲弊カウンタ値との誤差は0となり、ダーティキャッシュ122から追い出され、クリーンキャッシュ124に書き込まれた際に不揮発化されなかった疲弊カウンタ値の差分値1(50から51への差分)よりも、小さくなることが期待できる。これにより、ウェアレベリングの精度が向上する効果を奏する。
【0215】
ただし、この効果は、
(条件1)ダーティキャッシュ122から追い出されクリーンキャッシュ124に移された疲弊カウンタ値が、クリーンキャッシュ124がフルになることによりクリーンキャッシュ124から追い出される前に更新され、クリーンキャッシュ124からダーティキャッシュ122に再び移され、かつ、
(条件2)クリーンキャッシュ124からダーティキャッシュ122に再び移された以降の差分値がダーティキャッシュ不揮発化閾値以上になった時、
に限り得られる。
【0216】
特に、全体キャッシュ・差分方式の場合は、ダーティキャッシュ122の容量とクリーンキャッシュ124の容量とを併せた容量が不揮発化テーブル126の容量と等しいので、不揮発化テーブル126の全体がRAM30にキャッシュされている。そのため、クリーンキャッシュ124からエントリが追い出されることはないので、少なくとも上述の条件1は満たすことになる。したがって、全体キャッシュ・差分方式の場合は、部分キャッシュ・差分方式と比べて、実際の疲弊カウンタ値と不揮発化された疲弊カウンタ値との誤差が少なくなる可能性がより高まることが期待できる。
【0217】
セグメント・ログ・差分方式と同様に、ランダムアクセス時、各読み書き単位領域の疲弊カウンタ値の差分値がダーティキャッシュ不揮発化閾値に達する可能性は低い。したがって、ダーティキャッシュ122の第4エントリが不揮発化される可能性は低いか、全くない。その結果、ダーティキャッシュ122の全ての第4エントリが不揮発化されず、削除される状況になり得る。しかし、ランダムアクセスということは、自動的に疲弊がPCM32の全体にわたって平準化されているため、そもそもウェアレベリングの必要性が低く、ダーティキャッシュ122の全ての第4エントリが削除されても影響が少ないと考えられる。
【0218】
シャットダウンコマンド、または、電源異常断イベント通知を受信した時に、疲弊情報管理部58は、少なくともPLPで不揮発化可能なデータサイズに対応するエントリ数分、差分値の多い順に、ダーティキャッシュ122の第4エントリに記憶されている疲弊カウンタ値を、管理情報不揮発化領域32bの不揮発化テーブル126の第3エントリに上書きして不揮発化する。ここでは、PLPで不揮発化可能なデータサイズに対応するエントリ数が2であるとする。
【0219】
図25は、
図24を参照して説明した不揮発化の後にシャットダウンコマンド、または、電源異常断イベント通知を受信した場合の疲弊カウンタ値の不揮発化の一例を説明するための図である。疲弊情報管理部58は、ダーティキャッシュ122(
図24(a))の第4エントリe31に記憶されている疲弊カウンタ値250(第3インデックス値11)を管理情報不揮発化領域32bの不揮発化テーブル126(
図25(c))のインデックス値11の第3エントリe44に書き込む。また、疲弊情報管理部58は、ダーティキャッシュ122(
図24(a))の第4エントリe32に記憶されている疲弊カウンタ値150(第3インデックス値14)を管理情報不揮発化領域32bの不揮発化テーブル126(
図25(c))のインデックス値14の第3エントリe45に書き込む。
【0220】
なお、通常動作中の不揮発化処理と、シャットダウンコマンドまたは電源異常断イベント通知を受信した時の不揮発化処理とで、処理ルーチンを共通化する場合、疲弊情報管理部58は、不揮発化した第4エントリのデータをダーティキャッシュ122から削除してもよい。ただし、メモリシステム20への電力供給が絶たれれば、RAM30に記憶されているすべての情報が失われるため、この削除処理は必須ではない。なお、シャットダウンコマンドを受信した時は、バックアップ電源28の電力供給能力に基づく不揮発化できるデータサイズの制限を受けないため、電源異常断イベント通知を受信した時と比べて、より多くの個数の第4エントリを不揮発化してもよい。これにより、電源異常断イベント通知を受信した時と比べて、実際の疲弊カウンタ値に対する不揮発化疲弊カウンタ値の誤差をさらに少なくすることができる。
【0221】
メモリシステム20の起動時の復元処理は、部分/全体キャッシュ方式と同じである。
【0222】
図26は、実施形態に係る部分/全体キャッシュ・差分方式における疲弊情報の不揮発化の手順の一例を説明するためのフローチャートである。
【0223】
疲弊情報管理部58は、シャットダウンコマンド、または電源異常断イベント通知を受信したか否かを判定する(ステップS192)。
【0224】
シャットダウンコマンド、または電源異常断イベント通知を受信した場合(ステップS192でYES)、疲弊情報管理部58は、ダーティキャッシュ122の第4エントリに記憶されている疲弊カウンタ値の一部を不揮発化する(ステップS194)。疲弊情報管理部58は、不揮発化する疲弊カウンタ値を差分値の大きい順に選ぶ。電源異常断イベントが通知された場合に不揮発化される疲弊カウンタ値の個数は、バックアップ電源28の電力供給能力に応じ、任意に設計可能である。シャットダウンコマンドが受信された場合に不揮発化される第4エントリの個数は、電源異常断イベントが通知された場合に不揮発化される第4エントリの個数よりも多くてもよい。その後、メモリシステム20は動作停止する。
【0225】
シャットダウンコマンド、または電源異常断イベント通知を受信していない場合(ステップS192でNO)、疲弊情報管理部58は、疲弊カウンタ値が更新されたか否かを判定する(ステップS204)。疲弊カウンタ値は、例えば、ホストライトコマンドに伴うPCM32へのデータの書き込み、またはホストリードコマンドに伴うPCM32からのデータの読み出しにより更新される。
【0226】
疲弊カウンタ値が更新された場合(ステップS204でYES)、疲弊情報管理部58は、ダーティキャッシュ122が空き第4エントリを含むか否かを判定する(ステップS206)。
【0227】
ダーティキャッシュ122が空き第4エントリを含まない場合(ステップS206でNO)、疲弊情報管理部58は、ダーティキャッシュ122の一番小さい差分値を記憶する第4エントリのデータをダーティキャッシュ122から追い出し、ダーティキャッシュ122に空き第4エントリを生成する(ステップS208)。
【0228】
疲弊情報管理部58は、ダーティキャッシュ122から追い出したデータを不揮発化せずに、クリーンキャッシュ124に書き込む。書き込みの前に、疲弊情報管理部58は、クリーンキャッシュ124が空き第5エントリを含むか否かを判定する(ステップS210)。
【0229】
クリーンキャッシュ124が空き第5エントリを含まない場合(ステップS210でNO)、疲弊情報管理部58は、あるデータ記憶第5エントリのデータをクリーンキャッシュ124から追い出し、空き第5エントリを生成する(ステップS212)。追い出されるデータは、例えば、データ記憶第5エントリのうちの、前回参照された時間が最も過去の第5エントリのデータである。
【0230】
クリーンキャッシュ124が空き第5エントリを含む場合(ステップS210でYES)、またはステップS212の後、疲弊情報管理部58は、ダーティキャッシュ122から追い出したデータをクリーンキャッシュ124に書き込む(S214)。疲弊情報管理部58は、ダーティキャッシュ122から追い出されたデータのうちの、差分値以外のデータを、クリーンキャッシュ124に書き込む。
【0231】
ダーティキャッシュ122が空き第4エントリを含む場合(ステップS206でYES)、またはステップS214の後、疲弊情報管理部58は、ダーティキャッシュ122の空き第4エントリに第3インデックス値、差分値、疲弊カウンタ値の組を書き込む(ステップS216)。
【0232】
疲弊情報管理部58は、ダーティキャッシュ122の第4エントリに記憶されている差分値がダーティキャッシュ不揮発化閾値以上であるか否かを判定する(ステップS222)。
【0233】
ダーティキャッシュ122の第4エントリに記憶されている差分値がダーティキャッシュ不揮発化閾値以上である場合(ステップS222でYES)、疲弊情報管理部58は、その第4エントリに記憶されている疲弊カウンタ値を不揮発化テーブル126に書き込む(ステップS224)。
【0234】
疲弊情報管理部58は、不揮発化された第4エントリのデータ(すなわち、第3インデックス値と差分値と疲弊カウンタ値の組)をダーティキャッシュ122から削除し、空き第4エントリを生成する(ステップS228)。疲弊情報管理部58は、他の第4エントリのデータをシフトする。
【0235】
疲弊情報管理部58は、クリーンキャッシュ124が空き第5エントリを含むか否かを判定する(ステップS229)。
【0236】
クリーンキャッシュ124が空き第5エントリを含まない場合(ステップS229でNO)、疲弊情報管理部58は、あるデータ記憶第5エントリのデータをクリーンキャッシュ124から追い出し、空き第5エントリを生成する(ステップS231)。追い出されるデータは、例えば、データ記憶第5エントリのうちの、前回参照された時間が最も過去の第5エントリのデータである。
【0237】
クリーンキャッシュ124が空き第5エントリを含む場合(ステップS229でYES)、またはステップS231の後、疲弊情報管理部58は、不揮発化された第4エントリに記憶されていた第3インデックス値と疲弊カウンタ値の組を、クリーンキャッシュ124の第5エントリに書き込む(ステップS230)。
【0238】
ダーティキャッシュ122の第4エントリに記憶されている差分値がダーティキャッシュ不揮発化閾値以上ではない場合(ステップS222でNO)、またはステップS230の後、疲弊情報管理部58は、シャットダウンコマンド、または電源異常断イベント通知を受信したか否かを判定する(S192)。
【0239】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【0240】
20…メモリシステム、30…RAM、32…PCM、32b…管理情報不揮発化領域、34…コントローラ、36a…疲弊情報、56…電源異常断イベント通知部、58…疲弊情報管理部、60…ウェアレベリング部、62…疲弊情報復元部