(57)【特許請求の範囲】
【請求項１】
読み出すデータのアドレスの順番を規定するための第１のスキャンパターンに従って、外部から書き込まれたデータを記憶する記憶部の各記憶領域を示す飛び飛びのスキャンアドレスを生成するアドレス生成部と、
前記スキャンアドレスが示す前記記憶部の記憶領域からデータを読み出す読出部と、
前記読出部により読み出されたデータが、過去の一部のデータのいずれかと重複しているか否かを検出する重複検出部と、
を備え、
前記アドレス生成部は、前記重複検出部による重複の検出動作後、重複の検出の新たな対象となる前記記憶部の記憶領域を示すために、前記第１のスキャンパターンに従って、前記スキャンアドレスを更新するストレージコントローラ。
【請求項２】
前記記憶部は、ＮＡＮＤ型フラッシュメモリである請求項１に記載のストレージコントローラ。
【請求項３】
前記重複検出部は、前記読出部により読み出されたデータが、前記記憶部に記憶されているすべてのデータの数よりも小さい数の前記一部のデータのいずれかと重複しているか否かを検出する請求項１に記載のストレージコントローラ。
【請求項４】
前記読出部は、前記スキャンアドレスが示す前記記憶部の記憶領域からチャンク単位でデータを読み出し、
前記重複検出部は、前記読出部により読み出された前記チャンク単位のデータからハッシュ値を生成し、前記一部のデータのハッシュ値のいずれかと重複しているか否かを検出することによって、該読出部により読み出された前記チャンク単位のデータの重複の有無を検出する請求項１に記載のストレージコントローラ。
【請求項５】
前記記憶部は、外部から書き込まれるデータと共に、該データについての誤り訂正符号を記憶し、
前記重複検出部は、前記チャンク単位のデータについての前記誤り訂正符号をハッシュ値として生成する請求項４に記載のストレージコントローラ。
【請求項６】
前記重複検出部は、
前記読出部により読み出された前記チャンク単位のデータからハッシュ値を生成するハッシュ生成部と、
ハッシュ値の少なくとも一部を示す情報と、前記一部のデータを含む第１情報における位置を示す位置情報と、を関連付ける第２情報から、前記ハッシュ生成部により生成されたハッシュ値の少なくとも一部を示す情報に対応する位置情報を取得する取得部と、
前記取得部により取得された位置情報が示す前記第１情報での位置の近傍で、前記ハッシュ生成部により生成されたハッシュ値と一致するハッシュ値を探索する探索部と、
を有する請求項４に記載のストレージコントローラ。
【請求項７】
前記重複検出部により、前記読出部により読み出されたデータが重複していることが検出された場合、該読出部により読み出されたデータ、および該データと重複しているデータのうち、いずれか一方を無効とすることにより重複を排除する重複排除部と、をさらに備えた請求項１に記載のストレージコントローラ。
【請求項８】
前記重複検出部により、前記読出部により読み出されたデータが重複していることが検出された場合、いずれのデータが重複しているかを示す情報を、前記記憶部にアクセスする制御装置に通知する通知部と、をさらに備えた請求項１に記載のストレージコントローラ。
【請求項９】
前記記憶部の記憶領域すべてのデータについて前記重複検出部による重複の検出が実行された後、新たな順序で前記記憶部の記憶領域のデータについて前記重複検出部が重複の検出を実行するために、前記第１のスキャンパターンと異なる第２のスキャンパターンに更新するパターン更新部を、さらに備え、
前記アドレス生成部は、前記第２のスキャンパターンに従って、スキャンアドレスを生成する請求項１に記載のストレージコントローラ。
【請求項１０】
前記読出部により読み出されたデータのエラー率を算出し、前記エラー率が所定値以上である場合、該データにエラーがあることを検出するエラー検出部と、
前記エラー検出部によりエラーがあると検出されたデータを、前記記憶部で該データが記憶されていた記憶領域とは別の記憶領域に再書き込みを行う再書き込み部と、
をさらに備えた請求項１に記載のストレージコントローラ。
【請求項１１】
前記記憶部と、
請求項１〜１０のいずれか一項に記載のストレージコントローラと、
を備えたストレージ装置。
【請求項１２】
アドレス生成部が、読み出すデータのアドレスの順番を規定するためのスキャンパターンに従って、外部から書き込まれたデータを記憶する記憶部の各記憶領域を示す飛び飛びのスキャンアドレスを生成するアドレス生成ステップと、
読出部が、前記スキャンアドレスが示す前記記憶部の記憶領域からデータを読み出す読出ステップと、
重複検出部が、前記読出部により読み出されたデータが、過去の一部のデータのいずれかと重複しているか否かを検出する重複検出ステップと、
前記アドレス生成部が、前記重複検出部による重複の検出動作後、重複の検出の新たな対象となる前記記憶部の記憶領域を示すために、前記スキャンパターンに従って、前記スキャンアドレスを更新するステップと、
を有するデータ処理方法。
【請求項１３】
コンピュータを、
読み出すデータのアドレスの順番を規定するためのスキャンパターンに従って、外部から書き込まれたデータを記憶する記憶部の各記憶領域を示す飛び飛びのスキャンアドレスを生成するアドレス生成手段と、
前記スキャンアドレスが示す前記記憶部の記憶領域からデータを読み出す読出手段と、
前記読出手段により読み出されたデータが、過去の一部のデータのいずれかと重複しているか否かを検出する重複検出手段と、
して機能させ、
前記アドレス生成手段は、前記重複検出手段による重複の検出動作後、重複の検出の新たな対象となる前記記憶部の記憶領域を示すために、前記スキャンパターンに従って、前記スキャンアドレスを更新するように機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、ストレージコントローラ、ストレージ装置、データ処理方法およびプログラムに関する。
【背景技術】
【０００２】
近年、重複排除（Ｄｅ−ｄｕｐｌｉｃａｔｉｏｎ）または圧縮技術により、記録するデータの量を削減し、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）等のストレージ装置に組み込まれたＮＡＮＤ（Ｎｏｔ  ＡＮＤ）型フラッシュメモリへの書き込み回数を削減することにより、ストレージ装置を長寿命化する技術が提案されている。このような、重複排除の技術として、データをＮＡＮＤ型フラッシュメモリへ書き込む際に、書き込むデータを所定の大きさに分割したチャンクと呼ばれるデータ単位毎に、ハッシュ関数等を用いた特定のアルゴリズムにより求めたハッシュ値を利用してチャンク間の重複候補を求めておく。そして、バックエンド処理でその重複候補について実際に重複の有無を確認し、重複があった場合に、一方を削除する重複排除の手法が提案されている。ここで、１チャンク分のデータからハッシュ値を求めるアルゴリズムとしては、例えば、ＭＤ５（Ｍｅｓｓａｇｅ  Ｄｉｇｅｓｔ  ５）、ＳＨＡ−１（Ｓｅｃｕｒｅ  Ｈａｓｈ  Ａｌｇｏｒｉｔｈｍ  １）、またはＳＨＡ−２等の種々のアルゴリズムがある。
【０００３】
しかし、一般に、ハッシュ値を用いたチャンク間の重複探索には、有限の大きさを持った過去のハッシュ値を蓄積したハッシュリストを用いるが、ハッシュリストに十分な大きさがない場合には広範囲な探索が行えず、重複したデータを効率的に検出できないという問題がある。例えば、チャンクのデータ長が４［ＫＢ（バイト）］であるとし、ハッシュリストには２０［Ｂ］からなるハッシュ値と、ＮＡＮＤ型フラッシュメモリへの格納先を示す８［Ｂ］のアドレスが格納されていたとする。ハッシュリストへのハッシュ値のエントリ数が２Ｍエントリとすると、ハッシュリストの大きさは２８［Ｂ］×２Ｍ=５６［ＭＢ］となるが、このハッシュリストがカバーできるＮＡＮＤ型フラッシュメモリの探索範囲は原則として、２Ｍ×４［ＫＢ］＝８［ＧＢ］に過ぎない。したがって、このハッシュリストは、基本的には８［ＧＢ］以上遡って過去に書き込んだデータの重複検出は極めて困難となる。
【０００４】
また、ハッシュリストは、頻繁にアクセスされることから、ＮＡＮＤ型フラッシュメモリに記憶することは現実的ではない。また、ＳＳＤにはＮＡＮＤ型フラッシュメモリに加えてＤＲＡＭ（Ｄｙｎａｍｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）が搭載されている場合が多いものの、ＤＲＡＭは、ＳＳＤが本来なすべきホストとＮＡＮＤ型フラッシュメモリとの間の制御に用いるワークメモリとして活用されているため、重複検出のために容量の大きいハッシュリストを割り当てることは困難である。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】米国特許出願公開第２００９／０３２７５８１号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００６】
本発明は、上記に鑑みてなされたものであって、データの重複を効率よく検出することができるストレージコントローラ、ストレージ装置、データ処理方法およびプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００７】
実施形態のストレージコントローラは、アドレス生成部と、読出部と、重複検出部と、を備える。アドレス生成部は、読み出すデータのアドレスの順番を規定するための第１のスキャンパターンに従って、外部から書き込まれたデータを記憶する記憶部の各記憶領域を示す飛び飛びのスキャンアドレスを生成する。読出部は、スキャンアドレスが示す記憶部の記憶領域からデータを読み出す。重複検出部は、読出部により読み出されたデータが、過去の一部のデータのいずれかと重複しているか否かを検出する。アドレス生成部は、重複検出部による重複の検出動作後、重複の検出の新たな対象となる記憶部の記憶領域を示すために、第１のスキャンパターンに従って、スキャンアドレスを更新する。
【図面の簡単な説明】
【０００８】
【図１】実施形態に係るストレージ装置のハードウェア構成を示す図である。
【図２】実施形態に係るＳＳＤコントローラの機能ブロック構成を示す図である。
【図３】アドレス変換テーブルの構成の一例を示す図である。
【図４】有効管理テーブルの構成の一例を示す図である。
【図５】実施形態のアドレス生成部の機能ブロック構成を示す図である。
【図６】スキャンパターンに従ったデータの重複検出の処理順序を説明する図である。
【図７】実施形態の重複検出部の機能ブロック構成を示す図である。
【図８】実施形態に係るＳＳＤコントローラの重複検出処理を説明する図である。
【図９】実施形態に係るＳＳＤコントローラの重複排除処理を示すフローチャートである。
【図１０】実施形態に係るＳＳＤコントローラの重複検出処理を示すフローチャートである。
【発明を実施するための形態】
【０００９】
以下に、図面を参照しながら、本発明の実施形態に係るストレージコントローラ、ストレージ装置、データ処理方法およびプログラムを詳細に説明する。また、以下の図面において、同一の部分には同一の符号が付してある。
【００１０】
図１は、実施形態に係るストレージ装置のハードウェア構成の一例を示す図である。図１を参照しながら、本実施形態に係るストレージ装置１のハードウェア構成について説明する。
【００１１】
ストレージ装置１は、ＰＣ（Ｐｅｒｓｏｎａｌ  Ｃｏｍｐｕｔｅｒ）、ワークステーション、またはサーバ装置等の情報処理装置に搭載されたＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）であるホストＣＰＵ２（制御装置）が、データを読み書きするためにアクセスするＳＳＤである。ストレージ装置１は、ＳＡＴＡ（Ｓｅｒｉａｌ  ＡＴ  Ａｔｔａｃｈｍｅｎｔ）、ＳＡＳ（Ｓｅｒｉａｌ  Ａｔｔａｃｈｅｄ  ＳＣＳＩ）、またはＰＣＩｅ（Ｐｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔ  Ｅｘｐｒｅｓｓ）等のインターフェース規格でホストＣＰＵ２と接続され、論理アドレス（ＬＢＡ：  Ｌｏｇｉｃａｌ  Ｂｌｏｃｋ  Ａｄｄｒｅｓｓ）を用いてデータをアクセスするブロックストレージであってもよく、または、イーサーネットで接続され、キーと呼ばれる任意長のデータに紐づけられた可変長のデータをアクセスするキーバリュードライブ（Ｋｅｙ−Ｖａｌｕｅ  Ｄｒｉｖｅ）であってもよい。ストレージ装置１は、ホストＣＰＵ２から示された論理アドレスまたはキーに対し、対応する物理アドレスが示すＮＡＮＤ型フラッシュメモリ４の記憶領域を求め、ホストＣＰＵ２から与えられるデータの書き込み、および、読み出したデータのホストＣＰＵ２への出力を行う。ストレージ装置１は、例えば、データセンタ、クラウドシステム、または基幹システム等において、サーバ装置等のホストに接続されるＳＳＤとして用いられる。なお、ストレージ装置１は、情報処理装置に内蔵されたＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）等のデータが記憶されたＳＳＤであってもよく、情報処理装置に外部から接続される外付け型のＳＳＤであってもよい。
【００１２】
図１に示すように、ストレージ装置１は、ＳＳＤコントローラ３（ストレージコントローラ）と、ＮＡＮＤ型フラッシュメモリ４と、ＤＲＡＭ５と、を備えている。
【００１３】
ＳＳＤコントローラ３は、ＮＡＮＤ型フラッシュメモリ４およびＤＲＡＭ５へのデータの読み書きを制御する制御装置である。ＳＳＤコントローラ３は、図１に示すように、ＣＰＵ６と、ＤＲＡＭコントローラ７と、ホストＩ／Ｆ８と、バッファ９と、ＥＣＣ処理部１０と、ＮＡＮＤコントローラ１１と、を備えている。上述のＣＰＵ６、ＤＲＡＭコントローラ７、ホストＩ／Ｆ８、バッファ９、ＥＣＣ処理部１０、およびＮＡＮＤコントローラ１１は、図１に示すように、アドレスバスおよびデータバス等のバスによって互いに通信可能に接続されている。また、一般的に、ＳＳＤコントローラ３は、１個または複数個のＬＳＩ（Ｌａｒｇｅ  Ｓｃａｌｅ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）で構成されている。
【００１４】
ＮＡＮＤ型フラッシュメモリ４は、不揮発性記憶素子で構成されたフラッシュメモリの一種である。ＮＡＮＤ型フラッシュメモリ４は、複数のＮＡＮＤメモリチップによって構成されている。ＮＡＮＤ型フラッシュメモリ４は、ホストＣＰＵ２が実行するプログラム、およびデータ、ならびにＣＰＵ６が実行するプログラム等を記憶する。
【００１５】
ＤＲＡＭ５は、半導体記憶素子で構成された揮発性の記憶装置である。ＤＲＡＭ５は、揮発性であるため、供給されている電源が遮断されると記憶しているデータを消失する性質を有する。
【００１６】
ＣＰＵ６は、ＳＳＤコントローラ３全体の動作を制御する集積回路である。ＤＲＡＭコントローラ７は、ＤＲＡＭ５に対するデータの読み書き等のアクセス制御を行う機器である。ホストＩ／Ｆ８は、ストレージ装置１がホストＣＰＵ２とデータ通信するためのインターフェースである。
【００１７】
バッファ９は、ホストＣＰＵ２から受信したデータ、および、ＮＡＮＤコントローラ１１を介してＮＡＮＤ型フラッシュメモリ４から読み出したデータを一時的に記憶しておく記憶回路である。
【００１８】
ＥＣＣ処理部１０は、ホストＣＰＵ２からホストＩ／Ｆ８を介して受信され、バッファ９に一時記憶されたデータに対して、誤り訂正符号（ＥＣＣ：Ｅｒｒｏｒ  Ｃｏｒｒｅｃｔｉｎｇ  Ｃｏｄｅ）を付与する集積回路である。ＥＣＣ処理部１０により誤り訂正符号が付与されたデータは、ＮＡＮＤコントローラ１１によりＮＡＮＤ型フラッシュメモリ４に書き込まれる。
【００１９】
次に、ストレージ装置１が、ホストＣＰＵ２から受信したデータをＮＡＮＤ型フラッシュメモリ４に書き込む動作の概要を説明する。まず、ストレージ装置１のＳＳＤコントローラ３は、ホストＣＰＵ２からホストＩ／Ｆ８を介して、論理アドレス、および書き込むデータを受信し、バッファ９に一時記憶させる。次に、バッファ９に記憶されたデータは、ＥＣＣ処理部１０によってそのデータに基づいて求められた誤り訂正符号が付与されて、ＮＡＮＤコントローラ１１によって、論理アドレスに対応する物理アドレスが示すＮＡＮＤ型フラッシュメモリ４の記憶領域に書き込まれる。この場合、論理アドレスから物理アドレスへの変換は、後述する図３に示すＤＲＡＭ５に記憶されたアドレス変換テーブル１００１を参照して行われる。
【００２０】
また、ホストＣＰＵ２が、ストレージ装置１のＮＡＮＤ型フラッシュメモリ４からデータを読み出す動作の概要を説明する。まず、ストレージ装置１のＳＳＤコントローラ３では、ホストＣＰＵ２からホストＩ／Ｆ８を介して、読み出すデータに対応する論理アドレスが指定される。次に、ＮＡＮＤコントローラ１１は、上述のアドレス変換テーブル１００１によって、指定された論理アドレスに対応する物理アドレスを特定し、その物理アドレスが示すＮＡＮＤ型フラッシュメモリ４の記憶領域から、誤り訂正符号が付与されたデータを読み出す。そして、ＥＣＣ処理部１０は、ＮＡＮＤコントローラ１１により読み出されたデータに付与されている誤り訂正符号によって、読み出したデータに誤りがあるか否かを検出し、誤りがある場合は、誤り訂正符号によって誤りを訂正し、その誤り訂正符号を削除したデータ本体をバッファ９に記憶させる。また、ＥＣＣ処理部１０は、読み出したデータに誤りがない場合は、単に誤り訂正符号を削除してデータ本体をバッファ９に記憶させる。そして、バッファ９に記憶されたデータは、ホストＩ／Ｆ８を介してホストＣＰＵ２へ出力される。
【００２１】
なお、ＥＣＣ処理部１０は、図１に示すように、バスに接続された集積回路（ハードウェア回路）として実現するものとしているが、これに限定されるものではなく、ＣＰＵ６がプログラムを実行することによって実現されるものとしてもよい。
【００２２】
図２は、実施形態に係るＳＳＤコントローラの機能ブロック構成の一例を示す図である。図３は、アドレス変換テーブルの構成の一例を示す図である。図４は、有効管理テーブルの構成の一例を示す図である。図２〜４を参照しながら、本実施形態に係るＳＳＤコントローラ３の機能ブロック構成および動作について説明する。
【００２３】
図２に示すように、ＳＳＤコントローラ３は、アドレス生成部１０１（アドレス生成手段）と、読出部１０２（読出手段）と、重複検出部１０３（重複検出手段）と、重複排除部１０４と、管理情報記憶部１０５と、エラー検出部１０６と、再書込部１０７と、データ記憶部１０８（記憶部）と、追加部１０９と、パターン更新部１１０と、を有する。
【００２４】
アドレス生成部１０１は、スキャンパターンに基づいて、ＮＡＮＤ型フラッシュメモリ４においてスキャンするデータ、すなわち、重複検出処理の対象とするデータが記憶されているＮＡＮＤ型フラッシュメモリ４上の物理アドレス（以下、「ＮＡＮＤアドレス」という場合がある）を生成する機能部である。ここで、重複検出処理は、ＮＡＮＤ型フラッシュメモリ４に記憶されたデータを所定の大きさに分割したチャンクと呼ばれるデータ単位毎に行われる。すなわち、アドレス生成部１０１により生成されたＮＡＮＤアドレスは、ＮＡＮＤ型フラッシュメモリ４において所定の大きさのデータ単位である１チャンク分のデータが記憶されている記憶領域のアドレスを示す。なお、１チャンク分のデータの長さは可変長または固定長の場合のいずれもあり得るが、ここでは、説明を簡便にするため固定長であるものとして説明する。また、アドレス生成部１０１により生成されたＮＡＮＤアドレスを、以下、「スキャンアドレス」という場合があるものとする。アドレス生成部１０１は、図１に示すＣＰＵ６がプログラムを実行することによって実現される。アドレス生成部１０１の構成および動作の詳細は、図５および６において後述する。
【００２５】
読出部１０２は、アドレス生成部１０１により生成されたスキャンアドレスが示すＮＡＮＤ型フラッシュメモリ４の記憶領域（以下、単に「記憶領域」という場合がある）に記憶された１チャンク分のデータを読み出す機能部である。読出部１０２は、図１に示すＣＰＵ６がプログラムを実行することによって実現される。
【００２６】
重複検出部１０３は、ＮＡＮＤ型フラッシュメモリ４において、読出部１０２により読み出された１チャンク分のデータと重複する１チャンク分のデータが他の記憶領域に記憶されているか否かを検出する重複検出処理を実行する機能部である。重複検出部１０３は、図１に示すＣＰＵ６がプログラムを実行することによって実現される。重複検出部１０３の構成および動作（重複検出処理）の詳細は、図７および８において後述する。
【００２７】
管理情報記憶部１０５は、後述する図９に示す重複排除処理で使用する管理情報を記憶する機能部である。具体的には、管理情報記憶部１０５は、管理情報として、図３に示すアドレス変換テーブル１００１と、図４に示す有効管理テーブル１００２と、を記憶している。アドレス変換テーブル１００１は、ホストＣＰＵ２から指定される論理アドレスと、実際にデータが記憶されている記憶領域を示す物理アドレスであるＮＡＮＤアドレスとを関連付けるテーブルである。有効管理テーブル１００２は、ＮＡＮＤアドレスと、そのＮＡＮＤアドレスが示す記憶領域に記憶されたデータが有効であるか否かを示す有効フラグとを関連付けるテーブルである。例えば、図４に示すように、ＮＡＮＤアドレス「００００  ００００  ０００１」（１６進数表記、以下同様）が示す記憶領域に記憶されたデータは、有効フラグが「１」なので有効なデータであることを示す。ここで、有効なデータとは、過去にホストＣＰＵ２からＮＡＮＤ型フラッシュメモリ４に書き込まれて、その後消去または移動（実質的な上書き）等がなされていないデータを示す。
【００２８】
また、管理情報記憶部１０５は、さらに、管理情報として、後述する図８に示すハッシュテーブル１００３（第２情報の一例）およびハッシュリスト１００４（第１情報の一例）を記憶している。ハッシュテーブル１００３およびハッシュリスト１００４については、後述する。管理情報記憶部１０５は、図１に示すＤＲＡＭ５によって実現される。なお、管理情報記憶部１０５が記憶する管理情報のうち少なくともいずれか１つが、ＤＲＡＭ５ではなくＮＡＮＤ型フラッシュメモリ４に記憶されるものとしてもよい。この場合、管理情報記憶部１０５は、図１に示すＮＡＮＤ型フラッシュメモリ４またはＤＲＡＭ５のうち少なくともいずれか一方によって実現されることになる。
【００２９】
なお、図３に示すアドレス変換テーブル１００１は、テーブル形式の情報に限定されるものではなく、論理アドレスとＮＡＮＤアドレスとの関連付けが可能な情報であれば、どのような形式の情報であってもよい。また、図４に示す有効管理テーブル１００２も、テーブル形式の情報に限定されるものではなく、ＮＡＮＤアドレスが示す記憶領域に記載されたデータが有効であるか否かを判別することが可能な情報であれば、どのような形式の情報であってもよい。
【００３０】
重複排除部１０４は、重複検出部１０３によって、読出部１０２により読み出された１チャンク分のデータと重複する１チャンク分のデータが検出された場合、重複したデータを排除する機能部である。具体的には、重複排除部１０４は、例えば、図３において、スキャンアドレスが「８０００  ００００  ０１００」であった場合に、重複検出部１０３によりＮＡＮＤアドレス「８０００  ００００  ００００」が示す記憶領域の１チャンク分のデータと重複していることが検出されたものとする。図３に示すように、ＮＡＮＤアドレス「８０００  ００００  ０１００」および「８０００  ００００  ００００」に対応する論理アドレスは、それぞれ「ｙ」および「ｘ」であるとすると、アドレス変換テーブル１００１の論理アドレス「ｘ」の行には、ＮＡＮＤアドレス「８０００  ００００  ００００」が記憶されており、論理アドレス「ｙ」の行には、ＮＡＮＤアドレス「８０００  ００００  ０１００」が記憶されている。重複検出部１０３によって、ＮＡＮＤアドレス「８０００  ００００  ０１００」および「８０００  ００００  ００００」がそれぞれ示す記憶領域のデータは重複していることが検出されているので、論理アドレス「ｙ」に対応するＮＡＮＤアドレス「８０００  ００００  ０１００」を、「８０００  ００００  ００００」に書き換えても、論理アドレス「ｘ」または「ｙ」に基づいて読み出すデータとしては何ら矛盾は生じない。したがって、この場合、重複排除部１０４は、論理アドレス「ｙ」に対応するＮＡＮＤアドレス「８０００  ００００  ０１００」を、論理アドレス「ｘ」に対応するＮＡＮＤアドレス「８０００  ００００  ００００」で書き換える。すなわち、論理アドレス「ｘ」および「ｙ」の双方に対応するＮＡＮＤアドレスが「８０００  ００００  ００００」となり、ＮＡＮＤアドレス「８０００  ００００  ０１００」が示す記憶領域のデータは今後不要となる。よって、重複排除部１０４は、管理情報記憶部１０５に記憶された有効管理テーブル１００２を参照し、ＮＡＮＤアドレス「８０００  ００００  ０１００」に対応する有効フラグを「０」に書き換えて無効であるものとする。重複排除部１０４は、図１に示すＣＰＵ６がプログラムを実行することによって実現される。
【００３１】
なお、上述では、重複排除部１０４は、論理アドレス「ｙ」に対応するＮＡＮＤアドレス「８０００  ００００  ０１００」（スキャンアドレス）を、論理アドレス「ｘ」に対応するＮＡＮＤアドレス「８０００  ００００  ００００」で書き換えるものとしているが、これに限定されるものではない。すなわち、重複排除部１０４は、論理アドレス「ｘ」に対応するＮＡＮＤアドレス「８０００  ００００  ００００」を、論理アドレス「ｙ」に対応するＮＡＮＤアドレス「８０００  ００００  ０１００」で書き換えるものとしてもよい。ただし、この場合、重複している論理アドレス「ｘ」に対応するＮＡＮＤアドレス「８０００  ００００  ００００」が示す記憶領域のデータは、後述するように、ハッシュリスト１００４に過去のデータ（ハッシュ値）として記憶されているので、重複排除部１０４は、ハッシュリスト１００４に対しても、ＮＡＮＤアドレス「８０００  ００００  ００００」を「８０００  ００００  ０１００」で書き換えなければならない。
【００３２】
エラー検出部１０６は、スキャンアドレスで示される記憶領域から読み出された１チャンク分のデータのエラー率ｒを下記の式（１）で算出し、算出したエラー率ｒに対して閾値判定してエラーを検出する機能部である。
【００３３】
ｒ＝ｎｅ／Ｎ                                                    ・・・式（１）
【００３４】
式（１）のｎｅは１チャンク内のエラービット数を示し、Ｎは１チャンクを構成するビット数を示す。エラー検出部１０６は、読み出された１チャンク分のデータに付与されている誤り訂正符号に基づいて訂正可能なエラービット数ｎｅを求め、式（１）によりエラー率ｒを算出する。一般に、ＮＡＮＤ型フラッシュメモリ４に書き込まれたデータは、時間の経過および他の隣接するデータの読み出し動作によって少しずつ劣化する。エラー率ｒが大きな値をとっているということは、劣化が進んでいると判断できる。したがって、エラー検出部１０６は、エラー率ｒが所定の閾値以上であるか否かを判定する。エラー検出部１０６は、エラー率ｒが閾値以上の場合、データの劣化が進んでいると判断する。エラー検出部１０６は、図１に示すＥＣＣ処理部１０によって実現される。
【００３５】
再書込部１０７は、エラー検出部１０６により劣化が進んでいると判断されたデータ（エラー率ｒが閾値以上と判定されたデータ）を、データ記憶部１０８の別の記憶領域に再書き込みを行う機能部である。この場合、再書込部１０７は、エラーが検出されたデータについては、付与されている誤り訂正符号に基づいて誤りを訂正し、訂正したデータに新たな誤り訂正符号を付加して、データ記憶部１０８の別の記憶領域に再書き込みを行う。再書き込みにより、書き込まれたデータはリフレッシュされるため、ビットエラーの発生を抑制することができる。なお、誤り訂正のアルゴリズムとしては、ＲＳ（Ｒｅｅｄ−Ｓｏｌｏｍｏｎ）符号、ＢＣＨ符号、およびＬＤＰＣ（Ｌｏｗ  Ｄｅｎｓｉｔｙ  Ｐａｒｉｔｙ  Ｃｈｅｃｋ）符号等を用いた様々なアルゴリズムが知られている。誤り訂正アルゴリズムとしてＢＣＨ符号を用いる場合、例えば、公知の文献「Ｈ．  Ｃｈｏｉ，  Ｗ．  Ｌｉｕ  ｅｔ  ａｌ．，  “ＶＬＳＩ  Ｉｍｐｌｅｍｅｎｔａｔｉｏｎ  ｏｆ  ＢＣＨ  Ｅｒｒｏｒ  Ｃｏｒｒｅｃｔｉｏｎ  ｆｏｒ  Ｍｕｌｔｉｌｅｖｅｌ  Ｃｅｌｌ  ＮＡＮＤ  Ｆｌａｓｈ  Ｍｅｍｏｒｙ”，  ＩＥＥＥ  Ｔｒａｎｓａｃｔｉｏｎｓ  ｏｎ  Ｖｅｒｙ  Ｌａｒｇｅ  Ｓｃａｌｅ  Ｉｎｔｅｇｒａｔｉｏｎ  （ＶＬＳＩ）  Ｓｙｓｔｅｍｓ，  Ｖｏｌ．  １８，  Ｎｏ．５，  Ｍａｙ  ２０１０」では４０９６バイトのデータに対し２５６ビットの誤り訂正符号を加えることで１６ビットまでのビット誤りを訂正可能な例が示されている。
【００３６】
また、再書込部１０７は、データの再書き込みに併せて、管理情報記憶部１０５に記憶されたアドレス変換テーブル１００１、有効管理テーブル１００２、およびハッシュリスト１００４の内容を更新する。更新の内容の詳細については、図９において後述する。再書込部１０７は、図１に示すＮＡＮＤコントローラ１１によって実現される。
【００３７】
データ記憶部１０８は、ホストＣＰＵ２が実行するプログラム、およびデータ、ならびにＣＰＵ６が実行するプログラム等を記憶する機能部である。データ記憶部１０８は、図１に示すＮＡＮＤ型フラッシュメモリ４によって実現される。
【００３８】
追加部１０９は、重複検出部１０３によって読出部１０２により読み出された１チャンク分のデータと重複する１チャンク分のデータが検出されない場合、読み出されたデータは新しいデータとして、ハッシュテーブル１００３の内容を更新し、ハッシュリスト１００４に情報を追加する機能部である。ハッシュテーブル１００３の内容の更新、およびハッシュリスト１００４への情報の追加の詳細については、図９において後述する。追加部１０９は、図１に示すＣＰＵ６がプログラムを実行することによって実現される。
【００３９】
パターン更新部１１０は、アドレス生成部１０１が重複検出処理の対象とするデータが記憶されている記憶領域のＮＡＮＤアドレス（スキャンアドレス）を生成するためのスキャンパターンを更新する機能部である。パターン更新部１１０は、図１に示すＣＰＵ６がプログラムを実行することによって実現される。
【００４０】
なお、図２に示すＳＳＤコントローラ３のアドレス生成部１０１、読出部１０２、重複検出部１０３、重複排除部１０４、管理情報記憶部１０５、エラー検出部１０６、再書込部１０７、データ記憶部１０８、追加部１０９、およびパターン更新部１１０は、機能を概念的に示したものであって、このような構成に限定されるものではない。例えば、図２に示すＳＳＤコントローラ３で独立した機能部として図示した複数の機能部を、１つの機能部として構成してもよい。一方、図２に示すＳＳＤコントローラ３で１つの機能部が有する機能を複数に分割し、複数の機能部として構成するものとしてもよい。
【００４１】
また、ＳＳＤコントローラ３のアドレス生成部１０１、読出部１０２、重複検出部１０３、重複排除部１０４、追加部１０９、およびパターン更新部１１０の一部または全部は、ソフトウェアであるプログラムではなく、ＦＰＧＡ（Ｆｉｅｌｄ−Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）またはＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）等のハードウェア回路によって実現されてもよい。また、ＳＳＤコントローラ３のエラー検出部１０６は、ハードウェア回路（ＥＣＣ処理部１０）ではなく、ＣＰＵ６がプログラムを実行することによって実現されてもよい。
【００４２】
図５は、実施形態に係るＳＳＤコントローラのアドレス生成部の機能ブロック構成の一例を示す図である。図６は、スキャンパターンに従ったデータの重複検出の処理順序を説明する図である。図５および６を参照しながら、ＳＳＤコントローラ３のアドレス生成部１０１の機能ブロック構成および動作について説明する。
【００４３】
図５に示すように、アドレス生成部１０１は、カウンタ部１０１１と、反転部１０１２と、スクランブル部１０１３と、を有する。
【００４４】
カウンタ部１０１１は、スキャンアドレスを生成するためのカウンタ値を求める機能部である。カウンタ値のビット幅ｗは、下記の式（２）で決定される。
【００４５】
ｗ＝ｃｅｉｌ｛ｌｏｇ２（Ｂ／Ｎ）｝                              ・・・式（２）
【００４６】
式（２）のＢはデータ記憶部１０８の記憶容量を示し、Ｎは１チャンクを構成するビット数、すなわち１チャンクサイズを示し、ｃｅｉｌ（ｘ）は、ｘ以上の最も近い整数を返す関数であるものとする。すなわち、式（２）で決定されるビット幅ｗにより求まるカウンタ値の最大値は、データ記憶部１０８のすべてのチャンクを示すＮＡＮＤアドレスの個数と一致する。カウンタ部１０１１は、特定のカウンタ値によって、スキャンアドレスが求められた後、次のスキャンアドレスを生成する場合、そのカウンタ値をインクリメントする。
【００４７】
反転部１０１２は、特定のスキャンパターンに基づいて、カウンタ部１０１１から出力されたカウンタ値の各ビットを反転して、または、反転せずそのまま出力する機能部である。具体的には、反転部１０１２は、特定のスキャンパターンが示す反転モードが「ＯＮ」である場合、カウンタ値の各ビットを反転して出力する。例えば、カウンタ値が８ビットで構成されている場合、カウンタ部１０１１から「００」、「０１」、「０２」（１６進数表記）というカウンタ値が出力された場合、反転部１０１２によるビット反転後のデータは、それぞれ「ｆｆ」、「ｆｅ」、「ｆｄ」（１６進数表記）となり、データが降順となって出力される。一方、反転部１０１２は、特定のスキャンパターンが示す反転モードが「ＯＦＦ」である場合、カウンタ値の各ビットを反転せずに、そのまま出力する。なお、反転部１０１２は、上述のように、カウンタ値の各ビットを反転する代わりに、特定のスキャンパターンに基づいて、カウンタ値の一部のビットのみを反転させるものとしてもよい。
【００４８】
スクランブル部１０１３は、反転部１０１２から出力されるデータの各ビットを、特定のスキャンパターンが示すスクランブルパターンに従って入れ替えて、スキャンアドレスを出力する機能部である。例えば、「００」、「０１」、「０２」、「０３」（１６進数表記）というデータに対して、１ビット目（ビット０）と４ビット目（ビット３）を入れ替えれば、スクランブル部１０１３から出力されるデータは、それぞれ「００」、「０８」、「０２」、「０ａ」（１６進数表記）となる。
【００４９】
以上のように、カウンタ部１０１１が出力するカウンタ値と、反転部１０１２の反転モードと、スクランブル部１０１３のスクランブルパターンとに応じて、アドレス生成部１０１は様々な順序でスキャンアドレスを生成することができる。また、図５に示すように、反転モードおよびスクランブルパターンを含むスキャンパターンの情報は、管理情報記憶部１０５に記憶されており、パターン更新部１１０が、管理情報記憶部１０５から所定の方式に従って、または、ランダムに管理情報記憶部１０５から特定のスキャンパターンの情報を読み出す。そして、パターン更新部１１０は、読み出したスキャンパターンの情報に基づいて、反転部１０１２の反転モード、およびスクランブル部１０１３のスクランブルパターンを更新するためにスキャンパターン更新指令を出力する。
【００５０】
次に、図６を参照しながら、特定のスキャンパターンに基づいて、アドレス生成部１０１が生成するスキャンアドレスの順序の例を説明する。図６の例では、ＮＡＮＤ型フラッシュメモリ４の記憶領域には、ＮＡＮＤアドレス「００００  ００００  ００００」から「ｆｆｆｆ  ｆｆｆｆ  ｆｆｆｆ」が割り当てられているものとする。そして、アドレス生成部１０１は、特定のスキャンパターンにより、ＮＡＮＤ型フラッシュメモリ４の記憶領域をＮ個のブロックに分けたものとした場合、各ブロックの先頭から所定の位置を示すスキャンアドレスを生成する。すなわち、図６に示すように、アドレス生成部１０１は、まず最初に、先頭のブロックの先頭から所定の位置（１）を示すスキャンアドレスを生成する。次に、アドレス生成部１０１は、先頭から次のブロックの先頭から所定の位置（２）を示すスキャンアドレスを生成する。同様に、アドレス生成部１０１は、スキャンアドレスを生成していき、Ｎ個目のブロックで、所定の位置（Ｎ）を示すスキャンアドレスを生成した後、次のスキャンアドレスを生成する場合、先頭のブロックの位置（１）とは異なる所定の位置（Ｎ＋１）を示すスキャンアドレスを生成し、次に、先頭から次のブロックの位置（２）とは異なる所定の位置（Ｎ＋２）を示すスキャンアドレスを生成する。以上のアドレス生成部１０１が生成するスキャンアドレスの順序は一例であるが、このようにスキャンパターンを適用することによって、飛び飛びのスキャンアドレスを生成することが可能になる。
【００５１】
図６において、例えば、最後のブロック（Ｎ個目のブロック）の所定の位置（Ｎ）のデータについて重複検出処理が実行され、次に、最初のブロックの所定の位置（Ｎ＋１）のデータについて重複検出処理が実行されるので、その重複検出処理では位置（Ｎ）のデータと、位置（Ｎ＋１）のデータとの重複の有無が判定されていることになる。例えば、管理情報記憶部１０５が記憶するハッシュリストのエントリ数がＮ個であり、かつ、Ｎが図６に示すＮＡＮＤ型フラッシュメモリ４のアドレス空間（「００００  ００００  ００００」〜「ｆｆｆｆ  ｆｆｆｆ  ｆｆｆｆ」）のアドレス数よりも十分小さいものとすると、ＮＡＮＤ型フラッシュメモリ４に対して先頭のアドレスから線形探索により重複検出処理を行った場合、位置（Ｎ）と位置（Ｎ＋１）との重複の判定はできないことになる。しかし、スキャンパターンを適用し、飛び飛びのスキャンアドレスを生成することによって、離れたＮＡＮＤアドレスのデータ同士の重複を検出することが可能になり、ＮＡＮＤ型フラッシュメモリ４の全部のデータのハッシュ値を有する膨大なハッシュリストを有する必要がなく、過去の一部のハッシュ値（上述のように、例えば、Ｎ個）を記憶するハッシュリストによって、ＮＡＮＤ型フラッシュメモリ４全体の重複の検出が可能となる。
【００５２】
なお、図５に示すアドレス生成部１０１のカウンタ部１０１１、反転部１０１２、およびスクランブル部１０１３は、機能を概念的に示したものであって、このような構成に限定されるものではない。例えば、図５に示すアドレス生成部１０１で独立した機能部として図示した複数の機能部を、１つの機能部として構成してもよい。一方、図５に示すアドレス生成部１０１で１つの機能部が有する機能を複数に分割し、複数の機能部として構成するものとしてもよい。
【００５３】
図７は、実施形態に係るＳＳＤコントローラの重複検出部の機能ブロック構成の一例を示す図である。図８は、実施形態に係るＳＳＤコントローラの重複検出処理を説明する図である。図７および８を参照しながら、ＳＳＤコントローラ３の重複検出部１０３の機能ブロックおよび動作について説明する。
【００５４】
図７に示すように、重複検出部１０３は、ハッシュ生成部１０３１と、抽出部１０３２と、取得部１０３３と、探索部１０３４と、を有する。
【００５５】
ハッシュ生成部１０３１は、読出部１０２により読み出された１チャンク分のデータから、ハッシュ値を生成する機能部である。１チャンク分のデータからハッシュ値を求めるアルゴリズムとしては、上述のように、例えば、ＭＤ５、ＳＨＡ−１またはＳＨＡ−２等の種々のアルゴリズムを適用できる。また、ＳＳＤではフラッシュメモリのリテンション性能およびリードディスターブ等の影響によって発生するビットエラーの対策として使用される誤り訂正符号をハッシュ値として使用することも可能である。この場合、読出部１０２により読み出されたデータに付与されている誤り訂正符号をそのままハッシュ値として利用できるので、ハッシュ生成部１０３１が特定のアルゴリズムの処理を行ってハッシュ値を求める必要がなく、処理負荷が軽減される。図８に示す例では、ハッシュ生成部１０３１は、１チャンク分のデータからハッシュ値「０３３０」（１６進数表記）を生成している。
【００５６】
抽出部１０３２は、ハッシュ生成部１０３１により生成されたハッシュ値から一部のデータ（例えば、先頭の１バイト）（以下、「部分ハッシュ」という）を抽出する機能部である。図８に示す例では、抽出部１０３２は、ハッシュ生成部１０３１により生成されたハッシュ値「０３３０」から、先頭の１バイト分のデータ「０３」を部分ハッシュとして抽出している。なお、抽出する部分ハッシュのデータ長は１バイトに限定されるものではなく、探索速度、および管理情報記憶部１０５において確保可能なメモリ容量に応じて、適切に設定されるべきものである。
【００５７】
取得部１０３３は、管理情報記憶部１０５に記憶されたハッシュテーブル１００３を参照し、抽出部１０３２により抽出された部分ハッシュに対応する、ハッシュリスト１００４での位置を示す位置情報を取得する機能部である。ハッシュテーブル１００３は、図８に示すように、部分ハッシュと、ハッシュリスト１００４においてその部分ハッシュから始まるハッシュ値が記憶されている位置を示す位置情報と、を関連付けるテーブルである。ハッシュリスト１００４は、図８に示すように、重複検出処理が行われた過去の所定数の１チャンク分のデータのハッシュ値と、そのデータが記憶されているＮＡＮＤアドレスと、を関連付けるリスト（図８の例ではテーブル）である。図８に示す例では、部分ハッシュを１バイトとしているので、ハッシュテーブル１００３は、部分ハッシュとして「００」〜「ｆｆ」と、それぞれに対応する位置情報とを関連付けている。なお、ハッシュテーブル１００３は、部分ハッシュと、位置情報とを関連付けるものとしているが、ハッシュ値そのものと、位置情報とを関連付けるものとしてもよい。この場合は、抽出部１０３２による部分ハッシュの抽出動作は不要となる。また、説明を簡略化するために、ハッシュリスト１００４には、図８に示すように、ハッシュ値が昇順に並んで記憶されているものとする。この場合、位置情報は、例えば、図８に示すように、ハッシュリスト１００４において各ハッシュ値のうち部分ハッシュが共通している記憶部分の先頭位置を示す。例えば、図８の例では、抽出部１０３２により抽出された部分ハッシュが「０３」である場合、取得部１０３３は、ハッシュテーブル１００３から部分ハッシュ「０３」に対応する位置情報を取得し、その位置情報は、ハッシュリスト１００４のハッシュ値「０３３４」が記憶されている位置を示す。なお、ハッシュリスト１００４は、上述したように、ＮＡＮＤ型フラッシュメモリ４全体の各データのハッシュ値ではなく、重複検出処理を行った過去の一部のハッシュ値を記憶している。また、ハッシュリスト１００４には、ハッシュ値が昇順に並んで記憶されていることに限定されるものではなく、例えば、降順に並んで記憶されているものとしてもよく、ハッシュ値のうち部分ハッシュが同一であるハッシュ値が連続するように記憶されているものとしてもよく、または、いわゆるリスト構造によって部分ハッシュが同一である複数のハッシュ値が関連付けられているものとしてもよい。
【００５８】
なお、図８に示すハッシュテーブル１００３は、テーブル形式の情報に限定されるものではなく、部分ハッシュと位置情報との関連付けが可能な情報であれば、どのような形式の情報であってもよい。また、図８に示すハッシュリスト１００４は、実質的にテーブル形式の情報で示されているが、テーブル形式の情報に限定されるものではなく、ハッシュ値とＮＡＮＤアドレスとの関連付けが可能な情報であれば、どのような形式の情報であってもよい。
【００５９】
探索部１０３４は、管理情報記憶部１０５に記憶されたハッシュリスト１００４を参照し、取得部１０３３により取得された位置情報で示されるハッシュ値の位置から、ハッシュ生成部１０３１により生成されたハッシュ値と重複（一致）するハッシュ値を線形探索する機能部である。探索部１０３４によりハッシュリスト１００４において、ハッシュ生成部１０３１により生成されたハッシュ値と重複（一致）するハッシュ値が発見された場合、読出部１０２によってスキャンアドレスが示す記憶領域から読み出されたデータと重複するデータが、データ記憶部１０８の他の記憶領域にも記憶されていることを意味する。なお、探索部１０３４は、例えば、ハッシュリスト１００４で、ハッシュ値のうち部分ハッシュが同一であるハッシュ値が連続するように記憶されている場合は、位置情報が示すその連続したハッシュ値の先頭の位置から線形探索を行えばよい。すなわち、探索部１０３４は、取得部１０３３により取得された位置情報で示されるハッシュ値の位置の近傍のハッシュ値を探索すればよいことになる。
【００６０】
探索部１０３４は、ハッシュ生成部１０３１により生成されたハッシュ値が重複していると判断すると、ハッシュリスト１００４から重複しているハッシュ値に対応するＮＡＮＤアドレスを取得する。そして、探索部１０３４は、重複の検出結果として、データの重複の有無と、重複している場合に、取得したＮＡＮＤアドレスとを出力する。
【００６１】
以上のように、重複検出部１０３による重複検出処理では、まず、重複検出処理の対象となる１チャンク分のデータからハッシュ値を生成し、ハッシュテーブル１００３からそのハッシュ値がハッシュリスト１００４においてどのあたりに記憶されているかを大まかに特定する位置情報を取得し、ハッシュリスト１００４においてその位置情報が示す位置から線形探索を行うことによって、一致するハッシュ値が存在するか探索するものとしている。これによって、一律にハッシュリストの先頭から線形探索する場合と比較して、高速にハッシュ値の探索を行うことができる。
【００６２】
なお、図７に示す重複検出部１０３のハッシュ生成部１０３１、抽出部１０３２、取得部１０３３、および探索部１０３４は、機能を概念的に示したものであって、このような構成に限定されるものではない。例えば、図７に示す重複検出部１０３で独立した機能部として図示した複数の機能部を、１つの機能部として構成してもよい。一方、図７に示す重複検出部１０３で１つの機能部が有する機能を複数に分割し、複数の機能部として構成するものとしてもよい。
【００６３】
図９は、実施形態に係るＳＳＤコントローラの重複排除処理の一例を示すフローチャートである。図１０は、実施形態に係るＳＳＤコントローラの重複検出処理の一例を示すフローチャートである。図９および１０を参照しながら、本実施形態に係るＳＳＤコントローラ３の重複排除処理の流れについて説明する。
【００６４】
＜ステップＳ１１＞
アドレス生成部１０１は、重複検出部１０３の重複検出処理の対象となる１チャンク分のデータが記憶されている記憶領域を示すスキャン位置を初期化する。すなわち、アドレス生成部１０１のカウンタ部１０１１は、カウンタ値を「０」にリセットし、カウンタ値「０」から反転部１０１２およびスクランブル部１０１３によって求まるスキャンアドレスを初期アドレスとする。そして、ステップＳ１２へ移行する。
【００６５】
＜ステップＳ１２＞
読出部１０２は、ストレージ装置１がアイドル状態であるか否かを判定する。ここで、ホストＣＰＵ２から受けた書き込みまたは読み出しの処理がストレージ装置１によって実行されている場合、その処理を優先とするため非アイドル状態とする。また、このような優先度の高い処理が実行されていない状態を、アイドル状態とする。ストレージ装置１がアイドル状態である場合（ステップＳ１２：Ｙｅｓ）、ステップＳ１４へ移行し、非アイドル状態である場合（ステップＳ１２：Ｎｏ）、ステップＳ１３へ移行する。
【００６６】
＜ステップＳ１３＞
優先度の高いホストＣＰＵ２から受けた書き込みまたは読み出しの処理が実行されているので、読出部１０２は、その処理が終了するまで待機する。そして、ステップＳ１２へ戻る。
【００６７】
＜ステップＳ１４＞
読出部１０２は、アドレス生成部１０１により生成されたスキャンアドレスが示す記憶領域のデータが有効なデータであるか否かを判定する。具体的には、読出部１０２は、管理情報記憶部１０５の有効管理テーブル１００２を参照し、スキャンアドレスに対応する有効フラグが「１」である場合、スキャンアドレスが示す記憶領域のデータが有効なデータであると判定する。有効なデータである場合（ステップＳ１４：Ｙｅｓ）、ステップＳ１５へ移行し、有効なデータでない場合（ステップＳ１４：Ｎｏ）、ステップＳ２２へ移行する。
【００６８】
＜ステップＳ１５＞
読出部１０２は、スキャンアドレスが示す記憶領域の１チャンク分のデータが有効なデータであると判定し、その１チャンク分のデータを読み出す。そして、ステップＳ１６へ移行する。
【００６９】
＜ステップＳ１６＞
重複検出部１０３は、ＮＡＮＤ型フラッシュメモリ４において、読出部１０２により読み出された１チャンク分のデータと重複する１チャンク分のデータが他の記憶領域に記憶されているか否かを検出する重複検出処理を実行する。重複検出処理として、図１０に示すステップＳ１６１〜Ｓ１６４が実行される。
【００７０】
＜＜ステップＳ１６１＞＞
重複検出部１０３のハッシュ生成部１０３１は、読出部１０２により読み出された１チャンク分のデータから、ハッシュ値を生成する。そして、ステップＳ１６２へ移行する。
【００７１】
＜＜ステップＳ１６２＞＞
重複検出部１０３の抽出部１０３２は、ハッシュ生成部１０３１により生成されたハッシュ値から一部のデータである部分ハッシュを抽出する。そして、ステップＳ１６３へ移行する。
【００７２】
＜＜ステップＳ１６３＞＞
重複検出部１０３の取得部１０３３は、管理情報記憶部１０５に記憶されたハッシュテーブル１００３を参照し、抽出部１０３２により抽出された部分ハッシュに対応する、ハッシュリスト１００４での位置を示す位置情報を取得する。そして、ステップＳ１６４へ移行する。
【００７３】
＜＜ステップＳ１６４＞＞
重複検出部１０３の探索部１０３４は、管理情報記憶部１０５に記憶されたハッシュリスト１００４を参照し、取得部１０３３により取得された位置情報で示されるハッシュ値の位置から、ハッシュ生成部１０３１により生成されたハッシュ値と重複（一致）するハッシュ値を線形探索する。探索部１０３４は、ハッシュ生成部１０３１により生成されたハッシュ値が重複していると判断すると、ハッシュリスト１００４から重複しているハッシュ値に対応するＮＡＮＤアドレスを取得する。そして、探索部１０３４は、重複の検出結果として、データの重複の有無と、重複している場合に、取得したＮＡＮＤアドレスとを出力する。
【００７４】
重複検出部１０３は、以上のステップＳ１６１〜Ｓ１６４に示す重複検出処理を実行する。そして、ステップＳ１７へ移行する。
【００７５】
＜ステップＳ１７＞
重複検出部１０３による重複検出処理の結果、データが重複している、すなわち、読出部１０２により読み出された１チャンク分のデータと重複する１チャンク分のデータが他の記憶領域に記憶されている場合（ステップＳ１７：Ｙｅｓ）、ステップＳ１８へ移行する。この場合、重複検出部１０３は、検出結果として、探索部１０３４により取得された、重複しているデータが記憶されたＮＡＮＤアドレスを重複排除部１０４に出力する。
【００７６】
一方、重複検出部１０３による重複検出処理の結果、データが重複していない、すなわち、少なくともハッシュリスト１００４には、読出部１０２により読み出されたデータのハッシュ値が発見されなかった場合（ステップＳ１７：Ｎｏ）、ステップＳ１９へ移行する。この場合、重複検出部１０３は、検出結果として、データが重複していない旨を、エラー検出部１０６および追加部１０９に出力する。
【００７７】
＜ステップＳ１８＞
重複排除部１０４は、重複検出部１０３によって、読出部１０２により読み出された１チャンク分のデータと重複する１チャンク分のデータが検出された場合、読み出されたデータを排除する（無効とする）。具体的には、重複排除部１０４は、管理情報記憶部１０５に記憶されたアドレス変換テーブル１００１において、スキャンアドレスと一致するＮＡＮＤアドレス（対応する論理アドレスを例えば「ｙ」とする）を、重複検出部１０３から出力された、重複したデータが記憶されているＮＡＮＤアドレス（対応する論理アドレスを例えば「ｘ」とする）で書き換える。この場合、論理アドレス「ｘ」および「ｙ」の双方に対応するＮＡＮＤアドレスが、重複したデータが記憶されているＮＡＮＤアドレスとなり、スキャンアドレスが示す記憶領域のデータは今後不要となる。そして、重複排除部１０４は、管理情報記憶部１０５に記憶された有効管理テーブル１００２を参照し、スキャンアドレスと一致するＮＡＮＤアドレスに対応する有効フラグを「０」に書き換えて無効であるものとする。そして、ステップＳ２２へ移行する。
【００７８】
＜ステップＳ１９＞
追加部１０９は、重複検出部１０３によって読出部１０２により読み出された１チャンク分のデータと重複する１チャンク分のデータが検出されない場合、読み出されたデータは新しいデータとして、ハッシュテーブル１００３の内容を更新し、ハッシュリスト１００４に情報を追加する。
【００７９】
具体的には、追加部１０９は、読出部１０２によりスキャンアドレスから読み出された１チャンク分のデータは重複していないため、そのハッシュ値をハッシュリスト１００４に追加する必要がある。そこで、まず、追加部１０９は、ハッシュリスト１００４において、ハッシュ生成部１０３１により生成されたハッシュ値（以下、「生成ハッシュ値」という場合がある）を、取得部１０３３により取得された位置情報から探索して、生成ハッシュ値よりも小さいハッシュ値と、生成ハッシュ値よりも大きいハッシュ値との間に、生成ハッシュ値を挿入して追加する。さらに、追加部１０９は、ハッシュリスト１００４において、追加した生成ハッシュ値に対応するＮＡＮＤアドレスとして、スキャンアドレスを追加する。これによって、読出部１０２によりスキャンアドレスから読み出された１チャンク分のデータのハッシュ値と、そのスキャンアドレスとを示す行が追加される。
【００８０】
また、追加部１０９による生成ハッシュ値の追加の前に、ハッシュリスト１００４のエントリ数の上限に達している場合、追加部１０９による生成ハッシュ値の追加の代わりに、ハッシュリスト１００４の中で最も古いハッシュ値の行を削除する。すなわち、ハッシュリスト１００４に対して、ＦＩＦＯ（Ｆｉｒｓｔ  Ｉｎ  Ｆｉｒｓｔ  Ｏｕｔ）によってデータのエントリ数が上限を超えないようにする。ここで、ＦＩＦＯを実現するためには、例えば、ハッシュリスト１００４において、ハッシュ値と、ＮＡＮＤアドレスとの関連付けに加えて、そのハッシュ値が追加された時刻、または、追加された順序を示す情報等を関連付けて記憶させておくものとすればよい。これによって、追加部１０９は、ハッシュリスト１００４から最も古いハッシュ値の行を見つけることができる。あるいは、ハッシュリスト１００４のどこの行に最も古いハッシュ値が記憶されているかを示す情報を別情報として管理するものとしてもよい。なお、古いハッシュ値の行の削除は、必ずしもハッシュリスト１００４全体で最も古いハッシュ値を対象とする必要はない。例えば、同一の部分ハッシュを持ったハッシュ値の中で最も古いハッシュ値の行を削除するという方法であってもよい。
【００８１】
さらに、追加部１０９は、ハッシュリスト１００４に生成ハッシュ値の行を追加したことにより、ハッシュテーブル１００３で部分ハッシュに対応する位置情報がずれるため、ハッシュテーブル１００３の位置情報を更新する。
【００８２】
そして、ステップＳ２０へ移行する。
【００８３】
＜ステップＳ２０＞
エラー検出部１０６は、重複検出部１０３によって読出部１０２により読み出された１チャンク分のデータと重複する１チャンク分のデータが検出されない場合、読み出された１チャンク分のデータのエラー率ｒを上述の式（１）で算出し、算出したエラー率ｒに対して閾値判定してエラーを検出する。エラー検出部１０６は、読み出された１チャンク分のデータに付与されている誤り訂正符号に基づいて求められる訂正可能なエラービット数から、上述の式（１）によりエラー率ｒを算出する。そして、エラー検出部１０６は、エラー率ｒが所定の閾値以上であるか否かを判定する。エラー率ｒが閾値以上である場合（ステップＳ２０：Ｙｅｓ）、読み出したデータにはエラーが検出されたものとして、ステップＳ２１へ移行し、エラー率ｒが閾値未満である場合（ステップＳ２０：Ｎｏ）、ステップＳ２２へ移行する。
【００８４】
＜ステップＳ２１＞
再書込部１０７は、エラー検出部１０６によりエラーが検出されたデータ（エラー率ｒが閾値以上と判定されたデータ）を、データ記憶部１０８の別の記憶領域に再書き込みを行う。この場合、再書込部１０７は、エラーが検出されたデータについては、付与されている誤り訂正符号に基づいて誤りを訂正し、訂正したデータに新たに誤り訂正符号を付加して、データ記憶部１０８の別の記憶領域に再書き込みを行う。再書き込みにより、書き込まれたデータはリフレッシュされるため、ビットエラーの発生を抑制することができる。
【００８５】
また、再書込部１０７は、データの再書き込みに併せて、管理情報記憶部１０５に記憶されたアドレス変換テーブル１００１、有効管理テーブル１００２、およびハッシュリスト１００４の内容を更新する。具体的には、まず、再書込部１０７は、アドレス変換テーブル１００１において、スキャンアドレスと一致するＮＡＮＤアドレスを、再書き込みした別の記憶領域を示すＮＡＮＤアドレスで書き換える。また、再書込部１０７は、有効管理テーブル１００２において、スキャンアドレスに対応する有効フラグを「０」（無効）に書き換え、再書き込みした別の記憶領域を示すＮＡＮＤアドレスに対応する有効フラグを「１」（有効）に書き換える。そして、再書込部１０７は、ハッシュリスト１００４において、追加部１０９により追加された生成ハッシュ値に対応するＮＡＮＤアドレス（スキャンアドレス）を、再書き込みした別の記憶領域を示すＮＡＮＤアドレスで書き換える。そして、ステップＳ２２へ移行する。
【００８６】
＜ステップＳ２２＞
アドレス生成部１０１は、重複検出部１０３の重複検出処理の新たな対象となる１チャンク分のデータの記憶領域を示すために、現在のスキャンパターンに従ってスキャンアドレスを更新する。具体的には、アドレス生成部１０１のカウンタ部１０１１は、カウンタ値をインクリメントし、インクリメントされたカウンタ値から反転部１０１２およびスクランブル部１０１３によって求まるスキャンアドレスを、新たなスキャンアドレスとして更新する。そして、ステップＳ２３へ移行する。
【００８７】
＜ステップＳ２３＞
アドレス生成部１０１は、データ記憶部１０８（ＮＡＮＤ型フラッシュメモリ４）の記憶領域のすべてについてスキャンしたか、すなわち、重複検出部１０３による重複検出処理が実行されたか否かを判定する。具体的には、アドレス生成部１０１は、カウンタ部１０１１のカウンタ値が、データ記憶部１０８のすべてのチャンクを示すＮＡＮＤアドレスの個数、すなわち、ＮＡＮＤアドレスの最終アドレスに達したか否かにより判定する。データ記憶部１０８の記憶領域のすべてについてスキャンが終了した場合（ステップＳ２３：Ｙｅｓ）、ステップＳ２４へ移行し、終了していない場合（ステップＳ２３：Ｎｏ）、ステップＳ１２へ戻る。
【００８８】
＜ステップＳ２４＞
データ記憶部１０８の記憶領域すべてについてスキャンされた（重複検出部１０３による重複検出処理が実行された）場合、パターン更新部１１０は、管理情報記憶部１０５から所定の方式に従って、または、ランダムに管理情報記憶部１０５から特定のスキャンパターンの情報を読み出す。そして、パターン更新部１１０は、読み出したスキャンパターンの情報に基づいて、反転部１０１２の反転モード、およびスクランブル部１０１３のスクランブルパターンを更新するためにスキャンパターン更新指令を出力することによって、新たなスキャンパターンに更新する。そして、ステップＳ１１へ戻る。
【００８９】
以上のステップＳ１１〜Ｓ２４の動作によって、ＳＳＤコントローラ３による重複排除処理が実行される。
【００９０】
以上のように、本実施形態に係るＳＳＤコントローラ３は、アドレス生成部１０１によりスキャンパターンに従ったスキャンアドレスを生成するので、スキャンアドレスとして飛び飛びのアドレスを順々に生成し、そのスキャンアドレスのデータを重複検出処理の対象としている。これによって、離れたＮＡＮＤアドレスのデータ同士の重複を検出することが可能になり、ＮＡＮＤ型フラッシュメモリ４の全部のデータのハッシュ値を有する膨大なハッシュリストを有する必要がなく、過去の一部のハッシュ値を記憶するハッシュリストによって、ＮＡＮＤ型フラッシュメモリ４全体の重複の検出が可能となり、データの重複を効率よく検出することができる。
【００９１】
また、特定のスキャンパターンに従ったアドレス生成部１０１によるスキャンアドレスに基づいて、データ記憶部１０８の記憶領域すべてについてスキャンされた（重複検出部１０３による重複検出処理が実行された）場合、パターン更新部１１０は、管理情報記憶部１０５から所定の方式に従って、または、ランダムに管理情報記憶部１０５から特定のスキャンパターンの情報を読み出し、アドレス生成部１０１がスキャンアドレスを生成するためのスキャンパターンを更新するものとしている。これによって、ＮＡＮＤ型フラッシュメモリ４の各記憶領域のデータについてさらに網羅的に重複を検出することが可能となり、データの重複をさらに効率よく検出することができる。
【００９２】
また、重複検出部１０３による重複検出処理では、まず、重複検出処理の対象となる１チャンク分のデータからハッシュ値を生成し、ハッシュテーブル１００３からそのハッシュ値がハッシュリスト１００４においてどのあたりに記憶されているかを大まかに特定する位置情報を取得し、ハッシュリスト１００４においてその位置情報が示す位置から線形探索を行うことによって、一致するハッシュ値が存在するか探索するものとしている。これによって、一律にハッシュリストの先頭から線形探索する場合と比較して、高速にハッシュ値の探索を行うことができるので、データの重複を効率よく検出することができる。
【００９３】
また、重複検出部１０３によりデータの重複が検出された場合、重複排除部１０４は、重複したデータのいずれかを排除するものとしている。これによって、ＮＡＮＤ型フラッシュメモリ４に記憶されているデータを圧縮することが可能となり、ＮＡＮＤ型フラッシュメモリ４を効率的に利用することができる。
【００９４】
また、エラー検出部１０６は、読出部１０２により読み出された１チャンク分のデータについてエラーの有無を検出し、再書込部１０７は、エラー検出部１０６によりエラーが検出されたデータを、データ記憶部１０８の別の記憶領域に再書き込みを行うものとしている。これによって、書き込まれたデータはリフレッシュされるため、ビットエラーの発生を抑制することができる。
【００９５】
なお、上述の実施形態に係るＳＳＤコントローラ３の重複排除処理では、重複排除部１０４による重複したデータの排除が行われているが、この動作の代わりに、重複排除部１０４（通知部）は、重複しているデータの記憶領域を示すＮＡＮＤアドレスに対応する論理アドレス等のデータの重複を示す情報をホストＣＰＵ２に通知するものとしてもよい。この場合、実際のデータの重複排除の動作は、ホストＣＰＵ２の指令に委ねることになる。
【００９６】
また、上述の実施形態では、スキャンパターンを更新するために、パターン更新部１１０から出力されるスキャンパターン更新指令に基づいて、反転部１０１２およびスクランブル部１０１３の動作を変更するものとしていたが、これに限定されるものではない。すなわち、管理情報記憶部１０５には、反転部１０１２およびスクランブル部１０１３の動作を規定するスキャンパターンの情報ではなく、ＮＡＮＤ型フラッシュメモリ４のＮＡＮＤアドレスのデータをどのような順番でスキャンするかを直接規定するスキャンパターンの情報が記憶されているものとしてもよい。この場合、アドレス生成部１０１は、直接、スキャン順番を規定するスキャンパターンに従って、スキャンアドレスを生成するものとすればよい。
【００９７】
また、上述の実施形態では、スキャンアドレスが示す記憶領域のデータについて、エラー検出部１０６によるデータのエラーの検出は、重複検出部１０３によってそのデータに重複がない場合に行うものとしているが、これに限定されるものではない。例えば、重複検出部１０３によるデータの重複の有無に関わらず、スキャンアドレスが示す記憶領域のデータのすべてに対して、エラー検出部１０６によるエラー検出、および、再書込部１０７による誤り訂正後のデータの再書き込みを行うものとしてもよい。
【００９８】
また、上述の実施形態のＳＳＤコントローラ３のＣＰＵ６で実行されるプログラムは、例えば、インストール可能な形式または実行可能な形式のファイルでＣＤ−ＲＯＭ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ  Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＣＤ−Ｒ（Ｃｏｍｐａｃｔ  Ｄｉｓｋ−Ｒｅｃｏｒｄａｂｌｅ）、メモリカード、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）、またはフレキシブルディスク（ＦＤ）等のコンピュータで読み取り可能な記憶媒体に記憶されて提供されるものとしてもよい。
【００９９】
また、上述の実施形態のＳＳＤコントローラ３のＣＰＵ６で実行されるプログラムは、インターネット等のネットワークに接続されたコンピュータ上に格納され、ネットワーク経由でダウンロードされることにより提供されるようにしてもよい。また、上述の実施形態のＳＳＤコントローラ３のＣＰＵ６で実行されるプログラムは、インターネット等のネットワーク経由で提供または配布されるようにしてもよい。また、上述の実施形態のＳＳＤコントローラ３のＣＰＵ６で実行されるプログラムは、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）等に予め組み込んで提供されるようにしてもよい。
【０１００】
また、上述の実施形態のＳＳＤコントローラ３のＣＰＵ６で実行されるプログラムは、上述したＣＰＵ６で実行される各機能をコンピュータ上で実現させるためのモジュール構成となっている。実際のハードウェアとしては、ＣＰＵ６が記憶装置（ＤＲＡＭ５またはＮＡＮＤ型フラッシュメモリ４）からプログラムを読み出して実行することによって、上述の各機能がストレージ装置１上で実現されるようになっている。
【０１０１】
以上のように本発明の実施形態を説明したが、この実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。この新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、および変更を行うことができる。この実施形態およびその変形は、発明の範囲および要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【０１０２】
１  ストレージ装置
２  ホストＣＰＵ
３  ＳＳＤコントローラ
４  ＮＡＮＤ型フラッシュメモリ
５  ＤＲＡＭ
６  ＣＰＵ
７  ＤＲＡＭコントローラ
８  ホストＩ／Ｆ
９  バッファ
１０  ＥＣＣ処理部
１１  ＮＡＮＤコントローラ
１０１  アドレス生成部
１０２  読出部
１０３  重複検出部
１０４  重複排除部
１０５  管理情報記憶部
１０６  エラー検出部
１０７  再書込部
１０８  データ記憶部
１０９  追加部
１１０  パターン更新部
１００１  アドレス変換テーブル
１００２  有効管理テーブル
１００３  ハッシュテーブル
１００４  ハッシュリスト
１０１１  カウンタ部
１０１２  反転部
１０１３  スクランブル部
１０３１  ハッシュ生成部
１０３２  抽出部
１０３３  取得部
１０３４  探索部
【図１】
0006587953.tif 000002
【図２】
0006587953.tif 000003
【図３】
0006587953.tif 000004
【図４】
0006587953.tif 000005
【図５】
0006587953.tif 000006
【図６】
0006587953.tif 000007
【図７】
0006587953.tif 000008
【図８】
0006587953.tif 000009
【図９】
0006587953.tif 000010
【図１０】
0006587953.tif 000011