(57)【要約】【課題】ビット列への読出要求に対する応答性能の低下の抑制を図ること。【解決手段】要求元装置１０２は、データの読出要求を記憶装置１０１に送信する。読出要求を受けた記憶装置１０１は、読出要求を受けたデータ１１１とビット列のＥＣＣコード１１２とを記憶装置１０１内の記憶媒体から読み出す。ここで、データ１１１は、１と０のビットが連続したビット列となる。次に、記憶装置１０１は、データ１１１とＥＣＣコード１１２とを用いてデータの誤り訂正を実行する誤り訂正処理のうちのデータ１１１内に誤ったビットが有るか無いかを判定する判定処理が完了する前に、データ１１１を要求元装置１０２に送信する。【選択図】図１
2016024571.tif 000002
【特許請求の範囲】
【請求項１】
データの読出要求を行う要求元装置と、
前記要求元装置から読出要求を受けたデータのビット列と前記ビット列の誤り訂正符号とを読み出し、読み出した前記ビット列と前記誤り訂正符号とを用いて前記ビット列の誤り訂正を実行する誤り訂正処理のうちの前記ビット列内に誤ったビットが有るか無いかを判定する処理が完了する前に、前記ビット列を前記要求元装置に送信する記憶装置と、
を有ことを特徴とする誤り訂正システム。
【請求項２】
前記記憶装置は、
前記誤り訂正処理のうちの前記判定する処理で用いる前記ビット列内に誤ったビットが有るか無いかを表す値を計算する処理が完了する前に、前記ビット列を前記要求元装置に送信する、
ことを特徴とする請求項１に記載の誤り訂正システム。
【請求項３】
前記記憶装置は、
前記ビット列内に誤ったビットが有ると判定した場合、前記誤り訂正処理によって訂正された訂正後のビットを前記要求元装置に送信する、
ことを特徴とする請求項１または２に記載の誤り訂正システム。
【請求項４】
前記記憶装置は、
さらに、前記ビット列の誤り検出符号を読み出し、
前記ビット列と前記誤り検出符号とを用いて前記ビット列内に誤ったビットが有るか無いかを検出し、
前記ビット列の送信が完了し、かつ、前記ビット列内に誤ったビットが無いと検出した場合、前記ビット列の送信完了通知を前記要求元装置に送信し、
前記要求元装置は、
前記ビット列の送信完了通知を受信した場合、前記ビット列を用いた処理を実行する、
ことを特徴とする請求項１〜３のいずれか一つに記載の誤り訂正システム。
【請求項５】
前記記憶装置は、
前記ビット列の送信が完了し、かつ、前記ビット列内に誤ったビットが有ると検出した場合、前記誤り訂正処理によって訂正された訂正後のビットを前記要求元装置に送信し、前記訂正後のビットの送信が完了した後に訂正後のビット列の送信完了通知を前記要求元装置に送信し、
前記要求元装置は、
前記訂正後のビット列の送信完了通知を受信した場合、前記訂正後のビット列を用いた処理を実行する、
ことを特徴とする請求項４に記載の誤り訂正システム。
【請求項６】
前記記憶装置は、
前記ビット列の送信完了通知を前記要求元装置に送信した後に前記ビット列内に誤ったビットが有ると判定した場合、前記誤り訂正処理によって訂正された訂正後のビットを前記要求元装置に送信し、前記訂正後のビットの送信が完了した後に訂正後のビット列の送信完了通知を前記要求元装置に送信し、
前記要求元装置は、
前記訂正後のビット列の送信完了通知を受信した場合、前記訂正後のビット列を用いた処理を実行する、
ことを特徴とする請求項４に記載の誤り訂正システム。
【請求項７】
前記記憶装置は、
前記ビット列に対する書込回数が所定の回数未満、または前記読出要求より前に受けた前記ビット列に対する読出要求に対して読み出した前記ビット列における前記ビット列内に誤ったビットの数が所定数未満であるか否かを判断し、
判断結果に応じて、前記ビット列と前記誤り訂正符号とを読み出す第１の読出処理、または前記ビット列と前記誤り訂正符号と前記誤り検出符号とを読み出す第２の読出処理、のいずれか一方の処理を実行し、
前記第１の読出処理を実行した際に、前記ビット列の送信が完了した場合に前記ビット列の送信完了通知を前記要求元装置に送信する、
ことを特徴とする請求項４に記載の誤り訂正システム。
【請求項８】
前記記憶装置は、
前記ビット列に対する書込回数が所定の回数未満、または前記読出要求より前に受けた前記ビット列に対する読出要求に対して読み出した前記ビット列における前記ビット列内に誤ったビットの数が所定数未満であるか否かを判断し、
判断結果に応じて、前記ビット列と前記誤り訂正符号と前記誤り検出符号とを読み出す読出処理を実行し、
前記読出処理を実行した際に、前記ビット列と前記誤り検出符号とを用いて前記ビット列内に誤ったビットが有るか無いかを検出し、
前記読出処理を実行した際に、前記ビット列の送信が完了し、かつ、前記ビット列内に誤ったビットが無いと検出した場合に前記ビット列の送信完了通知を前記要求元装置に送信する、
ことを特徴とする請求項４に記載の誤り訂正システム。
【請求項９】
要求元装置と接続されるコンピュータが、
前記要求元装置から読出要求を受けたデータのビット列と前記ビット列の誤り訂正符号とを読み出し、
読み出した前記ビット列と前記誤り訂正符号とを用いて前記ビット列の誤り訂正を実行する誤り訂正処理のうちの前記ビット列内に誤ったビットが有るか無いかを判定する処理が完了する前に、前記ビット列を前記要求元装置に送信する、
処理を実行することを特徴とする誤り訂正方法。
【請求項１０】
要求元装置と接続されるコンピュータに、
前記要求元装置から読出要求を受けたデータのビット列と前記ビット列の誤り訂正符号とを読み出し、
読み出した前記ビット列と前記誤り訂正符号とを用いて前記ビット列の誤り訂正を実行する誤り訂正処理のうちの前記ビット列内に誤ったビットが有るか無いかを判定する処理が完了する前に、前記ビット列を前記要求元装置に送信する、
処理を実行させることを特徴とする誤り訂正プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、誤り訂正システム、誤り訂正方法、および誤り訂正プログラムに関する。
【背景技術】
【０００２】
従来、データ内の誤りのビットを検出して訂正する技術がある。関連する先行技術として、例えば、誤りが検出されなかったデータを先出しし、訂正処理を行うべきデータには訂正処理を施してから送信するものがある。また、連続データ転送で最初に発生した１ビットエラーのアドレス、訂正したデータをレジスタに取り込み、データ転送終了後、レジスタのアドレスが指す主記憶とバッファ記憶のデータをレジスタのデータに書き替える技術がある。また、データとＣＲＣ（Ｃｙｃｌｉｃ  Ｒｅｄｕｎｄａｎｃｙ  Ｃｈｅｃｋ）符号に基づくＣＲＣチェックを行い、エラーがなければデータはデータ転送用バスにより、ＣＲＣコードはＣＲＣバスによりキャッシュコントローラに転送する技術がある。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１２−１２８７７８号公報
【特許文献２】特開平５−２８９９４７号公報
【特許文献３】特開２００２−０２３９６６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、従来技術によれば、ビット列に対して読出要求を行うと、ビット列とビット列の誤り訂正符号とを用いてビット列の誤り訂正を実行する誤り訂正処理により、読出要求に対する応答性能が低下する。
【０００５】
１つの側面では、本発明は、ビット列への読出要求に対する応答性能の低下を抑制する誤り訂正システム、誤り訂正方法、および誤り訂正プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００６】
本発明の一側面によれば、データの読出要求を行う要求元装置と、要求元装置から読出要求を受けたデータのビット列とビット列の誤り訂正符号とを読み出し、読み出したビット列と誤り訂正符号とを用いてビット列の誤り訂正を実行する誤り訂正処理のうちのビット列内に誤ったビットが有るか無いかを判定する処理が完了する前に、ビット列を要求元装置に送信する記憶装置とを有する誤り訂正システム、誤り訂正方法、および誤り訂正プログラムが提案される。
【発明の効果】
【０００７】
本発明の一態様によれば、ビット列への読出要求に対する応答性能の低下を抑制することができるという効果を奏する。
【図面の簡単な説明】
【０００８】
【図１】図１は、誤り訂正システム１００の動作例を示す説明図である。
【図２】図２は、サーバ２００のハードウェア構成例を示すブロック図である。
【図３】図３は、ストレージ装置２０７の構成例を示すブロック図である。
【図４】図４は、ＣＰＵ２０１の機能構成例を示すブロック図である。
【図５】図５は、ストレージ装置２０７とＣＰＵ２０１との動作のタイミングチャート例を示す説明図である。
【図６】図６は、ストレージ装置２０７による第１の読出要求受信時処理手順の一例を示すフローチャートである。
【図７】図７は、ＣＰＵ２０１による読出データ受信時処理手順の一例を示すフローチャートである。
【図８】図８は、実施の形態２におけるストレージ装置８０１の構成例を示すブロック図である。
【図９】図９は、ストレージ装置８０１とＣＰＵ８０３との動作のタイミングチャート例を示す説明図である。
【図１０】図１０は、ストレージ装置８０１による第２の読出要求受信時処理手順の一例を示すフローチャートである。
【図１１】図１１は、実施の形態３におけるストレージ装置１１０１の構成例を示すブロック図である。
【図１２】図１２は、ストレージ装置１１０１による第３の読出要求受信時処理手順の一例を示すフローチャート（その１）である。
【図１３】図１３は、ストレージ装置１１０１による第３の読出要求受信時処理手順の一例を示すフローチャート（その２）である。
【図１４】図１４は、実施の形態４におけるストレージ装置１４０１の構成例を示すブロック図である。
【図１５】図１５は、ストレージ装置１４０１による第４の読出要求受信時処理手順の一例を示すフローチャートである。
【発明を実施するための形態】
【０００９】
以下に図面を参照して、開示の誤り訂正システム、誤り訂正方法、および誤り訂正プログラムの実施の形態を詳細に説明する。
【００１０】
（実施の形態１の説明）
図１は、誤り訂正システム１００の動作例を示す説明図である。誤り訂正システム１００は、記憶装置１０１と、記憶装置１０１に読出要求を送信する要求元装置１０２とを含む。誤り訂正システム１００は、例えば、サーバである。また、誤り訂正システム１００は、パーソナル・コンピュータでもよいし、携帯端末でもよい。
【００１１】
記憶装置１０１は、記憶したデータの誤り訂正を行う装置である。例えば、記憶装置１０１は、記憶媒体としてフラッシュメモリを用いたＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）や、記憶媒体として磁気ディスクを用いたＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）や、ＥＣＣ（Ｅｒｒｏｒ  Ｃｈｅｃｋｉｎｇ  ａｎｄ  Ｃｏｒｒｅｃｔｉｏｎ）と呼ばれる機能を搭載したメモリモジュールである。また、要求元装置１０２は、記憶装置１０１に対して読出要求を送信するものであればどのようなものでもよく、例えば、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）である。また、要求元装置１０２は、例えば、ＤＳＰ（Ｄｉｇｉｔａｌ  Ｓｉｇｎａｌ  Ｐｒｏｃｅｓｓｏｒ）や、ＧＰＵ（Ｇｒａｐｈｉｃｓ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）でもよい。
【００１２】
また、誤り訂正は、誤り訂正符号を用いることにより行われる。誤り訂正符号としては、例えば、ＢＣＨ符号、リード・ソロモン符号、ハフマン符号等がある。誤り訂正符号の復号する誤り訂正処理は、シンドローム計算を行い、シンドローム計算の結果から誤りのビットの有無を判定し、誤りのビットが有る場合、誤りのビット位置を検出して、誤りのビットを訂正する処理である。ここで、シンドロームは、誤りの症状を意味し、シンドローム計算は、誤りの症状を示す値を計算する処理である。
【００１３】
ここで、誤り訂正符号が２重誤り訂正が可能なＢＣＨ符号である場合を例にして説明する。例えば、記憶装置１０１が、ＢＣＨ符号の復号を行うものとする。このとき、記憶装置１０１は、シンドローム計算として、復号対象となるビット列を、予め決められた生成多項式Ｇ（ｘ）＝Ｇ１（ｘ）・Ｇ２（ｘ）で示されるＧ１（ｘ）、Ｇ２（ｘ）で割った剰余からシンドロームＳ１、Ｓ２を求める。
【００１４】
次に、記憶装置１０１は、Ｓ１、Ｓ２から、誤りのビットが有るか無いか、そして、誤りのビットが有るならばどのビットが誤ったかを判定する。例えば、記憶装置１０１は、Ｓ１、Ｓ２の値の組み合わせに応じて、どのビットが誤ったかを判定する判定テーブルｔ＿ＢＣＨを有しており、上述のテーブルを参照することにより判定する。判定テーブルｔ＿ＢＣＨは、それぞれの組み合わせに応じて、誤りのビットが無い、１つの誤ったビットの位置、２つの誤ったビットのそれぞれの位置、誤りのビットの位置は不明だが３つ以上の誤ったビットが有る、のうちのいずれか１つの情報を記憶する。例えば、記憶装置１０１は、Ｓ１＝Ｓ２＝０であれば、判定テーブルｔ＿ＢＣＨを参照して、誤りのビットが無いと判定する。そして、１つの誤ったビットの位置、または、２つの誤ったビットのそれぞれの位置を得た場合、記憶装置１０１は、該当の位置のビットを訂正する。
【００１５】
リード・ソロモン符号やハフマン符号については説明を省略するが、復号を行う装置は、リード・ソロモン符号やハフマン符号におけるシンドローム計算として、行列の演算を行う。
【００１６】
以下、誤りのビットが有ることを、「エラー」と呼称する場合がある。例えば、誤りのビットが有ることを判定した場合には、「エラー有」を判定したと呼称し、誤りのビットが無いことを判定した場合には、「エラー無」を判定したと呼称する場合がある。また、誤り訂正符号を「ＥＣＣ（Ｅｒｒｏｒ  Ｃｈｅｃｋｉｎｇ  ａｎｄ  Ｃｏｒｒｅｃｔｉｏｎ）コード」と呼称する場合がある。
【００１７】
ここで、シンドローム計算の結果、エラー無であれば、復号を行う装置は、データの要求元に送信する。しかしながら、シンドローム計算を実行するには一定の時間を要するため、エラー無であっても、データの送信が開始するまで遅延が生じることになる。
【００１８】
そこで、記憶装置１０１は、読出対象のデータのシンドローム計算の結果を用いた誤ったビットの有無の判定が完了する前にデータを要求元装置１０２に送信する。これにより、誤り訂正システム１００は、記憶装置１０１のデータは誤ったビットが無い確率が高いことを利用して、誤り訂正前のデータを送信して、応答性能の低下を抑制することができる。ここで、記憶装置１０１のデータは誤ったビットが無い確率が高いことは、記憶装置１０１の特性により予めわかっていることである。例えば、記憶装置１０１が、２ビットＭＬＣ（Ｍｕｌｔｉｐｌｅ  Ｌｅｖｅｌ  Ｃｅｌｌ）のＮＡＮＤ型フラッシュメモリである場合、８５［％］の確率でエラー無となる。
【００１９】
まず、要求元装置１０２は、図１の（１）で示す処理として、データの読出要求を記憶装置１０１に送信する。読出要求を受けた記憶装置１０１は、図１の（２）で示す処理として、読出要求を受けたデータ１１１とビット列のＥＣＣコード１１２とを記憶装置１０１内の記憶媒体から読み出す。ここで、データ１１１は、１と０のビットが連続したビット列となる。
【００２０】
次に、記憶装置１０１は、データ１１１とＥＣＣコード１１２とを用いてデータの誤り訂正を実行する誤り訂正処理のうち、データ１１１内に誤ったビットが有るか無いかを判定する判定処理が完了する前に、データ１１１を要求元装置１０２に送信する。図１の例では、枠１１３内部において、誤り訂正処理と、要求元装置１０２へのデータの送信との時間的な関係について示す。また、図１では、データ１１１には誤りのビットが無いものとする。
【００２１】
時刻ｔ０において、記憶装置１０１は、誤り訂正処理内のシンドローム計算を開始するとともに、要求元装置１０２へのデータ１１１の送信を開始する。そして、時刻ｔ０から時間が経過した時刻ｔ１にかけて、記憶装置１０１は、要求元装置１０２へのデータ１１１を送信する。そして、時刻ｔ１から時間が経過した時刻ｔ２において、記憶装置１０１は、シンドローム計算を完了し、データ１１１内に誤ったビットが有るか無いかを判定する処理が完了する。このように、記憶装置１０１は、図１の（３）で示す処理として、判定処理が完了する時刻ｔ２の前となる時刻ｔ１にデータ１１１を要求元装置１０２に送信する。
【００２２】
次に、誤り訂正システム１００を、サーバに適用した例を、図２を用いて説明する。
【００２３】
図２は、サーバ２００のハードウェア構成例を示すブロック図である。図２において、サーバ２００は、ＣＰＵ２０１と、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）２０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）２０３と、を含む。また、サーバ２００は、ディスクドライブ２０４およびディスク２０５と、通信インターフェース２０６と、ストレージ装置２０７と、を含む。また、ＣＰＵ２０１〜ディスクドライブ２０４、通信インターフェース２０６、ストレージ装置２０７はバス２０８によってそれぞれ接続される。ここで、ＣＰＵ２０１は、図１に示した要求元装置１０２に相当する。また、ストレージ装置２０７は、図１に示した記憶装置１０１に相当する。
【００２４】
ＣＰＵ２０１は、サーバ２００の全体の制御を司る演算処理装置である。ＲＯＭ２０２は、ブートプログラムなどのプログラムを記憶する不揮発性メモリである。ＲＡＭ２０３は、ＣＰＵ２０１のワークエリアとして使用される揮発性メモリである。
【００２５】
ディスクドライブ２０４は、ＣＰＵ２０１の制御に従ってディスク２０５に対するデータのリードおよびライトを制御する制御装置である。ディスクドライブ２０４には、例えば、磁気ディスクドライブ、ソリッドステートドライブなどを採用することができる。ディスク２０５は、ディスクドライブ２０４の制御で書き込まれたデータを記憶する不揮発性メモリである。例えばディスクドライブ２０４が磁気ディスクドライブである場合、ディスク２０５には、磁気ディスクを採用することができる。また、ディスクドライブ２０４がソリッドステートドライブである場合、ディスク２０５には、半導体素子によって形成された半導体メモリ、いわゆる半導体ディスクを採用することができる。
【００２６】
通信インターフェース２０６は、ネットワークと内部のインターフェースを司り、他の装置からのデータの入出力を制御する制御装置である。具体的に、通信インターフェース２０６は、通信回線を通じてネットワークを介して他の装置に接続される。通信インターフェース２０６には、例えば、モデムやＬＡＮアダプタなどを採用することができる。
【００２７】
ストレージ装置２０７は、記憶部としてＮＡＮＤ型フラッシュメモリを用いた記憶装置である。ストレージ装置２０７の内部のハードウェア構成については、図３で後述する。
【００２８】
また、サーバ２００の管理者が、サーバ２００を直接操作する場合、サーバ２００は、ディスプレイ、キーボード、マウスといったハードウェアを有してもよい。
【００２９】
例えば、サーバ２００は、ストレージ装置２０７に記憶されたデータを解析する。より具体的には、ストレージ装置２０７が、ある期間に対する売上情報を記憶しており、サーバ２００は、売上情報をストレージ装置２０７から読み出して、売上情報に関する解析を行う。
【００３０】
図３は、ストレージ装置２０７の構成例を示すブロック図である。ストレージ装置２０７は、ＮＡＮＤコントローラ３０１と、ＮＡＮＤ型フラッシュメモリ３０２とを有する。ＮＡＮＤコントローラ３０１は、ストレージ装置２０７を制御する。ＮＡＮＤ型フラッシュメモリ３０２は、電源を切ってもデータを失わない性質を有する半導体メモリである。
【００３１】
また、ＮＡＮＤコントローラ３０１は、読出部３１１と、誤り訂正部３１２と、送信部３１３と、バッファ３１４とを含む。誤り訂正部３１２は、シンドローム計算部３２１と、エラー判定部３２２と、エラー訂正部３２３とを含む。ここで、読出部３１１〜バッファ３１４は、ハードウェアとして組み込まれた回路ブロックである。また、ストレージ装置２０７内の記憶媒体に記憶されたプログラムを、ＤＳＰ等のプロセッサが実行することにより、読出部３１１〜送信部３１３の機能を実現してもよい。
【００３２】
読出部３１１は、ＣＰＵ２０１から読出要求を受けたデータと読み出したデータのＥＣＣコードとを読み出す。
【００３３】
誤り訂正部３１２は、読み出したデータの誤り訂正処理を行う。具体的には、誤り訂正部３１２は、誤り訂正処理として、読み出したデータとＥＣＣコードとを用いて読み出したデータの誤り訂正を実行する。
【００３４】
送信部３１３は、誤り訂正部３１２が実行する誤り訂正処理のうちの読み出したデータがエラー有かエラー無かを判定する処理が完了する前に、読み出したデータをＣＰＵ２０１に送信する。エラー有かエラー無かを判定する処理は、エラー判定部３２２が行う。また、送信部３１３は、誤り訂正部３１２が実行するシンドローム計算が完了する前に、読み出したデータをＣＰＵ２０１に送信する。シンドローム計算は、シンドローム計算部３２１が実行する。
【００３５】
また、送信部３１３は、読み出したデータがエラー有と判定した場合、誤り訂正部３１２が実行する誤り訂正処理によって訂正された訂正後のビットをＣＰＵ２０１に送信する。ここで、ＣＰＵ２０１に送信する内容は、少なくとも訂正後のビットが含まれていればよく、訂正後のビットを含む全てのビット列、訂正後のビットを含む一部のビット列、訂正後のビットのみ、のいずれであってもよい。以下、訂正後のビットとしてＣＰＵ２０１に送信するデータを、「訂正後のデータ」と呼称する。ここで、ＣＰＵ２０１が送信されたデータが訂正後のデータであることを判別するため、送信部３１３は、読み出したデータがエラー有と判定した場合に、エラー有通知をＣＰＵ２０１に送信してもよい。または、エラー有通知をＣＰＵ２０１に送信しない例として、ＣＰＵ２０１は、読出要求に対するデータを既に受信したにも関わらず、さらに別のデータを受信した場合、受信した別のデータが訂正後のデータであると判別してもよい。
【００３６】
また、送信部３１３は、読み出したデータの送信が完了した場合、読み出したデータの送信完了通知をＣＰＵ２０１に送信する。
【００３７】
シンドローム計算部３２１は、シンドローム計算を行う。例えば、ＢＣＨ符号であれば、シンドローム計算部３２１は、複数の多項式の剰余をそれぞれ求める。また、リード・ソロモン符号やハフマン符号であれば、シンドローム計算部３２１は、行列の演算を行う。
【００３８】
エラー判定部３２２は、シンドローム計算部３２１の結果から、エラー有かエラー無かを判定し、エラー有であれば、エラービットの位置を判定する。エラー訂正部３２３は、エラー判定部３２２がエラー有と判定した場合、エラーの訂正を行う。バッファ３１４は、読み出したデータを一時的に記憶する記憶領域である。
【００３９】
図４は、ＣＰＵ２０１の機能構成例を示すブロック図である。ＣＰＵ２０１は、保持部４０１と、処理部４０２とを、含む。ここで、処理部４０２は、記憶装置に記憶されたプログラムをＣＰＵ２０１が実行することにより、処理部４０２の機能を実現する。記憶装置とは、具体的には、例えば、図２に示したＲＯＭ２０２、ディスク２０５などである。また、記憶装置に記憶されたプログラムは、例えば、ストレージ装置２０７を制御するデバイスドライバである。また、各部の処理結果は、ＣＰＵ２０１が有するレジスタや、ＲＡＭ２０３等に記憶される。
【００４０】
保持部４０１は、ストレージ装置２０７から読み出したデータを一旦保持する記憶領域である。具体的に、保持部４０１は、ＣＰＵ２０１が有するレジスタやＣＰＵ２０１のキャッシュメモリである。
【００４１】
処理部４０２は、ストレージ装置２０７から読み出したデータを用いた何らかの処理を実行する。例えば、処理部４０２は、ストレージ装置２０７からデータの送信完了通知を受信した場合、データを用いた何らかの処理を実行する。また、処理部４０２は、ストレージ装置２０７から訂正後のデータを受信した後、訂正後のデータを用いた何らかの処理を実行する。以下、データ、または訂正後のデータを用いた何らかの処理を、単に、「データ処理」と呼称する。処理部４０２は、ストレージ装置２０７から、データの送信完了通知を受信した後、データ処理を開始する。また、処理部４０２は、データの送信完了通知を受信する前に、受信したデータに対して順次データ処理を行ってもよい。
【００４２】
次に、ストレージ装置２０７とＣＰＵ２０１との動作のタイミングチャートを図５を用いて説明する。
【００４３】
図５は、ストレージ装置２０７とＣＰＵ２０１との動作のタイミングチャート例を示す説明図である。ＮＡＮＤコントローラ３０１は、時刻ｔ０において、読出要求があったデータをＮＡＮＤ型フラッシュメモリ３０２から読み出す。そして、時刻ｔ０において、ＮＡＮＤコントローラ３０１は、読み出したデータを順次ＣＰＵ２０１に送信するとともに、読み出したデータに対してシンドローム計算を実行する。
【００４４】
時刻ｔ０から時間が経過した時刻ｔ１において、ＮＡＮＤコントローラ３０１は、読出要求があった全てのデータを読み出し終えて、読出要求があった全てのデータをＣＰＵ２０１に送信する。そして、時刻ｔ１において、ＮＡＮＤコントローラ３０１は、データの送信完了通知をＣＰＵ２０１に送信する。ここで、シンドローム計算はデータの読出よりも処理量が多いため、時刻ｔ１において、ＮＡＮＤコントローラ３０１は、シンドローム計算が完了しておらず処理中である。
【００４５】
また、時刻ｔ１において、データ送信完了通知を受信したＣＰＵ２０１は、データ処理を開始する。このとき、ＣＰＵ２０１は、処理によって値が変化するデータを、保持部４０１に書き込んでおく。
【００４６】
時刻ｔ１から時間が経過した時刻ｔ２において、ＮＡＮＤコントローラ３０１は、シンドローム計算を完了する。そして、時刻ｔ２において、ＮＡＮＤコントローラ３０１は、シンドローム計算の処理結果から、エラーの有無を判定する。
【００４７】
エラーが無いと判定した場合、ＮＡＮＤコントローラ３０１は、エラー無をＣＰＵ２０１に送信する。エラー無を受信したＣＰＵ２０１は、データ処理を継続する。
【００４８】
一方、エラーが有ると判定した場合、ＮＡＮＤコントローラ３０１は、エラー有をＣＰＵ２０１に送信する。そして、ＮＡＮＤコントローラ３０１は、エラー訂正を行う。エラー有を受信したＣＰＵ２０１は、データ処理を中断し、保持部に書き込んでおいたデータをロードする。そして、ＣＰＵ２０１は、訂正後のデータ４０１を受信するまで待つ。
【００４９】
時刻ｔ２から時間が経過した時刻ｔ３において、ＮＡＮＤコントローラ３０１は、誤り訂正を完了する。そして、時刻ｔ３において、ＮＡＮＤコントローラ３０１は、訂正後のデータをＣＰＵ２０１に送信する。ここで、訂正後のデータを送信するにあたって、ＮＡＮＤコントローラ３０１は、図３で説明したとおり、訂正後のビットを含む全てのビット列、訂正後のビットを含む一部のビット列、訂正後のビットのみ、のいずれであってもよい。ＣＰＵ２０１は、いずれの範囲のデータを送信してもらうかを、ＮＡＮＤコントローラ３０１に通知する。
【００５０】
時刻ｔ３から時間が経過した時刻ｔ４において、ＮＡＮＤコントローラ３０１は、誤り訂正の送信を完了し、訂正後のデータの送信完了通知をＣＰＵ２０１に送信する。そして、時刻ｔ４において、訂正後のデータの送信完了通知を受信したＣＰＵ２０１は、データ処理を開始する。
【００５１】
ここで、シンドローム計算のエラーの有りとなる確率についての一例を示す。ここで、ＮＡＮＤ型フラッシュメモリ３０２が、２ビットのＭＬＣであるとする。このとき、１０２４［Ｋバイト］中に１ビット以上のエラーが起こらない確率は、約８５［％］である。従って、１０２４［Ｋバイト］単位でシンドローム計算を行う場合、サーバ２００は、約８５［％］の確率で、ＣＰＵ２０１のデータ処理を巻き戻すことなくデータ処理を実行することができる。
【００５２】
図６は、ストレージ装置２０７による第１の読出要求受信時処理手順の一例を示すフローチャートである。ストレージ装置２０７による第１の読出要求受信時処理は、実施の形態１におけるＣＰＵ２０１からの読出要求を受けた際に実行する処理である。
【００５３】
ＮＡＮＤコントローラ３０１は、ＮＡＮＤ型フラッシュメモリ３０２から、読出要求を受けたデータとＥＣＣコードとを読み出す（ステップＳ６０１）。次に、ＮＡＮＤコントローラ３０１は、読み出したデータとＥＣＣコードとを用いて、読み出したデータに対するシンドローム計算を実行する（ステップＳ６０２）。また、ＮＡＮＤコントローラ３０１は、読み出したデータをＣＰＵ２０１に送信する（ステップＳ６０３）。ここで、ＮＡＮＤコントローラ３０１は、ステップＳ６０２の処理とステップＳ６０３の処理とを並列に行う。また、ＮＡＮＤコントローラ３０１は、ステップＳ６０２の処理の後にステップＳ６０３の処理を実行してもよいし、ステップＳ６０３の処理の後にステップＳ６０２の処理を実行してもよい。
【００５４】
次に、ＮＡＮＤコントローラ３０１は、ＣＰＵ２０１へのデータの送信が完了したか否かを判断する（ステップＳ６０４）。ＣＰＵ２０１へのデータの送信が完了していない場合（ステップＳ６０４：Ｎｏ）、ＮＡＮＤコントローラ３０１は、ステップＳ６０１の処理に移行する。
【００５５】
一方、ＣＰＵ２０１へのデータの送信が完了した場合（ステップＳ６０４：Ｙｅｓ）、ＮＡＮＤコントローラ３０１は、ＣＰＵ２０１にデータの送信完了通知を送信する（ステップＳ６０５）。次に、ＮＡＮＤコントローラ３０１は、シンドローム計算を実行する（ステップＳ６０６）。そして、ＮＡＮＤコントローラ３０１は、シンドローム計算が完了したか否かを判断する（ステップＳ６０７）。シンドローム計算が完了していない場合（ステップＳ６０７：Ｎｏ）、ＮＡＮＤコントローラ３０１は、ステップＳ６０６の処理に移行する。
【００５６】
一方、シンドローム計算が完了した場合（ステップＳ６０７：Ｙｅｓ）、ＮＡＮＤコントローラ３０１は、シンドローム計算の結果がエラー有を示すか否かを判断する（ステップＳ６０８）。シンドローム計算の結果がエラー無を示す場合（ステップＳ６０８：Ｎｏ）、ＮＡＮＤコントローラ３０１は、ＣＰＵ２０１にエラー無を送信する（ステップＳ６０９）。
【００５７】
一方、シンドローム計算の結果がエラー有を示す場合（ステップＳ６０８：Ｙｅｓ）、ＮＡＮＤコントローラ３０１は、ＣＰＵ２０１にエラー有を送信する（ステップＳ６１０）。そして、ＮＡＮＤコントローラ３０１は、エラービットを訂正する（ステップＳ６１１）。次に、ＣＰＵ２０１にエラー訂正完了通知を送信する（ステップＳ６１２）。
【００５８】
ステップＳ６０９、またはステップＳ６１２の処理終了後、ＮＡＮＤコントローラ３０１は、ストレージ装置２０７による第１の読出要求受信時処理を終了する。ストレージ装置２０７による第１の読出要求受信時処理を実行することにより、ストレージ装置２０７は、シンドローム計算の結果がエラー無であれば、シンドローム計算分の遅延なく、データをＣＰＵ２０１に送信することができる。
【００５９】
図７は、ＣＰＵ２０１による読出データ受信時処理手順の一例を示すフローチャートである。ＣＰＵ２０１による読出データ受信時処理は、読出要求を行ったデータをストレージ装置２０７から受信した際に行う処理である。
【００６０】
ＣＰＵ２０１は、ストレージ装置２０７から読出要求を行ったデータを受信する（ステップＳ７０１）。次に、ＣＰＵ２０１は、受信したデータのうち、処理によって変化するデータを保持部４０１に書き込む（ステップＳ７０２）。そして、ＣＰＵ２０１は、データ処理を開始する（ステップＳ７０３）。
【００６１】
次に、ＣＰＵ２０１は、エラー無を受信したか否かを判断する（ステップＳ７０４）。エラー無を受信していない場合（ステップＳ７０４：Ｎｏ）、続けて、ＣＰＵ２０１は、エラー有を受信したか否かを判断する（ステップＳ７０５）。エラー有を受信していない場合（ステップＳ７０５：Ｎｏ）、ＣＰＵ２０１は、ステップＳ７０４の処理に移行する。
【００６２】
エラー有を受信した場合（ステップＳ７０５：Ｙｅｓ）、ＣＰＵ２０１は、データ処理を中断する（ステップＳ７０６）。次に、ＣＰＵ２０１は、保持部４０１に書き込んであったデータをロードする（ステップＳ７０７）。そして、ＣＰＵ２０１は、訂正後のデータを受信したか否かを判断する（ステップＳ７０８）。訂正後のデータを受信していない場合（ステップＳ７０８：Ｎｏ）、ＣＰＵ２０１は、再びステップＳ７０８の処理を実行する。
【００６３】
一方、訂正後のデータを受信した場合（ステップＳ７０８：Ｙｅｓ）、ＣＰＵ２０１は、データ処理を開始する（ステップＳ７０９）。また、エラー無を受信した場合（ステップＳ７０４：Ｙｅｓ）、ＣＰＵ２０１は、データ処理を継続する（ステップＳ７１０）。
【００６４】
ステップＳ７０９、またはステップＳ７１０の処理終了後、ＣＰＵ２０１は、ＣＰＵ２０１による読出データ受信時処理を終了する。ＣＰＵ２０１による読出データ受信時処理を実行することにより、ストレージ装置２０７は、シンドローム計算の結果がエラー無であれば、シンドローム計算が完了する前にデータ処理を行うことができる。
【００６５】
以上説明したように、ストレージ装置２０７によれば、読出対象のデータのシンドローム計算の結果を用いた誤ったビットの有無の判定が完了する前にデータをＣＰＵ２０１に送信する。これにより、サーバ２００は、ストレージ装置２０７のデータは誤ったビットが無い確率が高いことを利用して、誤り訂正前のデータを送信して、応答性能の低下を抑制することができる。
【００６６】
また、ストレージ装置２０７によれば、シンドローム計算が完了する前に、読み出したデータをＣＰＵ２０１に送信する。これにより、サーバ２００は、判定する処理が完了する前に読み出したデータを送信する場合より、応答性能をさらに向上することができる。
【００６７】
またストレージ装置２０７によれば、読み出したデータがエラー有と判定した場合、ストレージ装置２０７が訂正後のデータをＣＰＵ２０１に送信する。これにより、ＣＰＵ２０１は、正しいデータで処理を行うことができる。
【００６８】
また、サーバ２００によれば、ストレージ装置２０７がＣＰＵ２０１へのデータの送信が完了した場合、データの送信完了通知をＣＰＵ２０１に送信し、ＣＰＵ２０１がデータの送信完了通知を受信した場合、データ処理を実行する。これにより、ＣＰＵ２０１は、シンドローム計算の結果を待つことなくデータ処理を実行することができる。
【００６９】
また、サーバ２００によれば、シンドローム計算の遅延なくＣＰＵ２０１がデータ処理を開始することができるため、シンドローム計算の結果、エラーが無い場合の遅延がなくなり、サーバ２００の性能を向上させることができる。
【００７０】
（実施の形態２の説明）
実施の形態１にかかるサーバ２００では、シンドローム計算によってエラーが有ると判定した場合、ＣＰＵ２０１のデータ処理を巻き戻すことになる。従って、エラーとなる割合が増加するにつれて、ＣＰＵ２０１のデータ処理を巻き戻すことが増加してしまう。そこで、実施の形態２にかかるサーバでは、シンドローム計算より処理量の少ない誤り検出符号による誤り検出を行い、誤りのビットが無いと検出したＣＰＵ２０１がデータ処理を実行する。なお、実施の形態１において説明した箇所と同様の箇所については、同一符号を付して図示および説明を省略する。
【００７１】
図８は、実施の形態２におけるストレージ装置８０１の構成例を示すブロック図である。図８では、実施の形態２におけるサーバ８００内における、ストレージ装置８０１は、ＮＡＮＤコントローラ８０２と、ＮＡＮＤ型フラッシュメモリ３０２とを有する。また、ストレージ装置８０１は、実施の形態２におけるＣＰＵ８０３と接続する。
【００７２】
ＮＡＮＤコントローラ８０２は、読出部８１１と、誤り訂正部３１２と、誤り検出部８１２と、送信部８１３と、バッファ３１４とを含む。
【００７３】
読出部８１１は、読出部３１１が読み出したデータとＥＣＣコードとに加えて、データの誤り検出符号を読み出す。誤り検出符号は、対象のデータが誤っているか否かを検出することができる符号であり、データが誤っている際に、どのビットが誤っているか特定することを目的とはしない。誤り検出としては、例えば、ＣＲＣ（Ｃｙｃｌｉｃ  Ｒｅｄｕｎｄａｎｃｙ  Ｃｈｅｃｋ）や、対象のデータを分割した部分データを数値として合計したチェックサム等が挙げられる。以下、誤り検出としては、ＣＲＣを用いることとし、ＣＲＣにより得られる誤り検出符号を、ＣＲＣコードと呼称する。
【００７４】
誤り検出部８１２は、読み出したデータとデータのＣＲＣコードとを用いてデータ内に誤ったビットが有るか無いかを検出する。ここで、ＣＲＣのエラー検出精度は、ＮＡＮＤ型フラッシュメモリ３０２で発生するビットエラー数より大きいビットエラー数を検出できるように設計したものとする。
【００７５】
送信部８１３は、データの送信が完了し、かつ、データ内に誤ったビットが無いと検出した場合、データの送信完了通知をＣＰＵ８０３に送信する。
【００７６】
また、送信部８１３は、データの送信が完了し、かつ、データ内に誤ったビットが有ると検出した場合、誤り訂正処理によって訂正された訂正後のビットをＣＰＵ８０３に送信する。そして、送信部８１３は、訂正後のビットの送信が完了した後に訂正後のデータの送信完了通知をＣＰＵ８０３に送信する。ＣＰＵ８０３は、データの送信完了通知を受信した場合、データ処理を実行する。
【００７７】
図９は、ストレージ装置８０１とＣＰＵ８０３との動作のタイミングチャート例を示す説明図である。ＮＡＮＤコントローラ８０２は、時刻ｔ０において、読出要求があったデータを読み出す。そして、時刻ｔ０において、ＮＡＮＤコントローラ８０２は、読み出したデータを順次ＣＰＵ８０３に送信するとともに、読み出したデータに対するＣＲＣ計算と読み出したデータに対するシンドローム計算とを実行する。
【００７８】
時刻ｔ０から時間が経過した時刻ｔ１において、ＮＡＮＤコントローラ８０２は、読出要求があった全てのデータを読み出し終える。ここで、ＣＲＣ計算とシンドローム計算とはデータの読出よりも処理量が多いため、時刻ｔ１において、ＮＡＮＤコントローラ８０２は、ＣＲＣ計算とシンドローム計算とが完了しておらず処理中である。
【００７９】
時刻ｔ１から時間が経過した時刻ｔ２において、ＮＡＮＤコントローラ８０２は、ＣＲＣ計算を完了する。ここで、シンドローム計算はＣＲＣ計算よりも処理量が多いため、時刻ｔ２において、ＮＡＮＤコントローラ８０２は、シンドローム計算が完了しておらず処理中である。具体的には、ＣＲＣ計算の内容は、１つの多項式の剰余を求めることである。これに対し、シンドローム計算は、誤り訂正符号がＢＣＨ符号であれば複数の多項式の剰余を求めることであるから、ＢＣＨ符号におけるシンドローム計算はＣＲＣ計算よりも処理量が多くなる。このように、誤り訂正符号におけるシンドローム計算は、誤りのビットの位置を特定するための演算であり、誤りが有るか無いかを検出する誤り検出符号における誤り検出より処理量が多くなり、時間がかかる。
【００８０】
そして、時刻ｔ２において、ＮＡＮＤコントローラ８０２は、ＣＲＣ計算の処理結果から、エラーの有無を判定する。
【００８１】
エラーが無いと判定した場合、ＮＡＮＤコントローラ８０２は、データの送信完了通知をＣＰＵ８０３に送信する。データの送信完了通知を受信したＣＰＵ８０３は、データ処理を開始する。
【００８２】
一方、エラーが有ると判定した場合、ＮＡＮＤコントローラ８０２は、そのまま、シンドローム計算を続行する。そして、時刻ｔ２から時間が経過した時刻ｔ３において、ＮＡＮＤコントローラ８０２は、シンドローム計算を完了する。そして、ＮＡＮＤコントローラ８０２は、エラー訂正を行う。
【００８３】
時刻ｔ３から時間が経過した時刻ｔ４において、ＮＡＮＤコントローラ８０２は、誤り訂正を完了する。そして、時刻ｔ４において、ＮＡＮＤコントローラ８０２は、訂正後のデータをＣＰＵ８０３に送信する。
【００８４】
時刻ｔ４から時間が経過した時刻ｔ５において、ＮＡＮＤコントローラ８０２は、訂正後のデータの送信を完了して、データの送信完了通知をＣＰＵ８０３に送信する。そして、時刻ｔ５において、データの送信完了通知を受信したＣＰＵ８０３は、データ処理を開始する。
【００８５】
図１０は、ストレージ装置８０１による第２の読出要求受信時処理手順の一例を示すフローチャートである。ストレージ装置８０１による第２の読出要求受信時処理は、ＣＰＵ８０３からの読出要求を受けた際に実行する処理である。
【００８６】
ＮＡＮＤコントローラ８０２は、ＮＡＮＤ型フラッシュメモリ３０２から、読出要求を受けたデータとＥＣＣコードとＣＲＣコードとを読み出す（ステップＳ１００１）。次に、ＮＡＮＤコントローラ８０２は、読み出したデータとＣＲＣコードとを用いて、読み出したデータに対するＣＲＣ計算を実行する（ステップＳ１００２）。また、ＮＡＮＤコントローラ８０２は、読み出したデータとＥＣＣコードとを用いて、読み出したデータに対するシンドローム計算を実行する（ステップＳ１００３）。また、ＮＡＮＤコントローラ８０２は、読み出したデータをＣＰＵ８０３に送信する（ステップＳ１００４）。ここで、ＮＡＮＤコントローラ８０２は、ステップＳ１００２の処理とステップＳ１００３の処理とステップＳ１００４の処理とを並列に行う。また、ＮＡＮＤコントローラ８０２は、ステップＳ１００２の処理〜ステップＳ１００４の各処理を逐次処理してもよく、逐次処理する際にはどのような順序で処理を行ってもよい。
【００８７】
次に、ＮＡＮＤコントローラ８０２は、ＣＰＵ８０３へのデータの送信が完了したか否かを判断する（ステップＳ１００５）。ＣＰＵ８０３へのデータの送信が完了していない場合（ステップＳ１００５：Ｎｏ）、ＮＡＮＤコントローラ８０２は、ステップＳ１００１の処理に移行する。
【００８８】
一方、ＣＰＵ８０３へのデータの送信が完了した場合（ステップＳ１００５：Ｙｅｓ）、ＮＡＮＤコントローラ８０２は、ＣＲＣ計算の結果が、エラー有を示すか否かを判断する（ステップＳ１００６）。エラー有を示す場合（ステップＳ１００６：Ｙｅｓ）、ＮＡＮＤコントローラ８０２は、シンドローム計算を実行する（ステップＳ１００７）。次に、ＮＡＮＤコントローラ８０２は、シンドローム計算が完了したか否かを判断する（ステップＳ１００８）。シンドローム計算が完了していない場合（ステップＳ１００８：Ｎｏ）、ＮＡＮＤコントローラ８０２は、ステップＳ１００７の処理に移行する。
【００８９】
一方、シンドローム計算が完了した場合（ステップＳ１００８：Ｙｅｓ）、ＮＡＮＤコントローラ８０２は、エラービットを訂正する（ステップＳ１００９）。そして、ステップＳ１００９の処理終了後、または、エラー有を示さない場合（ステップＳ１００６：Ｎｏ）、ＮＡＮＤコントローラ８０２は、ＣＰＵ８０３にデータの送信完了通知を送信する（ステップＳ１０１０）。ここで、ステップＳ１００６がＮｏとなった場合、ＮＡＮＤコントローラ８０２は、シンドローム計算を中断してもよい。
【００９０】
ステップＳ１０１０の処理終了後、ＮＡＮＤコントローラ８０２は、第２の読出要求受信時処理を終了する。第２の読出要求受信時処理を実行することにより、ストレージ装置８０１は、ＣＰＵ８０３でのデータ処理の巻き戻しを抑止するとともに、ＣＲＣのエラーが無ければ、シンドローム計算分の遅延なく、データをＣＰＵ８０３に送信することができる。
【００９１】
また、ＣＰＵ８０３は、ストレージ装置８０１から送信完了通知を受信したら、データ処理を開始する。また、ＣＰＵ８０３は、データをストレージ装置８０１に書き込む際に、データにＣＲＣコードを付加してストレージ装置８０１に送信する。または、ＣＰＵ８０３は、ＣＲＣコードを計算せず、データのみをストレージ装置８０１に送信する。そして、ＮＡＮＤコントローラ８０２が、データに対するＣＲＣコードを計算して、データとＣＲＣコードとをＮＡＮＤ型フラッシュメモリ３０２に書き込んでもよい。
【００９２】
以上説明したように、サーバ８００によれば、ストレージ装置８０１がＣＲＣ計算を行い、エラー無であればＣＰＵ８０３にデータの送信完了通知を送信し、ＣＰＵ８０３は、データ処理を開始してもよい。これにより、サーバ８００は、シンドローム計算が完了する前にデータ処理を行うことができる。
【００９３】
また、サーバ８００によれば、ストレージ装置８０１がＣＰＵ８０３へのデータの送信が完了し、かつ、ＣＲＣ計算によりデータにエラーが有ると検出した場合、訂正データを送信して送信完了通知を送信し、ＣＰＵ８０３は、データ処理を開始してもよい。これにより、ＣＰＵ８０３は、正しいデータでデータ処理を行えるとともに、エラーが有る場合のＣＰＵ８０３の処理の巻き戻しがなくなり、ストレージ装置２０７に比べＣＰＵ８０３の負荷を抑えることができる。
【００９４】
（実施の形態３の説明）
実施の形態２にかかるサーバ８００では、ＣＲＣのエラー検出精度を、ＮＡＮＤ型フラッシュメモリ３０２で発生するビットエラー数以上のビットエラー数を検出できるように設計したものである。これに対し、実施の形態３にかかるサーバでは、ＮＡＮＤ型フラッシュメモリ３０２で発生するビットエラー数が、設計したＣＲＣの検出限界を超えてしまう場合があることを想定し、超えてしまう場合には、実施の形態１で示した処理と同様の処理を行う。なお、実施の形態１または２において説明した箇所と同様の箇所については、同一符号を付して図示および説明を省略する。
【００９５】
図１１は、実施の形態３におけるストレージ装置１１０１の構成例を示すブロック図である。図１１では、実施の形態３におけるサーバ１１００内における、ストレージ装置１１０１は、ＮＡＮＤコントローラ１１０２と、ＮＡＮＤ型フラッシュメモリ３０２とを有する。また、ストレージ装置１１０１は、実施の形態３におけるＣＰＵ１１０３と接続する。
【００９６】
ＮＡＮＤコントローラ１１０２は、読出部８１１と、誤り訂正部３１２と、誤り検出部８１２と、送信部１１１１と、バッファ３１４とを含む。
【００９７】
送信部１１１１は、データの送信完了通知をＣＰＵ１１０３に送信した後に、誤り検出部８１２がデータにエラーが有ると判定した場合、誤り訂正処理によって訂正された訂正後のビットをＣＰＵ１１０３に送信する。そして、訂正後のビットの送信が完了した後に訂正後のデータの送信完了通知をＣＰＵ１１０３に送信する。
【００９８】
ＣＰＵ１１０３は、訂正後のデータの送信完了通知を受信した場合、訂正後のデータを用いた処理を実行する。
【００９９】
図１２は、ストレージ装置１１０１による第３の読出要求受信時処理手順の一例を示すフローチャート（その１）である。また、図１３は、ストレージ装置１１０１による第３の読出要求受信時処理手順の一例を示すフローチャート（その２）である。ストレージ装置１１０１による第３の読出要求受信時処理は、ＣＰＵ１１０３からの読出要求を受けた際に実行する処理である。
【０１００】
ここで、図１２で示すステップＳ１２０１〜Ｓ１２０５の処理は、図１０で示したステップＳ１００１〜Ｓ１００５の処理と同一であるため、説明を省略する。また、図１３で示すステップＳ１３０３〜Ｓ１３０７の処理は、図６で示したステップＳ６０８〜Ｓ６１２の処理と同一であるため、説明を省略する。
【０１０１】
ステップＳ１２０５：Ｙｅｓとなった場合、ＮＡＮＤコントローラ１１０２は、ＣＲＣ計算の結果が、エラー有を示すか否かを判断する（ステップＳ１２０６）。エラー無を示す場合（ステップＳ１２０６：Ｎｏ）、ＮＡＮＤコントローラ１１０２は、ＣＰＵ１１０３にデータの送信完了通知を送信する（ステップＳ１２０７）。
【０１０２】
ステップＳ１２０７の処理終了後、または、エラー有を示す場合（ステップＳ１２０６：Ｙｅｓ）、ＮＡＮＤコントローラ１１０２は、シンドローム計算を実行する（ステップＳ１３０１）。次に、ＮＡＮＤコントローラ１１０２は、シンドローム計算が完了したか否かを判断する（ステップＳ１３０２）。シンドローム計算が完了していない場合（ステップＳ１３０２：Ｎｏ）、ＮＡＮＤコントローラ１１０２は、ステップＳ１３０１の処理に移行する。
【０１０３】
一方、シンドローム計算が完了した場合（ステップＳ１３０２：Ｙｅｓ）、ＮＡＮＤコントローラ１１０２は、ステップＳ１３０３の処理に移行する。ストレージ装置１１０１による第３の読出要求受信時処理を実行することにより、ストレージ装置１１０１は、ＣＰＵ１１０３でのデータ処理の巻き戻しを抑止することができる。さらに、ストレージ装置１１０１は、ＣＲＣのエラーが無ければ、シンドローム計算分の遅延なく、データをＣＰＵ１１０３に送信することができる。
【０１０４】
また、ＣＰＵ１１０３の動作は、図７で示した読出データ受信時処理と同一であるため、説明を省略する。
【０１０５】
また、サーバ１１００によれば、ＣＲＣ計算でエラーを検出した場合には、ＣＰＵ１１０３のデータ処理を開始しないため、巻き戻し処理を行わずに済み、ＣＰＵ１１０３の負荷を抑えることができる。また、ストレージ装置１１０１によれば、ＮＡＮＤ型フラッシュメモリ３０２で発生するビットエラー数が設計したＣＲＣの検出限界を超えてもよいため、ストレージ装置８０１よりＣＲＣの検出精度を低くすることができる。ＣＲＣの検出精度を低くしてもよいということは、すなわち、ストレージ装置１１０１は、ストレージ装置８０１よりＣＲＣビットの数を抑えて、実データを記憶する領域を増大することができる。
【０１０６】
（実施の形態４の説明）
実施の形態３にかかるサーバ１１００では、ＮＡＮＤ型フラッシュメモリ３０２で発生するビットエラー数が、設計したＣＲＣの検出限界を超えてしまう場合があることを想定したものである。ここで、ＮＡＮＤ型フラッシュメモリ３０２で発生するビットエラー数は、常に同じ値ではなく、ＮＡＮＤ型フラッシュメモリ３０２の劣化に伴って増加する。そこで、実施の形態４にかかるサーバでは、ＮＡＮＤ型フラッシュメモリ３０２の劣化度合に応じて、第１の読出要求受信時処理と、第２の読出要求受信時処理と、を切り替える。ここで、ＮＡＮＤ型フラッシュメモリ３０２の劣化度合は、ＮＡＮＤ型フラッシュメモリ３０２への書込回数や、今までのビットエラー数により特定する。なお、実施の形態１〜３のいずれかにおいて説明した箇所と同様の箇所については、同一符号を付して図示および説明を省略する。
【０１０７】
図１４は、実施の形態４におけるストレージ装置１４０１の構成例を示すブロック図である。図１４では、実施の形態４にかかるサーバ１４００内における、ストレージ装置１４０１は、ＮＡＮＤコントローラ１４０２と、ＮＡＮＤ型フラッシュメモリ３０２とを有する。また、ストレージ装置１４０１は、実施の形態４におけるＣＰＵ１４０３と接続する。
【０１０８】
ＮＡＮＤコントローラ１４０２は、判断部１４１１と、読出部１４１２と、誤り訂正部３１２と、誤り検出部１４１３と、送信部１４１４と、バッファ３１４とを含む。
【０１０９】
判断部１４１１は、読み出したデータに対する書込回数が所定の回数未満、または読出要求より前に受けたデータに対する読出要求に対して読み出したデータにおけるデータ内に誤ったビットの数が所定数未満であるか否かを判断する。読み出したデータに対する書込回数を用いる場合には、判断部１４１１は、ＮＡＮＤコントローラ１４０２が記憶しておいた、読み出したデータに対する書込回数を参照する。また、読出要求より前に受けたデータに対する読出要求に対して読み出したデータにおけるデータ内の誤ったビットの数を用いる場合には、エラー判定部３２２が、誤ったビットの数を記憶しておく。また、記憶しておく誤ったビットの数は、直前の読出要求に対する誤ったビットの数でもよいし、過去数回分の読出要求に対する誤ったビットの平均値でもよい。
【０１１０】
また、所定の回数や所定数は、サーバ１４００の設計者によって指定される。例えば、所定の回数について、サーバ１４００の設計者は、ＮＡＮＤ型フラッシュメモリ３０２と同一性能のＮＡＮＤ型フラッシュメモリに対して、書込回数に応じて、データを読み出した際に読み出したデータに誤ったビットが無い割合を記録する。ＮＡＮＤ型フラッシュメモリの特性として、書込回数が増えるにつれて誤ったビットが無い割合は低下することになる。そして、サーバ１４００の設計者は、読み出したデータに誤ったビット率が無い割合が、例えば、５０［％］等サーバ１４００の設計者が指定する割合以下となった際の書込回数を、所定の書込回数として指定する。ここで、サーバ１４００の設計者が指定する割合は、ＣＰＵ１４０３の性能に応じて決めることが好ましい。例えば、ＣＰＵ１４０３が低性能であり、データ処理の巻き戻しが頻繁に発生することを避けたい場合には、サーバ１４００の設計者が指定する割合を１００［％］に近い値とする。
【０１１１】
また、所定数について、サーバ１４００の設計者は、ＮＡＮＤ型フラッシュメモリ３０２と同一性能のＮＡＮＤ型フラッシュメモリに対して、読み出したデータ内の誤ったビットの数に応じて、次に読み出した際にデータ内に誤ったビットが無い割合を記録する。ここで、読み出したデータ内に誤ったビットの数が多いほど、同じアドレスに対して次に読み出したデータに誤ったビットが無い割合は低下することになる。そして、サーバ１４００の設計者は、次に読み出したデータに誤ったビット率が無い割合が、例えば、５０［％］等サーバ１４００の設計者が指定する割合以下となった際の誤ったビットの数を、所定数として指定する。サーバ１４００の設計者が指定する割合の指定例については、所定の回数の例と同一である。
【０１１２】
または、ＮＡＮＤコントローラ１４０２は、ＣＰＵ１４０３にかかる負荷量に基づいて、所定の回数や所定数を決定してもよい。この場合、ＣＰＵ１４０３は、ＣＰＵ１４０３にかかる負荷量としてＣＰＵ１４０３の使用率を、定期的に、または、読出要求に付随してストレージ装置１４０１に送信する。そして、ＮＡＮＤコントローラ１４０２は、使用率に応じた所定の回数や所定数を記憶したテーブルを用意しておき、テーブルを参照して、使用率に応じた所定の回数や所定数を決定する。
【０１１３】
例えば、ＣＰＵ１４０３にかかる負荷量が低い場合には、ＮＡＮＤコントローラ１４０２は、所定の回数や所定数の値を大きくし、第１の読出要求受信時処理を実行する可能性を高くする。第１の読出要求受信時処理は、ＣＲＣ計算の結果を待たなくてよい分、ＣＰＵ１４０３は、第２の読出要求受信時処理を実行した場合より早くデータ処理を開始することができる。一方、ＣＰＵ１４０３にかかる負荷量が高い場合には、ＮＡＮＤコントローラ１４０２は、所定の回数や所定数の値を小さくし、第２の読出要求受信時処理を実行する可能性を高くする。従って、サーバ１４００は、ＣＰＵ１４０３にかかる負荷量が高い場合には、所定の回数や所定数の値を小さくすることによりデータ処理の巻き戻しが高確率で発生する状態を回避できて、ＣＰＵ１４０３にかかる負荷を抑制することができる。
【０１１４】
読出部１４１２は、判断部１４１１による判断結果に応じて、データと誤り訂正符号とを読み出す第１の読出処理、またはデータと誤り訂正符号と誤り検出符号とを読み出す第２の読出処理、のいずれか一方の処理を実行する。例えば、判断部１４１１が、読み出したデータに対する書込回数が所定の回数未満であると判断したとする。この場合、読出部１４１２は、第１の読出処理を実行する。また、判断部１４１１が、読出要求より前に受けたデータに対する読出要求に対して読み出したデータにおけるデータ内の誤ったビットの数が所定数以上であると判断したとする。この場合、読出部１４１２は、第２の読出処理を実行する。
【０１１５】
誤り検出部１４１３は、読出部１４１２が第２の読出処理を実行した際に、データとデータのＣＲＣコードとを用いてデータ内に誤ったビットが有るか無いかを検出する。
【０１１６】
送信部１４１４は、読出部１４１２が第１の読出処理を実行した際に、データの送信が完了した場合にデータの送信完了通知をＣＰＵ１４０３に送信する。また、送信部１４１４は、読出部１４１２が第２の読出処理を実行した際に、データの送信が完了し、かつ、データ内に誤ったビットが無いと検出した場合にデータの送信完了通知をＣＰＵ１４０３に送信する。
【０１１７】
図１５は、ストレージ装置１４０１による第４の読出要求受信時処理手順の一例を示すフローチャートである。ストレージ装置１４０１による第４の読出要求受信時処理は、ＣＰＵ１４０３からの読出要求を受けた際に実行する処理である。
【０１１８】
ＮＡＮＤコントローラ１４０２は、読出要求を受けたビット列に対する書込回数が所定の回数未満、または、読出要求を受けたビット列のビットエラー数が所定数未満か否かを判断する（ステップＳ１５０１）。ここで、ステップＳ１５０１がＮｏとなる例について、ＮＡＮＤコントローラ１４０２は、書込回数と、ビットエラー数との両方を確認しなくてよい。すなわち、ＮＡＮＤコントローラ１４０２は、書込回数が所定の回数以上、または、ビットエラー数が所定数以上であれば、ステップＳ１５０１をＮｏとして処理する。また、ビットエラー数は、現在受けた読出要求より前に受けたビット列に対する読出要求に対して読み出したビット列におけるビットエラー数である。
【０１１９】
読出要求を受けたビット列のビットエラー数が所定数未満、または読出要求を受けたビット列のビットエラー数が所定数未満である場合（ステップＳ１５０１：Ｙｅｓ）、ＮＡＮＤコントローラ１４０２は、第１の読出要求受信時処理を実行する（ステップＳ１５０２）。一方、読出要求を受けたビット列のビットエラー数が所定数以上、または読出要求を受けたビット列のビットエラー数が所定数以上である場合（ステップＳ１５０１：Ｎｏ）、ＮＡＮＤコントローラ１４０２は、第２の読出要求受信時処理を実行する（ステップＳ１５０３）。
【０１２０】
ステップＳ１５０２、またはステップＳ１５０３の処理終了後、ＮＡＮＤコントローラ１４０２は、ストレージ装置１４０１による第４の読出要求受信時処理を終了する。ストレージ装置１４０１による第４の読出要求受信時処理を実行することにより、ストレージ装置１４０１は、ＮＡＮＤ型フラッシュメモリ３０２の劣化度合に応じて、第１の読出要求受信時処理と、第２の読出要求受信時処理とを切り替えることができる。
【０１２１】
また、ＣＰＵ１４０３の動作として、読出対象のアドレスに対する書込回数、またはビットエラー数を記憶しておく。そして、ＣＰＵ１４０３は、読出要求をストレージ装置１４０１に送信する際、記憶しておいた書込回数、またはビットエラー数に基づいて、実施の形態１における動作、または実施の形態２における動作のいずれかを行う。
【０１２２】
または、ＣＰＵ１４０３は、読出対象のアドレスに対する書込回数、またはビットエラー数を記憶せず、ストレージ装置１４０１の読出要求の応答に基づいて、実施の形態１における動作、または実施の形態２における動作を行ってもよい。具体的には、まず、ストレージ装置１４０１の設計者は、ステップＳ６０５における「データの送信完了通知」と、ステップＳ１０１０における「データの送信完了通知」とが識別できるように、識別子を分けて設計しておく。そして、ＣＰＵ１４０３は、ステップＳ６０５における「データの送信完了通知」を受信した際には、実施の形態１における動作、すなわち、保持部４０１にデータを保持して、データ処理を行う。また、ＣＰＵ１４０３は、ステップＳ１０１０における「データの送信完了通知」を受信した際には、実施の形態２における動作、すなわち、保持部４０１にデータを保持せずにデータ処理を行う。これにより、ＣＰＵ１４０３は、読出対象のアドレスに対する書込回数、またはビットエラー数を記憶しなくとも、実施の形態１における動作と実施の形態２における動作とを切り替えることができる。
【０１２３】
また、実施の形態４におけるＣＲＣコードについて、ＮＡＮＤコントローラ１４０２は、データを書き込む際に、データに対するＣＲＣコードを計算し、データとＣＲＣコードとをＮＡＮＤ型フラッシュメモリ３０２に書き込む。または、ＮＡＮＤコントローラ１４０２は、所定の回数や所定数が固定値であれば、データを書き込む際に、データを書き込んだ後における読出対象のアドレスに対する書込回数が所定の回数未満、またはビットエラー数が所定数未満かを判断してもよい。そして、ＮＡＮＤ型フラッシュメモリ３０２は、読出対象のアドレスに対する書込回数が所定の回数未満、またはビットエラー数が所定数未満であれば、ＣＲＣコードは用いられないため、ＣＲＣコードを計算しなくてよい。
【０１２４】
以上説明したように、ストレージ装置１４０１によれば、読出対象のアドレスに対する書込回数が所定回数未満、またはビットエラー数が所定数未満である場合に、第１の読出要求受信時処理を実行してもよい。このように、サーバ１４００は、ＮＡＮＤ型フラッシュメモリ３０２が劣化していないと見做した場合には、シンドローム計算の結果でエラーは概ね起こらないため、エラーが無い場合の遅延がなくなり、サーバ１４００の性能を向上させることができる。
【０１２５】
また、ストレージ装置１４０１によれば、読出対象のアドレスに対する書込回数が所定回数以上、またはビットエラー数が所定数以上である場合に、第２の読出要求受信時処理を実行してもよい。このように、サーバ１４００は、ＮＡＮＤ型フラッシュメモリ３０２が劣化していると見做した場合、シンドローム計算の結果でエラーとなる確率が上昇しているため、エラーが有る場合のＣＰＵ１４０３の処理の巻き戻しをなくすことができる。
【０１２６】
なお、実施の形態１〜４で説明した誤り訂正方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本誤り訂正プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ−Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）等のコンピュータで読み取り可能な記録媒体に記録され、ＤＳＰ等のプロセッサによって記録媒体から読み出されることによって実行される。また本誤り訂正プログラムは、インターネット等のネットワークを介して配布してもよい。
【０１２７】
また、実施の形態１〜４で説明したストレージ装置は、スタンダードセルやストラクチャードＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）などの特定用途向けＩＣ（以下、単に「ＡＳＩＣ」と称す。）やＦＰＧＡ（Ｆｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）などのＰＬＤ（Ｐｒｏｇｒａｍｍａｂｌｅ  Ｌｏｇｉｃ  Ｄｅｖｉｃｅ）によっても実現することができる。具体的には、例えば、ストレージ装置２０７であれば、読出部３１１〜バッファ３１４をＨＤＬ記述によって機能定義し、そのＨＤＬ記述を論理合成してＡＳＩＣやＰＬＤに与えることにより、ストレージ装置２０７を製造することができる。
【０１２８】
上述した実施の形態１〜４に関し、さらに以下の付記を開示する。
【０１２９】
（付記１）データの読出要求を行う要求元装置と、
前記要求元装置から読出要求を受けたデータのビット列と前記ビット列の誤り訂正符号とを読み出し、読み出した前記ビット列と前記誤り訂正符号とを用いて前記ビット列の誤り訂正を実行する誤り訂正処理のうちの前記ビット列内に誤ったビットが有るか無いかを判定する処理が完了する前に、前記ビット列を前記要求元装置に送信する記憶装置と、
を有ことを特徴とする誤り訂正システム。
【０１３０】
（付記２）前記記憶装置は、
前記誤り訂正処理のうちの前記判定する処理で用いる前記ビット列内に誤ったビットが有るか無いかを表す値を計算する処理が完了する前に、前記ビット列を前記要求元装置に送信する、
ことを特徴とする付記１に記載の誤り訂正システム。
【０１３１】
（付記３）前記記憶装置は、
前記ビット列内に誤ったビットが有ると判定した場合、前記誤り訂正処理によって訂正された訂正後のビットを前記要求元装置に送信する、
ことを特徴とする付記１または２に記載の誤り訂正システム。
【０１３２】
（付記４）前記記憶装置は、
前記ビット列の送信が完了した場合、前記ビット列の送信完了通知を前記要求元装置に送信し、
前記要求元装置は、
前記ビット列の送信完了通知を受信した場合、前記ビット列を用いた処理を実行する、
ことを特徴とする付記１〜３のいずれか一つに記載の誤り訂正システム。
【０１３３】
（付記５）前記記憶装置は、
さらに、前記ビット列の誤り検出符号を読み出し、
前記ビット列と前記誤り検出符号とを用いて前記ビット列内に誤ったビットが有るか無いかを検出し、
前記ビット列の送信が完了し、かつ、前記ビット列内に誤ったビットが無いと検出した場合、前記ビット列の送信完了通知を前記要求元装置に送信し、
前記要求元装置は、
前記ビット列の送信完了通知を受信した場合、前記ビット列を用いた処理を実行する、
ことを特徴とする付記１〜４のいずれか一つに記載の誤り訂正システム。
【０１３４】
（付記６）前記記憶装置は、
前記ビット列の送信が完了し、かつ、前記ビット列内に誤ったビットが有ると検出した場合、前記誤り訂正処理によって訂正された訂正後のビットを前記要求元装置に送信し、前記訂正後のビットの送信が完了した後に訂正後のビット列の送信完了通知を前記要求元装置に送信し、
前記要求元装置は、
前記訂正後のビット列の送信完了通知を受信した場合、前記訂正後のビット列を用いた処理を実行する、
ことを特徴とする付記５に記載の誤り訂正システム。
【０１３５】
（付記７）前記記憶装置は、
前記ビット列の送信完了通知を前記要求元装置に送信した後に前記ビット列内に誤ったビットが有ると判定した場合、前記誤り訂正処理によって訂正された訂正後のビットを前記要求元装置に送信し、前記訂正後のビットの送信が完了した後に訂正後のビット列の送信完了通知を前記要求元装置に送信し、
前記要求元装置は、
前記訂正後のビット列の送信完了通知を受信した場合、前記訂正後のビット列を用いた処理を実行する、
ことを特徴とする付記５に記載の誤り訂正システム。
【０１３６】
（付記８）前記記憶装置は、
前記ビット列に対する書込回数が所定の回数未満、または前記読出要求より前に受けた前記ビット列に対する読出要求に対して読み出した前記ビット列における前記ビット列内に誤ったビットの数が所定数未満であるか否かを判断し、
判断結果に応じて、前記ビット列と前記誤り訂正符号とを読み出す第１の読出処理、または前記ビット列と前記誤り訂正符号と前記誤り検出符号とを読み出す第２の読出処理、のいずれか一方の処理を実行し、
前記第１の読出処理を実行した際に、前記ビット列の送信が完了した場合に前記ビット列の送信完了通知を前記要求元装置に送信する、
ことを特徴とする付記５に記載の誤り訂正システム。
【０１３７】
（付記９）前記記憶装置は、
前記ビット列に対する書込回数が所定の回数未満、または前記読出要求より前に受けた前記ビット列に対する読出要求に対して読み出した前記ビット列における前記ビット列内に誤ったビットの数が所定数未満であるか否かを判断し、
判断結果に応じて、前記ビット列と前記誤り訂正符号と前記誤り検出符号とを読み出す読出処理を実行し、
前記読出処理を実行した際に、前記ビット列と前記誤り検出符号とを用いて前記ビット列内に誤ったビットが有るか無いかを検出し、
前記読出処理を実行した際に、前記ビット列の送信が完了し、かつ、前記ビット列内に誤ったビットが無いと検出した場合に前記ビット列の送信完了通知を前記要求元装置に送信する、
ことを特徴とする付記５に記載の誤り訂正システム。
【０１３８】
（付記１０）要求元装置と接続されるコンピュータが、
前記要求元装置から読出要求を受けたデータのビット列と前記ビット列の誤り訂正符号とを読み出し、
読み出した前記ビット列と前記誤り訂正符号とを用いて前記ビット列の誤り訂正を実行する誤り訂正処理のうちの前記ビット列内に誤ったビットが有るか無いかを判定する処理が完了する前に、前記ビット列を前記要求元装置に送信する、
処理を実行することを特徴とする誤り訂正方法。
【０１３９】
（付記１１）要求元装置と接続されるコンピュータに、
前記要求元装置から読出要求を受けたデータのビット列と前記ビット列の誤り訂正符号とを読み出し、
読み出した前記ビット列と前記誤り訂正符号とを用いて前記ビット列の誤り訂正を実行する誤り訂正処理のうちの前記ビット列内に誤ったビットが有るか無いかを判定する処理が完了する前に、前記ビット列を前記要求元装置に送信する、
処理を実行させることを特徴とする誤り訂正プログラム。
【符号の説明】
【０１４０】
１００  誤り訂正システム
１０１  記憶装置
１０２  要求元装置
１１１  データ
１１２  ＥＣＣコード
２００、８００、１１００、１４００  サーバ
２０１、８０３、１１０３、１４０３  ＣＰＵ
２０７、８０１、１１０１、１４０１  ストレージ装置
３１１、８１１、１４１２  読出部
３１２  誤り訂正部
３１３、８１３、１４１４  送信部
３２１  シンドローム計算部
３２２  エラー判定部
３２３  エラー訂正部
８１２、１４１３  誤り検出部
１４１１  判断部
【図１】
2016024571.tif 000003
【図２】
2016024571.tif 000004
【図３】
2016024571.tif 000005
【図４】
2016024571.tif 000006
【図５】
2016024571.tif 000007
【図６】
2016024571.tif 000008
【図７】
2016024571.tif 000009
【図８】
2016024571.tif 000010
【図９】
2016024571.tif 000011
【図１０】
2016024571.tif 000012
【図１１】
2016024571.tif 000013
【図１２】
2016024571.tif 000014
【図１３】
2016024571.tif 000015
【図１４】
2016024571.tif 000016
【図１５】
2016024571.tif 000017