以下、添付図面を参照しながら、本発明に係るメモリデバイスおよび情報処理装置の実施形態を詳細に説明する。
(第1の実施形態)
具体的な内容を説明する前に、従来技術と併せて本実施形態の概要を説明する。MRAM(Magnetoresistive Random Access Memory)、PCM(Phase Change Memory)、Memristorのような、プロセッサのメモリバスに直結できるバイトアドレッサブルな不揮発メモリを、メインメモリ(主記憶装置)として使用するコンピュータシステムでは、予期しない電源障害やハードウェア故障が発生しても、障害や故障を取り除いてリブート(再起動)した後、不揮発メモリ(メインメモリ)に残されている状態(データ)を用いて、障害や故障の発生の直前の一貫性のある状態から処理を継続することができる。そのために、プロセッサ上で動作するプログラムは、どのタイミングで障害や故障が発生しても、常にその直前の一貫性のある状態を再現できるように決めた順序で、不揮発メモリへのデータの書き込みを行う。
例えば、不揮発メモリ上にデータベースの更新ログをリンクトリストで管理する場合、個々のトランザクションの更新ログをログエントリに書き込む処理と、それらのログエントリをリンクトリストにつなぐ処理とが必要であるが、必ずログエントリへの書き込みが完了した後(ログエントリへの書き込みが不揮発メモリのメモリセルに書き込まれて、データが永続的になった後)に、そのログエントリへのポイントをリンクトリストにつなぐための書き込みを行う。この順序が守られないと、完全に書き込まれていない不完全なログエントリがリンクトリストにつながれている状態が発生し、その時点で障害が発生すると、リブート後に不完全なログを元にデータベースのリカバリを行うことになり、データベースの一貫性が壊れる。
しかし、このようにプロセッサ上で動作するプログラムが、決まった順序で不揮発メモリへのデータの書き込みを行っても、実際に不揮発メモリにデータが書き込まれるまでには、プロセッサのキャッシュメモリやライトバッファやメモリコントローラなどを経由するので、その段階で書き込み順序の入れ替えや書き込みの遅延が発生するので、プログラムが想定している順序で不揮発メモリにデータの書き込みが行われないというオーダリング(Ordering)の問題が生じる。オーダリングの問題を解決するために従来から提案されている方法の一つとして、プロセッサから不揮発メモリに書き込まれるデータ群を、エポックと呼ばれる世代番号で識別されるグループに分け、キャッシュメモリから不揮発メモリへのライトバックの順番がエポック順になるように制御するエポックバリアと呼ばれる制御方式が知られている。
ここで、従来のDDR方式のDRAMを搭載したDIMMのようなメモリデバイス(メモリモジュール)の場合は、メモリデバイス上のメモリ(チップ、あるいはダイ)への書き込みのタイミングは、それが接続されたプロセッサのメモリコントローラがコントロールするので、メモリコントローラは、データ書き込みの順序を制御できるとともに書き込みの完了を認識することができた。しかし、メモリの動作速度の高速化とともに、メモリデバイス側に、メモリに対するデータの書き込みを制御するコントローラを搭載するメモリデバイスが登場してきている。例えば、HMC(Hybrid Memory Cube)はそのようなメモリデバイスの一つである。他にも、QPI(QuickPath Interconnect)で接続するメモリデバイスや、各種プロセッサの持つ専用のバスで接続されるメモリデバイス(メモリコントローラとメモリを組み合わせたもの)など、さまざまな実現形態がある(後述する本実施形態は、これらの何れの形態にも適用できる)。
以上のような、メモリに対するデータの書き込みを制御するコントローラが搭載されたメモリデバイスに接続されたプロセッサのメモリコントローラは、メモリデバイスに対するデータの送信(書き込み対象のデータの送信)が完了すれば、データの書き込みが完了したものと認識する。しかしながら、メモリデバイスに送信された書き込み対象のデータは、さらにメモリデバイス側のコントローラを経由してメモリに書き込まれるため、プロセッサのメモリコントローラがデータの書き込みが完了したと認識した時点では、書き込み対象のデータがメモリ内のメモリセルまで到達している保証は無い。また、メモリデバイスに搭載されたコントローラは、データの書き込み順序の最適化(書き込み順序の変更など)を行った上で、不揮発メモリのメモリセルへデータを書き込んで永続的にする。
メモリデバイスに搭載されたコントローラが行うデータの書き込み順序の最適化には、様々な方式がある。第1の最適化としては、同じロウページへの書き込みをまとめる方式が考えられる。一般的には、それぞれが行方向に延びる複数のワード線と、それぞれが列方向に延びる複数のビット線との各交差に対応してマトリクス状に配置される複数のメモリセルを有する不揮発メモリ内のメモリセルの位置を指定するためのアドレス情報のうち、上位のビット部分をロウアドレス(行方向のアドレス)、下位のビット部分をカラムアドレス(列方向のアドレス)として使い、不揮発メモリにアクセスする際は、まずロウアドレスを指定してロウページ(1本のワード線に接続される複数のメモリセル分のデータサイズを「ロウページ」と称する)を指定し、そのロウページ内のリード(データの読み出し)やライト(データの書き込み)を行う。そのため、同じロウアドレスを持つリードやライトのアクセスは続けて行うことで、ロウページのオープン(アクティベートとも呼ぶ)やクローズ(プリチャージとも呼ぶ)の回数を減らし、それに必要な時間も削減することができる。そのため、コントローラは、受け取ったリードやライトのリクエストの順序を、できるだけ同じロウページのものが連続するように入れ替える。
第2の最適化としては、メモリデバイス内に複数の不揮発メモリを内蔵し、それらが並列に動作(リードやライト)できる場合、リードやライトのリクエストを受け取ったコントローラは、アクセスしたい不揮発メモリが動作可能な状態(例えばリードやライトの処理中ではない状態)であればすぐにアクセスを開始し、アクセスしたい不揮発メモリが他のリクエストによる処理を実行中であれば、キューに入れて待たせる方式が考えられる。そのため、不揮発メモリに対する書き込み順序は、コントローラがライトリクエストを受け取った順序とは異なる。第2の最適化のような順序の入れ替えは、複数のメモリデバイスがプロセッサに接続されている場合に、異なるメモリデバイス間でも発生し得る。つまり、プロセッサが第1のメモリデバイスに対して、不揮発メモリに対するデータの書き込みを要求するライトリクエスト(第1のライトリクエスト)を送信した後に、第2のメモリデバイスに対してライトリクエスト(第2のライトリクエスト)を送信したとしても、第1のメモリデバイスは、第1のリクエストを受け取ったときに、それよりも前に受け取ったライトリクエストに基づくデータの書き込みを実行中であり、第2のメモリデバイスは、第2のライトリクエストを受け取ったときにアイドル状態(何も処理を行ってない状態)であれば、第2のライトリクエストに基づくデータの書き込みが、第2のライトリクエストよりも前に発行された第1のライトリクエストに基づくデータの書き込みよりも先に完了する。
メモリデバイスに搭載されたコントローラによる不揮発メモリへの書き込み順序は、基本的には到着順であるが、それに対して、上記の第1の最適化や第2の最適化の一方または両方を組み合わせて順序を決めるように実施することができる。さらに、上記の第1の最適化や第2の最適化以外の最適化を組み合わせて実施することもできる。
以上のような、コントローラを内蔵するメモリデバイスの場合、該コントローラ内での遅延や書き込み順序の最適化処理によって、プロセッサが想定している不揮発メモリへのデータの書き込み順序と異なる順序で、不揮発メモリに対するデータの書き込みが行われる可能性がある。そのため、オーダリングを保証することができない。
本実施形態は、コントローラと、1以上の不揮発メモリとを含むメモリデバイスにおいて、該コントローラ内での書き込み順序の入れ替えをコントロールし、メモリデバイスに接続されたプロセッサ(ないしはその上で動作するプログラム)が指定した順序で不揮発メモリのメモリセルへのデータの書き込みが行われることを保証するためのメカニズムを提供する。具体的には、ある時点までにメモリデバイスが受け取ったライトリクエストに基づくデータの書き込み(不揮発メモリのセルへの書き込み)が完了して永続的になっていることを確認するためのコマンド(後述のオーダリングリクエスト)を用いて、オーダリングを保証するためのメカニズムを実現する。
以下、添付図面を参照しながら、本実施形態の具体的な内容を詳細に説明する。
図1は、本実施形態の情報処理装置1のハードウェア構成の一例を示す図である。例えば情報処理装置1は、サーバ計算機、PC(Personal Computer)、携帯型情報端末(可搬型のタブレットも含む)、携帯電話端末などで構成され得る。図1に示すように、情報処理装置1は、プロセッサ10と、メモリデバイス20(メモリモジュール(他の実施形態でも同様))とを備える。図1の例では、メモリデバイス20は、アクセス用のポートを1つ持ち、そこにプロセッサ10を接続しているが、これに限られるものではない。
ホスト装置の一例であるプロセッサ10は、プロセッサコア(CPU(Central Processing Unit)とも称する)11と、キャッシュメモリ12と、メモリコントローラ13とを備える。
プロセッサコア11が実行するプログラムによるメモリデバイス20へのデータ書き込みの手順としては、まず、書き込み対象のデータがキャッシュメモリ12に書き込まれる。キャッシュメモリ12は、適切なタイミングで、メモリコントローラ13に対してデータをメモリデバイス20に書き込むことを指示する。メモリコントローラ13は、キャッシュメモリ12に書き込まれたデータをメモリデバイス20に書き込むために、メモリデバイス20に対して、適切なタイミングで書き込み要求(ライトリクエスト)を発行する。書き込み要求とは、メモリデバイス20の不揮発メモリ21に対するデータの書き込みを要求する情報である。本実施形態における書き込み要求は、書き込み対象のデータと、メモリデバイス20の不揮発メモリ21のうち該書き込み対象のデータが書き込まれる位置を示す情報(アドレス情報)とを少なくとも含む。プロセッサコア11が実行するプログラムによるメモリデバイス20へのデータ書き込みの別の手順としては、キャッシュメモリ12をスキップして、直接メモリコントローラ13に対してデータをメモリデバイス20に書き込むことを指示する。また、メモリデバイス20からデータを読み出す場合は、メモリコントローラ13は、プロセッサコア11からの指示に従って、読み出し要求(リードリクエスト)を発行する。読み出し要求とは、メモリデバイス20の不揮発メモリ21からのデータの読み出しを要求する情報である。本実施形態における読み出し要求は、メモリデバイス20の不揮発メモリ21のうち読み出し対象のデータが格納されている位置を示すアドレス情報を少なくとも含む。
また、本実施形態のプロセッサ10は、メモリデバイス20に対して1以上の書き込み要求を送信した後、該送信済みの1以上の書き込み要求に基づくデータの書き込みが行われたことの確認を要求する書き込み順序確認要求(以下の説明では、「オーダリングリクエスト」と称する場合がある)をメモリデバイス20へ送信(例えばメモリコントローラ13から送信)する。例えば、プロセッサ10は、第1の書き込み集合に含まれる1以上の書き込み要求をメモリデバイス20に送信した後に、該第1の書き込み集合に含まれる1以上の書き込み要求に基づくデータの書き込みが行われたことを確認するために、書き込み順序確認要求をメモリデバイス20に送信する。そして、プロセッサ10は、メモリデバイス20から該書き込み順序確認要求に対する応答(リプライ)を受け取った後に、第1の書き込み集合よりも書き込み順序が後の第2の書き込み集合に含まれる1以上の書き込み要求をメモリデバイス20へ送信する。
本実施形態のプロセッサ10は、メモリデバイス20に対して、第1の書き込み集合に含まれる1以上の書き込み要求を送信した後に書き込み順序確認要求を送信した後は、該書き込み順序確認要求に対する応答(リプライ)をメモリデバイス20から受け取るまでは、第2の書き込み集合に含まれる1以上の書き込み要求をメモリデバイス20に送信することはしないので、メモリデバイス20に内蔵されたコントローラ22内での遅延や書き込み順序の最適化処理などの影響を受けることなく、第1の書き込み集合に基づくデータの書き込み後に第2の書き込み集合に基づくデータの書き込みが行われることを保証できる。
以下の説明では、書き込み要求(ライトリクエスト)、読み出し要求(リードリクエスト)、書き込み順序確認要求(オーダリングリクエスト)を区別しない場合は、単に「リクエスト」と称する場合がある。
図2は、本実施形態のリクエストの形式の一例を示す図である。図2の例では、リクエストは、コマンド情報とタグ情報とアドレス情報とデータとCRCとを含む。コマンド情報は、リクエストの種類を識別する情報である。タグ情報は、リクエストと、該リクエストに対する応答を示すリプライを対応付けるための情報(例えば番号等)である。アドレス情報は、メモリデバイス20の不揮発メモリ21の位置を示す情報である。データは、例えばリクエストが書き込み要求(ライトリクエスト)の場合、書き込み対象のデータとなる。CRCは、リクエストがエラー無く送られたかどうかを検証するための情報である。これらの情報は、リクエストの種類によっては存在しない場合もあり、例えば読み出し要求の場合は、「データ」の部分は存在しない。なお、図2に示す情報に加えて、リクエスト全体の長さを示す情報が含まれてもよい。
図3は、本実施形態のリクエストに対する応答を示すリプライの形式の一例を示す図である。図3の例では、リプライは、コマンド情報とタグ情報とデータとCRCとを含む。コマンド情報は、リプライの種類を識別する情報である。タグ情報は、対応するリクエストに含まれるタグ情報と同一の情報である。データは、例えば読み出し要求に対するリプライの場合、読み出し結果のデータとなる。CRCは、リプライがエラー無く送られたかどうかを検証するための情報である。これらの情報は、リプライの種類によっては存在しない場合もあり、例えば書き込み要求に対するリプライの場合は、「データ」の部分は存在しない。なお、図3に示す情報に加えて、リプライ全体の長さを示す情報が含まれてもよい。
図4は、本実施形態における書き込み要求(ライトリクエスト)の一例を示す図である。本実施形態の書き込み要求は、該書き込み要求に対する応答を要求しない「リプライ無しの書き込み要求」であるが、後述の他の実施形態においては、リプライを要求する「リプライ付きの書き込み要求」が含まる場合もある。図3の例では、コマンド情報として、16バイトのデータの書き込みを要求し、該データの書き込みを行った後に応答(リプライ)を返す必要が無いリクエストであることを識別する情報(図4の例では「16−byte POSTED WRITE request」)が指定される。図4の例では、リプライが不要であるため、タグ情報は存在しない。また、図4の例では、アドレス情報として「12EF00」が指定され、データとして、「B8、26、・・・、9A、01」という書き込み対象の16バイトのデータが指定される。つまり、図4の書き込み要求は、メモリデバイス20の不揮発メモリ21のうち「12EF00」が示す位置に対して、「B8、26、・・・、9A、01」という16バイトのデータの書き込みを要求し、該データの書き込みを行った後に応答を返す必要が無いリプライ無しの書き込み要求であると考えることができる。
図5は、本実施形態における読み出し要求(リードリクエスト)の一例を示す図である。図5の例では、コマンド情報として、64バイトのデータの読み出しを要求するリクエストであることを識別する情報(図5の例では「64−byte READ request」)が指定される。また、タグ情報として「7」を示す番号が指定され、アドレス情報として「21B498」が指定される。つまり、図5の読み出し要求は、メモリデバイス20の不揮発メモリ21のうち「21B498」が示す位置から64バイトのデータの読み出しを要求する読み出し要求であると考えることができる。
図6は、図5の読み出し要求に対する応答を示すリプライの一例を示す図である。図6の例では、コマンド情報として、64バイトのデータの読み出しを要求する読み出し要求に対するリプライであることを識別する情報(図6の例では「64−byte READ response」)が指定される。また、図6の例では、タグ情報として、図5の読み出し要求に含まれるタグ情報と同一の情報(「7」を示す番号)が指定される。また、図6の例では、アドレス情報は存在せず、データとして、「48、BD、・・・、53、A4」という図5の読み出し要求に基づくデータの読み出し結果を示す64バイトのデータが指定される。
図7は、本実施形態における書き込み順序確認要求(オーダリングリクエスト)の一例を示す図である。基本的には、図2のリクエスト形式に基づいており、コマンド情報として、書き込み順序確認要求であることを識別する情報(図7の例では「ORDERING request」)が指定される。また、図7の例では、タグ情報として「5」を示す番号が指定され、アドレス情報およびデータは存在しない。
図8は、図7の書き込み順序確認要求に対する応答を示すリプライの一例を示す図である。図8の例では、コマンド情報として、書き込み順序確認要求に対するリプライであることを識別する情報(図8の例では「ORDERING response」)が指定される。また、図8の例では、タグ情報として、図7の書き込み順序確認要求に含まれるタグ情報と同一の情報(「5」を示す番号)が指定される。同一のタグ情報を用いることで、リクエストとリプライとを対応付けている。
図1に戻り、メモリデバイス20の構成を説明する。図1に示すように、メモリデバイス20は、不揮発メモリ21と、コントローラ22とを備える。メモリデバイス20は、半導体装置の一例であると考えることができる。
本実施形態では、不揮発メモリ21は、MRAM(Magnetoresistive Random Access Memory)で構成されるが、これに限られるものではない。例えば不揮発メモリ21は、PCM(Phase Change Memory)、ReRAM(Resistive Random Access Memory)、FeRAM(Ferroelectric Random Access Memory)、Memristorでもよいし、DRAM(Dynamic Random Access Memory)とNAND Flashを組み合わせたNVDMMであっても構わない。また、不揮発メモリ21は、バッテリバックアップした揮発メモリ(DRAMやSRAMなど)であっても構わない。
図9は、本実施形態における不揮発メモリ21の概略構成の一例を示す図である。図9に示すように、不揮発メモリ21は、不揮発メモリセルアレイ201と、揮発性のメモリであるロウバッファ(ページバッファ)202とを有する。
詳細な図示は省略するが、不揮発メモリセルアレイ201には、行方向(図9の左右方向)に延在する複数のワード線、および、列方向(図9の上下方向)に延在する複数のビット線が配置され、不揮発メモリセルアレイ201は、複数のワード線と複数のビット線との各交差に対応してマトリクス状に配置される複数のメモリセルを有する。また、詳細な図示は省略するが、不揮発メモリセルアレイ201は、コントローラ22の制御の下、各ワード線の電圧を制御する回路や各ビット線の電圧を制御する回路などを備えている。以上の構成は、公知の様々な構成を利用することができる。なお、この例では1本のワード線に接続される複数のメモリセル分のデータサイズを「ページ」と称し、ロウバッファ202は、データの書き込み時またはデータの読み出し時において選択されたワード線に対応する1ページ分のデータを一時的に格納する。本実施形態では、不揮発メモリ21へのデータの書き込みや不揮発メモリ21からのデータの読み出しは、このロウバッファ202を経由して行われるが、これは、公知の方法と同様である。
図1に戻って説明を続ける。コントローラ22は、不揮発メモリ21に対するデータの書き込みを要求する書き込み要求を、プロセッサ10のメモリコントローラ13から受け取った後に、該書き込み要求に基づくデータの書き込みを行う。また、コントローラ22は、不揮発メモリ21に対するデータの読み出しを要求する読み出し要求を、プロセッサ10のメモリコントローラ13から受け取った後に、該読み出し要求に基づくデータの読み出しを行う。
また、本実施形態では、コントローラ22は、プロセッサ10から、メモリデバイス20へ送信済みの1以上の書き込み要求に基づくデータの書き込みが行われたことの確認を要求する書き込み順序確認要求(オーダリングリクエスト)を受け取ると、該書き込み順序確認要求を受け取る前に受け取った書き込み要求に基づくデータの書き込みを行った後に、書き込み順序確認要求に対する応答(リプライ)をプロセッサ10へ送信する。本実施形態のコントローラ22の詳細な内容については後述する。
図10は、メモリデバイス20の詳細なハードウェア構成の一例を示す図である。図10に示すように、コントローラ22は、リクエスト受信部211と、リクエスト記憶部212と、メモリアクセス部213と、リプライ送信部214とを備える。これらの各要素は、半導体回路で構成され、それぞれ独立して設けられてもよいし、任意の2以上の要素が集積されて設けられてもよい。
リクエスト受信部211は、プロセッサ10からリクエスト(書き込み要求、読み出し要求および書き込み順序確認要求のうちの何れか)を受け取り、受け取った順にリクエスト記憶部212に記録する。つまり、リクエスト記憶部212は、プロセッサ10から受け取ったリクエストを、受け取った順に記憶する。例えばリクエスト記憶部212は、リクエスト受信部211が受け取ったリクエストを、そのままの形式で管理することもできるし、受け取ったリクエストに対応する(関する)情報を、メモリアクセス部213が処理し易い形式に加工した状態で、受け取った順に1次元のキューあるいはリンクトリストにして管理することもできる。
メモリアクセス部213は、リクエスト記憶部212に記録されているリクエスト(あるいはリクエストに対応する情報)を順次取り出して、そのリクエストが書き込み要求であれば、該書き込み要求に基づいて不揮発メモリ21に対するデータの書き込みを行い、そのリクエストが読み出し要求であれば、該読み出し要求に基づいて不揮発メモリ21からのデータの読み出しを行う。
また、本実施形態では、メモリアクセス部213は、リクエスト記憶部212内に書き込み順序確認要求が記憶されている場合は、該書き込み順序確認要求よりも古い書き込み要求(該書き込み順序確認要求よりも先にリクエスト記憶部212に記憶された書き込み要求)に基づくデータの書き込みを行った後に、該書き込み順序確認要求を取り出し、リプライ送信部214に対して、該書き込み順序確認要求に対する応答(リプライ)の送信を指示する。すなわち、メモリアクセス部213は、該書き込み順序確認要求を受け取る前に受け取った書き込み要求に基づくデータの書き込みを行った後に、リプライ送信部214に対して、該書き込み順序確認要求に対する応答の送信を指示する。この指示を受けたリプライ送信部214は、該書き込み順序確認要求に対する応答をプロセッサ10へ送信する。
図11は、リクエスト受信部211の動作例を示すフローチャートである。リクエスト受信部211は、プロセッサ10からリクエストを受信すると(ステップS1)、その受信したリクエストを、受信した順序でリクエスト記憶部212に記録する(ステップS2)。
図12は、メモリアクセス部213の動作例を示すフローチャートである。まず、メモリアクセス部213は、リクエスト記憶部212内に書き込み順序確認要求(オーダリングリクエスト)が記憶されているかどうかを確認する(ステップS11)。リクエスト記憶部212内に書き込み順序確認要求が記憶されている場合(ステップS11:Yes)、メモリアクセス部213は、最も古い書き込み順序確認要求よりも古い書き込み要求がリクエスト記憶部212内に記憶されているかどうかを確認する(ステップS12)。最も古い書き込み順序確認要求よりも古い書き込み要求が記憶されている場合(ステップS12:Yes)、または、上述のステップS11において、リクエスト記憶部212内に書き込み順序確認要求が記憶されていない場合(ステップS11:No)、処理は後述のステップS13に移行する。
ステップS13において、メモリアクセス部213は、リクエスト記憶部212内に書き込み要求または読み出し要求が記憶されているかどうかを確認する。リクエスト記憶部212内に書き込み要求も読み出し要求も記憶されていない場合(ステップS13:No)は、処理はステップS11に戻る一方、リクエスト記憶部212内に書き込み要求または読み出し要求が記憶されている場合(ステップS13:Yes)は、メモリアクセス部213は、リクエスト記憶部212から書き込み要求または読み出し要求を取り出す(ステップS14)。ステップS14における書き込み要求または読み出し要求の取り出し方法は任意であるが、最も単純な方法としては、リクエスト記憶部212内の書き込み要求および読み出し要求の中で最も古いものを取り出すという方法である。別の方法としては、例えば同じロウページに対する書き込み要求または読み出し要求が連続するように取り出すという方法も考えられる。さらに別の方法としては、同じロウページに対する書き込み要求または読み出し要求が連続するように取り出すものの、一定時間以上にわたってリクエスト記憶部212から取り出されていないリクエストは優先的に取り出すという方法も考えられる。他にも様々な方法を用いて構わない。
ステップS14で取り出したリクエストが書き込み要求である場合(ステップS15:Yes)、メモリアクセス部213は、取り出した書き込み要求に基づくデータの書き込み(不揮発メモリ21へのデータの書き込み)を行い(ステップS16)、処理はステップS11に戻る。一方、ステップS14で取り出したリクエストが読み出し要求である場合(ステップS15:No)、メモリアクセス部213は、取り出した読み出し要求に基づくデータの読み出し(不揮発メモリ21からのデータの読み出し)を行い(ステップS17)、読み出したデータを含むリプライ(読み出し要求に対する応答)の送信をリプライ送信部214に指示する(ステップS18)。この指示を受けたリプライ送信部214は、ステップS14で取り出した読み出し要求に対するリプライをプロセッサ10へ送信する。そして、処理はステップS11に戻る。
一方、上述のステップS12において、最も古い書き込み順序確認要求よりも古い書き込み要求が記憶されていない場合(ステップS12:No)、すなわち、最も古い書き込み順序確認要求を受け取る前に受け取った書き込み要求に基づくデータの書き込みが完了している場合、メモリアクセス部213は、その最も古い書き込み順序確認要求をリクエスト記憶部212から取り出し、該書き込み順序確認要求に対する応答の送信をリプライ送信部214に指示する(ステップS19)。この指示を受けたリプライ送信部214は、書き込み順序確認要求に対する応答(リプライ)をプロセッサ10へ送信する。そして、処理はステップS11に戻る。
以下に、本実施形態における書き込み順序確認要求(オーダリングリクエスト)の利用例を挙げて説明する。例えば、キャッシュメモリ12が上述のエポックバリア機能を備える場合、キャッシュメモリ12は、書き込み対象のデータをキャッシュする際に、キャッシュメモリ12へのデータの書き込みの単位であるキャッシュラインに対してエポックと呼ばれる世代番号を記録していく。エポックは、プロセッサ10上のプログラムからの指示によってインクリメントされる。メモリコントローラ13は、キャッシュラインを不揮発メモリ21にライトバックする時に、必ずエポック番号の順にライトバックするように制御する。つまり、あるエポック番号のキャッシュラインをすべてライトバックした後で、次のエポック番号のキャッシュラインのライトバックを行うように制御する。これにより、プログラムで想定されている順番(プログラマが意図した順番)に、不揮発メモリ21(不揮発メモリ21のメモリセル)への書き込みを行うことができる。以上のような形態に対して、本実施形態を適用する場合は、メモリコントローラ13は、あるエポック番号のキャッシュラインをすべてライトバックした後、書き込み順序確認要求(オーダリングリクエスト)をメモリデバイス20に送り、それに対する応答(リプライ)が返ってきたことを確認した後、次のエポック番号のキャッシュラインのライトバックを開始する。このようにすることで、あるエポック番号のキャッシュラインのデータが確実に不揮発メモリのメモリセルに書き込まれた後に、次のエポック番号のキャッシュラインのデータの書き込み(不揮発メモリ21のメモリセルへの書き込み)が行われることを保証できる。
また、例えばプロセッサ10上で動作するプログラム自身が、書き込み順序確認要求をメモリデバイス20に発行する形態に対して、本実施形態を適用することもできる。例えば、それぞれが、メモリデバイス20の不揮発メモリ21に対する1以上の書き込み要求を含む書き込み集合Aおよび書き込み集合Bがあって、書き込み集合Aに基づくデータの書き込みが確実に完了してから(書き込み集合Aに対応するデータが不揮発メモリ21のメモリセルに確実に書き込まれてから)、書き込み集合Bに基づくデータの書き込みを行うことが望まれる場合を考える。一例として、ログの書き込み例に対応させ、書き込み集合Aはログエントリの書き込みで、書き込み集合Bはログエントリを管理するリンクの付け替えのための書き込みである場合を想定する。このような場合に、書き込み順序確認要求(オーダリングリクエスト)を用いてログの書き込みを実行するには、まず書き込み集合Aに属するデータ群をキャッシュメモリ12に書き込んだ後、それらの書き込んだアドレスに対応するキャッシュフラッシュ命令を実行してライトバックさせる。次にメモリデバイス20に対して書き込み順序確認要求を送り、それに対する応答(リプライ)を待つ。書き込み順序確認要求に対する応答の受け取りを確認した後、書き込み集合Bに属するデータ群をキャッシュメモリ12に書き込む。そして、必要に応じて、書き込み集合Bに属するデータ群を書き込んだアドレスに対応するキャッシュフラッシュ命令を実行する。なお、キャッシュメモリ12に書き込んだ後にキャッシュフラッシュ命令を実行する代わりに、キャッシュをスキップする書き込み命令を実行することもできる。
また、プロセッサ10によっては、書き込み対象のデータがメモリセルまで到達していることを確認するための特殊命令を利用する場合がある。例えばIntelアーキテクチャにおけるPCOMMIT命令などが上記特殊命令に相当する。このような特殊命令をプロセッサ10が実行すると、プロセッサ10は、プロセッサ10と接続されているメモリデバイス20に対して書き込み順序確認要求(オーダリングリクエスト)を送り、それに対する応答(リプライ)の受け取りを待って、次の命令の実行に移るようにすることで、オーダリングを保証できる。
なお、本実施形態におけるオーダリング保証方式では、プロセッサ10上で同時に実行する複数のアプリケーション、あるいは複数のトランザクション、あるいは複数のスレッド、さらには複数のプロセッサ10から、それぞれが独自に書き込み順序確認要求(オーダリングリクエスト)を発行しても矛盾を生じない。
以上に説明したように、メモリデバイス20のコントローラ22は、プロセッサ10から、メモリデバイス20へ送信済みの1以上の書き込み要求に基づくデータの書き込みが行われたことの確認を要求する書き込み順序確認要求(オーダリングリクエスト)を受け取ると、該書き込み順序確認要求を受け取る前に受け取った書き込み要求に基づくデータの書き込みを行った後に、該書き込み順序確認要求に対する応答をプロセッサ10へ返す。
例えば、プロセッサ10は、第1の書き込み集合に基づくデータの書き込みが確実に完了してから、第2の書き込み集合に基づくデータの書き込みを行うことを保証するために(第1の書き込み集合と第2の書き込み集合との書き込み順序を保証するために)、第1の書き込み集合に含まれる1以上の書き込み要求をメモリデバイス20に送信した後に、書き込み順序確認要求をメモリデバイス20に送信し、該書き込み順序確認要求に対する応答(リプライ)をメモリデバイス20から受け取った後に、第2の書き込み集合に含まれる1以上の書き込み要求をメモリデバイス20へ送信する。すなわち、プロセッサ10は、メモリデバイス20に対して、第1の書き込み集合に含まれる1以上の書き込み要求を送信した後に書き込み順序確認要求を送信した後は、該書き込み順序確認要求に対する応答をメモリデバイス20から受け取るまでは、第2の書き込み集合に含まれる1以上の書き込み要求をメモリデバイス20に送信することはしないので、メモリデバイス20に内蔵されたコントローラ22内での遅延や書き込み順序の最適化処理などの影響を受けることなく、第1の書き込み集合に基づくデータの書き込みの後に第2の書き込み集合に基づくデータの書き込みが行われることを保証できる。
したがって、本実施形態によれば、メモリデバイス20にコントローラ22が搭載される構成においてもオーダリングを保証することができる。
(第1の実施形態の変形例1)
例えばメモリデバイス20は、複数のアクセスポートを有する形態であってもよい。
例えばメモリデバイス20とプロセッサ10とを複数のアクセスポートで接続することで、データ転送能力を向上させることができる。例えば図13に示すように、コントローラ22が、リクエストを受信またはリプライを送信するためのアクセスポートを2つ有する形態であってもよい。このように2つのアクセスポートを使ってメモリデバイス20とプロセッサ10とを接続することで、データ転送のバンド幅を2倍にすることができる。また、図13の例では、リクエスト受信部211は、受信したリクエストをリクエスト記憶部212に記録する際に、そのリクエストが送られてきたアクセスポートを示す情報を関連付けて記録しておき、メモリアクセス部213は、リプライ送信部214に対してリプライの送信を指示する際に、どのアクセスポートから受け取ったリクエストに対するリプライかを伝えることで、リプライ送信部214は、リクエストの送信元に対応するリプライを送り返すことができる。
また、例えばメモリデバイス20を複数のプロセッサ10と接続することもできる。例えば図14に示すように、アクセスポートを2つ有するメモリデバイス20に対して、2つのプロセッサ10aおよび10bを接続することもできる。この例では、プロセッサ10aとプロセッサ10bがデータを共有することができる。
また、例えばメモリデバイス20に対して、プロセッサ10と、別のメモリデバイス(以下、「第2のメモリデバイス200」と称する)とを接続し、プロセッサ10からの書き込み要求を、必要に応じて第2のメモリデバイス200に転送する構成であってもよい。図15に示すように、メモリデバイス20は第2のメモリデバイス200と接続され、メモリデバイス20のコントローラ22は、プロセッサ10のメモリコントローラ13から、第2のメモリデバイス200に対するデータの書き込みを要求する書き込み要求を受け取ると、該書き込み要求を第2のメモリデバイス200に転送する構成でもよい。このように接続することで、例えばプロセッサ10がメモリデバイスとの接続用のポートを1つしか持たない場合でも、複数のメモリデバイスと接続することができる。
また、例えば図16に示すように、第2のメモリデバイス200が、プロセッサ10とは別の第2のプロセッサ100と接続される構成とすることもできる。
図15や図16のように、ホストとなるプロセッサ(プロセッサ10または第2のプロセッサ100)が、一のメモリデバイス(メモリデバイス20および第2のメモリデバイス200のうちの何れか一方のメモリデバイス、以下では「第1のメモリデバイス」と称する)を介して他のメモリデバイス(メモリデバイス20および第2のメモリデバイス200のうちの何れか他方のメモリデバイス、以下では「第2のメモリデバイス」と称する)にアクセスする場合、プロセッサが第1のメモリデバイスに送ったリクエストは、第1のメモリデバイスで処理するリクエストであるのか第2のメモリデバイスへ転送するリクエストであるのかを判断する必要がある。この判断は、例えばリクエスト中のアドレス情報の上位ビットで判断するように実施することができる。別の実施方法としては、例えば図17に示すように、リクエスト中に、対象となるメモリデバイスを識別する「デバイスID」を指定するフィールドを設け、リクエストを受け取った第1のメモリデバイスは、このデバイスIDに従って、該第1のメモリデバイスで処理すべきか、他のメモリデバイス(第2のメモリデバイス)に転送するかを判断するようにしてもよい。
また、例えば図18に示すように、プロセッサ10がメモリデバイスとの接続用のポートを複数(図18の例では2つ)持つ場合には、該プロセッサ10に複数のメモリデバイス(図18の例では、メモリデバイス20と第2のメモリデバイス200)を直結することもできる。
(第1の実施形態の変形例2)
例えばHMCのように、メモリデバイス20内に複数の不揮発メモリ21のダイまたはチップを持たせる場合も考えられるので、図19に示すように、メモリデバイス20は、複数の不揮発メモリ21を備える形態であってもよい。図19の例では、複数の不揮発メモリ21が設けられる点、および、複数の不揮発メモリ21と1対1に対応する複数のメモリアクセス部213が設けられる点以外の構成は、上述の第1の実施形態と同様である。
複数のメモリアクセス部213の各々は、該メモリアクセス部213に接続されている不揮発メモリ21に対する書き込み要求に基づくデータの書き込みや読み出し要求に基づくデータの読み出しを行う。複数の不揮発メモリ21の各々には互いに異なるアドレスが割り当てられているので、各メモリアクセス部213は、リクエスト記憶部213のリクエスト(あるいはリクエストに対応する情報)に含まれるアドレス情報を参照して、該リクエストが、該メモリアクセス部213に対応する(該メモリアクセス部213に接続されている)不揮発メモリ21に対するリクエストであるかどうかを判断できる。
図20は、図19の変形例で、コントローラ22が、リクエストを受信またはリプライを送信するためのアクセスポートを2つ有する構成を示す。なお、これに限らず、コントローラ22が有するアクセスポートの数は任意に変更可能である。
(第2の実施形態)
次に、第2の実施形態について説明する。上述の第1の実施形態と共通する部分については適宜に説明を省略する。第2の実施形態の情報処理装置1のハードウェア構成は上述の第1の実施形態と同様であるので、詳細な説明は省略する。本実施形態では、プロセッサ10が発行する書き込み要求の中に、書き込み順序確認要求を兼ねる書き込み要求を設けた点で上述の第1の実施形態と異なる。
本実施形態では、書き込み要求には、書き込み要求に基づくデータの書き込みを行った後に、該書き込み要求に対する応答(リプライ)をプロセッサ10に送信することを要求するリプライ付きの書き込み要求と、書き込み要求に基づくデータの書き込みを行った後に、該書き込み要求に対する応答をプロセッサ10に送信することを必要としないリプライ無しの書き込み要求とがある。
図21は、リプライ付きの書き込み要求の一例を示す図である。図21では、コマンド情報として、64バイトのデータの書き込みを要求するリプライ付きの書き込み要求であることを識別する情報(図21の例では「64−byte WRITE request」)が指定される。また、図21の例では、タグ情報として「4」を示す番号が指定され、アドレス情報として「108A0」が指定され、データとして、「8F、42、・・・、0B、9D」という書き込み対象の64バイトのデータが指定される。つまり、図21のリプライ付きの書き込み要求は、メモリデバイス20の不揮発メモリ21のうち「108A0」が示す位置に対して、「8F、42、・・・、0B、9D」という64バイトのデータの書き込みを要求し、該データの書き込みを行った後に応答(リプライ)を返すことを要求するリプライ付きの書き込み要求であると考えることができる。
図22は、図21のリプライ付きの書き込み要求に対する応答を示すリプライの一例を示す図である。図22の例では、コマンド情報として、リプライ付きの書き込み要求に対するリプライであることを識別する情報(図22の例では「WRITE response」)が指定される。また、図22の例では、タグ情報として、図21のリプライ付きの書き込み要求に含まれるタグ情報と同一の情報(「4」を示す番号)が指定される。また、図22の例では、アドレス情報やデータは存在しない。
本実施形態では、コントローラ22は、リプライ付きの書き込み要求をプロセッサ10から受け取ると、リプライ付きの書き込み要求を受け取る前に受け取ったリプライ無しの書き込み要求に基づくデータの書き込みを行った後に、リプライ付きの書き込み要求に基づくデータの書き込みを行い、リプライ付きの書き込み要求に対する応答をホスト装置へ送信する。
すなわち、リプライ付きの書き込み要求を、書き込み順序確認要求(オーダリングリクエスト)として利用することができる。例えば、1以上の書き込み要求の集合である第2の書き込み集合よりも前にデータの書き込みが行われる第1の書き込み集合に含まれる1以上の書き込み要求のうち、最後にメモリデバイス20に送り込まれる書き込み要求はリプライ付きの書き込み要求であり、それ以外の書き込み要求はリプライ無しの書き込み要求であるという形態にすることができる。
また、例えば、1以上の書き込み要求の集合である第1の書き込み集合に含まれる1以上の書き込み要求はリプライ無しの書き込み要求であり、第1の書き込み集合よりも後にデータの書き込みが行われる第2の書き込み集合に含まれる1以上の書き込み要求のうち、最初にメモリデバイス20に送り込まれる書き込み要求は前記リプライ付きの書き込み要求であり、それ以外の書き込み要求は前記リプライ無しの書き込み要求であるという形態にすることもできる。
図23は、本実施形態のメモリアクセス部213の動作例を示すフローチャートである。まず、メモリアクセス部213は、リクエスト記憶部212内にリプライ付きの書き込み要求が記憶されているかどうかを確認する(ステップS21)。リクエスト記憶部212内にリプライ付きの書き込み要求が記憶されている場合(ステップS21:Yes)、メモリアクセス部213は、最も古いリプライ付きの書き込み要求よりも古いリプライ無しの書き込み要求が記憶されているかどうかを確認する(ステップS22)。最も古いリプライ付きの書き込み要求よりも古いリプライ無しの書き込み要求が記憶されている場合(ステップS22:Yes)、または、上述のステップS21において、リクエスト記憶部212内にリプライ付きの書き込み要求が記憶されていない場合(ステップS21:No)、処理は後述のステップS23に移行する。
ステップS23において、メモリアクセス部213は、リクエスト記憶部212内にリプライ無しの書き込み要求または読み出し要求が記憶されているかどうかを確認する。リクエスト記憶部212内にリプライ無しの書き込み要求または読み出し要求が記憶されていない場合(ステップS23:No)は、処理はステップS21に戻る一方、リクエスト記憶部212内にリプライ無しの書き込み要求または読み出し要求が記憶されている場合(ステップS23:Yes)は、メモリアクセス部213は、リクエスト記憶部212からリプライ無しの書き込み要求または読み出し要求を取り出す(ステップS24)。ステップS24におけるリプライ無しの書き込み要求または読み出し要求の取り出し方法は任意であるが、最も単純な方法としては、リクエスト記憶部212内のリプライ無しの書き込み要求および読み出し要求の中で最も古いものを取り出すという方法である。別の方法としては、例えば同じロウページに対するリプライ無しの書き込み要求または読み出し要求が連続するように取り出すという方法も考えられる。さらに別の方法としては、同じロウページに対するリプライ無しの書き込み要求または読み出し要求が連続するように取り出すものの、一定時間以上にわたってリクエスト記憶部212から取り出されていないリクエストは優先的に取り出すという方法が考えられる。他にも様々な方法を用いて構わない。
ステップS24で取り出したリクエストがリプライ無しの書き込み要求である場合(ステップS25:Yes)、メモリアクセス部213は、取り出したリプライ無しの書き込み要求に基づくデータの書き込みを行い(ステップS26)、処理はステップS21に戻る。一方、ステップS24で取り出したリクエストが読み出し要求である場合(ステップS25:No)、メモリアクセス部213は、取り出した読み出し要求に基づくデータの読み出しを行い(ステップS27)、読み出したデータを含むリプライ(読み出し要求に対する応答)の送信をリプライ送信部214に指示する(ステップS28)。この指示を受けたリプライ送信部214は、ステップS24で取り出した読み出し要求に対するリプライをプロセッサ10へ送信する。そして、処理はステップS21に戻る。
一方、上述のステップS22において、最も古いリプライ付きの書き込み要求よりも古いリプライ無しの書き込み要求が記憶されていない場合(ステップS22:No)、メモリアクセス部213は、その最も古いリプライ付きの書き込み要求をリクエスト記憶部212から取り出し(ステップS29)、取り出したリプライ付きの書き込み要求に基づくデータの書き込みを行う(ステップS30)。そして、メモリアクセス部213は、リプライ付きの書き込み要求に対する応答(リプライ)の送信をリプライ送信部214に指示する(ステップS31)。この指示を受けたリプライ送信部214は、リプライ付きの書き込み要求に対する応答をプロセッサ10へ送信する。そして、処理はステップS21に戻る。
なお、図23の例では、書き込み順序確認要求(オーダリングリクエスト)の機能を兼ねるリプライ付きの書き込み要求で指定された書き込み対象のデータが、不揮発メモリ21のメモリセルへ書き込まれて永続的になってから、該リプライ付きの書き込み要求に対応するリプライを送り返す実施方法を示している。この実施方法の変形例として、書き込み順序確認要求(オーダリングリクエスト)の機能を兼ねるリプライ付きの書き込み要求に基づくデータの書き込みを開始後、書き込み対象のデータが不揮発メモリ21のメモリセルへ書き込まれて永続的になる前に、対応するリプライを送り返すようにしても構わない。
(第3の実施形態)
次に、第3の実施形態について説明する。上述の各実施形態と共通する部分については適宜に説明を省略する。第3の実施形態の情報処理装置1のハードウェア構成は上述の第1の実施形態と同様であるので、詳細な説明は省略する。本実施形態では、上述の第2の実施形態と同様に、プロセッサ10が発行する書き込み要求の中に、書き込み順序確認要求を兼ねる書き込み要求を設けた点で上述の第1の実施形態と異なる。さらに、本実施形態では、書き込み順序確認要求を兼ねる書き込み要求は書き込み順序確認の時点よりも前の任意の時点で書き込みができるように、書き込み順序確認要求を兼ねる書き込み要求を、データの書き込みを行ったか否かを示すフラグ情報と関連付けて(対応付けて)リクエスト記憶部212で管理する点で上述の第2の実施形態と異なる。
本実施形態では、書き込み要求には、書き込み要求に基づくデータの書き込みを行った後に、該書き込み要求に対する応答をプロセッサ10に送信することを要求するリプライ付きの書き込み要求と、該書き込み要求に基づくデータの書き込みを行った後に、該書き込み要求に対する応答をプロセッサ10に送信することを必要としないリプライ無しの書き込み要求とがある。そして、コントローラ22は、リプライ付きの書き込み要求をプロセッサ10から受け取ると、該リプライ付きの書き込み要求を受け取る前に受け取ったリプライ無しの書き込み要求に基づくデータの書き込みと該リプライ付きの書き込み要求に基づくデータの書き込みを行った後、該リプライ付きの書き込み要求に対する応答をプロセッサ10へ送信する。本実施形態では、コントローラ22は、データの書き込みを行っていないことを示すように設定したフラグ情報と関連付けてリクエスト記憶部212に記憶していたリプライ付きの書き込み要求を取り出して、その取り出したリプライ付きの書き込み要求に基づくデータの書き込みを行った後、データの書き込みを行ったことを示すように設定したフラグ情報と関連付けて、該リプライ付きの書き込み要求をリクエスト記憶部212の元の位置に戻し、該リプライ付きの書き込み要求を受け取る前に受け取った書き込み要求に基づくデータの書き込みを行った後に、該リプライ付きの書き込み要求に対する応答をホスト装置に送信する。
例えば、1以上の書き込み要求の集合である第2の書き込み集合よりも前にデータの書き込みが行われる第1の書き込み集合に含まれる1以上の書き込み要求のうち、最後にメモリデバイス20に送り込まれる書き込み要求はリプライ付きの書き込み要求であり、それ以外の書き込み要求はリプライ無しの書き込み要求であるという形態にすることができる。
図24は、本実施形態のメモリアクセス部213の動作例を示すフローチャートである。まず、メモリアクセス部213は、リクエスト記憶部212内に処理済みのリプライ付きの書き込み要求(つまり、データの書き込みを行ったことを示すように設定されたフラグ情報と関連付けられたリプライ付きの書き込み要求)が記憶されているかどうかを確認する(ステップS41)。リクエスト記憶部212内に処理済みのリプライ付きの書き込み要求が記憶されている場合(ステップS41:Yes)、メモリアクセス部213は、最も古い処理済みのリプライ付きの書き込み要求よりも古いリクエストは、読み出し要求だけであるか否かを確認する(ステップS42)。最も古い処理済みのリプライ付きの書き込み要求よりも古いリクエストが読み出し要求だけでは無い場合(ステップS42:No)、または、上述のステップS41において、リクエスト記憶部212内に処理済みのリプライ付きの書き込み要求が記憶されていない場合(ステップS41:No)、処理は後述のステップS43に移行する。
ステップS43において、メモリアクセス部213は、リクエスト記憶部212内に、リプライ無しの書き込み要求、読み出し要求および処理済みでないリプライ付きの書き込み要求(つまり、データの書き込みを行っていないことを示すように設定されたフラグ情報と関連付けられたリプライ付きの書き込み要求)のうちの何れかが記憶されているかどうかを確認する。リクエスト記憶部212内に、リプライ無しの書き込み要求、読み出し要求および処理済みでないリプライ付きの書き込み要求のうちの何れかが記憶されていない場合(ステップS43:No)は、処理はステップS41に戻る一方、リクエスト記憶部212内に、リプライ無しの書き込み要求、読み出し要求および処理済みでないリプライ付きの書き込み要求のうちの何れかが記憶されている場合(ステップS43:Yes)は、メモリアクセス部213は、リクエスト記憶部212から、リプライ無しの書き込み要求、読み出し要求および処理済みでないリプライ付きの書き込み要求のうちの何れかを取り出す(ステップS44)。ステップS44におけるリクエストの取り出し方法は任意であるが、最も単純な方法としては、リクエスト記憶部212内のリプライ無しの書き込み要求、読み出し要求および処理済みでないリプライ付きの書き込み要求の中で最も古いものを取り出すという方法である。別の方法としては、例えば同じロウページに対する、処理済みでないリプライ付きの書き込み要求またはリプライ無しの書き込み要求または読み出し要求が連続するように取り出すという方法も考えられる。さらに別の方法としては、同じロウページに対する、処理済みでないリプライ付きの書き込み要求またはリプライ無しの書き込み要求または読み出し要求が連続するように取り出すものの、一定時間以上にわたってリクエスト記憶部212から取り出されていないリクエストは優先的に取り出すという方法も考えられる。他にも様々な方法を用いて構わない。
メモリアクセス部213は、ステップS44で取り出したリクエストの種類を判断し(ステップS45)、ステップS44で取り出したリクエストがリプライ付きの書き込み要求(処理済みでないリプライ付きの書き込み要求)である場合、そのリプライ付きの書き込み要求に基づくデータの書き込みを行い(ステップS46)、そのリプライ付きの書き込み要求を、処理済みのリプライ付きの書き込み要求として、リクエスト記憶部212の元の位置に戻す(ステップS47)。すなわち、メモリアクセス部213は、そのリプライ付きの書き込み要求を、データの書き込みを行ったことを示すように設定したフラグ情報に関連付けて、リクエスト記憶部212の元の位置に戻す。そして、処理はステップS41に戻る。
また、ステップS44で取り出したリクエストがリプライ無しの書き込み要求である場合、メモリアクセス部213は、そのリプライ無しの書き込み要求に基づくデータの書き込みを行う(ステップS48)。そして、処理はステップS41に戻る。
さらに、ステップS44で取り出したリクエストが読み出し要求である場合、メモリアクセス部213は、その読み出し要求に基づくデータの読み出しを行い(ステップS49)、読み出したデータを含むリプライの送信をリプライ送信部214に指示する(ステップS50)。この指示を受けたリプライ送信部214は、ステップS44で取り出した読み出し要求に対する応答(リプライ)をプロセッサ10へ送信する。そして、処理はステップS41に戻る。
一方、上述のステップS42において、最も古い処理済みのリプライ付きの書き込み要求よりも古いリクエストが読み出し要求だけである場合(ステップS42:Yes)、メモリアクセス部213は、その最も古い処理済みのリプライ付きの書き込み要求をリクエスト記憶部212から取り出し(ステップS51)、取り出した処理済みのリプライ付きの書き込み要求に対するリプライの送信をリプライ送信部214に指示する(ステップS52)。この指示を受けたリプライ送信部214は、ステップS51で取り出した処理済みのリプライ付きの書き込み要求に対するリプライをプロセッサ10へ送信する。そして、処理はステップS41に戻る。
なお、上述の第2の実施形態および第3の実施形態の別の変形例としては、例えば書き込み要求中にオーダリング保証の機能(書き込み順序確認要求としての機能)を持たせるか持たせないかを指定する別のフラグ情報を設け、コントローラ22は、書き込み要求に含まれる該フラグ情報に応じて、通常の書き込み要求に対応する処理を実行するか、オーダリングを保証するための書き込み要求に対応する処理を実行するかを切り替える形態であってもよい。
(第4の実施形態)
次に、第4の実施形態について説明する。上述の各実施形態と共通する部分については適宜に説明を省略する。第4の実施形態の情報処理装置1のハードウェア構成は上述の第1の実施形態と同様であるので、詳細な説明は省略する。本実施形態では、不揮発メモリ21のうち特定の位置(アドレス)からのデータの読み出しを要求する特定読み出し要求が、書き込み順序確認要求の役割を果たす点で上述の各実施形態と異なる。
コントローラ22は、上記特定読み出し要求をプロセッサ10から受け取ると、特定読み出し要求を受け取る前に受け取った書き込み要求に基づくデータの書き込みを行った後に、特定読み出し要求に基づくデータの読み出しを行い、特定読み出し要求に対する応答をプロセッサ10に送信する。データの読み出しを行い、特定読み出し要求に対する応答をプロセッサ10に送信する。特定読み出し要求とそうでない読み出し要求の識別は、指定された読み出し位置(アドレス)が特定のものかどうかで判断する。特定のアドレスとして、あらかじめ決めておいた固定のアドレス(例えば0番地やFFFFFF番地など)を使うことができる。また、コントローラ22内に特定のアドレスを記憶する特定アドレスレジスタを設け、特定アドレスレジスタには任意のアドレスを設定できる手段を設け、読み出し要求に指定されたアドレスが特定アドレスレジスタの値と同じであれば特定読み出し要求であると判断することもできる。
図25は、本実施形態のメモリアクセス部213の動作例を示すフローチャートである。まず、メモリアクセス部213は、リクエスト記憶部212内に特定読み出し要求が記憶されているかどうかを確認する(ステップS61)。リクエスト記憶部212内に特定読み出し要求が記憶されている場合(ステップS61:Yes)、メモリアクセス部213は、最も古い特定読み出し要求よりも古い書き込み要求が記憶されているかどうかを確認する(ステップS62)。最も古い特定読み出し要求よりも古い書き込み要求が記憶されている場合(ステップS62:Yes)、または、上述のステップS61において、リクエスト記憶部212内に特定読み出し要求が記憶されていない場合(ステップS61:No)、処理は後述のステップS63に移行する。
ステップS63において、メモリアクセス部213は、リクエスト記憶部212内に書き込み要求または特定読み出し要求とは異なる読み出し要求が記憶されているかどうかを確認する。リクエスト記憶部212内に書き込み要求または特定読み出し要求とは異なる読み出し要求が記憶されていない場合(ステップS63:No)は、処理はステップS61に戻る一方、リクエスト記憶部212内に書き込み要求または特定読み出し要求とは異なる読み出し要求が記憶されている場合(ステップS63:Yes)は、メモリアクセス部213は、リクエスト記憶部212から書き込み要求または特定読み出し要求とは異なる読み出し要求を取り出す(ステップS64)。ステップS64における書き込み要求または読み出し要求の取り出し方法は任意であるが、最も単純な方法としては、リクエスト記憶部212内の書き込み要求および読み出し要求の中で最も古いものを取り出すという方法である。別の方法としては、例えば同じロウページに対する書き込み要求または読み出し要求が連続するように取り出すという方法も考えられる。さらに別の方法としては、同じロウページに対する書き込み要求または読み出し要求が連続するように取り出すものの、一定時間以上にわたってリクエスト記憶部212から取り出されていないリクエストは優先的に取り出すという方法も考えられる。他にも様々な方法を用いて構わない。
ステップS64で取り出したリクエストが書き込み要求である場合(ステップS65:Yes)、メモリアクセス部213は、取り出した書き込み要求に基づくデータの書き込み(不揮発メモリ21へのデータの書き込み)を行い(ステップS66)、処理はステップS61に戻る。一方、ステップS64で取り出したリクエストが読み出し要求(特定読み出し要求とは異なる読み出し要求)である場合(ステップS65:No)、メモリアクセス部213は、取り出した読み出し要求に基づくデータの読み出し(不揮発メモリ21からのデータの読み出し)を行い(ステップS67)、その読み出したデータを含むリプライの送信をリプライ送信部214に指示する(ステップS68)。この指示を受けたリプライ送信部214は、ステップS64で取り出した読み出し要求に対するリプライをプロセッサ10へ送信する。そして、処理はステップS61に戻る。
一方、上述のステップS62において、最も古い特定読み出し要求よりも古い書き込み要求が記憶されていない場合(ステップS62:No)、メモリアクセス部213は、その最も古い特定読み出し要求をリクエスト記憶部212から取り出し(ステップS69)、取り出した特定読み出し要求に基づくデータの読み出し(不揮発メモリ21からのデータの読み出し)を行い(ステップS70)、その読み出したデータを含むリプライ(特定読み出し要求に対するリプライ)の送信をリプライ送信部214に指示する(ステップS71)。この指示を受けたリプライ送信部214は、特定読み出し要求に対するリプライをプロセッサ10へ送信する。そして、処理はステップS61に戻る。
(第5の実施形態)
次に、第5の実施形態について説明する。上述の各実施形態と共通する部分については適宜に説明を省略する。第5の実施形態の情報処理装置1のハードウェア構成は上述の第1の実施形態と同様であるので、詳細な説明は省略する。本実施形態では、不揮発メモリ21のうち特定の位置(アドレス)に対するデータの書き込みを要求する特定書き込み要求が、書き込み順序確認要求の役割を果たす点で上述の各実施形態と異なる。より具体的には、特定書き込み要求は、該特定書き込み要求に基づくデータの書き込みを行った後に、該特定書き込み要求に対する応答をプロセッサ10に送信することを要求するリプライ付きの書き込み要求である。
コントローラ22は、特定書き込み要求をプロセッサ10から受け取ると、特定書き込み要求を受け取る前に受け取った書き込み要求に基づくデータの書き込みを行った後に、特定書き込みに基づくデータの読み出しを行い、特定書き込み要求に対する応答(リプライ)をプロセッサ10に送信する。特定書き込み要求とそうでない書き込み要求の識別は、指定された書き込み位置(アドレス)が特定のものかどうかで判断する。特定のアドレスとして、あらかじめ決めておいた固定のアドレス(例えば0番地やFFFFFF番地など)を使うことができる。また、コントローラ22内に特定のアドレスを記憶する特定アドレスレジスタを設け、特定アドレスレジスタには任意のアドレスを設定できる手段を設け、書き込み要求に指定されたアドレスが特定アドレスレジスタの値と同じであれば特定書き込み要求であると判断することもできる。
例えば、1以上の書き込み要求の集合である第2の書き込み集合よりも前にデータの書き込みが行われる第1の書き込み集合に含まれる1以上の書き込み要求のうち、最後にメモリデバイス20に送り込まれる書き込み要求は上記特定書き込み要求であってもよい。その他の書き込み要求は、リプライ付きの書き込み要求であってもよいし、リプライ無しの書き込み要求であっても構わない。
また、例えば、1以上の書き込み要求の集合である第1の書き込み集合よりも後にデータの書き込みが行われる第2の書き込み集合に含まれる1以上の書き込み要求のうち、最初にメモリデバイス20に送り込まれる書き込み要求は上記特定書き込み要求であってもよい。この場合、特定書き込み要求に対するリプライが返ってきた後、その他の書き込み要求を発行する。その他の書き込み要求は、リプライ付きの書き込み要求であってもよいし、リプライ無しの書き込み要求であっても構わない。
図26は、本実施形態のメモリアクセス部213の動作例を示すフローチャートである。まず、メモリアクセス部213は、リクエスト記憶部212内に特定書き込み要求が記憶されているかどうかを確認する(ステップS81)。リクエスト記憶部212内に特定書き込み要求が記憶されている場合(ステップS81:Yes)、メモリアクセス部213は、最も古い特定書き込み要求よりも古い、特定書き込み要求とは異なる書き込み要求(リプライ付きの書き込み要求であってもよいし、リプライ無しの書き込み要求であってもよい)が記憶されているかどうかを確認する(ステップS82)。最も古い特定書き込み要求よりも古い書き込み要求が記憶されている場合(ステップS82:Yes)、または、上述のステップS81において、リクエスト記憶部212内に特定書き込み要求が記憶されていない場合(ステップS81:No)、処理は後述のステップS83に移行する。
ステップS83において、メモリアクセス部213は、リクエスト記憶部212内に、特定書き込み要求とは異なる書き込み要求または読み出し要求が記憶されているかどうかを確認する。リクエスト記憶部212内に、特定書き込み要求とは異なる書き込み要求または読み出し要求が記憶されていない場合(ステップS83:No)は、処理はステップS81に戻る一方、リクエスト記憶部212内に、特定の書き込み要求とは異なる書き込み要求または読み出し要求が記憶されている場合(ステップS83:Yes)は、メモリアクセス部213は、リクエスト記憶部212から、特定書き込み要求とは異なる書き込み要求または読み出し要求を取り出す(ステップS84)。ステップS84におけるリクエストの取り出し方法は任意であるが、最も単純な方法としては、リクエスト記憶部212内の、特定書き込み要求とは異なる書き込み要求および読み出し要求の中で最も古いものを取り出すという方法である。別の方法としては、例えば同じロウページに対する、特定書き込み要求とは異なる書き込み要求または読み出し要求が連続するように取り出すという方法も考えられる。さらに別の方法としては、同じロウページに対する、特定書き込み要求とは異なる書き込み要求または読み出し要求が連続するように取り出すものの、一定時間以上にわたってリクエスト記憶部212から取り出されていないリクエストは優先的に取り出すという方法も考えられる。他にも様々な方法を用いて構わない。
ステップS84で取り出したリクエストが書き込み要求(特定書き込み要求とは異なる書き込み要求)である場合(ステップS85:Yes)、メモリアクセス部213は、取り出した書き込み要求に基づくデータの書き込みを行い(ステップS86)、処理はステップS81に戻る。一方、ステップS84で取り出したリクエストが読み出し要求である場合(ステップS85:No)、メモリアクセス部213は、取り出した読み出し要求に基づくデータの読み出しを行い(ステップS87)、読み出したデータを含むリプライ(読み出し要求に対する応答)の送信をリプライ送信部214に指示する(ステップS88)。この指示を受けたリプライ送信部214は、ステップS84で取り出した読み出し要求に対するリプライをプロセッサ10へ送信する。そして、処理はステップS81に戻る。
一方、上述のステップS82において、最も古い特定書き込み要求よりも古い書き込み要求が記憶されていない場合(ステップS82:No)、メモリアクセス部213は、その最も古い特定書き込み要求をリクエスト記憶部212から取り出し(ステップS89)、取り出した特定書き込み要求に基づくデータの書き込みを行う(ステップS90)。そして、メモリアクセス部213は、特定書き込み要求に対する応答(リプライ)の送信をリプライ送信部214に指示する(ステップS91)。この指示を受けたリプライ送信部214は、特定書き込み要求に対する応答をプロセッサ10へ送信する。そして、処理はステップS81に戻る。
(第6の実施形態)
次に、第6の実施形態について説明する。上述の各実施形態と共通する部分については適宜に説明を省略する。第6の実施形態の情報処理装置1のハードウェア構成は上述の第1の実施形態と同様であるので、詳細な説明は省略する。本実施形態では、上述の第5の実施形態と同様に、不揮発メモリ21のうち特定の位置に対するデータの書き込みを要求する特定書き込み要求が、書き込み順序確認要求の役割を果たす点で上述の各実施形態と異なる。さらに、本実施形態では、特定書き込み要求は書き込み順序確認の時点よりも前の任意の時点で書き込みができるように、特定書き込み要求を、データの書き込みを行ったか否かを示すフラグ情報と関連付けて(対応付けて)リクエスト記憶部212で管理する点で上述の第5の実施形態と異なる。
本実施形態では、不揮発メモリ21のうち特定の位置に対するデータの書き込みを要求する特定書き込み要求は、特定書き込み要求に基づくデータの書き込みを行った後に、特定書き込み要求に対する応答をプロセッサ10に送信することを要求する。つまり、特定書き込み要求は、リプライ付きの書き込み要求の一態様であると考えることができる。そして、コントローラ22は、特定書き込み要求をプロセッサ10から受け取ると、該特定書き込み要求を受け取る前に受け取った書き込み要求に基づくデータの書き込みと該特定書き込み要求に基づくデータの書き込みを行った後に、該特定書き込み要求に対する応答をプロセッサ10に送信する。本実施形態では、コントローラ22は、データの書き込みを行っていないことを示すように設定したフラグ情報と関連付けてリクエスト記憶部212に記憶していた特定書き込み要求を取り出して、その取り出した特定書き込み要求に基づくデータの書き込みを行った後、データの書き込みを行ったことを示すように設定したフラグ情報と関連付けて、該特定書き込み要求をリクエスト記憶部212の元の位置に戻し、該特定書き込み要求を受け取る前に受け取った書き込み要求に基づくデータの書き込みを行った後に、該特定書き込み要求に対する応答をプロセッサ10へ送信する。
例えば、1以上の書き込み要求の集合である第2の書き込み集合よりも前にデータの書き込みが行われる第1の書き込み集合に含まれる1以上の書き込み要求のうち、最後にメモリデバイス20に送り込まれる書き込み要求は特定書き込み要求であるという形態にすることができる。その特定書き込み要求に対応するリプライを待ってから、第2の書き込み集合に含まれる書き込み要求を発行する。
図27は、本実施形態のメモリアクセス部213の動作例を示すフローチャートである。まず、メモリアクセス部213は、リクエスト記憶部212内に処理済みの特定書き込み要求(つまり、データの書き込みを行ったことを示すフラグ情報を含む特定書き込み要求)が記憶されているかどうかを確認する(ステップS101)。リクエスト記憶部212内に処理済みの特定書き込み要求が記憶されている場合(ステップS101:Yes)、メモリアクセス部213は、最も古い処理済みの特定書き込み要求よりも古いリクエストは、読み出し要求だけであるか否かを確認する(ステップS102)。最も古い処理済みの特定書き込み要求よりも古いリクエストが読み出し要求だけでは無い場合(ステップS102:No)、または、上述のステップS101において、リクエスト記憶部212内に処理済みの特定書き込み要求が記憶されていない場合(ステップS101:No)、処理は後述のステップS103に移行する。
ステップS103において、メモリアクセス部213は、リクエスト記憶部212内に、特定書き込み要求とは異なる書き込み要求(リプライ付きの書き込み要求であってもよいし、リプライ無しの書き込み要求であってもよい)、読み出し要求および処理済みでない特定書き込み要求(つまり、データの書き込みを行っていないことを示すフラグ情報を含む特定書き込み要求)のうちの何れかが記憶されているかどうかを確認する。リクエスト記憶部212内に、特定書き込み要求とは異なる書き込み要求、読み出し要求および処理済みでない特定書き込み要求のうちの何れも記憶されていない場合(ステップS103:No)は、処理はステップS101に戻る一方、リクエスト記憶部212内に、特定書き込み要求とは異なる書き込み要求、読み出し要求および処理済みでない特定書き込み要求のうちの何れかが記憶されている場合(ステップS103:Yes)は、メモリアクセス部213は、リクエスト記憶部212から、特定書き込み要求とは異なる書き込み要求、読み出し要求および処理済みでない特定書き込み要求のうちの何れかを取り出す(ステップS104)。ステップS104におけるリクエストの取り出し方法は任意であるが、最も単純な方法としては、リクエスト記憶部212内の特定書き込み要求とは異なる書き込み要求、読み出し要求および処理済みでない特定書き込み要求の中で最も古いものを取り出すという方法である。別の方法としては、例えば同じロウページに対する、処理済みでない特定書き込み要求または特定書き込み要求とは異なる書き込み要求または読み出し要求が連続するように取り出すという方法も考えられる。さらに別の方法としては、同じロウページに対する、処理済みでない特定書き込み要求または特定書き込み要求とは異なる書き込み要求または読み出し要求が連続するように取り出すものの、一定時間以上にわたってリクエスト記憶部212から取り出されていないリクエストは優先的に取り出すという方法である。他にも様々な方法を用いて構わない。
メモリアクセス部213は、ステップS104で取り出したリクエストの種類を判断し(ステップS105)、ステップS104で取り出したリクエストが特定書き込み要求(処理済みでない特定書き込み要求)である場合、その特定書き込み要求に基づくデータの書き込みを行い(ステップS106)、その特定書き込み要求を、処理済みの特定書き込み要求として、リクエスト記憶部212の元の位置に戻す(ステップS107)。すなわち、メモリアクセス部213は、その特定書き込み要求に含まれるフラグ情報を、データの書き込みを行ったことを示すように設定した後、その特定書き込み要求を、リクエスト記憶部212の元の位置に戻す。そして、処理はステップS101に戻る。
また、ステップS104で取り出したリクエストが、特定書き込み要求とは異なる書き込み要求である場合、メモリアクセス部213は、その書き込み要求に基づくデータの書き込みを行う(ステップS108)。そして、処理はステップS101に戻る。
さらに、ステップS104で取り出したリクエストが読み出し要求である場合、メモリアクセス部213は、その読み出し要求に基づくデータの読み出しを行い(ステップS109)、読み出したデータを含むリプライの送信をリプライ送信部214に指示する(ステップS110)。この指示を受けたリプライ送信部214は、ステップS104で取り出した読み出し要求に対するリプライをプロセッサ10へ送信する。そして、処理はステップS101に戻る。
一方、上述のステップS102において、最も古い処理済みの特定書き込み要求よりも古いリクエストが読み出し要求だけである場合(ステップS102:Yes)、メモリアクセス部213は、その最も古い処理済みの特定書き込み要求をリクエスト記憶部212から取り出し(ステップS111)、取り出した処理済みの特定書き込み要求に対する応答(リプライ)の送信をリプライ送信部214に指示する(ステップS112)。この指示を受けたリプライ送信部214は、ステップS111で取り出した処理済みの特定書き込み要求に対する応答をプロセッサ10へ送信する。そして、処理はステップS101に戻る。
(第7の実施形態)
次に、第7の実施形態について説明する。上述の各実施形態と共通する部分については適宜に説明を省略する。本実施形態では、不揮発メモリ21は複数の領域(以下では、「ブロック」と称する場合がある)から構成され、ブロック毎に、該ブロックに対応する書き込み集合間の書き込み順序(オーダリング)を保証するための構成を採用する点で上述の各実施形態と異なる。
例えば複数の不揮発メモリ21を内蔵するメモリデバイス20においては、各不揮発メモリ21をブロックとすることができる。また、例えば複数のバンクを持つ不揮発メモリ21を内蔵するメモリデバイス20においては、バンクをブロックとすることができる。さらに、メモリデバイス20内の全ての不揮発メモリ21を予め決まっているサイズに分割して、それらをブロックとすることもできる。さらに別の方法としては、コントローラ22が、ブロックを管理するためのブロック管理情報(例えばテーブル形式の情報)を有し、不揮発メモリ21を任意のサイズのブロックに分割し、各ブロックの開始アドレスと終了アドレスをブロック管理情報内に記録し、このブロック管理情報を参照して、プロセッサ10から受け取ったリクエストがどのブロックに属するのか(どのブロックに対応するのか)判断するように実施しても構わない。
図28は、4G(ギガ)バイトの不揮発メモリ21を4つのブロックに分割した例を示す。また、図29は、4Gバイトの不揮発メモリ21を8つのブロックに分割した例を示す。
図30は、本実施形態における書き込み順序確認要求(オーダリングリクエスト)の一例を示す図である。図7に示した書き込み順序確認要求と比べると、図30の書き込み順序確認要求はアドレス情報を有している点が異なる。図30の例では、書き込み順序確認要求は、コマンド情報として、書き込み順序確認要求であることを識別する情報(図30の例では「ORDERING request」)が指定される。また、図30の例では、タグ情報として「2」を示す番号が指定され、アドレス情報として「562840」が指定されている。図30の書き込み順序確認要求は、不揮発メモリ21のうち「562840」が属するブロックにおける書き込み順序を保証するために、該ブロックに対応する、送信済みの1以上の書き込みに基づくデータの書き込みが行われたことの確認を要求する情報であると考えることもできる。また、図31は、図30の書き込み順序確認要求に対する応答(リプライ)の一例を示す図である。図31のリプライの形式は、図8に示したリプライの形式と同様である。
例えば図10のように、本実施形態のメモリデバイス20が、1つのリクエスト記憶部212と、1つのメモリアクセス部213とを有する構成である場合、メモリアクセス部213は、図28および図29のような、アドレス情報とブロックとの対応を示す情報(ブロック管理情報)を有し、リクエスト記憶部212に記憶されたリクエストに含まれるアドレス情報を参照して、該リクエストがどのブロックに向けたものかを判断する(該リクエストに対応するブロックを判断する)。つまり、メモリアクセス部213は、リクエスト記憶部212に記憶された複数のリクエストを、該リクエストに含まれるアドレス情報に基づいて、ブロック別に分類し、複数のブロックごとに、該ブロックに属する全てのリクエストを対象として、図12に示したような手順(この例では上述の第1の実施形態と同様の手順)でリクエストを処理する。このとき、特定のブロックの処理を優先しても構わないし、全ブロックに対して公平に処理を行うようにしてもよい。
また、例えば図32に示すように、ブロック毎に専用のリクエスト記憶部212を設けても構わない。図32は、図28のように4つのブロックから構成される不揮発メモリ21を有するメモリデバイス20が、4つのブロックと1対1に対応する4つのリクエスト記憶部212を有する構成である。
図33は、図32の構成のリクエスト受信部211の動作例を示すフローチャートである。リクエスト受信部211は、プロセッサ10からリクエストを受信すると(ステップS121)、その受信したリクエストに含まれるアドレス情報に基づいて、その受信したリクエストに対応するブロックを特定する(ステップS122)。そして、リクエスト受信部211は、特定したブロックに対応するリクエスト記憶部212に、受信したリクエストを受信した順序で記録する(ステップS123)。プロセッサ10から受信したリクエストは、該リクエストに対応するブロックに入るので、図32の構成のメモリアクセス部213は、アドレス情報とブロックとの対応を示す情報を持つ必要は無く、複数のリクエスト記憶部212ごとに(見方を変えれば複数のブロックごとに)、図12に示したような手順(この例では上述の第1の実施形態と同様の手順)でリクエストを処理することができる。
また、例えば図34に示すように、メモリデバイス20が複数の不揮発メモリ21を有し、各不揮発メモリ21がブロックに対応する場合には、複数の不揮発メモリ21(複数のブロック)ごとに、専用のリクエスト記憶部212とメモリアクセス部213が設けられてもよい。図34は、4つの不揮発メモリ21と1対1に対応する4つのブロックごとに、4つのリクエスト記憶部212と4つのメモリアクセス部213が設けられる構成である。この場合、リクエスト受信部211は図33の手順で、プロセッサ10から受信したリクエストを、該リクエストに対応するブロック用のリクエスト記憶部212に入れるので、メモリアクセス部213は、担当するブロック用のリクエスト記憶部212内のリクエストに対して、図12に示したような手順(この例では上述の第1の実施形態と同様の手順)でリクエストを処理することができる。
図35は図34の構成の変形例で、メモリデバイス20に搭載された4つの不揮発メモリ21が、図29のように8つのブロックを有し、1つの不揮発メモリ21に対して2つのブロックが対応する場合を示している。図35の例では、4つの不揮発メモリ21と1対1に対応する4つのメモリアクセス部213の各々に対して、複数(この例では2つ)のリクエスト記憶部212が割り当てられ、各メモリアクセス部213は、該メモリアクセス部213に割り当てられた2つのリクエスト記憶部212の各々に記憶された全てのリクエストを対象として、図12に示したような手順(この例では上述の第1の実施形態と同様の手順)でリクエストを処理することができる。
要するに、本実施形態のコントローラ22は、プロセッサ10から、複数のブロックのうちの何れかを示す対象ブロック(対象領域)に対応する送信済みの1以上の書き込み要求に基づくデータの書き込みが行われたことの確認を要求する書き込み順序確認要求(対象ブロックに対応するオーダリングリクエスト)を受け取ると、書き込み順序確認要求を受け取る前に受け取った、対象ブロックに対応する1以上の書き込み要求に基づくデータの書き込みを行った後に、書き込み順序確認要求に対する応答をプロセッサ10へ送信する形態であればよい。具体的な動作内容は、上述の第1の実施形態と同様に考えることができる。また、複数のブロックの各々は、不揮発メモリ21のアドレス空間を、予め定められているサイズで区切ることで得られる領域であってもよいし、不揮発メモリ21のアドレス空間を任意に分割することで得られる領域であってもよい。コントローラ22は、複数のブロックの各々に対応するアドレスの範囲を設定する。
また、本実施形態のメモリアクセス部213は、図12に示したような手順だけではなく、例えば図23に示したような手順(上述の第2の実施形態と同様の手順)でリクエストを処理することもできる。要するに、書き込み要求には、リプライ付きの書き込み要求と、リプライ無しの書き込み要求とがあり、コントローラ22は、複数のブロックのうちの何れかを示す対象ブロックに対応するリプライ付きの書き込み要求を示す第1の書き込み要求をプロセッサ10から受け取ると、第1の書き込み要求を受け取る前に受け取った、対象ブロックに対応する1以上のリプライ無しの書き込み要求に基づくデータの書き込みを行った後に、第1の書き込み要求に基づくデータの書き込みを行い、第1の書き込み要求に対するリプライをプロセッサ10へ送信する形態であってもよい。具体的な動作内容は、上述の第2の実施形態と同様に考えることができる。
例えば、対象ブロックに対応する1以上の書き込み要求の集合である第2の書き込み集合よりも前にデータの書き込みが行われ、かつ、対象ブロックに対応する1以上の書き込み要求の集合である第1の書き込み集合に含まれる1以上の書き込み要求のうち、最後にメモリデバイス20に送り込まれる書き込み要求は上記第1の書き込み要求であり、それ以外の書き込み要求はリプライ無しの書き込み要求であってもよい。また、例えば対象ブロックに対応する1以上の書き込み要求の集合である第1の書き込み集合に含まれる1以上の書き込み要求はリプライ無しの書き込み要求であり、第1の書き込み集合よりも後にデータの書き込みが行われ、かつ、対象ブロックに対応する1以上の書き込み要求の集合である第2の書き込み集合に含まれる1以上の書き込み要求のうち、最初にメモリデバイス20に送り込まれる書き込み要求は上記第1の書き込み要求であり、それ以外の書き込み要求はリプライ無しの書き込み要求であってもよい。
また、本実施形態のメモリアクセス部213は、例えば図24に示したような手順(上述の第3の実施形態と同様の手順)でリクエストを処理することもできる。要するに、上述の第3の実施形態と同様に、書き込み要求には、書き込み要求に基づくデータの書き込みを行った後に、書き込み要求に対する応答をプロセッサ10に送信することを要求するリプライ付きの書き込み要求と、リプライ無しの書き込み要求とがある。そして、上述の第3の実施形態と同様に、コントローラ22は、リプライ付きの書き込み要求をプロセッサ10から受け取ると、該リプライ付きの書き込み要求を受け取る前に受け取ったリプライ無しの書き込み要求に基づくデータの書き込みと該リプライ付きの書き込み要求に基づくデータの書き込みを行った後、該リプライ付きの書き込み要求に対する応答をプロセッサ10へ送信する。例えばコントローラ22は、複数のブロックのうちの何れかを示す対象ブロックに対応し、かつ、データの書き込みを行っていないことを示すように設定したフラグ情報と関連付けてリクエスト記憶部212に記憶していたリプライ付きの書き込み要求を示す第2の書き込み要求を取り出して、その取り出した第2の書き込み要求に基づくデータの書き込みを行った後、データの書き込みを行ったことを示すように設定したフラグ情報と関連付けて、第2の書き込み要求をリクエスト記憶部212の元の位置に戻し、第2の書き込み要求を受け取る前に受け取った、対象領域に対応する書き込み要求に基づくデータの書き込みを行った後に、第2の書き込み要求に対する応答をプロセッサ10に送信する形態であってもよい。具体的な動作内容は、上述の第3の実施形態と同様に考えることができる。
例えば対象領域に対応する1以上の書き込み要求の集合である第2の書き込み集合よりも前にデータの書き込みが行われ、かつ、対象領域に対応する1以上の書き込み要求の集合である第1の書き込み集合に含まれる1以上の書き込み要求のうち、最後にメモリデバイス20に送り込まれる書き込み要求は上記第2の書き込み要求であり、それ以外の書き込み要求はリプライ無しの書き込み要求であってもよい。
また、本実施形態のメモリアクセス部213は、例えば図25に示したような手順(上述の第4の実施形態と同様の手順)でリクエストを処理することもできる。要するに、コントローラ22は、複数のブロックのうちの何れかを示す対象ブロックの特定の位置(アドレス)からのデータの読み出しを要求する特定読み出し要求をプロセッサ10から受け取ると、特定読み出し要求を受け取る前に受け取った、対象ブロックに対応する書き込み要求に基づくデータの書き込みを行った後に、特定読み出し要求に基づくデータの読み出しを行い、特定読み出し要求に対する応答をプロセッサ10に送信する形態であってもよい。具体的な動作内容は、上述の第4の実施形態と同様に考えることができる。
また、本実施形態のメモリアクセス部213は、例えば図26に示したような手順(上述の第5の実施形態と同様の手順)でリクエストを処理することもできる。要するに、コントローラは、複数のブロックのうちの何れかを示す対象ブロックの特定の位置に対するデータの書き込みを要求する特定書き込み要求をプロセッサ10から受け取ると、特定書き込み要求を受け取る前に受け取った、対象ブロックに対応する1以上の書き込み要求に基づくデータの書き込みを行った後に、特定書き込み要求に基づくデータの書き込みを行い、特定書き込み要求に対する応答をプロセッサ10に送信する形態であってもよい。具体的な動作内容は、上述の第5の実施形態と同様に考えることができる。
例えば、対象領域に対応する1以上の書き込み要求の集合である第2の書き込み集合よりも前にデータの書き込みが行われ、かつ、対象領域に対応する1以上の書き込み要求の集合である第1の書き込み集合に含まれる1以上の書き込み要求のうち、最後にメモリデバイス20に送り込まれる書き込み要求は上記特定書き込み要求であってもよい。
また、例えば対象領域に対応する1以上の書き込み要求の集合である第1の書き込み集合よりも後にデータの書き込みが行われ、かつ、対象領域に対応する1以上の書き込み要求の集合である第2の書き込み集合に含まれる1以上の書き込み要求のうち、最初にメモリデバイス20に送り込まれる書き込み要求は上記特定書き込み要求であってもよい。そのリプライを待ってから残りの書き込み要求をメモリデバイス20に送り込む。
さらに、本実施形態のメモリアクセス部213は、例えば図27に示したような手順(上述の第6の実施形態と同様の手順)でリクエストを処理することもできる。要するに、複数のブロックのうちの何れかを示す対象ブロックの特定の位置に対するデータの書き込みを要求する特定書き込み要求は、特定書き込み要求に基づくデータの書き込みを行った後に、特定書き込み要求に対する応答をプロセッサ10に送信することを要求する。そして、上述の第6の実施形態と同様に、コントローラ22は、特定書き込み要求をプロセッサ10から受け取ると、該特定書き込み要求を受け取る前に受け取った書き込み要求に基づくデータの書き込みと該特定書き込み要求に基づくデータの書き込みを行った後に、該特定書き込み要求に対する応答をプロセッサ10に送信する。例えばコントローラ22は、データの書き込みを行っていないことを示すように設定したフラグ情報と関連付けてリクエスト記憶部212に記憶していた特定書き込み要求を取り出して、その取り出した特定書き込み要求に基づくデータの書き込みを行った後、データの書き込みを行ったことを示すように設定したフラグ情報と関連付けて、該特定書き込み要求をリクエスト記憶部212の元の位置に戻し、該特定書き込み要求を受け取る前に受け取った、対象ブロックに対応する1以上の書き込み要求に基づくデータの書き込みを行った後に、該特定書き込み要求に対する応答をプロセッサ10に送信する形態であってもよい。具体的な動作内容は、上述の第6の実施形態と同様に考えることができる。
例えば対象ブロックに対応する1以上の書き込み要求の集合である第2の書き込み集合よりも前にデータの書き込みが行われ、かつ、対象ブロックに対応する1以上の書き込み要求の集合である第1の書き込み集合に含まれる1以上の書き込み要求のうち、最後にメモリデバイス20に送り込まれる書き込み要求は、上記特定書き込み要求であってもよい。
(第8の実施形態)
次に、第8の実施形態について説明する。上述の各実施形態と共通する部分については適宜に説明を省略する。本実施形態では、書き込み要求は、該書き込み要求に対応する処理を含む1以上の処理の集合を示すグループを識別するグループ識別情報(以下では、「グループID」と称する場合がある)を含み、グループごとに、該グループに対応する書き込み集合間の書き込み順序(オーダリング)を保証するための構成を採用する点で上述の各実施形態と異なる。本実施形態では、上述の第7の実施形態と異なり、同じグループに対応するデータの書き込み先は、不揮発メモリ21の何れの領域であっても構わない(同一ブロックである必要は無い)ので、上述の第7の実施形態に比べて柔軟に不揮発メモリ21を管理することができる。
図36は、本実施形態におけるリクエストの形式の一例を示す図である。図36の例では、対象となるグループを識別するグループIDをさらに含んでいる。図37は、本実施形態における書き込み順序確認要求(オーダリングリクエスト)の一例を示す図である。図37の書き込み順序確認要求は、コマンド情報として、書き込み順序確認要求を識別する情報(図37の例では「ORDERING requet」)が指定される。また、図30の例では、タグ情報として、「7」を示す番号が指定され、グループIDとして、「5」を示す番号が指定されている。図37の書き込み順序確認要求は、「5」を示す番号で識別されるグループに対応する、送信済みの1以上の書き込みに基づくデータの書き込みが行われたことの確認を要求する情報であると考えることもできる。本実施形態においては、リードリクエストやライトリクエストもグループIDを含む。
例えば図10のように、本実施形態のメモリデバイス20が、1つのリクエスト記憶部212と、1つのメモリアクセス部213とを有する構成である場合、メモリアクセス部213は、リクエスト記憶部212に記憶されたリクエストに含まれるグループIDを参照して、該リクエストがどのグループに属するのかを判断する(該リクエストに対応するグループを判断する)。つまり、メモリアクセス部213は、リクエスト記憶部212に記憶された複数のリクエストを、該リクエストに含まれるグループIDに基づいて、グループ別に分類し、複数のグループごとに、該グループに対応する全てのリクエストを対象として、図12に示したような手順(この例では上述の第1の実施形態と同様の手順)でリクエストを処理する。このとき、特定のグループの処理を優先しても構わないし、全グループに対して公平に処理を行うようにしてもよい。
また、例えば図38に示すように、リクエスト記憶部212は、複数のグループと1対1に対応する複数(図38の例では8つ)のグループ用の記憶領域を有する形態であってもよい。
図39は、図38の構成のリクエスト受信部211の動作例を示すフローチャートである。リクエスト受信部211は、プロセッサ10からリクエストを受信すると(ステップS131)、その受信したリクエストに含まれるグループIDで識別されるグループを特定する(ステップS132)。そして、リクエスト受信部211は、特定したグループに対応するグループ用の記憶領域に、受信したリクエストを受信した順序で記録する(ステップS133)。
図38の構成のメモリアクセス部213は、複数のグループ用の記憶領域ごとに(見方を変えれば複数のグループごとに)、図12に示したような手順(この例では上述の第1の実施形態と同様の手順)でリクエストを処理することができる。
要するに、本実施形態では、書き込み要求は、書き込み要求に対応する処理を含む1以上の処理の集合を示すグループを識別するグループ識別情報(グループID)を含み、コントローラ22は、プロセッサ10から、何れかのグループ識別情報を示す対象グループ識別情報を含む送信済みの1以上の書き込み要求に基づくデータの書き込みが行われたことの確認を要求する書き込み順序確認要求を受け取ると、書き込み順序確認要求を受け取る前に受け取った、対象グループ識別情報を含む1以上の書き込み要求に基づくデータの書き込みを行った後に、書き込み順序確認要求に対する応答をプロセッサ10へ送信する形態であればよい。具体的な動作内容は、上述の第1の実施形態と同様に考えることができる。
また、本実施形態のメモリアクセス部213は、図12に示したような手順だけではなく、例えば図23に示したような手順(上述の第2の実施形態と同様の手順)でリクエストを処理することもできる。要するに、書き込み要求は、該書き込み要求に対応する処理を含む1以上の処理の集合を示すグループを識別するグループ識別情報を含むとともに、上述の第2の実施形態と同様に、書き込み要求には、リプライ付きの書き込み要求とリプライ無しの書き込み要求とがある。そして、コントローラ22は、何れかのグループ識別情報を示す対象グループ識別情報を含むリプライ付きの書き込み要求を示す第3の書き込み要求をプロセッサ10から受け取ると、第3の書き込み要求を受け取る前に受け取った、対象グループ識別情報を含むリプライ無しの書き込み要求に基づくデータの書き込みを行った後に、第3の書き込み要求に基づくデータの書き込みを行い、第3の書き込み要求に対する応答をプロセッサ10へ送信する形態であってもよい。具体的な動作内容は、上述の第2の実施形態と同様に考えることができる。
例えば対象グループ識別情報を含む1以上の書き込み要求の集合である第2の書き込み集合よりも前にデータの書き込みが行われ、かつ、対象グループ識別情報を含む1以上の書き込み要求の集合である第1の書き込み集合に含まれる1以上の書き込み要求のうち、最後にメモリデバイス20に送り込まれる書き込み要求は、上記第3の書き込み要求であってもよい。
また、例えば対象グループ識別情報を含む1以上の書き込み要求の集合である第1の書き込み集合に含まれる1以上の書き込み要求はリプライ無しの書き込み要求であり、第1の書き込み集合よりも後にデータの書き込みが行われ、かつ、対象グループ識別情報を含む1以上の書き込み要求の集合である第2の書き込み集合に含まれる1以上の書き込み要求のうち、最初にメモリデバイス20に送り込まれる書き込み要求は、上記第3の書き込み要求であってもよい。その第3の書き込み要求に対応するリプライを待った後、第2の書き込み集合の残りの書き込み要求をメモリデバイス20に送り込む。
また、本実施形態のメモリアクセス部213は、例えば図24に示したような手順(上述の第3の実施形態と同様の手順)でリクエストを処理することもできる。要するに、書き込み要求は、該書き込み要求に対応する処理を含む1以上の処理の集合を示すグループを識別するグループ識別情報を含むとともに、上述の第3の実施形態と同様に、書き込み要求には、リプライ付きの書き込み要求と、リプライ無しの書き込み要求とがある。そして、上述の第3の実施形態と同様に、コントローラ22は、リプライ付きの書き込み要求をプロセッサ10から受け取ると、該リプライ付きの書き込み要求を受け取る前に受け取ったリプライ無しの書き込み要求に基づくデータの書き込みと該リプライ付きの書き込み要求に基づくデータの書き込みを行った後、該リプライ付きの書き込み要求に対する応答をプロセッサ10へ送信する。例えばコントローラ22は、何れかのグループ識別情報を示す対象グループ識別情報を含み、かつ、データの書き込みを行っていないことを示すように設定したフラグ情報と関連付けてリクエスト記憶部212に記憶していたリプライ付きの書き込み要求を示す第4の書き込み要求を取り出して、その取り出した第4の書き込み要求に基づくデータの書き込みを行った後、データの書き込みを行ったことを示すように設定したフラグ情報と関連付けて、第4の書き込み要求をリクエスト記憶部212の元の位置に戻し、第4の書き込み要求を受け取る前に受け取った対象グループ識別情報を含む書き込み要求に基づくデータの書き込みを行った後に、第4の書き込み要求に対する応答をホスト装置に送信する形態であってもよい。具体的な動作内容は、上述の第3の実施形態と同様に考えることができる。
例えば対象グループ識別情報を含む1以上の書き込み要求の集合である第2の書き込み集合よりも前にデータの書き込みが行われ、かつ、対象グループ識別情報を含む第1の書き込み集合に含まれる1以上の書き込み要求のうち、最後にメモリデバイス20に送り込まれる書き込み要求は上記第4の書き込み要求であり、それ以外の書き込み要求はリプライ無しの書き込み要求であってもよい。
また、本実施形態のメモリアクセス部213は、例えば図25に示したような手順(上述の第4の実施形態と同様の手順)でリクエストを処理することもできる。要するに、コントローラ22は、何れかのグループ識別情報を示す対象グループ識別情報を含み、不揮発メモリ21のうち特定の位置(アドレス)からのデータの読み出しを要求する特定読み出し要求をプロセッサ10から受け取ると、特定読み出し要求を受け取る前に受け取った、対象グループ識別情報を含む書き込み要求に基づくデータの書き込みを行った後に、特定読み出し要求に基づくデータの読み出しを行い、特定読み出し要求に対する応答をプロセッサ10に送信する形態であってもよい。具体的な動作内容は、上述の第4の実施形態と同様に考えることができる。
また、本実施形態のメモリアクセス部213は、例えば図26に示したような手順(上述の第5の実施形態と同様の手順)でリクエストを処理することもできる。要するに、書き込み要求は、該書き込み要求に対応する処理を含む1以上の処理の集合を示すグループを識別するグループ識別情報を含み、コントローラ22は、何れかのグループ識別情報を示す対象グループ識別情報を含み、かつ、不揮発メモリ21のうち特定の位置に対するデータの書き込みを要求する特定書き込み要求をプロセッサ10から受け取ると、特定書き込み要求を受け取る前に受け取った、対象グループ識別情報を含む書き込み要求に基づくデータの書き込みを行った後に、特定書き込み要求に基づくデータの書き込みを行い、特定書き込み要求に対する応答をプロセッサ10に送信する形態であってもよい。具体的な動作内容は、上述の第5の実施形態と同様に考えることができる。
例えば、対象グループ識別情報を含む1以上の書き込み要求の集合である第2の書き込み集合よりも前にデータの書き込みが行われ、かつ、対象グループ識別情報を含む1以上の書き込み要求の集合である第1の書き込み集合に含まれる1以上の書き込み要求のうち、最後にメモリデバイス20に送り込まれる書き込み要求は上記特定書き込み要求であってもよい。
また、例えば、対象グループ識別情報を含む1以上の書き込み要求の集合である第1の書き込み集合よりも後にデータの書き込みが行われ、かつ、対象グループ識別情報を含む1以上の書き込み要求の集合である第2の書き込み集合に含まれる1以上の書き込み要求のうち、最初にメモリデバイス20に送り込まれる書き込み要求は上記特定書き込み要求であってもよい。
さらに、本実施形態のメモリアクセス部213は、例えば図27に示したような手順(上述の第6の実施形態と同様の手順)でリクエストを処理することもできる。要するに、何れかのグループ識別情報を示す対象グループ識別情報を含み、かつ、不揮発メモリ21のうち特定の位置に対するデータの書き込みを要求する特定書き込み要求は、該特定書き込み要求に基づくデータの書き込みを行った後に、該特定書き込み要求に対する応答をプロセッサ10に送信することを要求する。そして、上述の第6の実施形態と同様に、コントローラ22は、特定書き込み要求をプロセッサ10から受け取ると、該特定書き込み要求を受け取る前に受け取った書き込み要求に基づくデータの書き込みと該特定書き込み要求に基づくデータの書き込みを行った後に、該特定書き込み要求に対する応答をプロセッサ10に送信する。例えばコントローラ22は、データの書き込みを行っていないことを示すように設定したフラグ情報と関連付けてリクエスト記憶部212に記憶していた特定書き込み要求を取り出して、その取り出した特定書き込み要求に基づくデータの書き込みを行った後、データの書き込みを行ったことを示すように設定したフラグ情報と関連付けて、該特定書き込み要求をリクエスト記憶部212の元の位置に戻し、該特定書き込み要求を受け取る前に受け取った、対象グループ識別情報を含む書き込み要求に基づくデータの書き込みを行った後に、該特定書き込み要求に対する応答をプロセッサ10に送信する形態であってもよい。具体的な動作内容は上述の第6の実施形態と同様に考えることができる。
例えば対象グループ識別情報を含む1以上の書き込み要求の集合である第2の書き込み集合よりも前にデータの書き込みが行われ、かつ、対象グループ識別情報を含む1以上の書き込み要求の集合である第1の書き込み集合に含まれる1以上の書き込み要求のうち、最後にメモリデバイス20に送り込まれる書き込み要求は上記特定書き込み要求であってもよい。
以上、本発明の実施形態を説明したが、上述の各実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
なお、上述した各実施形態および各変形例は任意に組み合わせることができる。