(57)【特許請求の範囲】
【請求項１】
消去済と書込済のいずれの状態であるかによりビット値の情報を記憶するセルを複数有し、当該セルへの書き込みは、各セルごと、もしくは、N (N>1)個のセルごと（以下「ページごと」という。）に行い、当該セルの消去は、M (M>N)個のセルごと（以下「ブロックごと」という。）に行うフラッシュメモリ部、
識別名を受け付けて、当該識別名と、前記フラッシュメモリ部においてセルの列が配置される場所と、を対応付けて、前記フラッシュメモリ部に記憶させる配置部、
識別名を受け付けて、前記フラッシュメモリ部において当該識別名に対応付けられる場所に配置されるセルの列のそれぞれの状態に対応付けられるビット値から、当該識別名に対応付けられるビット列を読み出すビット列読出部、
識別名とビット列とを受け付けて、
（ａ）前記フラッシュメモリ部に当該識別名に対応付けられる場所が記憶されている場合、当該識別名に対応付けられる場所に配置されるセルの列のうち状態が消去済のセルの一部または全部を書込済にすれば、当該セルの列のそれぞれの状態に対応付けられるビット値からなるビット列を当該受け付けられたビット列に一致させることができるならば、前記フラッシュメモリにおいて当該消去済のセルの一部または全部を書込済に更新し、
（ｂ）上記（ａ）以外の場合は、前記配置部に当該識別名に対応付けられる場所を新たに配置させ、前記新たに配置された場所のセルの列の一部または全部を書込済に更新して、
前記フラッシュメモリ部において当該セルの列のそれぞれの状態に対応付けられるビット値からなるビット列が当該受け付けられたビット列に一致するように書き込むビット列書込部
を備え、
前記フラッシュメモリ部はＮＡＮＤ型フラッシュメモリであり、当該セルの状態の消去済は０に、書込済は１に、それぞれ対応付けられ、書き込みは、１ページ単位で行われ、当該ページのうち、ビット列を記憶するためのデータページには、当該データページに記憶されるビット列の誤り訂正符号を表す訂正ビット列を所定個数まで格納可能な訂正ビット列格納領域と、前記所定個数の領域のそれぞれの位置に訂正ビット列が格納されているか否かを１か０かにより示す有効ビットからなる有効ビット列が格納される有効ビット列格納領域と、を含むチェックページが対応付けられ、
前記ビット列書込部が、当該データページにビット列を書き込むと、当該有効ビット列格納領域に格納される有効ビット列のうち、値が０である有効ビットを先頭から走査して、当該訂正ビット列格納領域のうち未だ訂正ビット列が記憶されていない位置を求め、
（ｐ）訂正ビット列が記憶されていない位置が求められれば、当該訂正ビット列格納領域のうち、当該求められた位置に当該訂正ビット列を書き込み、当該有効ビット列格納領域のうち、当該求められた位置に対する有効ビットに１を書き込み、
（ｑ）訂正ビット列が記憶されていない位置が求められなければ、ページの再配置を行ってから、当該訂正ビット列格納領域のうち、先頭の位置に当該訂正ビット列を書き込み、当該有効ビット列格納領域のうち、先頭の有効ビットに１を書き込む
ことを特徴とする記憶装置。
【請求項２】
請求項１に記載の記憶装置であって、
識別名と整数値とを受け付けて、当該整数値を所定の除数Dで割った商を表す上位ビット列と、当該整数値を当該所定の除数で割った余の数だけ１を含み、それ以外は０であるD-1ビット長の下位ビット列と、を連結したビット列を生成して、当該識別名と当該生成されたビット列とを前記ビット列書込部に与える整数書込部、
識別名を受け付けて、当該識別名を前記ビット列読出部に与え、読み出されたビット列を当該上位ビット列と当該下位ビット列とに分解し、当該上位ビット列により表される整数値にDを乗じて当該下位ビット列に含まれる１の個数を加えた整数値を読み出し結果とする整数読出部
をさらに備えることを特徴とする記憶装置。
【請求項３】
消去済と書込済のいずれの状態であるかによりビット値の情報を記憶するセルを複数有し、当該セルへの書き込みは、各セルごと、もしくは、N (N>1)個のセルごと（以下「ページごと」という。）に行い、当該セルの消去は、M (M>N)個のセルごと（以下「ブロックごと」という。）に行うフラッシュメモリ部を制御する記憶方法であって、当該記憶方法は、配置部、ビット列読出部、ビット列書込部を有する記憶装置により実行され、
前記配置部が、識別名を受け付けて、当該識別名と、前記フラッシュメモリ部においてセルの列が配置される場所と、を対応付けて、前記フラッシュメモリ部に記憶させる配置工程、
前記ビット列読出部が、識別名を受け付けて、前記フラッシュメモリ部において当該識別名に対応付けられる場所に配置されるセルの列のそれぞれの状態に対応付けられるビット値から、当該識別名に対応付けられるビット列を読み出すビット列読出工程、
前記ビット列書込部が、識別名とビット列とを受け付けて、
（ａ）前記フラッシュメモリ部に当該識別名に対応付けられる場所が記憶されている場合、当該識別名に対応付けられる場所に配置されるセルの列のうち状態が消去済のセルの一部または全部を書込済にすれば、当該セルの列のそれぞれの状態に対応付けられるビット値からなるビット列を当該受け付けられたビット列に一致させることができるならば、前記フラッシュメモリにおいて当該消去済のセルの一部または全部を書込済に更新し、
（ｂ）上記（ａ）以外の場合は、前記配置部に当該識別名に対応付けられる場所を新たに配置させ、前記新たに配置された場所のセルの列の一部または全部を書込済に更新して、
前記フラッシュメモリ部において当該セルの列のそれぞれの状態に対応付けられるビット値からなるビット列が当該受け付けられたビット列に一致するように書き込むビット列書込工程
を備え、
前記フラッシュメモリ部はＮＡＮＤ型フラッシュメモリであり、当該セルの状態の消去済は０に、書込済は１に、それぞれ対応付けられ、書き込みは、１ページ単位で行われ、当該ページのうち、ビット列を記憶するためのデータページには、当該データページに記憶されるビット列の誤り訂正符号を表す訂正ビット列を所定個数まで格納可能な訂正ビット列格納領域と、前記所定個数の領域のそれぞれの位置に訂正ビット列が格納されているか否かを１か０かにより示す有効ビットからなる有効ビット列が格納される有効ビット列格納領域と、を含むチェックページが対応付けられ、
前記ビット列書込工程にて、前記ビット列書込部が当該データページにビット列を書き込むと、前記ビット列書込部は、当該有効ビット列格納領域に格納される有効ビット列のうち、値が０である有効ビットを先頭から走査して、当該訂正ビット列格納領域のうち未だ訂正ビット列が記憶されていない位置を求め、
（ｐ）訂正ビット列が記憶されていない位置が求められれば、当該訂正ビット列格納領域のうち、当該求められた位置に当該訂正ビット列を書き込み、当該有効ビット列格納領域のうち、当該求められた位置に対する有効ビットに１を書き込み、
（ｑ）訂正ビット列が記憶されていない位置が求められなければ、ページの再配置を行ってから、当該訂正ビット列格納領域のうち、先頭の位置に当該訂正ビット列を書き込み、当該有効ビット列格納領域のうち、先頭の有効ビットに１を書き込む
ことを特徴とする記憶方法。
【請求項４】
消去済と書込済のいずれの状態であるかによりビット値の情報を記憶するセルを複数有し、当該セルへの書き込みは、各セルごと、もしくは、N (N>1)個のセルごと（以下「ページごと」という。）に行い、当該セルの消去は、M (M>N)個のセルごと（以下「ブロックごと」という。）に行うフラッシュメモリ部を制御するコンピュータを、
識別名を受け付けて、当該識別名と、前記フラッシュメモリ部においてセルの列が配置される場所と、を対応付けて、前記フラッシュメモリ部に記憶させる配置部、
識別名を受け付けて、前記フラッシュメモリ部において当該識別名に対応付けられる場所に配置されるセルの列のそれぞれの状態に対応付けられるビット値から、当該識別名に対応付けられるビット列を読み出すビット列読出部、
識別名とビット列とを受け付けて、
（ａ）前記フラッシュメモリ部に当該識別名に対応付けられる場所が記憶されている場合、当該識別名に対応付けられる場所に配置されるセルの列のうち状態が消去済のセルの一部または全部を書込済にすれば、当該セルの列のそれぞれの状態に対応付けられるビット値からなるビット列を当該受け付けられたビット列に一致させることができるならば、前記フラッシュメモリにおいて当該消去済のセルの一部または全部を書込済に更新し、
（ｂ）上記（ａ）以外の場合は、前記配置部に当該識別名に対応付けられる場所を新たに配置させ、前記新たに配置された場所のセルの列の一部または全部を書込済に更新して、
前記フラッシュメモリ部において当該セルの列のそれぞれの状態に対応付けられるビット値からなるビット列が当該受け付けられたビット列に一致するように書き込むビット列書込部
として機能させ、
前記フラッシュメモリ部はＮＡＮＤ型フラッシュメモリであり、当該セルの状態の消去済は０に、書込済は１に、それぞれ対応付けられ、書き込みは、１ページ単位で行われ、当該ページのうち、ビット列を記憶するためのデータページには、当該データページに記憶されるビット列の誤り訂正符号を表す訂正ビット列を所定個数まで格納可能な訂正ビット列格納領域と、前記所定個数の領域のそれぞれの位置に訂正ビット列が格納されているか否かを１か０かにより示す有効ビットからなる有効ビット列が格納される有効ビット列格納領域と、を含むチェックページが対応付けられ、
前記ビット列書込部が、当該データページにビット列を書き込むと、当該有効ビット列格納領域に格納される有効ビット列のうち、値が０である有効ビットを先頭から走査して、当該訂正ビット列格納領域のうち未だ訂正ビット列が記憶されていない位置を求め、
（ｐ）訂正ビット列が記憶されていない位置が求められれば、当該訂正ビット列格納領域のうち、当該求められた位置に当該訂正ビット列を書き込み、当該有効ビット列格納領域のうち、当該求められた位置に対する有効ビットに１を書き込み、
（ｑ）訂正ビット列が記憶されていない位置が求められなければ、ページの再配置を行ってから、当該訂正ビット列格納領域のうち、先頭の位置に当該訂正ビット列を書き込み、当該有効ビット列格納領域のうち、先頭の有効ビットに１を書き込む
ように機能させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、フラッシュメモリを用いる記憶装置において、消去の回数をできるだけ抑制して寿命を長くするのに好適な記憶装置、記憶方法、ならびに、これらをコンピュータにて実現するプログラムに関する。
【背景技術】
【０００２】
従来から、ＥＥＰＲＯＭ（Electrically Erasable Programmable Read Only Memory）を用いたフラッシュメモリが広く利用されており、ディジタルカメラやビデオカメラの画像保存媒体やコンピュータの情報記憶媒体等に広く使われている。これらのフラッシュメモリでは、ハードディスク等と等価に取り扱えるように各種のファイルシステムなどが構築されていることも多い。
【０００３】
フラッシュメモリでは、浮遊ゲート（floating gate）を備えるセルが「消去済」「書込済」のいずれの状態をとるかによって１ビットの情報を表現するが、大別してＮＡＮＤ型とＮＯＲ型の２種類がある。
【０００４】
ここで、ＮＯＲ型フラッシュメモリでは、１ビット単位での読出（消去済か書込済かを調べる）と書込（消去済を書込済に更新する）が可能であるが、消去（書込済を消去済に更新する）は、ブロックと呼ばれる複数ビット単位で行う。一方、ＮＡＮＤ型フラッシュメモリでは、読出と書込はページと呼ばれる複数ビット単位で行い、消去は、ブロックと呼ばれる複数ビット単位で行う。ここで、１ページがNビットであり、１ブロックがMビットであるとすると、一般に1 < N < Mである。
【０００５】
ただし、ＮＡＮＤ型フラッシュメモリは、ページ単位での読出と書込を行うとはいえ、１ページ読み出した後は所望のビットを抽出すれば、読出は１ビット単位で可能であるし、所望のビットを消去から書込に更新したい場合は、一旦ページをＲＡＭ（Random Access Memory）等に読み出して、当該所望のビットを消去済から書込済にしたページをＲＡＭ内で構成してから、これを当該ページに書き込めば良い。
【０００６】
また、ＮＡＮＤ型フラッシュメモリはＮＯＲ型フラッシュメモリに比べて誤りが生じることが多いため、ページ単位で誤り訂正符号を記憶する領域を確保するのが一般的である。
【０００７】
フラッシュメモリ技術の分野では、セルの消去済をビット値「１」に書込済をビット値「０」に対応付けて考えることが多い。この場合、「１」から「０」に書き換える際の単位は１ビットもしくは１ページ（Nビット）であり、「０」から「１」に消去する際の単位は１ブロック（Mビット）である、ということになる。もっとも、消去済と書込済に対する「０」「１」の対応付けは、負論理と正論理のいずれを採用するかによって、適宜反転が可能である。
【０００８】
さて、フラッシュメモリには、消去回数に制限があり、消去を頻繁に繰り返すと寿命に達してしまうという性質がある。消去回数を抑制するための技術は、たとえば以下の文献に開示されている。
【特許文献１】特開２００５−３３９４５０号公報
【０００９】
一方で、ゲーム装置などで、プレイヤーの情報やゲームの状態を保存するためのメモリカードにも、フラッシュメモリが使用されている。ゲーム装置などで保存されるゲーム状態のパラメータをビット列により表現した場合、その一部のみが変化して、大部分が変化しないことが多い。また、ゲーム状態のパラメータのうち、数値のものには、殆どの場合に増加し、減少することが稀であるようなものもある。たとえば「ログイン回数」「プレイ時間」「経験値」などのパラメータである。
【００１０】
このような数値パラメータの変化の特徴は、ゲーム装置におけるゲーム状態のほか、各種の情報処理においても見られ、数値はランダムに変化するのではなく、ビット列により表現した場合、その一部のみが変化して、大部分が変化しないことが多い。
【発明の開示】
【発明が解決しようとする課題】
【００１１】
したがって、パラメータの変化の特徴を生かしつつ、フラッシュメモリの消去回数を抑制して寿命ができるだけ尽きないようにする技術が強く求められている。
【００１２】
本発明は、上記のような課題を解決するもので、フラッシュメモリを用いる記憶装置において、消去の回数をできるだけ抑制して寿命を長くするのに好適な記憶装置、記憶方法、ならびに、これらをコンピュータにて実現するプログラムを提供することを目的とする。
【課題を解決するための手段】
【００１３】
以上の目的を達成するため、本発明の原理にしたがって、下記の発明を開示する。
【００１４】
本発明の第１の観点に係る記憶装置は、フラッシュメモリ部、配置部、ビット列読出部、ビット列書込部を備え、以下のように構成する。
【００１５】
すなわち、フラッシュメモリ部は、消去済と書込済のいずれの状態であるかによりビット値の情報を記憶するセルを複数有し、当該セルへの書き込みは、各セルごと、もしくは、N (N>1)個のセルごと（以下「ページごと」という。）に行い、当該セルの消去は、M (M>N)個のセルごと（以下「ブロックごと」という。）に行う。
【００１６】
すなわち、このフラッシュメモリ部は、従来から用いられているＥＥＰＲＯＭ等のセルの集合体であり、書込はビット単位、もしくは、複数ビットからなるページ単位で行い、読出は複数ビット・複数ページからなるブロック単位で行うものである。
【００１７】
一方、配置部は、識別名を受け付けて、当該識別名と、フラッシュメモリ部においてセルの列が配置される場所と、を対応付けて、フラッシュメモリ部に記憶させる。
【００１８】
すなわち、配置部は、フラッシュメモリ記憶媒体においてファイルシステムを構築する処理を行う。このようなファイルシステムの構築の具体的な手法については、コンピュータの外部記憶装置としてハードディスクと同等に扱うためのファイルシステムの公知の技術を適用するのが典型的である。ただし、後述するように、本発明においては、ファイルの中身が変更されたときに、セル列が配置される場所を再配置しなければならない可能性をできるだけ低減する工夫が、書込の際に行われる。
【００１９】
一方、ビット列読出部は、識別名を受け付けて、フラッシュメモリ部において当該識別名に対応付けられる場所に配置されるセルの列のそれぞれの状態に対応付けられるビット値から、当該識別名に対応付けられるビット列を読み出す。
【００２０】
すなわち、ビット列読出部は、ファイル名に相当する識別名を鍵に、フラッシュメモリ部に記憶されているビット列を読み出す処理を行うものであり、コンピュータの外部記憶装置としてハードディスクと同等に扱うためのファイルシステムの公知の技術を適用するのが典型的である。
【００２１】
さらに、ビット列書込部は、識別名とビット列とを受け付けて、
（ａ）フラッシュメモリ部に当該識別名に対応付けられる場所が記憶されている場合、当該識別名に対応付けられる場所に配置されるセルの列のうち状態が消去済のセルの一部または全部を書込済にすれば、当該セルの列のそれぞれの状態に対応付けられるビット値からなるビット列を当該受け付けられたビット列に一致させることができるならば、フラッシュメモリにおいて当該消去済のセルの一部または全部を書込済に更新し、
（ｂ）上記（ａ）以外の場合は、配置部に当該識別名に対応付けられる場所を新たに配置させ、新たに配置された場所のセルの列の一部または全部を書込済に更新して、
フラッシュメモリ部において当該セルの列のそれぞれの状態に対応付けられるビット値からなるビット列が当該受け付けられたビット列に一致するように書き込む。
【００２２】
すなわち、更新前のビット列と更新後のビット列とを比較し、更新前のビット列の一部または全部を、消去済から書込済に変化させるだけで更新後のビット列になるようであれば、ビット単位でセルに対する書き込みを行うことで、ファイルの中身の更新を行う（上記（ａ））。
【００２３】
また、更新前のビット列の一部または全部を、消去済から書込済に変化させるだけでは不十分な場合には、セルの再配置を行ってから書き込みを行うことで、ファイルの中身の更新を行う（上記（ｂ））。
【００２４】
従来の技術では、ファイルの中身の更新を行おうとすると、その更新の如何をとわず、上記（ｂ）のように、セルの再配置を行って書き込みをしているが、本発明においては、ファイルの中身の更新を行う際に、その更新の様子を吟味して、セルの再配置をできるだけ生じないように工夫している（上記（ａ））。そして、セルの再配置には、フラッシュメモリ部の消去が不可避である。
【００２５】
したがって、本発明によれば、フラッシュメモリの消去が生じるのをできるだけ抑制して、寿命を伸ばすことができるようになる。
【００２６】
また、本発明の記憶装置において、当該セルの状態の消去済は０に、書込済は１に、それぞれ対応付けられ、整数書込部、整数読出部をさらに備え、以下のように構成することができる。
【００２７】
すなわち、整数書込部は、識別名と整数値とを受け付けて、当該整数値を所定の除数Dで割った商を表す上位ビット列と、当該整数値を当該所定の除数で割った余の数だけ１を含み、それ以外は０であるD-1ビット長の下位ビット列と、を連結したビット列を生成して、当該識別名と当該生成されたビット列とをビット列書込部に与える。
【００２８】
一般に、現実社会において処理の対象となる整数は、ランダムに変化するものではなく、一定の傾向により変化することが多い。整数を通常のビット列で表現した場合、上位ビットと下位ビットでは、下位ビットの方が頻繁に変化する傾向がある。そこで、上位ビットは、そのまま通常のビット表現を用い、下位ビットは、その数値の数だけ１が並び、あとは０であるビット列に変換してから、フラッシュメモリ部に記憶する。
【００２９】
たとえば、８ビット整数値「１２２」は、２進数のビット列で表現すると「０１１１１０１０」となる。そこで、これを上位３ビット「０１１」と下位５ビット「１１０１０」に分ける。
【００３０】
５ビットの２進数では、０〜３１の３２通りが表現できるから、０〜３１のいずれかの値vを、
「１」がv個、「０」が31-v個
で表現する。
【００３１】
上記の例では、下位５ビット「１１０１０」は、整数値「２６」であるから、「１」が２６個、「０」が（３２−１）−２６  ＝  ５個のビット列で表現する。当該３２ビットのビット列としては、０側を下位ビットに配置する
1 11111 11111 11111 11111 11111 00000
という表現と、１側を下位ビットに配置する
0 00001 11111 11111 11111 11111 11111
という表現の２通りが典型的である。０〜３１の３２通りを３２ビットのビット列の中で「１」が立っている状態で表現する形式であれば、どのような形式を採用しても良い。
【００３２】
したがって、全体として見ると、８ビット整数値は、３＋（３２−１）＝３４ビットで表現されることになり、実際のビット列は、種々の態様が考えられるが、２つの断片を上記の２種類の態様に合わせて配置する以下の４通りのいずれかを選択するのが典型的である。
011  1 11111 11111 11111 11111 11111 00000；
1 11111 11111 11111 11111 11111 00000  011；
011  0 00001 11111 11111 11111 11111 11111；
0 00001 11111 11111 11111 11111 11111  011
【００３３】
さて、当該８ビット整数値「１２２」が１増加して「１２３」になったとすると、上記と同様の処理により、そのビット列表現は、上記の典型例に合わせて考えると、
011  1 11111 11111 11111 11111 11111 10000；
1 11111 11111 11111 11111 11111 10000  011；
011  0 00011 11111 11111 11111 11111 11111；
0 00011 11111 11111 11111 11111 11111  011
のいずれかとなる。
【００３４】
この表現を利用する限り、８ビット整数値が１ずつ増加しても、上位ビットが変化するのは３２回に１回の割合であり、下位ビットを表現する３２ビットは、ほとんどの場合、０だったビットが１に変化するだけである。すなわち、ほとんどの場合は、「消去済」のセルを「書込済」に更新するだけで済み、ブロック消去の原因となるセルの再配置はしないですむことになる。
【００３５】
一方、整数読出部は、識別名を受け付けて、当該識別名をビット列読出部に与え、読み出されたビット列を当該上位ビット列と当該下位ビット列とに分解し、当該上位ビット列により表される整数値にDを乗じて当該下位ビット列に含まれる１の個数を加えた整数値を読み出し結果とする。
【００３６】
これは、上記のような表現によってフラッシュメモリ部に記憶されたビット列を、通常の整数値に戻す処理を行うものである。
【００３７】
本発明によれば、数値の変化の特性を生かしたビット列の表現を採用することで、記憶装置の寿命をできるだけ伸ばすことができるようになる。
【００３８】
また本発明の記憶装置において、フラッシュメモリ部はＮＯＲ型フラッシュメモリであり、書き込みは、１ビット単位で行われるように構成することができる。
【００３９】
本発明は、上記発明の好適実施形態に係るものであり、アクセスの際の信頼性が高いとされるＮＯＲ型フラッシュメモリを利用するものである。
【００４０】
また、本発明の記憶装置において、フラッシュメモリ部はＮＡＮＤ型フラッシュメモリであり、書き込みは、１ページ単位で行われ、当該ページのうち、ビット列を記憶するためのデータページには、当該データページに記憶されるビット列の誤り訂正符号を表す訂正ビット列を記憶するチェックページが対応付けられ、ビット列書込部が、当該データページにビット列を書き込むと、当該ビット列の訂正ビット列を当該チェックページの先頭から当該訂正ビット列を書き込むように構成することができる。
【００４１】
本発明は、上記発明の好適実施形態に係るものであり、アクセスの際の信頼性がＮＯＲ型に比べて低いとされるＮＡＮＤ型フラッシュメモリを利用するものである。従来の技術では、あるページにデータを書き込むと、そのページは消去されるまで更新されないから、各ページに誤り訂正符号用領域を用意していたが、本発明では、あるページにデータを書き込んだ後も、そのページに対するセル単位の書き込みが生じるため、誤り訂正符号も変化する。そこで、この訂正ビット列を別のページの先頭から順に書き込むこととするものである。
【００４２】
本発明のその他の観点に係る記憶方法は、消去済と書込済のいずれの状態であるかによりビット値の情報を記憶するセルを複数有し、当該セルへの書き込みは、各セルごと、もしくは、N (N>1)個のセルごと（以下「ページごと」という。）に行い、当該セルの消去は、M (M>N)個のセルごと（以下「ブロックごと」という。）に行うフラッシュメモリ部を制御し、当該記憶方法は、配置部、ビット列読出部、ビット列書込部を有する記憶装置により実行され、配置工程、ビット列読出工程、ビット列書込工程を備え、以下のように構成する。
【００４３】
すなわち、配置工程では、配置部が、識別名を受け付けて、当該識別名と、フラッシュメモリ部においてセルの列が配置される場所と、を対応付けて、フラッシュメモリ部に記憶させる。
【００４４】
一方、ビット列読出工程では、ビット列読出部が、識別名を受け付けて、フラッシュメモリ部において当該識別名に対応付けられる場所に配置されるセルの列のそれぞれの状態に対応付けられるビット値から、当該識別名に対応付けられるビット列を読み出す。
【００４５】
さらに、ビット列書込工程では、ビット列書込部が、識別名とビット列とを受け付けて、
（ａ）フラッシュメモリ部に当該識別名に対応付けられる場所が記憶されている場合、当該識別名に対応付けられる場所に配置されるセルの列のうち状態が消去済のセルの一部または全部を書込済にすれば、当該セルの列のそれぞれの状態に対応付けられるビット値からなるビット列を当該受け付けられたビット列に一致させることができるならば、フラッシュメモリにおいて当該消去済のセルの一部または全部を書込済に更新し、
（ｂ）上記（ａ）以外の場合は、配置部に当該識別名に対応付けられる場所を新たに配置させ、新たに配置された場所のセルの列の一部または全部を書込済に更新して、
フラッシュメモリ部において当該セルの列のそれぞれの状態に対応付けられるビット値からなるビット列が当該受け付けられたビット列に一致するように書き込む。
【００４６】
本発明のその他の観点に係るプログラムは、フラッシュメモリを有するコンピュータを、上記の記憶装置の各部として機能させるように構成する。典型的には、当該プログラムは、各種のフラッシュメモリカードが内蔵するコントローラチップにて実行されるが、差替可能なＥＥＰＲＯＭを独立したカードとして用意し、これが挿入されるコンピュータやゲーム装置のＣＰＵ（Central Processing Unit）にて当該プログラムを実行して、ＣＰＵがコントローラチップを介さずに直接ＥＥＰＲＯＭにアクセスすることで、上記の記憶装置を実現することとしても良い。
【００４７】
また、本発明のプログラムは、コンパクトディスク、フレキシブルディスク、ハードディスク、光磁気ディスク、ディジタルビデオディスク、磁気テープ、半導体メモリ等のコンピュータ読取可能な情報記憶媒体に記録することができる。
【００４８】
上記プログラムは、プログラムが実行されるコンピュータとは独立して、コンピュータ通信網を介して配布・販売することができる。また、上記情報記憶媒体は、コンピュータとは独立して配布・販売することができる。
【発明の効果】
【００４９】
本発明によれば、フラッシュメモリを用いる記憶装置において、消去の回数をできるだけ抑制して寿命を長くするのに好適な記憶装置、記憶方法、ならびに、これらをコンピュータにて実現するプログラムを提供することができる。
【発明を実施するための最良の形態】
【００５０】
以下に本発明の実施形態を説明する。以下では、理解を容易にするため、ゲーム用の情報処理装置を利用して本発明が実現される実施形態を説明するが、以下に説明する実施形態は説明のためのものであり、本願発明の範囲を制限するものではない。したがって、当業者であればこれらの各要素もしくは全要素をこれと均等なものに置換した実施形態を採用することが可能であるが、これらの実施形態も本発明の範囲に含まれる。
【実施例１】
【００５１】
図１は、本発明の記憶装置を利用する典型的な情報処理装置の概要構成を示す模式図である。以下、本図を参照して説明する。
【００５２】
情報処理装置１００は、ＣＰＵ（Central Processing Unit）１０１と、ＲＯＭ  １０２と、ＲＡＭ（Random Access Memory）１０３と、インターフェイス１０４と、コントローラ１０５と、外部メモリ１０６と、画像処理部１０７と、ＤＶＤ−ＲＯＭ（Digital Versatile Disc ROM）ドライブ１０８と、ＮＩＣ（Network Interface Card）１０９と、音声処理部１１０と、マイク１１１と、を備える。
【００５３】
このうち、外部メモリ１０６と、ＣＰＵ  １０１と、ＲＡＭ  １０３と、が、共働して、本実施形態における記憶装置として機能することとなる。本実施形態では、当該記憶装置は、ゲームにおけるログイン回数や経験値などの数値パラメータをセーブするために利用される。以下、詳細に説明する。
【００５４】
ゲーム用のプログラムおよびデータを記憶したＤＶＤ−ＲＯＭをＤＶＤ−ＲＯＭドライブ１０８に装着して、情報処理装置１００の電源を投入することにより、当該プログラムが実行され、本実施形態の記憶装置が実現される。
【００５５】
ＣＰＵ  １０１は、情報処理装置１００全体の動作を制御し、各構成要素と接続され制御信号やデータをやりとりする。また、ＣＰＵ  １０１は、レジスタ（図示せず）という高速アクセスが可能な記憶域に対してＡＬＵ（Arithmetic Logic Unit）（図示せず）を用いて加減乗除等の算術演算や、論理和、論理積、論理否定等の論理演算、ビット和、ビット積、ビット反転、ビットシフト、ビット回転等のビット演算などを行うことができる。さらに、マルチメディア処理対応のための加減乗除等の飽和演算や、三角関数等、ベクトル演算などを高速に行えるように、ＣＰＵ  １０１自身が構成されているものや、コプロセッサを備えて実現するものがある。
【００５６】
ＲＯＭ  １０２には、電源投入直後に実行されるＩＰＬ（Initial Program Loader）が記録され、これが実行されることにより、ＤＶＤ−ＲＯＭに記録されたプログラムをＲＡＭ  １０３に読み出してＣＰＵ  １０１による実行が開始される。また、ＲＯＭ  １０２には、情報処理装置１００全体の動作制御に必要なオペレーティングシステムのプログラムや各種のデータが記録される。
【００５７】
ＲＡＭ  １０３は、データやプログラムを一時的に記憶するためのもので、ＤＶＤ−ＲＯＭから読み出したプログラムやデータ、その他ゲームの進行やチャット通信に必要なデータが保持される。また、ＣＰＵ  １０１は、ＲＡＭ  １０３に変数領域を設け、当該変数に格納された値に対して直接ＡＬＵを作用させて演算を行ったり、ＲＡＭ  １０３に格納された値を一旦レジスタに格納してからレジスタに対して演算を行い、演算結果をメモリに書き戻す、などの処理を行う。
【００５８】
インターフェイス１０４を介して接続されたコントローラ１０５は、ユーザがゲーム実行の際に行う操作入力を受け付ける。
【００５９】
インターフェイス１０４を介して着脱自在に接続された外部メモリ１０６には、ゲーム等のプレイ状況（過去の成績等）を示すデータ、ゲームの進行状態を示すデータ、ネットワーク対戦の場合のチャット通信のログ（記録）のデータなどが書き換え可能に記憶される。ユーザは、コントローラ１０５を介して指示入力を行うことにより、これらのデータを適宜外部メモリ１０６に記録することができる。
【００６０】
本実施形態では、この外部メモリ１０６は、ＥＥＰＲＯＭにより構成されており、ＥＥＰＲＯＭのアドレスバスとデータバスがバス（本図の白矢印）経由でＣＰＵ  １０１に接続されるものとする。すなわち、外部メモリ１０６は、専用のコントローラチップを有するのではなく、ＣＰＵ  １０１に直接管理される。このような構成を採用することで、外部メモリ１０６のコストを低減させることができる。もちろん、専用のコントローラチップを外部メモリ１０６内に用意して、コンピュータに接続した場合にハードディスクと同様に見えるような機能を持たせることとしても良い。
【００６１】
ＤＶＤ−ＲＯＭドライブ１０８に装着されるＤＶＤ−ＲＯＭには、ゲームを実現するためのプログラムとゲームに付随する画像データや音声データが記録される。ＣＰＵ  １０１の制御によって、ＤＶＤ−ＲＯＭドライブ１０８は、これに装着されたＤＶＤ−ＲＯＭに対する読み出し処理を行って、必要なプログラムやデータを読み出し、これらはＲＡＭ  １０３等に一時的に記憶される。
【００６２】
画像処理部１０７は、ＤＶＤ−ＲＯＭから読み出されたデータをＣＰＵ  １０１や画像処理部１０７が備える画像演算プロセッサ（図示せず）によって加工処理した後、これを画像処理部１０７が備えるフレームメモリ（図示せず）に記録する。フレームメモリに記録された画像情報は、所定の同期タイミングでビデオ信号に変換され画像処理部１０７に接続されるモニタ（図示せず）へ出力される。これにより、各種の画像表示が可能となる。
【００６３】
画像演算プロセッサは、２次元の画像の重ね合わせ演算やαブレンディング等の透過演算、各種の飽和演算を高速に実行できる。
【００６４】
また、仮想３次元空間に配置され、各種のテクスチャ情報が付加されたポリゴン情報を、Ｚバッファ法によりレンダリングして、所定の視点位置から仮想３次元空間に配置されたポリゴンを所定の視線の方向へ俯瞰したレンダリング画像を得る演算の高速実行も可能である。
【００６５】
さらに、ＣＰＵ  １０１と画像演算プロセッサが協調動作することにより、文字の形状を定義するフォント情報にしたがって、文字列を２次元画像としてフレームメモリへ描画したり、各ポリゴン表面へ描画することが可能である。
【００６６】
ＮＩＣ  １０９は、情報処理装置１００をインターネット等のコンピュータ通信網（図示せず）に接続するためのものであり、ＬＡＮ（Local Area Network）を構成する際に用いられる１０ＢＡＳＥ−Ｔ／１００ＢＡＳＥ−Ｔ規格にしたがうものや、電話回線を用いてインターネットに接続するためのアナログモデム、ＩＳＤＮ（Integrated Services Digital Network）モデム、ＡＤＳＬ（Asymmetric Digital Subscriber Line）モデム、ケーブルテレビジョン回線を用いてインターネットに接続するためのケーブルモデム等と、これらとＣＰＵ  １０１との仲立ちを行うインターフェース（図示せず）により構成される。
【００６７】
音声処理部１１０は、ＤＶＤ−ＲＯＭから読み出した音声データをアナログ音声信号に変換し、これに接続されたスピーカ（図示せず）から出力させる。また、ＣＰＵ  １０１の制御の下、ゲームの進行の中で発生させるべき効果音や楽曲データを生成し、これに対応した音声をスピーカや、ヘッドホン（図示せず）、イヤフォン（図示せず）から出力させる。
【００６８】
音声処理部１１０では、ＤＶＤ−ＲＯＭに記録された音声データがＭＩＤＩデータである場合には、これが有する音源データを参照して、ＭＩＤＩデータをＰＣＭデータに変換する。また、ADPCM形式やOgg Vorbis形式等の圧縮済音声データである場合には、これを展開してＰＣＭデータに変換する。ＰＣＭデータは、そのサンプリング周波数に応じたタイミングでＤ／Ａ（Digital/Analog）変換を行って、スピーカに出力することにより、音声出力が可能となる。
【００６９】
さらに、情報処理装置１００には、インターフェイス１０４を介してマイク１１１を接続することができる。この場合、マイク１１１からのアナログ信号に対しては、適当なサンプリング周波数でＡ／Ｄ変換を行い、ＰＣＭ形式のディジタル信号として、音声処理部１１０でのミキシング等の処理ができるようにする。
【００７０】
このほか、情報処理装置１００は、ハードディスク等の大容量外部記憶装置を用いて、ＲＯＭ  １０２、ＲＡＭ  １０３、外部メモリ１０６、ＤＶＤ−ＲＯＭドライブ１０８に装着されるＤＶＤ−ＲＯＭ等と同じ機能を果たすように構成してもよい。
【００７１】
以上で説明した情報処理装置１００は、いわゆる「コンシューマ向けテレビゲーム装置」に相当するものであるが、仮想空間を表示するような画像処理を行うものであれば本発明を実現することができる。したがって、携帯電話、携帯ゲーム機器、カラオケ装置、一般的なビジネス用コンピュータなど、種々の計算機上で本発明を実現することが可能である。
【００７２】
たとえば、一般的なコンピュータは、上記情報処理装置１００と同様に、ＣＰＵ、ＲＡＭ、ＲＯＭ、ＤＶＤ−ＲＯＭドライブ、および、ＮＩＣを備え、情報処理装置１００よりも簡易な機能を備えた画像処理部を備え、外部記憶装置としてハードディスクを有する他、フレキシブルディスク、光磁気ディスク、磁気テープ等が利用できるようになっている。また、コントローラ１０５ではなく、キーボードやマウスなどを入力装置として利用する。
【００７３】
（整数の内部表現）
以下では、本実施形態において使われる整数の内部表現について説明する。一般に、整数をビット列で表現するためには、２の補数表現が用いられる。２の補数表現は、整数値とビット列が対応付けられる表現である。以下に、８ビット整数の例を示す。また、理解を容易にするため、ビット列には空白による区切を入れている。
整数127  ⇔  ビット列0111 1111；
整数126  ⇔  ビット列0111 1110；
…；
整数4  ⇔  ビット列0000 0100；
整数3  ⇔  ビット列0000 0011；
整数2  ⇔  ビット列0000 0010；
整数1  ⇔  ビット列0000 0001；
整数0  ⇔  ビット列0000 0000；
整数-1  ⇔  ビット列1111 1111；
整数-2  ⇔  ビット列1111 1110；
整数-3  ⇔  ビット列1111 1101；
整数-4  ⇔  ビット列1111 1100；
…；
整数-127  ⇔  ビット列1000 0001；
整数-128  ⇔  ビット列1000 0000
【００７４】
ここで、現実社会の活動においては、ゲーム装置の「ログイン回数」「プレイ時間」「経験値」「残り時間」の例に見られるように、整数数値が一方向のみに変化する（増加するのみ、もしくは、減少するのみ）ことが多い。すなわち、非対称な変化をすることが多い。
【００７５】
一方で、フラッシュメモリにおいては、消去済のセルを書込済にするのは、ビット単位やページ単位で可能であり、細かい制御が可能であるが、書込済のセルを消去済に戻すのには、ブロック単位での制御が必要であり、しかも、消去回数にはフラッシュメモリの寿命に基づく制限がある。すなわち、消去済→書込済の変化と、書込済→消去済の変化とは、非対称である。
【００７６】
したがって、この非対称性を生かした整数の内部表現を採用することにより、フラッシュメモリの消去の回数を減らし、これによって寿命を伸ばすことができると期待できる。
【００７７】
さて、上記のビット列の例を見ると、整数値がある方向に変化していったとしても、上位ビットの値は変化しない。一方で、下位ビットは上位ビットに比べて激しく、０→１、１→０と変化する。これをそのままフラッシュメモリに書き込もうとすると、上記のように、ブロック単位での消去が必要になる。この消去の回数は、書込回数のおよそ半分程度と予想される。
【００７８】
したがって、下位ビットの表現に工夫を加えて、消去回数を抑えることを考える。以下では、正整数の値が増加していく状況が頻繁に生じるものとして考える。
【００７９】
フラッシュメモリでは、消去済→書込済に変化させる方が、その逆よりもコストが低い。一方、前提から、正整数の値が増加していく頻度は高い。したがって、正整数の値が増加すると、セルが消去済→書込済に変化するような表現を採用すると、消去回数を減らすことができると考えられる。
【００８０】
まず、２の補数表現による整数を上位ビットと下位ビットに分ける。ここでは、理解を容易にするため、上位ビットは３ビット、下位ビットは５ビットとする。
【００８１】
すると、下位ビットでは、０から３１（＝25−１）までの３２（＝25）通りの整数が表現されることになる。
【００８２】
整数値が１ずつ増加していくと、上位ビットは、３２回に１回だけ変化するが、下位ビットは、毎回変化する。そこで、２の補数表現では５ビットで表される下位ビットを、25-1＝３１ビット長のビット列で表現する。すなわち、０から３１の数値を、「３１ビット長のビット列の中で、値が１であるビットの個数」により表現するのである。
【００８３】
すると、０から３１まで数値が増加していく間は、上記のビット表現では、「０であったビット一つが１に変化する」ことを繰り返すことになる。
【００８４】
あとは、この３１ビット長のビット列と、上位３ビットのビット列とを連結すれば、本実施形態における内部表現を得ることができる。以下具体例をあげて説明する。
【００８５】
８ビット整数値「１２２」は、２の補数表現によるビット列で表現すると「０１１１  １０１０」となる。そこで、これを上位３ビット「０１１」と下位５ビット「１１０１０」に分ける。
【００８６】
下位５ビット「１１０１０」は、整数値「２６」であるから、「１」が２６個、「０」が（３２−１）−２６  ＝  ５個のビット列で表現する。当該３２ビットのビット列としては、０側を下位ビットに配置する
1 11111 11111 11111 11111 11111 00000
という表現と、１側を下位ビットに配置する
0 00001 11111 11111 11111 11111 11111
という表現の２通りが典型的である。０〜３１の３２通りを３２ビットのビット列の中で「１」が立っている状態で表現する形式であれば、たとえばランダムにビット位置を選択して１を立てる等、どのような形式を採用しても良い。
【００８７】
したがって、全体として見ると、８ビット整数値は、本実施形態の内部表現では、３＋（３２−１）＝３４ビットで表現されることになる。
【００８８】
本実施形態の内部表現の実際のビット列は、種々の態様が考えられるが、２つの断片を上記の２種類の態様に合わせて配置する以下の４通りのいずれかを選択するのが典型的である。
011  1 11111 11111 11111 11111 11111 00000；
1 11111 11111 11111 11111 11111 00000  011；
011  0 00001 11111 11111 11111 11111 11111；
0 00001 11111 11111 11111 11111 11111  011
【００８９】
さて、当該８ビット整数値「１２２」が１増加して「１２３」になったとすると、上記と同様の処理により、そのビット列表現は、上記の典型例に合わせて考えると、
011  1 11111 11111 11111 11111 11111 10000；
1 11111 11111 11111 11111 11111 10000  011；
011  0 00011 11111 11111 11111 11111 11111；
0 00011 11111 11111 11111 11111 11111  011
のいずれかとなる。
【００９０】
この表現を利用する限り、８ビット整数値が１ずつ増加しても、上位ビットが変化するのは３２回に１回の割合であり、下位ビットを表現する３２ビットは、ほとんどの場合、０だったビットが１に変化するだけである。
【００９１】
一般に、本内部表現では、２の補数表現により表現された整数を上位ビットと下位ビットに分ける。一般に、この分割は、整数値を定数Dで割ったときの商と余により得ることができる。
【００９２】
次に、D-1ビット長のビット列において、当該余の値の個数だけビットを１に立て、それ以外はビットを０にクリアしたままとしたビット列を得る。
【００９３】
そして、商を表すビット列（これは、２の補数表現をそのまま用いることができる。）とD-1ビット長のビット列とを連結する。
【００９４】
そして、本内部表現を採用するのに合わせて、フラッシュメモリのセルの消去済を０に、書込済を１に対応させる。
【００９５】
すると、頻繁に行われる整数が少しずつ増加する演算は、消去済（０）→書込済（１）の変化に対応させ、比較的回数が少ないそれ以外の演算は、書込済（１）→消去済（０）の変化に対応させることができる。したがって、全体として見ると、フラッシュメモリのセルに対するブロック消去の回数が抑制されると期待できる。
【００９６】
さて、正整数については、上記のような内部表現を採用することで、フラッシュメモリの消去回数を抑制できると期待されるが、負の整数が次第に増加していく状況が頻繁に想定される環境下でも、ある整数値xをDで割ったときの商yと余rを以下のように定義することによって、同様の効果を得ることができる。
x = y×D + r，(0≦r≦D-1)
【００９７】
この手法は、単純なビット列の分割と、本質的に同じである。たとえば、
-1 = (-1)×32 + 31；
-2 = (-1)×32 + 30；
-127 = (-4)×32 + 1；
-128 = (-4)×32 + 0
であり、整数「−１」の３ビット長の２の補数表現は「１１１」であり、整数「−４」の３ビット長の２の補数表現は「１００」であるから、それぞれを上記の内部表現の一例で表すと、
整数-1  ⇔  111  1 11111 11111 11111 11111 11111 11111；
整数-2  ⇔  111  0 11111 11111 11111 11111 11111 11111；
整数-127  ⇔  100  0 00000 00000 00000 00000 00000 00001；
整数-128  ⇔  100  0 00000 00000 00000 00000 00000 00000；
のような対応を付けることができる。
【００９８】
このほか、負の数を表すためには、一旦１の補数表現を採用してから、上位ビットと下位ビットに分割することとしても良い。
【００９９】
以下、整数については、２の補数表現と、上記の内部表現の２通りを適宜使い分けるものとする。また、文字列等の表現については、固定長表現、長さと文字列の組み合わせによる表現、ヌル文字を最後に配置した文字列表現等、用途に合わせて手法を使い分けるものとする。
【０１００】
（記憶装置）
図２は、上記情報処理装置１００にプログラムを実行させることにより実現される記憶装置の一実施形態の概要構成を示す説明図である。以下、本図を参照して説明する。
【０１０１】
記憶装置２０１は、フラッシュメモリ部２０２、配置部２０３、ビット列読出部２０４、ビット列書込部２０５、整数読出部２０６、整数書込部２０７、を備える。
【０１０２】
フラッシュメモリ部２０２は、ＥＥＰＲＯＭ等により構成され、複数のセルを有し、当該セルは、消去済、書込済のいずれかの状態をとる。そして、当該セルへの書き込みは、各セルごと、もしくは、N (N>1)個のセルごと（以下「ページごと」という。）に行われる。当該セルの消去は、M (M>N)個のセルごと（以下「ブロックごと」という。）に行われる。以下では、フラッシュメモリ部２０２として、書き込みをページ単位で行うＮＡＮＤ型のＥＥＰＲＯＭを想定して説明をするが、ビット単位での書き込みが可能なＮＯＲ型のＥＥＰＲＯＭでも、同様の手法を採用することができる。
【０１０３】
本実施形態では、理解を容易にするため、セルが消去済の状態をビット値０に、書込済の状態をビット値１に、それぞれ割り当てるものとし、ファイルシステムとして、ファイル名の長さと制限がファイルに格納できる情報量に制限があるものを例としてとりあげて説明する。
【０１０４】
本実施形態のフラッシュメモリ部２０２は、Nビットのページが2×Z個ある集合体である。したがって、フラッシュメモリ部は、Z個の配列p[0]，p[1]，…，p[Z-1]およびZ個の配列q[0]，q[1]，…，q[Z-1]からなると考えることができる。
【０１０５】
各ページp[i]のセルは、全部でNビットであるが、適宜ビットを割り当てた各フィールドに、以下のような情報を格納する。
（１）ファイル名（識別名）p[i].n。固定長（L文字、8×Lビット）の文字列を採用する。このファイル名としては、文字表現にＡＳＣＩＩを用い、文字列の最後が０で終わるＡＳＣＩＩＺ形式を採用する。
（２）当該ページp[i]が、消去しても良いか否かを表すごみビットp[i].e。ごみビットp[i].e = 0であれば、当該ページp[i]は未使用（ファイルとして確保されていない）もしくは使用中であり、ごみビットp[i].e = 1であれば、当該ページp[i]は消去しても良いことを意味する。
（３）当該ページp[i]に格納されるビット列p[i].b。当該ファイルに格納されうる情報のサイズは固定長（N-8×L-1ビット）である。
【０１０６】
また、各ページq[i]は、ページp[i]に格納された情報に対する誤り訂正符号を格納するための領域である。ページq[i]は、q[i][0]，q[i][1]，…，q[i][Q-1]のようにQ個に分割されており、断片q[i][j]は、ページp[i]に対してj回目の書き込みが行われたときの、情報が格納される。具体的には、以下の通りである。
断片q[i][j]に誤り訂正符号が格納されているか否かを示す有効ビットq[i][j].v。たとえば、q[i][0].v = q[i][1].v = … = q[i][k-1].v = 1であり、q[i][k].v = 0である場合は、ページp[i]に対する書き込みがk回行われたことを意味する。
ページp[i]に対する誤り訂正符号q[i][j].c。利用できる誤り訂正符号の最大ビット長は、N/Q - 1ということになる。
【０１０７】
上記の整数内部表現を採用して、ファイル１つについて整数１個を記憶させるものとし、その整数が１ずつ増えていく状況を考えると、書込がD回行われるごとに消去を１回行う必要があるものと予想される。したがって、Q≦Dとするのが典型的である。
【０１０８】
初期状態（フォーマット直後の状態）では、フラッシュメモリ部２０２の各ページは、消去されている。したがって、i = 0，1，…，Z-1のそれぞれについて、
p[i].n = ""（長さ０の文字列）；
p[i].e = 0；
p[i].b = 0；
q[i][0].v = q[i][1].v = … = q[i][Q-1].v = 0；
q[i][0].c = q[i][1].c = … = q[i][Q-1].c = 0
となる。
【０１０９】
さて、本実施形態のフラッシュメモリ部２０２はＮＡＮＤ型のＥＥＰＲＯＭを採用しているため、その読み書きは、ページ単位で行われる。すなわち、あるページp[i]やq[i]における所定位置のビット（列）を読み出すには、まず、その位置を含むページ全体をＲＡＭに読み出す。そして、ＲＡＭに読み出されたページ全体のビット列から、所望位置のビット（列）を抽出すれば、所望のビット（列）の読出ができることになる。
【０１１０】
一方、書き込みについては、上記と同様に、一旦、書き込みたい位置に記憶されているビット（列）を抽出する。このビット（列）をaとする。一方、その位置に書き込みたいビット（列）をbとする。ビット論理積演算をANDと表記するとき、
a AND b = a
が成立すれば、当該書き込みたい位置にビット（列）bを書き込んだとしても、セルが0（消去済）→1（書込済）へ変化することはあっても、その逆は生じない。
【０１１１】
したがって、上記の条件が満たされる場合には、ＲＡＭにおいて、aの位置にbを書き込んで更新し、その結果を、フラッシュメモリ部２０２の当該ページに書き込むことになる。
【０１１２】
一般に、あるページ全体をビット列s、当該ページ全体に書き込みたい新たなビット列tについて、
s AND t = s
が成立すれば、当該ページにそのままtを上書きすることができる。一方、これが成立しない場合には、ページの再配置が必要となる。
【０１１３】
また、ビット単位での読み書きが可能なＮＯＲ型ＥＥＰＲＯＭを採用する場合には、ファイル管理のためにページを適当なサイズに設定して、ビット単位でアクセスを行っても良いし、ページ単位でまとめてアクセスを行うこととしても良い。
【０１１４】
以下では、理解を容易にするため、ページ内の所定のフィールドの内容を読み出す場合には、読み出された当該フィールドの値をp[k].e（k番目のページの消去可能フィールド）のように、当該フィールド名で記載するものとし、上記のようなＲＡＭを経由した読み出しの詳細は言及を省略する。
【０１１５】
また、上書きが可能な場合（0が1になるセルが存在しても良いが、1が0になるセルは存在しない場合）に、当該フィールド位置にビット（列）を上書きする処理については、
p[k].e ← 1
のように、←を用いて表記するものとする。
【０１１６】
一般に、あるページs全体をビット列として考えたとき、当該ページs全体に書き込みたい新たなビット列tについて、
s AND t = s
が成立すれば、
s ← t
のように、当該ページsにtを、そのまま上書きすることができる。一方、これが成立しない場合には、ページの再配置が必要となる。以下、まず、ページをファイルに割り当てる配置処理について説明する。
【０１１７】
（配置処理）
以下では、配置部２０３が実行する配置処理について説明する。
【０１１８】
配置部２０３は、新たなファイルを作成する際や、ページへの書き込みでは更新が不可能になり、新たなページを割り当てる必要がある場合に開始される。
【０１１９】
図３、図４は、配置処理の制御の流れを示すフローチャートである。以下、本図を参照して説明する。この配置処理は、いわゆるライブラリ呼び出し、関数呼び出しの形式で実行されるのが典型的である。
【０１２０】
配置部２０３は、フラッシュメモリ部２０２に新たに確保したいファイル名fを受け付けると（ステップＳ３００）、変数k = 0，1，…，Z-1について、以下の処理を繰り返す（ステップＳ３０１〜Ｓ３０４）。
【０１２１】
すなわち、
p[k].n = f（ファイル名が一致）かつ
p[k].e = 0（当該ページを使用中）
であるか否かを調べ（ステップＳ３０２）、成立すれば（ステップＳ３０２；Ｙｅｓ）、
p[k].e ← 1（代入）
を実行してフラッシュメモリへの書き込みを行い（ステップＳ３０３）、当該ファイル名に対する既存のファイルを消去可能にし、ループＳ３０１〜Ｓ３０４を抜ける。
【０１２２】
一方、成立しなければ（ステップＳ３０２；Ｎｏ）、次のkを得て繰り返しを続ける（ステップＳ３０４）。
【０１２３】
次に、配置部２０３は、変数k = 0，1，…，Z-1について、以下の処理を繰り返す（ステップＳ３０５〜Ｓ３０８）。
【０１２４】
すなわち、未使用のページを得るため
p[k].n = ""（ファイル名が長さ０の文字列）
p[k].e = 0（当該ページは未使用）
であるか否かを調べ（ステップＳ３０６）、そうであれば（ステップＳ３０６；Ｙｅｓ）、
p[k].n ← f；
を実行してフラッシュメモリへの書き込みを行い（ステップＳ３０７）、ループＳ３０５〜Ｓ３０８を抜ける。
【０１２５】
一方、成立しなければ（ステップＳ３０６；Ｎｏ）、次のkを得て繰り返しを続ける（ステップＳ３０８）。
【０１２６】
ループＳ３０５〜Ｓ３０８が単純に終了した場合、すべてのkについてページp[k]が未使用でないことを意味するから、すでにごみとなっているページを未使用の状態に戻す、すなわち、消去する必要がある。ここで、上記のように、読み書きはページ単位で行えるが、消去は、複数ページからなるブロック単位で行わなければならない。以下、ブロック1個が、B個のページからなるとして、説明する。
【０１２７】
変数i = 0，1，…，(Z/B)-1について、以下の処理を繰り返す（ステップＳ３０９〜Ｓ３１２）。
【０１２８】
ここで、変数iは、ブロック番号を意味する。i番目のブロックには、ページ
p[b×i]，p[b×i+1]，…，p[b×i+B-1]
および、これらに対応する誤り訂正符号ページ
q[b×i]，q[b×i+1]，…，q[b×i+B-1]
が対応するものとし、これらの単位で消去が可能であるとする。
【０１２９】
そして、当該i番目のブロック（ブロック#i）のページすべてが消去可能であるか否か、すなわち、
p[b×i].e = p[b×i+1].e = … = p[b×i+B-1].e = 1
であるか否かを調べ（ステップＳ３１０）、そうであれば（ステップＳ３１０；Ｙｅｓ）、p側のブロック
p[b×i]，p[b×i+1]，…，p[b×i+B-1]
およびq側のブロック
q[b×i]，q[b×i+1]，…，q[b×i+B-1]
を消去することにより、ブロック#iに対応付けられる各ページを「ページ消去」する（ステップＳ３１１）。
【０１３０】
ステップＳ３１０の条件が満たされない場合（ステップＳ３１０；Ｎｏ）、および、ステップＳ３１１の後は、次のkを得て繰り返しを続ける（ステップＳ３１２）。
【０１３１】
そして、ループＳ３０９〜Ｓ３１２の繰り返しで消去を行うことができたか否か、すなわち、ステップＳ３１１を１回でも通過したか否かを判断する（ステップＳ３１３）。消去を行うことができた場合（ステップＳ３１３；Ｙｅｓ）、未使用のページを作ることができたことになるから、ステップＳ３０５に戻る。
【０１３２】
一方、消去ができなかった場合（ステップＳ３１３；Ｎｏ）、各ページを移動することによって、消去を行うことを試みる。
【０１３３】
あらかじめ、ＲＡＭ内に、当該ページと同じビット数からなるバッファ領域を2×B個、
r[0]，r[1]，…，r[B-1]；
s[0]，s[1]，…，s[B-1]
のように用意しておく。
【０１３４】
そして、変数b，kを０に設定し（ステップＳ３１４）、当該バッファ領域r[0]，r[1]，…，r[B-1]，s[0]，s[1]，…，s[B-1]の各ビットを、すべて０にクリアする（ステップＳ３１５）。
【０１３５】
ついで、変数i = 0，1，…，Z-1について、以下の処理を繰り返す（ステップＳ３１６〜Ｓ３３０）。
【０１３６】
まず、消去しても良いページでないか、それとも、消去して良いページか、すなわち、
p[i].e = 1
であるか否か、を調べる（ステップＳ３１７）。１に等しくない場合（ステップＳ３１７；Ｎｏ）、ステップＳ３３０に進む。
【０１３７】
１に等しい場合（ステップＳ３１７；Ｙｅｓ）、ページp[i]，q[i]は消去してはならないことになるから、
r[b] ← p[i]，s[b] ← q[i]
のように、ページの内容を一時的にコピーして（ステップＳ３１８）、bの値を１増やす（ステップＳ３１９）。
【０１３８】
そして、b = Bであるか否かを調べる（ステップＳ３２０）。これが成立しない場合（ステップＳ３２０；Ｎｏ）、ステップＳ３３０に進む。
【０１３９】
一方これが成立した場合（ステップＳ３２０；Ｙｅｓ）、バッファ領域に１ブロック分のページが蓄積されたことになる。
【０１４０】
そこで、ページ
p[k]，p[k+1]，…，p[k+B-1]；
q[k]，q[k+1]，…，q[k+B-1]
からなるブロック（ブロック番号k/B）を消去して（ステップＳ３２１）、
p[k] ← r[0]，p[k+1] ← r[1]，…，p[k+B-1] ← r[B-1]；
q[k] ← s[0]，q[k+1] ← s[1]，…，q[k+B-1] ← s[B-1]
のように、ブロック番号k/Bのブロックにページの書込を行ってコピー移動を行い（ステップＳ３２２）、変数bを０にクリアし、変数kをBだけ増やし（ステップＳ３２３）、バッファ領域r[0]，r[1]，…，r[B-1]，s[0]，s[1]，…，s[B-1]の各ビットを、すべて０にクリアして（ステップＳ３２４）、変数iについての繰り返しを続ける（ステップＳ３３０）。
【０１４１】
なお、i = k+B-1の場合には、ステップＳ３２１、ステップＳ３２２の処理は省略しても良い。「同じ場所への移動」を意味するからである。
【０１４２】
さて、ステップＳ３１６〜ステップＳ３３０の繰り返しが終了したら、b = 0であるか否かを調べる（ステップＳ３３１）。これが成立しない場合（ステップＳ３３１；Ｎｏ）、使用中のページの情報がバッファ領域に蓄積されていることになる。
【０１４３】
したがって、ページ
p[k]，p[k+1]，…，p[k+B-1]；
q[k]，q[k+1]，…，q[k+B-1]
からなるブロック（ブロック#k/B）を消去して（ステップＳ３３２）、
p[k] ← r[0]，p[k+1] ← r[1]，…，p[k+B-1] ← r[B-1]；
q[k] ← s[0]，q[k+1] ← s[1]，…，q[k+B-1] ← s[B-1]
のようにページのコピー移動を行い（ステップＳ３３３）、変数kをBだけ増やす（ステップＳ３３４）。これにより、有効なページがすべて、フラッシュメモリ部２０２に戻されたことになる。
【０１４４】
そして、k < Zが成立する間（ステップＳ３３５〜Ｓ３３８）、
p[k]，p[k+1]，…，p[k+B-1]；
q[k]，q[k+1]，…，q[k+B-1]
からなるブロック（ブロック#k/B）を消去して（ステップＳ３３６）、変数kをBだけ増やす（ステップＳ３３７）処理を繰り返す（ステップＳ３３８）。これによって、残余の不要ブロックをすべて消去する。その後にステップＳ３０６に戻る。
【０１４５】
一方、b = 0であったら（ステップＳ３３１；Ｙｅｓ）、ステップＳ３３５に進む。
【０１４６】
これらの処理は、いわゆるごみ集め（garbage collection）に相当する処理であり、上記の技術に限らず、公知の種々の技術を適用することができる。
【０１４７】
なお、ブロック消去が１回もできなかった場合には、記憶装置２０１が充満状態になっており、これ以上ファイルを書き込むことはできない旨のエラーを報告して、処理を終了することとしても良い。
【０１４８】
さて、ステップＳ３０７においてp[k].nにファイル名fの書き込みを行ったら、ファイル名fに対してk番目のページが確保できたことを後述するビット書込処理等に返して（ステップＳ３５１）、本処理を終了する。
【０１４９】
（ビット列書込処理）
図５は、ビット列書込部２０５にて実行されるビット列書込処理の制御の流れを示すフローチャートである。以下、本図を参照して説明する。
【０１５０】
ビット列書込処理は、ファイル名fと、書き込むビット列tとを指定する関数呼び出し、ライブラリ呼び出しによって開始されるのが典型的である。
【０１５１】
また、ビット列tは、ビット長がN-8×L-1であることを想定して説明するが、ビット列tを適当な長さに分割して、各断片ごとにビット列を書き込み、読み出しできるようにしても良い。この場合には、ファイル名fと当該断片の位置との組み合わせが、その情報に対する識別名として機能する。
【０１５２】
さて、ビット列書込部２０５がファイル名fとビット列tを受け付けると（ステップＳ４０１）、変数k = 0，1，…，Z-1について、以下の処理を繰り返す（ステップＳ４０２〜Ｓ４０４）。
【０１５３】
すなわち、
p[k].n = f（ファイル名が一致）かつ
p[k].e = 0（当該ページを使用中）
であるか否かを調べ（ステップＳ４０３）、成立しなければ（ステップＳ４０３；Ｎｏ）、次のkを得て繰り返しを続ける（ステップＳ４０４）。
【０１５４】
ステップＳ４０３の条件が成立しないままにループＳ４０２〜Ｓ４０４を抜けた場合には、当該ファイル名fが割り当てられたページが存在しないこととなるので、当該ファイル名fを指定して、上記の配置処理を起動し、当該ファイル名fに対するページ番号kを取得し（ステップＳ４０５）、誤り訂正符号を書き込む断片の位置hとして０を設定して（ステップＳ４０６）、ステップＳ４２１へ進む。
【０１５５】
一方、ステップＳ４０３の条件が成立した場合（ステップＳ４０３；Ｙｅｓ）、当該ページに既に格納されているビット列p[k].bと、書き込みたいビット列tと、に、
p[k].b AND t = p[k].b
が成立するか否かを調べる（ステップＳ４０７）。成立しない場合（ステップＳ４０７；Ｎｏ）、当該ページp[k]はページの再配置が必要となるから、
p[k].e ← 1
を実行して、ページp[k]およびq[k]をごみに設定してから（ステップＳ４０８）、ステップＳ４０５に進む。
【０１５６】
一方、成立する場合（ステップＳ４０７；Ｙｅｓ）、ページp[k]に対する誤り訂正符号を格納できるか否かを調べるため、変数h = 0，1，…，Q-1について、順に以下の処理を繰り返す（ステップＳ４１１）。
【０１５７】
すなわち、
q[k][h].v = 0
であるか否かを判断し（ステップＳ４１２）、そうであれば（ステップＳ４１２；Ｙｅｓ）、断片の位置hに誤り訂正符号を書き込むことができるので、ステップＳ４２１へ進む。
【０１５８】
もしq[k][h].v = 1であれば（ステップＳ４１２；Ｎｏ）、次のhを得て繰り返しを続ける（ステップＳ４１３）。
【０１５９】
ステップＳ４１２の条件が成立しないままにループＳ４１１〜Ｓ４１３が終了した場合、誤り訂正符号を格納できる領域がページq[k]に残っていないことになるため、ページの再配置が必要となるから、ステップＳ４０５に進む。
【０１６０】
さて、ファイル名fに対してビット列tが書き込み可能なページp[k]、および、当該ページp[k]に対する誤り訂正符号を書き込むページq[k]内の断片q[k][h]に対するインデックスk，hが得られたら、ビット列tに対する誤り訂正符号uを計算する（ステップＳ４２１）。採用する誤り訂正符号の種類は、ハミング符号やリード・ソロモン符号等、用途とビット長の制限に応じて適宜選択することができる。
【０１６１】
誤り訂正符号uが計算されたら、
p[k].b ← t；
q[k][h].v ← 1；
q[k][h].c ← u
のように、各ページに情報を書き込み（ステップＳ４２２）、本処理を終了する。
【０１６２】
（ビット列読出処理）
図６は、ビット列読出部２０４により実行されるビット列読出処理の制御の流れを示すフローチャートである。以下、本図を参照して説明する。
【０１６３】
ビット列読出処理は、ファイル名fを指定する関数呼び出し、ライブラリ呼び出しによって開始されるのが典型的である。
【０１６４】
また、読み出されるビット列は、上記のビット列の書込処理と同様に、ビット長がN-8×L-1であることを想定して説明するが、読み出されるビット列を適当な長さに分割して、各断片ごとにビット列を読み出しできるようにしても良い。この場合には、ファイル名fと当該断片の位置との組み合わせが、その情報に対する識別名として機能する。
【０１６５】
さて、ビット列読出部２０４がファイル名fを受け付けると（ステップＳ５０１）、変数k = 0，1，…，Z-1について、以下の処理を繰り返す（ステップＳ５０２〜Ｓ５０４）。
【０１６６】
すなわち、
p[k].n = f（ファイル名が一致）かつ
p[k].e = 0（当該ページを使用中）
であるか否かを調べ（ステップＳ５０３）、成立しなければ（ステップＳ５０３；Ｎｏ）、次のkを得て繰り返しを続ける（ステップＳ５０４）。
【０１６７】
ステップＳ５０３の条件が成立しないままにループＳ５０２〜Ｓ５０４を抜けた場合には、当該ファイル名fが割り当てられたページが存在しないこととなるので、当該ファイルは存在しない旨のエラーを報告して（ステップＳ５０５）、本処理終了する。
【０１６８】
一方、ステップＳ５０３の条件が成立した場合（ステップＳ５０３；Ｙｅｓ）、ページp[k]に対する誤り訂正符号を取得するため、変数h = 0，1，…，Q-2について、順に以下の処理を繰り返す（ステップＳ５１１）。
【０１６９】
すなわち、
q[k][h].v = 1かつq[k][h+1].v = 0
であるか否かを判断し（ステップＳ５１２）、そうであれば（ステップＳ５１２；Ｙｅｓ）、断片の位置hに最新の誤り訂正符号が書き込まれていることになるので、ステップＳ５２１へ進む。
【０１７０】
一方ステップＳ５１２の条件が成立しなければ（ステップＳ５１２；Ｎｏ）、次のhを得て繰り返しを続ける（ステップＳ５１３）。
【０１７１】
ステップＳ５１２の条件が成立しないままにループＳ５１１〜Ｓ５１３が終了した場合、断片の位置Q-1に最新の誤り訂正符号が記憶されていることになるので、hにQ-1を設定して（ステップＳ５１４）、ステップＳ５２１に進む。
【０１７２】
さて、ファイル名fに対するページp[k]および当該ページp[k]に対する最新の誤り訂正符号が書き込まれたページq[k]内の断片q[k][h]についての、インデックスk，hが得られたら、ページp[k]に格納されたビット列p[k].bを、誤り訂正符号q[k][h].cで、誤り訂正して、ビット列tを得る（ステップＳ５２１）。
【０１７３】
そして、誤り訂正の結果のビット列tを、読み出した結果として返して（ステップＳ５２２）、本処理を終了する。
【０１７４】
上述のファイルシステムは極めて単純なものであるが、他の種々のファイルシステムにおいても、本発明の原理を適用することが可能である。たとえば、複数ページにまたがる可変長のファイルを処理可能とするために、各ページpには、ファイル内における次のページのインデックスを格納することとし、ファイルの全体長は、当該ページ群に対するq内に格納する等の手法や、公知のファイルシステム構築技術を配置部２０２や、ビット列読出部２０４、ビット列書込部２０５における処理対称のページ位置の検索に適用することができる。
【０１７５】
なお、上記の実施形態では、ＮＡＮＤ型ＥＥＰＲＯＭを使用しているため、誤り訂正符号を適用することが望ましい場合が多いが、誤りが生じる可能性がよりＮＯＲ型ＥＥＰＲＯＭの場合等では、誤り訂正符号に係る構成や処理を省略することとしても良い。
【０１７６】
さて、上記のような、フラッシュメモリ部２０２、配置部２０３、ビット列読出部２０４、ビット列書込部２０５による構成を用いても、従来の技術に比べて各ページに対する消去回数は、抑制できるものと期待される。たとえば、各種のログファイルのように、ファイルの内容に文字列の追加のみが行われるような場合には、上記の構成のみであっても、ページ消去の回数を抑制することができる。
【０１７７】
以下では、前述のような内部表現を用いることで、さらにページ消去の回数を抑制する手法について説明する。
【０１７８】
（整数書込・整数読出）
整数以外のビット列については、上記のように、直接、ビット列読出部２０４、ビット列書込部２０５を利用することで、ページ消去の回数を抑制しつつアクセスが可能となるが、整数については、前述の内部表現の変換を行うことで、さらにページ消去の回数を抑制することが期待できる。
【０１７９】
すなわち、整数書込部２０７は、ファイル名（および、ページの大きさによっては、当該ファイル内における位置）に相当する識別名vと、当該識別名vに対して記憶する整数値wと、を受け付けて、整数値wを、上記の内部表現に変換し、当該識別名vと、変換結果のビット列w'と、を、ビット列書込部２０５に渡す。
【０１８０】
一方、整数読出部２０６は、ファイル名（および、ページの大きさによっては、当該ファイル内における位置）に相当する識別名vを受け付けて、これをビット列読出部２０４に渡し、返ってきた内部表現のビット列x'を、整数値xに逆変換して、読み出された整数値として取得し、他の処理で利用可能なようにする。
【０１８１】
上記のように、整数値の変化に非対称性がある場合には、本実施形態の内部表現を用いることで、各セルについて、0（消去済）→1（書込済）の変化の方が、その逆の変化よりも頻繁に発生するようになるため、ページの再配置・消去が必要ない更新の機会を増やすことができる。
【産業上の利用可能性】
【０１８２】
以上説明したように、本発明によれば、フラッシュメモリを用いる記憶装置において、消去の回数をできるだけ抑制して寿命を長くするのに好適な記憶装置、記憶方法、ならびに、これらをコンピュータにて実現するプログラムを提供することができる。
【図面の簡単な説明】
【０１８３】
【図１】本発明の記憶装置が利用される典型的な情報処理装置の概要構成を示す模式図である。
【図２】情報処理装置にプログラムを実行させることにより実現される記憶装置の一実施形態の概要構成を示す説明図である。
【図３】配置部により実行される配置処理の制御の流れを示すフローチャートである。
【図４】配置部により実行される配置処理の制御の流れを示すフローチャートである。
【図５】ビット列書込部により実行されるビット列書込処理の制御の流れを示すフローチャートである。
【図６】ビット列読出部により実行されるビット列読出処理の制御の流れを示すフローチャートである。
【符号の説明】
【０１８４】
１００  情報処理装置
１０１  ＣＰＵ
１０２  ＲＯＭ
１０３  ＲＡＭ
１０４  インターフェイス
１０５  コントローラ
１０６  外部メモリ
１０７  画像処理部
１０８  ＤＶＤ−ＲＯＭドライブ
１０９  ＮＩＣ
１１０  音声処理部
１１１  マイク
２０１  記憶装置
２０２  フラッシュメモリ部
２０３  配置部
２０４  ビット列読出部
２０５  ビット列書込部
２０６  整数読出部
２０７  整数書込部
【図１】
0004785819.tif 000002
【図２】
0004785819.tif 000003
【図３】
0004785819.tif 000004
【図４】
0004785819.tif 000005
【図５】
0004785819.tif 000006
【図６】
0004785819.tif 000007