不揮発性ランダムアクセスメモリRAMを有するストレージモジュールと、読出要求を受信するルックアップモジュールとを備え、前記ストレージモジュールは、前記不揮発性RAMにメタデータを格納し、前記メタデータは、ソリッドステートストレージデバイスにキャッシュされている外部ストレージデバイスからのデータを特定し、前記ルックアップモジュールは、前記メタデータに基づき、且つ、前記読出要求に応じて、前記ソリッドステートストレージデバイスからキャッシュされたデータを供給するか、または、前記外部ストレージデバイスから取得した第2のデータを供給するかを選択するインターフェースアダプタ。前記ストレージモジュールはさらに、前記不揮発性RAM内に書込バッファを維持しており、前記第2のデータは、前記外部ストレージデバイスから取得されると、前記書込バッファに格納され、前記第2のデータは、前記書込バッファに格納された後、前記ソリッドステートストレージデバイスに格納される請求項1に記載のインターフェースアダプタ。前記ルックアップモジュールは、前記ソリッドステートストレージデバイスからのデータ、または、前記書込バッファからのデータを用いて、前記読出要求に選択的に応答する請求項2に記載のインターフェースアダプタ。前記ルックアップモジュールは、前記書込バッファからの前記第2のデータで、前記読出要求に対して応答する請求項3に記載のインターフェースアダプタ。前記書込バッファからの前記第2のデータを前記ソリッドステートストレージデバイスに格納するタイミングを判断するバッファ制御モジュールをさらに備える請求項2に記載のインターフェースアダプタ。前記バッファ制御モジュールは、前記第2のデータを含めて所定量のデータが、前記ソリッドステートストレージデバイス内の互いに隣接する複数の位置に格納すべく、前記書込バッファ内にあることに基づき、前記第2のデータを前記ソリッドステートストレージデバイスへと格納する請求項5に記載のインターフェースアダプタ。前記ルックアップモジュールは、書込要求を受信し、前記書込要求に対応付けられている書込データを前記書込バッファに格納する請求項2に記載のインターフェースアダプタ。ライトスルーモードがイネーブルされると、前記書込データはさらに前記外部ストレージデバイスに供給される請求項7に記載のインターフェースアダプタ。前記ソリッドステートストレージデバイス内の選択データの上書きを選択的に許可するキャッシュエビクションモジュールをさらに備える請求項1に記載のインターフェースアダプタ。前記キャッシュエビクションモジュールは、前記選択データが上書きされる前に、前記外部ストレージデバイスに前記選択データのうち修正部分を送信する請求項9に記載のインターフェースアダプタ。前記ルックアップモジュールは、前記読出要求に応じて、前記ストレージモジュールにあるデータのヒットリストを作成し、前記ストレージモジュールに無いデータのミスリストを作成し、前記ミスリストに応じて前記外部ストレージデバイスにデータ要求を送信する請求項1に記載のインターフェースアダプタ。第1のバス要求を前記読出要求に変換し、第2のバス要求を書込要求に変換する変換モジュールをさらに備える請求項1に記載のインターフェースアダプタ。コンピュータにインストールされるホストバスアダプタであって、ソリッドステートストレージデバイスと、不揮発性ランダムアクセスメモリRAMと、実行モジュールとを備え、前記実行モジュールは、外部ストレージデバイスからのデータを前記ソリッドステートストレージデバイスにキャッシュし、前記ソリッドステートストレージデバイス内にキャッシュされているデータを示すメタデータを、前記不揮発性RAMに格納し、前記コンピュータの中央プロセッサから読出要求を受信し、前記ソリッドステートストレージデバイスにキャッシュされた前記データを用いて、前記読出要求に選択的に応答するホストバスアダプタ。前記実行モジュールは、前記不揮発性RAMの一部分を書込バッファとして利用し、前記中央プロセッサから書込要求を受信し、前記書込みデータを前記ソリッドステートストレージデバイスに格納する前に、前記書込要求に対応する書込データを前記書込バッファに格納し、前記読出要求に応じて、前記書込バッファから選択的にデータを供給し、前記メタデータが、前記読出要求のうちいずれか1つに対応する第1のデータが前記書込バッファまたは前記ソリッドステートストレージデバイスに格納されていない旨を示す場合、前記外部ストレージデバイスに前記第1のデータを要求し、前記第1のデータが前記外部ストレージデバイスから受信されると、前記第1のデータを前記ソリッドステートストレージデバイスに格納する前に、前記第1のデータを前記書込バッファに格納する請求項13に記載のホストバスアダプタ。インターフェースアダプタを動作させる方法であって、外部ストレージデバイスからのデータであってソリッドステートストレージデバイスにキャッシュされているデータを特定するメタデータを、前記インターフェースアダプタの不揮発性ランダムアクセスメモリRAMに格納する段階と、読出要求を受信する段階と、前記メタデータに基づき、且つ、前記読出要求に応じて、前記ソリッドステートストレージデバイスからキャッシュされたデータを供給するか、または、前記外部ストレージデバイスから取得した第2のデータを供給するか選択する段階とを備える方法。前記不揮発性RAMの内部に書込バッファを維持する段階と、前記外部ストレージデバイスから前記第2のデータを取得すると、前記書込バッファに前記第2のデータを格納する段階と、前記第2のデータを前記書込バッファに格納した後に、前記ソリッドステートストレージデバイスに前記第2のデータを格納する段階と、前記書込バッファから前記第2のデータで前記読出要求に選択的に応答する段階とをさらに備える請求項15に記載の方法。前記第2のデータを、前記第2のデータを含めて所定量のデータが、前記ソリッドステートストレージデバイス内の互いに隣接する複数の位置に格納すべく、前記書込バッファ内にあることに基づくタイミングで、前記ソリッドステートストレージデバイスに格納する段階をさらに備える請求項16に記載の方法。書込要求を受信する段階と、前記書込要求に対応付けられている書込データを前記書込バッファに格納する段階とをさらに備え、ライトスルーモードがイネーブルされると、前記書込データはさらに前記外部ストレージデバイスに供給される請求項16に記載の方法。前記ソリッドステートストレージデバイス内の選択データの上書きを選択的に許可する段階と、前記選択データを上書きする前に、前記選択データのうち修正部分を前記外部ストレージデバイスに送信する段階とをさらに備える請求項15に記載の方法。前記読出要求に応じて、前記ソリッドステートストレージデバイスにあるデータのヒットリストを作成する段階と、前記読出要求に応じて、前記ソリッドステートストレージデバイスに無いデータのミスリストを作成する段階と、前記ミスリストに応じて前記外部ストレージデバイスにデータ要求を送信する段階と、前記ヒットリストおよび前記ミスリストの組み合わせに基づき、前記読出要求に応答する段階とをさらに備える請求項15に記載の方法。インターフェースアダプタは、不揮発性ランダムアクセスメモリRAMを有するストレージモジュールと、ルックアップモジュールとを備える。ストレージモジュールは、不揮発性RAMにメタデータを格納する。メタデータは、ソリッドステートストレージデバイスにキャッシュされている外部ストレージデバイスからのデータを特定する。ルックアップモジュールは、読出要求を受信する。ルックアップモジュールはさらに、メタデータに基づき、読出要求に応じて、ソリッドステートストレージデバイスからキャッシュされたデータを提供するか、外部ストレージデバイスから取得された第2のデータを提供するかを選択する。他の特徴を挙げると、ストレージモジュールはさらに、不揮発性RAMで書込バッファを維持する。第2のデータは、外部ストレージデバイスから取得されると書込バッファに格納される。第2のデータは、書込バッファに格納された後にソリッドステートストレージデバイスに格納される。別の特徴を挙げると、インターフェースアダプタは、書込バッファからソリッドステートストレージデバイスへと第2のデータを格納するタイミングを決定するバッファ制御モジュールを有する。バッファ制御モジュールは、ソリッドステートストレージデバイス内の互いに隣接した位置に格納される所定量のデータが、第2のデータを含め、書込バッファにあることに基づき、第2のデータをソリッドステートストレージデバイスに格納する。さらに別の特徴を挙げると、インターフェースアダプタは、ソリッドステートストレージデバイス内にある選択データの上書きを選択的に許可するキャッシュエビクションモジュールを備える。他の特徴を挙げると、ルックアップモジュールは、読出要求に応じて、ストレージモジュールにあるデータのヒットリストを作成し、ストレージモジュール内に無いデータのミスリストを作成し、ミスリストに応じて外部ストレージデバイスにデータ要求を送信する。ホストバスアダプタは、ソリッドステートストレージデバイスと、不揮発性ランダムアクセスメモリRAMと、実行モジュールとを備える。ホストバスアダプタは、コンピュータにインストールされるように構成されている。実行モジュールは、ソリッドステートストレージデバイスに、外部ストレージデバイスからのデータをキャッシュする。実行モジュールはさらに、不揮発性RAMにメタデータを格納する。メタデータは、ソリッドステートストレージデバイスにキャッシュされているデータを示す。実行モジュールはさらに、コンピュータの中央プロセッサから読出要求を受信し、ソリッドステートストレージデバイスからキャッシュされたデータを用いて読出要求に選択的に応答する。他の特徴を挙げると、実行モジュールは、不揮発性RAMの一部分を書込バッファとして利用する。実行モジュールはさらに、中央プロセッサから書込要求を受信する。実行モジュールはさらに、書込データをソリッドステートストレージデバイスに格納する前に、書込バッファに書込要求に対応する書込データを格納する。実行モジュールはさらに、読出要求に応じて、書込バッファからデータを選択的に提供する。実行モジュールはさらに、読出要求のうちいずれか1つに対応する第1のデータが書込バッファまたはソリッドステートストレージデバイスに格納されていないとメタデータが示す場合、外部ストレージデバイスに第1のデータを要求する。実行モジュールはさらに、第1のデータが外部ストレージデバイスから受信されると、第1のデータをソリッドステートストレージデバイスに格納する前に、書込バッファに第1のデータを格納する。インターフェースアダプタを操作する方法は、インターフェースアダプタの不揮発性ランダムアクセスメモリRAMにメタデータを格納する段階を備える。メタデータは、ソリッドステートストレージデバイスにキャッシュされている外部ストレージデバイスからのデータを特定する。当該方法は、読出要求を受信する段階を備え、メタデータに基づき、読出要求に応じて、ソリッドステートストレージデバイスからのキャッシュされたデータを提供するか、または、外部ストレージデバイスから取得された第2のデータを提供するかを選択する段階を備える。本開示内容を適用するその他の分野については、詳細な説明、請求項および図面から明らかになるであろう。詳細な説明および具体的な例は、説明を目的として紹介されているに過ぎず、本開示の範囲を限定するものではない。以下に記載する説明は、本質的に説明を目的としたものに過ぎず、本開示、その適用範囲または利用方法を限定するものでは決してない。説明を分かり易くするべく、複数の図面にわたって同様の構成要素を特定する場合には同じ参照番号を利用する。本明細書で用いる場合、A、BおよびCのうち少なくとも1つという表現は、AorBorCの非排他的論理和演算を意味するものと解釈されたい。方法を構成する段階は、本開示の原理を変更することなく、実行順序を変更し得るものと理解されたい。本明細書で用いる場合、モジュールという用語は、特定用途向け集積回路ASIC、電子回路、組み合わせ論理回路、フィールドプログラマブルゲートアレイFPGA、コードを実行するプロセッサ共有、専用、群、本明細書で説明する機能を実現するその他の適切な構成要素、または、上記の一部または全てを組み合わせた、例えば、システムオンチップの一部またはこれらを含むものを意味するとしてよい。モジュールという用語は、プロセッサが実行するコードを格納するメモリ共有、専用、または、群を含むとしてよい。コードという用語は、上記で用いたように、ソフトウェア、ファームウェアおよび/またはマイクロコードを含むとしてよく、プログラム、ルーチン、関数、クラスおよび/またはオブジェクトを意味するとしてよい。共有という用語は、上記で用いたように、複数モジュールからのコードの一部または全てが、一の共有プロセッサを利用して実行されることを意味する。また、複数のモジュールからの一部または全てのコードは、一の共有メモリによって格納されているとしてよい。群という用語は、上記で用いたように、一のモジュールからのコードの一部または全てが、一群のプロセッサを利用して実行され得ることを意味する。また、一のモジュールからのコードの一部または全ては、一群のメモリを用いて格納されるとしてよい。本明細書で説明する装置および方法は、1以上のプロセッサで実行する1以上のコンピュータプログラムで実装されるとしてよい。コンピュータプログラムは、持続性有形コンピュータ可読媒体に格納されているプロセッサで実行可能な命令を含む。コンピュータプログラムはさらに、格納データを含むとしてもよい。持続性有形コンピュータ可読媒体の例を挙げると、これらに限定されないが、不揮発性メモリ、磁気ストレージおよび光学ストレージがある。図2Aを参照すると、本開示の原理に係るコンピューティングシステムの一例を図示している。コンピュータ202では、プロセッサ204が、ノースブリッジモジュール210を用いて、メインメモリ206およびグラフィクス処理モジュール208と接続されている。ノースブリッジモジュール210は、サウスブリッジモジュール212と接続されており、サウスブリッジモジュール212は、プロセッサ204が周辺機器にアクセスできるようにする。サウスブリッジモジュール212は、PCIExpressスロット220と接続されている。PCIExpressカード222がPCIExpressスロットのうち1つにインストールされており、キャッシュストレージアダプタ224が、PCIExpressスロット220のうち別の1つにインストールされている。キャッシュストレージアダプタ224は、ストレージデバイス230と接続されており、プロセッサ204がストレージデバイス230に読み書きアクセスできるようにする。プロセッサ204、メインメモリ206、グラフィクス処理モジュール208、ノースブリッジモジュール210、および、サウスブリッジモジュール212は、ホスト232と総称する場合がある。キャッシュストレージアダプタ224は、ホスト232がストレージデバイス230にアクセスできるようにする機能を持つものとも言える。ストレージデバイス230は、任意の種類の大容量ストレージを含むとしてよい。一例に過ぎないが、ストレージデバイス230は、ロジカルボリュームマネジメントLVMデバイス、仮想ボリューム、RAIDrudundantarrayofinexpensivedisks、ロジカルユニットナンバーLUNで特定されるデバイス、インターネットスモールコンピュータシステムインターフェースiSCSILUN、ファイバーチャネルFCLUN、ファイバーチャネルオーバーイーサネット登録商標FCoELUN、ダイレクトアタッチドストレージDAS、または、ストレージエリアネットワークSANのうち1以上を含むとしてよい。ホスト232は、キャッシュストレージアダプタ224を介して、ストレージデバイス230にコマンドを発行する。読み書き等のアクセス要求は、キャッシュストレージアダプタ224によってキャッシュされるとしてよい。制御コマンドは、キャッシュストレージアダプタ224によって解釈および実行されるとしてよく、および/または、ストレージデバイス230に渡されるとしてよい。さまざまな実施例によると、ホスト232からキャッシュストレージアダプタ224に送信されるコマンドは、SCSIコマンドであってよい。キャッシュストレージアダプタ224は、SCSIコマンドを、ストレージデバイス230に適したコマンドに変換するとしてよい。キャッシュストレージアダプタ224はさらに、PCIExpressプロトコルと、ストレージデバイス230にアクセスするために用いられるプロトコルとの間で変換を行う。一例に過ぎないが、ストレージデバイス230は、イーサネット登録商標、エクスターナルシリアルアドバンスドテクノロジアタッチメントeSATA、シリアルアタッチドSCSISAS、スモールコンピュータシステムズインターフェースSCSI、Infinibandインフィニバンド、または、ファイバーチャネルを用いてアクセスされるとしてよい。キャッシュストレージアダプタ224は、PCIExpressカードとして図示されている。しかし、本開示の原理は他のインターフェースにも適用される。例えば、キャッシュストレージアダプタ224は、USB2.0またはUSB3.0等のUSBユニバーサルシリアルバスインターフェースを用いることができる。これに代えて、キャッシュストレージアダプタ224は、PCIまたはPCI-X等のレガシーインターフェースを利用することができる。キャッシュストレージアダプタ224は、さまざまなフォームファクターで実現することができる。例えば、キャッシュストレージアダプタ224は、ExpressCard/34またはExpressCard/54といったフォームファクターで実現可能である。ExpressCardフォームファクターは通常、ポータブルコンピュータについて利用されるものであるとしてよい。キャッシュストレージアダプタ224は、ExpressCardとして実現される場合、PCIExpressまたはUSBを利用するように構成され得る。図2Bを参照すると、本開示の原理に係るコンピューティングシステムの別の例が図示されている。コンピュータ250は、メインメモリ254およびグラフィクス処理モジュール256と接続されるプロセッサ252を備える。プロセッサ252は、サウスブリッジモジュール258を介して、周辺機器と接続される。例えば、サウスブリッジモジュール258は、PCIExpressスロット270へのアクセスを可能とする。PCIExpressカード222およびキャッシュストレージアダプタ224は、PCIExpressスロット270にインストールされているものとして図示されている。プロセッサ252、メインメモリ254、グラフィクス処理モジュール256、および、サウスブリッジモジュール258は、ホスト272と総称することができる。キャッシュストレージアダプタ224は、図2Aに図示したホスト232と比較した場合に異なるホスト272のアーキテクチャを活用できるように、異なったやり方で実施または構成するとしてよい。ホスト232またはホスト272は、キャッシュストレージアダプタ224と通信するために、SCSIターゲットモードドライバ等のターゲットモードドライバ、または、イニシエータモードドライバを実装するとしてよい。図2Bでは、キャッシュストレージアダプタ224は、ストレージエリアネットワーク280と接続されているものとして図示されている。ストレージエリアネットワーク280は、汎用のコンピュータネットワーク化コンポーネントおよび/または特定ストレージ用のネットワーク化コンポーネント等、ネットワーク化コンポーネントを利用して接続されている1以上のストレージデバイスを有している。例えば、ストレージエリアネットワーク280は、ファイバーチャネルインターコネクト、Infinibandインターコネクト、ギガビットまたは10ギガビットのイーサネット登録商標インターコネクト等のイーサネット登録商標インターコネクト、ファイバーチャネルオーバーイーサネット登録商標インターコネクト、iSCSIインターコネクト、および、ATAオーバーイーサネット登録商標インターコネクトを含むとしてよい。ストレージエリアネットワーク280はさらに、他のコンピュータに対してストレージリソースを提供するとしてよい。一例に過ぎないが、第2のコンピュータ282および第3のコンピュータ284が、ストレージエリアネットワーク280に接続されているものとして図示されている。さまざまな実施例によると、コンピュータ250は、第2のコンピュータ282および/または第3のコンピュータ284によってアクセスされるストレージエリアネットワーク280のストレージリソースにデータを書き込むとしてよい。このような状況において、書込データのコヒーレンシは、キャッシュストレージアダプタ224のライトスルーモードをイネーブルすることによって改善されるとしてよい。キャッシュストレージアダプタ224は、ライトスルーモードでは、遅延をできる限り短く抑えて、ストレージエリアネットワーク280に修正データを提供する。キャッシュストレージアダプタ224は、ライトバックモード等の他のモードでは、修正データをストレージエリアネットワーク280に送り返す前に、修正データをより長い期間にわたって格納するとしてよい。図3Aを参照すると、キャッシュストレージアダプタ300の一例を示す上位のブロック図が図示されている。一例に過ぎないが、キャッシュストレージアダプタ300は、ホスト232およびストレージデバイス230と接続されているものとして図示されている。キャッシュストレージアダプタ300は、フラッシュメモリまたはリードオンリーメモリ等のファームウェア312から命令を実行するプロセッサ310を備える。プロセッサ310は、内部仮ストレージを備えるとしてよく、仮命令およびデータ情報を揮発性メモリ314に格納するとしてよい。プロセッサ310は、不揮発性RAMランダムアクセスメモリ320と接続されている。不揮発性RAM320は、スタティックランダムアクセスメモリSRAM、ダイナミックランダムアクセスメモリDRAM、または、シンクロナスダイナミックランダムアクセスメモリSDRAM等の揮発性RAMを含むとしてよい。不揮発性RAM320は、揮発性RAMに不揮発性RAMの特性を与えるためのコンポーネントを含む。一例に過ぎないが、不揮発性RAM320は、電池等のバックアップ電源を含むとしてよい。これは、充電式電池であってよい。不揮発性RAM320はさらに、不揮発性RAM320の格納内容を維持するための電力を供給するスーパーキャパシタまたは任意の適切な種類の電気二重層キャパシタを含むとしてよい。不揮発性RAM320はこのため、限られた時間の間のみ、データを維持するとしてよい。このタイムフレーム内では、バックアップ電力がキャッシュストレージアダプタ300に供給され得る。例えば、中断不可能な電源またはバックアップ発電機によって、キャッシュストレージアダプタ300に電力を再供給することができる。プロセッサ310はさらに、ソリッドステートドライブ330と接続されている。ソリッドステートドライブ330は、フラッシュメモリ等の不揮発性メモリを含む。一例に過ぎないが、フラッシュメモリは、シングルレベルセルSLCストレージセル、マルチレベルセルMLCストレージセル、および/または、標準的なMLCストレージセルよりもエラーレートが低くなるように設計されているエンタープライズMLCストレージセルを含むとしてよい。ストレージセルは、NANDストレージセルであってよい。プロセッサ310は、ストレージデバイス230からのデータをソリッドステートドライブ330にキャッシュする命令を実行する。ソリッドステートドライブ330に格納されているデータに関する情報は、キャッシュメタデータと呼ばれる。キャッシュメタデータは、不揮発性RAM320に格納されている。キャッシュメタデータはさらに、ソリッドステートドライブに格納されているデータに関連する属性、例えば、最終アクセス時刻、アクセス数、および、データの修正の有無を追加で格納しているとしてよい。ホスト232が提供する書込データは、不揮発性RAM320に格納される。不揮発性RAM320のうち書込データを格納するために用いられる一部分は、書込バッファと呼ばれている。プロセッサ310は、不揮発性RAM320の特定の一部分を書込バッファと指定するとしてよい。プロセッサ310は、この一部分の量を、書込バッファが必要とするスペースに応じて調整するとしてよい。さまざまな実施例によると、プロセッサ310は、不揮発性RAM320内において、書込バッファを明示的に指定しない。これに代えて、プロセッサ310は、キャッシュメタデータおよび書込バッファデータの両方を不揮発性RAM320に格納する。不揮発性RAM320での空きスペースが限定されると、書込バッファデータの量を減らすとしてよい。さまざまな実施例によると、プロセッサ310は、キャッシュメタデータを不揮発性RAM320のアドレス範囲の一端に格納して、書込バッファが不揮発性RAM320のアドレス範囲の反対側の端部で始まるように格納するとしてよい。格納されるキャッシュメタデータおよび書込バッファデータが増えるにつれて、不揮発性RAM320のそれぞれの部分が増加して互いにぶつかることとなる。プロセッサ310はこの後、書込バッファデータとキャッシュメタデータとが重複しないようにする責任を持つとしてよい。ソリッドステートドライブ330は、ストレージコントローラと同様にストレージセルを含むとしてよい。ストレージコントローラは、ソリッドステートドライブ330の利用可能な寿命を最大限に長くするためにソリッドステートドライブ330内のさまざまな位置にデータを動的に割り当てるウェアレベリングアルゴリズムを実装するとしてよい。ソリッドステートドライブ330は、1以上のコントローラ集積回路および1以上のストレージ集積回路によって実現されるとしてよい。こういった集積回路は、キャッシュストレージアダプタ300の主要回路基板に実装されるとしてよい。これに代えて、ソリッドステートドライブ330の集積回路は、別の回路基板上に実現され、この回路基板をドーターボードとしてキャッシュストレージアダプタ300に差し込むとしてもよい。他の実施例によると、ソリッドステートドライブ330は、完全に筐体内に収容されているドライブであるとしてよく、ラップトップコンピュータの主要ハードドライブ用など、一般的使用を目的として小売店で入手可能なものであってよい。これらの実施例では、ソリッドステートドライブ330は、キャッシュストレージアダプタ300に実装されているとしてもよいし、または、可撓性のケーブルでキャッシュストレージアダプタ300に接続されているとしてよい。一例に過ぎないが、ソリッドステートドライブ330は、SATAインターフェース、eSATAインターフェースまたはシリアルアタッチドSCSISASインターフェースを介して、ホスト232およびキャッシュストレージアダプタ300が共有している筐体の内部に実装されるとしてよい。キャッシュストレージアダプタ300は、ソリッドステートドライブ330がソリッドステートドライブ330のサイズを大きくするために、そして、利用可能な寿命が終わるとソリッドステートドライブを交換するために交換可能となるように構成されているとしてよい。キャッシュストレージアダプタ300は、ソリッドステートドライブ330を含めた複数のソリッドステートドライブに対して接続され得る。さまざまな実施例によると、複数のソリッドステートドライブの容量および性能特性は、均一である必要はないとしてよい。さまざまな実施例によると、ソリッドステートドライブのうち1つ、例えば、ソリッドステートドライブ330は、キャッシュストレージアダプタ300に実装されている一方、残りのソリッドステートドライブは、ケーブルを介してキャッシュストレージアダプタ300に接続されているとしてよい。図3Bを参照すると、キャッシュストレージアダプタ350の実施例を示す別の上位の機能ブロック図が図示されている。プロセッサ310、ファームウェア312、揮発性メモリ314、および、不揮発性RAM320は、図3Aに示したものと同様であるとしてよい。図3Bにおいて、ソリッドステートドライブ360は、キャッシュストレージアダプタ350から独立したものとして図示されている。ソリッドステートドライブ360はこのため、キャッシュストレージアダプタ350とは別個に実装されるとしてよく、キャッシュストレージアダプタ350とは同じコンピュータ筐体の中には位置しないとしてもよい。図4を参照すると、キャッシュストレージアダプタ400の実施例を示す機能ブロック図が図示されている。キャッシュストレージアダプタ400は、実行モジュール410およびストレージモジュール420を含む。実行モジュール410は、プロセッサおよびメモリを含むとしてよく、プロセッサはさまざまな機能を実行するべくメモリから命令を実行する。例えば、図4の実行モジュール410は、要求変換モジュール422、ルックアップモジュール424、入出力最適化モジュール426、キャッシュエビクションモジュール428、先読みモジュール430、および、キャッシュミスモジュール432を含む。要求変換モジュール422は、ホスト232からのコマンドを、実行モジュール410の残りのモジュールによって利用可能な形式に変換する。さらに、要求変換モジュール422は、ホスト232からのコマンドを、ストレージデバイス230に対応する形式に変換するとしてよい。一例に過ぎないが、ホスト232は、SCSIコマンドを要求変換モジュール422に提供するとしてよい。要求変換モジュール422はこの後、これらのコマンドを一般的なアクセスコマンドに変換するとしてもよいし、および/または、これらのコマンドをストレージデバイス230に対応する形式、例えば、ファイバーチャネルコマンドに変換するとしてよい。さまざまな実施例によると、要求変換モジュール422は、アクセスコマンド、例えば、読出コマンドおよび書込コマンドの処理方法を制御コマンドの処理方法とは異ならせるとしてよい。例えば、制御コマンドは、変換を最小限に抑えるか、または、変換を行わないとしてよく、ストレージデバイス230に渡す。ストレージモジュール420は、不揮発性RAM440を含む。不揮発性RAM440では、実行モジュール410は、キャッシュメタデータ442を格納しており、不揮発性RAM440の一部を書込バッファ444として利用する。実行モジュール410は、不揮発性RAM440の一部分を書込バッファ444として利用されるように割り当てるとしてよい。この割り当ては、必要に応じて調整されるとしてよい。これに代えて、実行モジュール410は、不揮発性RAM440の一部分を書込バッファ444として保留することなく、単に書込バッファデータを不揮発性RAM440に格納するとしてもよい。ストレージモジュール420もまた、論理的観点から見ると、ソリッドステートドライブ450を備える。ソリッドステートドライブ450は、より一般的にはソリッドステートストレージデバイスと呼ばれる。ソリッドステートドライブ450は、キャッシュストレージアダプタ400の一部として図示されているが、上述したように取り外し可能にキャッシュストレージアダプタ400に実装されているとしてもよいし、または、キャッシュストレージアダプタ400とは別個に構成されておりケーブルを介して接続されているとしてもよい。ソリッドステートドライブ450は、キャッシュストレージアダプタ400と共通の筐体内に収容されているとしてもよいし、または、当該筐体の外部に配置されるとしてもよい。ソリッドステートドライブ450は、SATAまたはeSATAを用いてキャッシュストレージアダプタ400の残りの構成要素と通信を行うとしてよい。ストレージデバイス230は、機能的にも物理的にもキャッシュストレージアダプタ400とは別個の構成要素であるので、外部ストレージデバイスと呼ぶ。多くの実施例によると、ストレージデバイス230は、キャッシュストレージアダプタ400を収容するコンピュータ筐体とは別個の筐体内に配置されている。実際には、ストレージデバイス230は、キャッシュストレージアダプタ400とは同じサーバーラックにすら配置されていないとしてもよく、または、キャッシュストレージアダプタ400と同じ部屋にすら配置されていないとしてもよい。ストレージデバイス230が特にストレージエリアネットワークSANとして実施される場合、ストレージデバイス230は一の位置に限定されるものではないとしてよい。さまざまな実施例によると、ストレージエリアネットワークSAN等のストレージデバイス230の実施例では内部の複雑さが見えないようになるとしてよい。ストレージデバイス230はこのため、一のハードディスクドライブ等、一のハードウェアボリュームであるかのように、キャッシュストレージアダプタ400に対してインターフェースを提示するとしてよい。要求変換モジュール422が読出要求を受信すると、読出要求の対象であるアドレスをルックアップモジュール424に供給する。ルックアップモジュール424は、キャッシュメタデータ442を検査して、対象となるアドレスが、書込バッファ444またはソリッドステートドライブ450のいずれかに現在キャッシュされているか否かを判断する。ルックアップモジュール424は、キャッシュされている対象アドレスのヒットリストを生成するとともに、キャッシュされていないアドレスのミスリストを生成する。ルックアップモジュール424は、ミスリストをキャッシュミスモジュール432に供給する。キャッシュミスモジュール432は通常、ストレージデバイス230に対して対象アドレスを要求する。ルックアップモジュール424は、読出要求のサイズに基づき、読出要求を複数のルックアップ要求に分割するとしてもよい。ルックアップモジュール424は、ルックアップ要求毎に、キャッシュメタデータ442に基づきヒットリストおよびミスリストを決定する。ストレージデバイス230へのアクセスの粒度は、ホスト232から受信するアクセス要求の粒度とは異なるとしてよい。例えば、ホスト232は、1バイトまたは1ワードを要求するとしてよいが、ストレージデバイス230はブロック単位でアクセスされるとしてもよい。言い換えると、読出または書込は、1以上のブロックとして実行される場合がある。一例に過ぎないが、各ブロックのサイズは4キロバイトであるとしてよい。キャッシュミスモジュール432はこのため、ミスリストに記載されている対象アドレスを含むブロックをいずれも、ストレージデバイス230に対して要求するとしてもよい。この場合は自動的に、ストレージデバイス230から、対象アドレスの前後のデータを含み得る1ブロックを読み出すことによって、空間局所性を利用することになる。また、キャッシュミスモジュール432は、さらに空間局所性を利用するべく、1以上の後続ブロックおよび/または1以上の先行ブロックを同時にストレージデバイス230に対して要求するとしてよい。先読みモジュール430は、近い将来にアクセスされるであろうブロックの予想を試みるとしてよい。先読みモジュール430はこの後、これらのブロックについても読出要求をストレージデバイス230に送る。さまざまな実施例によると、先読みモジュール430は、ストレージデバイス230がキャッシュミスモジュール432からの要求への対応を終了するまで、読出要求の発行を待つとしてよい。入出力最適化モジュール426は、ホスト232が要求するアクセスおよびストレージデバイス230に送信された読出要求の記録を取るとしてよい。入出力最適化モジュール426は、ストレージデバイス230の温度および局所情報を動的に較正するとしてよい。この較正は、領域毎に行われるとしてよい。各領域は、所定数のブロックであるか、または、入出力最適化モジュール426の決定に基づきサイズが可変であるとしてよい。温度という単語は、ストレージデバイス230の所定領域での動作の量を意味する。局所情報は、所定のブロックがアクセスされた後に周囲のブロックへのアクセスが発生する確率を意味する。入出力最適化モジュール426は、あるブロックが近い将来にアクセスされる可能性に基づき、先読みモジュール430を呼び出すとしてよい。ストレージデバイス230が供給する読出データは、書込バッファ444に格納する。キャッシュメタデータ442は、当該データが書込バッファ444に格納されたことを示すべく更新される。ルックアップモジュール424はこの後、ヒットリストおよびミスリストの両方から得られるデータを用いて、要求変換モジュール422を介して、読出要求に応答することができる。要求変換モジュール422がホスト232から書込要求を受信すると、書込要求に関連するデータが書込バッファ444に格納される。この新しく格納されたデータは、ストレージデバイス230に格納されているデータとは異なるので、汚染データと呼ばれる。結果として、修正されたデータをストレージデバイス230に送信する。しかし、ライトスルーモードでは、書込バッファ444が受信したデータを、できる限り遅延を短くして、ストレージデバイス230に渡す。上述したように、ライトスルーモードは、他のシステムがストレージデバイス230にアクセスしている場合に利用されるので、修正されたデータにアクセスする必要があるとしてよい。書込バッファ444のデータは、ソリッドステートドライブ450に比べると書込バッファ444の容量が制限されるので、ソリッドステートドライブ450に書き込まれる。さまざまな実施例によると、ソリッドステートドライブ450への書き込みでは、ソリッドステートドライブ450の1ブロック全体の全ての要素への書き込みが必要となる。ソリッドステートドライブ450のブロックサイズは、ストレージデバイス230のブロックサイズとは、同じであってもよいし、異なるとしてもよい。ソリッドステートドライブは通常、書込/消去が実行される度に、性能が劣化し、最終的には利用不可能になる。このため、書込バッファ444からのデータは、1ブロック全体に対応するデータを書き込むことになってから、ソリッドステートドライブ450に書き込まれるとしてよい。これによって、新しいデータがソリッドステートドライブ450の一のブロックに追加される度に、同じブロックを書き変える必要がなくなる。また、一のデータの変更は、ソリッドステートドライブ450にデモートされる前に、複数回にわたって書込バッファに書き込まれる場合がある。このため、この一のデータについてのソリッドステートドライブ450のストレージセルは、当該データが複数回変更されているにも関わらず、書込サイクルが1回のみで済む。キャッシュエビクションモジュール428は、ソリッドステートドライブ450内のデータのキャッシュを中止すべきタイミングを判断する。当該データは、ソリッドステートドライブ450から実際に削除されるとしてもよいし、または、他の実施例では、当該データが格納されていた領域を空き領域とマーキングするとしてもよい。このため、新しくキャッシュされるデータを、エビクションされたデータに上書きすることができる。エビクションの前に、ストレージデバイス230に未送信の汚染データがあれば、ストレージデバイス230にフラッシュする。さらに、周期的に、または、さまざまなパラメータによって決まるその他の間隔で、ソリッドステートドライブ450に格納されている汚染データをストレージデバイス230にフラッシュして、ストレージデバイス230が最も新しい修正を反映するようにする。一例に過ぎないが、ソリッドステートドライブ450は、ソリッドステートドライブ450に格納されている汚染データがしきい値を超えると、ストレージデバイス230にデータをフラッシュするとしてよい。図5を参照すると、キャッシュストレージアダプタ500の実施例を示す機能ブロック図が図示されている。キャッシュストレージアダプタ500のうち図4に記載の要素と同様の機能を持つ要素については、同じ参照番号を付与している。図5において、図4では明確に記載していた接続関係について一部は、図示を省略している。例えば、入出力最適化モジュール426は、要求変換モジュール422とルックアップモジュール424との間でやり取りされる要求を観察する。また、入出力最適化モジュール426は、先読みモジュール430に、ストレージデバイス230に要求すべき対象アドレスを供給する。アービター504は、先読みモジュール430およびキャッシュミスモジュール432から要求を受信し、これらの要求をストレージデバイス230に送信する。アービター504は、先読みモジュール430からの要求よりも、キャッシュミスモジュール432からの要求を優先するとしてよい。アービター504はさらに、隣接する要求等の要求を組み合わせて、ストレージデバイス230へのアクセスを効率化するとしてよい。バッファ制御モジュール508は、書込バッファ444からソリッドステートドライブ450へのデータの送信タイミング、または、デモートタイミングを決定する。データがソリッドステートドライブ450に送信されると、バッファ制御モジュール508はキャッシュメタデータ442を更新して新しい格納位置を反映させる。バッファ制御モジュール508およびキャッシュエビクションモジュール428は、入出力最適化モジュール426と通信して、どのデータをソリッドステートドライブ450にデモートすべきか、どのデータをソリッドステートドライブ450からエビクションすべきかを判断するとしてよい。ストレージデバイス230から読み出されたデータが書込バッファ444に格納されているので、このデータ経路が図5に明示されている。ルックアップモジュール424が読出要求を処理すると、キャッシュメタデータ442が、要求されたデータが格納されている書込バッファ444および/またはソリッドステートドライブ450内の位置を示す。これらのアドレスは、書込みバッファ444および/またはソリッドステートドライブ450に供給される。書込バッファ444および/またはソリッドステートドライブ450はこの後、要求されたデータをルックアップモジュール424に供給する。ルックアップモジュール424はこの後、データをアセンブルして、要求変換モジュール422を介して、ホスト232からの要求に応答する。ルックアップモジュール424が書込要求を処理すると、書込要求に関連するデータは、格納のために、書込バッファ444に供給される。キャッシュエビクションモジュール428は、キャッシュメタデータ442を更新して、ソリッドステートドライブ450に前に格納されていたデータはエビクションされたのでキャッシュされていない旨を示す。さまざまな実施例によると、キャッシュエビクションモジュール428は、書込バッファ444がエビクション直前のデータの修正後のバージョンを格納していないことを、バッファ制御モジュール508に確認するとしてよい。図6を参照すると、本開示の原理に係るキャッシュストレージアダプタの動作例を示すフローチャートが図示されている。604で開始され、読出要求を受信している場合には608に進み、受信していない場合には612に進む。608において、読出要求を変換して616に進む。616において、読出要求の対象が書込バッファにある場合には620に進み、無い場合には624に進む。620において、書込バッファから読出要求が要求するデータを提供し、612に進む。624において、対象となるデータがソリッドステートドライブに格納されているか否かを判断する。格納されている場合には628に進み、格納されていない場合には632に進む。628において、読出要求に応じてソリッドステートドライブからデータを提供し、612に進む。632において、ストレージデバイスにデータを要求し、636に進む。636において、ストレージデバイスからのデータを書込バッファに格納し、620に進む。612において、書込要求を受信したか否かを判断する。受信している場合には640に進み、受信していない場合には644に進む。640において、書込要求を変換して、648に進む。648において、書込要求に対応するデータを書込バッファに書き込んで、644に進む。644において、ソリッドステートドライブ内の空きスペースがしきい値未満か否かを判断する。しきい値未満である場合には652に進み、しきい値以上である場合には656に進む。652において、ソリッドステートデバイス内の空きスペースを増やすために、どのブロックをエビクションするかを判断して、660に進む。660において、エビクションすべきブロックのいずれかが汚染データを含む場合には664に進み、含まない場合には668に進む。664において、汚染データをストレージデバイスに書き込んで、668に進む。668において、ソリッドステートドライブ内のエビクションされたブロックを空きブロックとマーキングして、新しいデータを上書きできることを示す。さまざまな実施例によると、空きブロックとしてマーキングされているブロックに対する要求が発生すると、当該ブロックは再度利用中とされ、当該データを用いて要求に対応する。656に続く。656において、書込バッファからブロックをデモートすべきか否かを判断する。デモートすべきである場合には672に進み、すべきでない場合には676に進む。672において、書込バッファからソリッドステートドライブへとデータを書込み、680に進む。680において、書込バッファから書き込まれたブロックを空きブロックとマーキングして、他のデータで利用できるようにして、676に進む。676において、ストレージデバイスがアイドル状態であるか否かを判断する。アイドル状態である場合には684に進み、そうでない場合には604に戻る。例えば、ストレージデバイスは、書込要求または読出要求に対応していない場合にはアイドル状態であると見なされるとしてよい。684において、ソリッドステートドライブ内のいずれかのブロックが汚染データであるか否かを判断する。汚染データがある場合には688に進み、無い場合には692に進む。688において、汚染ブロックをストレージデバイスに書き込んで、604に戻る。692において、読出要求および書込要求を分析して、694に進む。694において、ストレージデバイスの各領域を、動作レベルおよび所与のブロックが要求された後に隣接するブロックが要求される確率に応じて特徴付けする。696に進み、今後の読出アクセスが694での特徴付けに基づいて予測可能であるか否かを判断する。予測可能である場合には698に進み、そうでない場合には604に戻る。698において、694の特徴付けによって予測されるアドレスでストレージデバイスからデータをプリフェッチする。この後、604に戻る。図7を参照すると、本開示の原理に係るキャッシュストレージアダプタの動作例を示すフローチャートが図示されている。具体的には、図7は、読み書き要求の処理の実施例に注目している。704で開始され、読出要求が受信されている場合には708に進み、受信されていない場合には712に進む。708において、読出要求を変換する。716に続き、読出要求を読出要求のサイズに基づいて複数のルックアップ要求にパーシングする。720に続き、ルックアップ要求をキャッシュメタデータを用いて処理する。724に続き、キャッシュ内で利用可能なデータが書込バッファ内にあるか、または、ソリッドステートドライブ内にあるかに基づいてヒットリストを作成する。728に進み、キャッシュ内で利用可能でないデータのミスリストを作成する。732に続き、ミスリストが空の場合には736に進み、記載がある場合には740に進む。740において、キャッシュミスハンドラを呼び出して、ミスリストをキャッシュミスハンドラに供給する。744に進み、ミスリストに応じてストレージデバイスからデータをフェッチする。748に続き、ストレージデバイスからフェッチされたデータを書込キャッシュに格納する。752へと続き、キャッシュメタデータおよびミスリストを更新して、要求されたデータが現在は書込キャッシュに格納されていることを示す。736に進み、ヒットリストおよびミスリストに対応する混合結果を含む、読出要求に対する応答を返信する。この後、712に進む。712において、書込要求を受信したか否かを判断して、受信した場合には760に進み、受信していない場合には704に戻る。760において、書込要求を変換する。764に進み、書込要求に対応するデータを書込バッファに書き込む。768に進み、ライトスルーモードがアクティブになっている場合には772に進み、アクティブでない場合には776に進む。772において、データをストレージデバイスに書き込み、776に進む。776において、キャッシュメタデータを更新して、新しく格納された書込みデータを示し、704に戻る。704に戻ると図示されているのは、読出要求および書込要求はそれぞれ独自のループを用いて処理される一方、デモート、エビクション、入出力最適化、および、フラッシュ等のその他の機能は他の制御ループを用いて実行されるためである。他の制御ループは、並行して動作するとしてもよく、読出要求および書込要求の処理よりも優先度が低いとしてよい。本開示に係る広義の教示内容は、さまざまな形態で実施可能である。このため、本開示には具体例が含まれるが、本開示の真の範囲は、図面、明細書および請求項を参照することにより他にも変形例が明らかになるので、それらに限定されるべきではない。