(57)【特許請求の範囲】
【請求項１】
外部から入力されたリードコマンドを受けて記憶媒体からデータを読み出しバッファに格納するとともに、該バッファに格納されたデータを外部に転送する記憶装置において、
今回のリードコマンドにより要求されたデータが前記バッファに格納されていないときは、前記記憶媒体から今回のリードコマンドにより指定されたデータを読み出して、前記バッファの、データが既に格納されている領域の最終アドレスの次のアドレス以降の領域に格納し、該バッファに格納された、今回のリードコマンドにより指定されたデータを外部に転送するとともに、該記憶媒体からアドレス順に読出しを継続して前記バッファに格納する先読みを行なう読出制御手段と、
前記バッファ上の、前記記憶媒体上でのアドレスが連続しているデータが格納されたデータエリアに、該データエリア内の、外部に転送されていない残りのデータ量に基づいて、重み付けを行なう重み付け手段とを備え、
前記読出制御手段は、今回のリードコマンドにより要求されたデータが前記バッファに格納されていないときは、前記記憶媒体から今回のリードコマンドにより指定されたデータを読み出して、前記バッファの、前記重み付け手段により付された重みが最小のデータエリアに格納することを特徴とする記憶装置。
【請求項２】
前記読出制御手段は、前記バッファの、前記重み付け手段により付された重みが最大のデータエリアへの上書きを禁止し、該バッファの、該データエリアを除く領域に上書きすることにより、前記記憶媒体から読み出したデータを前記バッファに格納するものであることを特徴とする請求項１記載の記憶装置。
【請求項３】
前記重み付け手段は、前記読出制御手段により、前記バッファ中の、最大の重みが付されたデータエリアがアクセスされたときは、該データエリアを除くデータエリアのうちのいずれかのデータエリアに最大の重みを付すものであることを特徴とする請求項２記載の記憶装置。
【請求項４】
前記読出制御手段は、今回のリードコマンドにより要求されたデータ全てが前記バッファ中のいずれかのデータエリアに格納されており、かつ、該データエリア中の、今回のリードコマンドにより要求されたデータが格納された領域の先頭アドレスが、該データエリア中の、該データエリア形成の基になった過去のリードコマンドによる要求に応じて外部に転送したデータが格納された領域の最終アドレスの次のアドレスであったときは、今回のリードコマンドに応じて、前記記憶媒体上の、該データエリアの最終アドレスに格納されているデータが記憶されていたアドレスの次のアドレスから先読みを開始するものであることを特徴とする請求項１記載の記憶装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、外部、例えばホストシステムで発行されたリードコマンドを受けて、記憶媒体、例えば磁気ディスクあるいは光ディスク等からデータを読み出し、リードバッファにキャッシュデータとして格納するとともに、そのリードバッファに格納されたキャッシュデータを外部（例えばホストシステム）に向けて転送する、磁気ディスク装置あるいは光ディスク装置等の記憶装置に関する。
【０００２】
【従来の技術】
磁気ディスクをアクセスする磁気ディスク装置や光ディスクをアクセスする光ディスク装置等においては、従来より、ホストシステムよりリードコマンドを受け取ったとき、磁気ディスクあるいは光ディスク等の記憶媒体の、そのリードコマンドで指定された読出先頭アドレスからそのリードコマンドで指定されたデータ量のデータを読み出すだけでなく、次のコマンドを受け取るまでの空き時間を利用して、そのままアドレス順に読出しを継続するという、いわゆる先読みが行なわれる。記憶媒体から読み出されたデータは、キャッシュデータとしてリードバッファに格納され、そのリードバッファに格納されたキャッシュデータのうちの、先読みのデータを除く、そのリードコマンドにより要求されたデータは、そのリードコマンド発行元のホストシステムに転送される。このような先読みを行ない、次にリードコマンドを受け取ったとき、その受け取ったリードコマンドが要求しているデータがリードバッファに既に格納されているか否かが判定され、リードバッファに既に格納されているときは、記憶媒体をアクセスせずに、リードバッファに既に格納されているキャッシュデータを読み出してホストシステムに転送する。このようにして、アクセスタイムの短絡化が図られている。
【０００３】
【発明が解決しようとする課題】
従来、記憶媒体から読み出されたデータのリードバッファへの格納方式として、
（１）１つのリードバッファを固定的に複数のセグメントに区切り、各リードコマンドごとに別々のセグメントに格納していく方式や、
（２）１つのリードバッファを固定的には複数に区切らずに、各リードコマンド毎のデータ（ホストシステムから要求されたデータと先読みデータ）をリードバッファ上に順次に格納していく方式
が知られている。
【０００４】
ここで、上記（１）の方式の場合、記憶媒体上のアドレスが不連続な複数個のキャッシュデータをリードバッファ上に同時に保持可能であるが、リードバッファが複数のセグメントに分けられているため、各セグメントごとのキャッシュサイズが自ずと小さく制限されてしまい、シーケンシャルリードコマンド（過去のリードコマンドで指定された、記憶媒体上の読出し領域の最終アドレスに対する次のアドレスを読出先頭アドレスとするリードコマンド）が連続するように発行された場合に、性能に制限を受ける結果となる。
【０００５】
また、上記（２）の方式の場合、先読みによりリードバッファに格納されている、後で利用されるかも知れないキャッシュデータが、新たに発行されたリードコマンドに応じて記憶媒体から読み出されたデータとそれに続く先読みデータで上書きされてしまう可能性が高く（シーケンシャルリードコマンドが連続発行された場合は上書きされる可能性が特に高い）、記憶媒体から切角読み出してリードバッファに格納しておいたキャッシュデータを効率的に利用することができない結果となる。
【０００６】
さらに、上記（１）の方式の変形として、リードバッファの空き領域をアドレス単位で管理し先読みデータのみバッファ上に詰めていく方式が知られているが、この方式の場合、データがバッファ上で不連続に配置されるため、これをコントロールためのアドレス管理が複雑となり、また、新たなリードコマンドが発行されたとき、そのリードコマンドが要求しているデータがバッファ上に格納されているか否かの判定が複雑となり、さらに、そのリードコマンドが要求しているデータがバッファ上に格納されているときの、そのデータをアクセスするための特殊な回路が必要となり、コストアップに繋がる結果となる。
【０００７】
本発明は、上記事情に鑑み、未転送のデータをバッファ上に効率良く保持することができ、したがってアクセス速度を向上させることのできる記憶装置を提供することを目的とする。
【０００８】
【課題を解決するための手段】
上記目的を達成する本発明の記憶装置は、外部から入力されたリードコマンドを受けて記憶媒体からデータを読み出しバッファに格納するとともに、そのバッファに格納されたデータを外部に転送する記憶装置において、
今回のリードコマンドにより要求されたデータがバッファに格納されていないときは、記憶媒体から今回のリードコマンドにより指定されたデータを読み出して、バッファの、データが既に格納されている領域の最終アドレスの次のアドレス以降の領域に格納し、そのバッファに格納された、今回のリードコマンドにより指定されたデータを外部に転送するとともに、その記憶媒体からアドレス順に読出しを継続してバッファに格納する先読みを行なう読出制御手段と、
バッファ上の、記憶媒体上でのアドレスが連続しているデータが格納されたデータエリアに、そのデータエリア内の、外部に転送されていない残りのデータ量に基づいて、重み付けを行なう重み付け手段とを備えることを特徴とする。
【０００９】
ここで、上記重み付け手段は、更に、データエリア毎に、当該データエリアに対するアクセス頻度、当該データエリアが最後にアクセスされてからの経過時間、または当該データエリアが最後にアクセスされてからの外部リードコマンドの発行回数の少なくとも１つに基いて、重み付けを行なうものであってもよい。
【００１０】
また、上記読出制御手段は、今回のリードコマンドにより要求されたデータがバッファに格納されていないときは、記憶媒体から今回のリードコマンドにより指定されたデータを読み出して、バッファの、重み付け手段により付された重みが最小のデータエリアに格納するものであることが好ましい。
【００１１】
本発明の記憶装置は、記憶媒体から読み出したデータをバッファ上に順次詰めていくため、バッファ全体が有効に使用される。また、バッファ上の、記憶媒体上でのアドレスが不連続な点で分離されるデータエリアごとに重み付けを行ない、最小の重みのデータエリアに上書きするようにしたときは、後で使用される可能性の高いデータがバッファ上に多く残ることになり、キャッシュデータの有効利用が図られ、アクセス速度が向上する。
【００１２】
ここで、上記本発明の記憶装置において、上記読出制御手段は、バッファの、重み付け手段により付された重みが最大のデータエリアへの上書きを禁止し、バッファの、そのデータエリアを除く領域に上書きすることにより、記憶媒体から読み出したデータをバッファに格納するものであることが好ましい。
【００１３】
バッファ上に空き領域が存在しないときは、重み付け手段により付された重みが最小のデータエリアに上書きされるが、そのデータエリアのサイズを越えて上書きをする必要を生じたときであっても、重み付け手段により付された重みが最大のデータエリアについては上書きを禁止することにより、バッファ上のキャッシュデータの有効利用と、記憶媒体から新たに読み出したデータをバッファに格納するにあたりバッファ上に広い格納領域を確保したいという要求との調和が図られる。
【００１４】
ここで、上記読出制御手段により、バッファ中の、最大の重みが付されたデータエリアがアクセスされたときは、重み付け手段は、そのデータエリアを除くデータエリアのうちのいずれかのデータエリアに最大の重みを付すものであることが好ましい。
【００１５】
新たに発行されたリードコマンドにより要求されたデータが、バッファ中の、重みが最大のデータエリアに存在する場合があり、その場合は、その最大重みのデータエリアがアクセスされることになる。この場合、そのアクセスされた最大重みのデータエリアを除く他のデータエリアのいずれかを重大重みとすることにより、バッファ上のキャッシュデータの有効利用と記憶媒体から新たに読み出したデータの広い格納領域の確保との協和が保たれる。もともと最大重みを持っていたデータエリアは、アクセスされた結果そのデータエリアに格納されていたデータのうちの少なくとも一部がそこから読み出されて転送されるため、そのデータエリアの未転送のデータ量は減少し、そのデータエリアの重みは自ずと低下することになる。
【００１６】
さらに、上記本発明の記憶装置において、上記読出制御手段は、今回のリードコマンドにより要求されたデータ全てがバッファ中のいずれかのデータエリアに格納されており、かつ、そのデータエリア中の、今回のリードコマンドにより要求されたデータが格納され領域の先頭アドレスが、そのデータエリア中の、そのデータエリア形成の基になった過去のリードコマンドによる要求に応じて外部に転送したデータが格納された領域の最終アドレスの次のアドレスであったときは、今回のリードコマンドに応じて、記憶媒体上の、そのデータエリアの最終アドレスに格納されているデータが記憶されていたアドレスの次のアドレスから先読みを開始するものであることが好ましい。
【００１７】
今回のリードコマンドにより要求されているデータ全てがバッファ中のいずれかのデータエリアに格納されており（これを「フルヒット」と称する）、かつ、今回のリードコマンドが、そのデータエリア形成の基になった過去のリードコマンドに対するシーケンシャルコマンドであったときは、今回のリードコマンドがシーケンシャルコマンドであることから、今回のリードコマンドに対するシーケンシャルコマンドがさらに発行される可能性が高く、したがってこの条件を満たす場合には先読みを実行する。フルヒット時に先読みを実行するにあたり、過去のリードコマンドに対するシーケンシャルコマンドであるという条件を設けることにより、無駄な先読み実行によるオーバヘッドの増加が防止され、また、別のデータエリアへの無駄な上書きが防止される。
【００１８】
尚、今回のリードコマンドが要求しているデータがバッファ上に一部しか存在していない（これを「一部ヒット」と称する）ときは、今回のリードコマンドがシーケンシャルコマンドであるか否かに拘らず、足りない分のデータが記憶媒体から読み出され、次のリードコマンド発行までに空き時間があるときは先読みが実行される。
【００１９】
尚、本発明の記憶装置は、以下のようにも捉えることができる。すなわち、本発明の記憶装置は、外部から入力されたリードコマンドを受けて記憶媒体からデータを読み出しバッファに格納するとともに、そのバッファに格納されたデータを外部に転送する記憶装置において、
今回入力されたリードコマンドにより要求されたデータがバッファに既に格納されているか否かを判定する判定手段と、
今回のリードコマンドにより要求されたデータがバッファに既に格納されている場合はそのバッファからそのデータを読み出して外部に転送し、今回のリードコマンドにより要求されたデータがバッファには格納されておらず、かつそのバッファにデータが格納されていない空き領域が存在するときは、記憶媒体の、今回のリードコマンドにより指定された読出先頭アドレス以降の、今回のリードコマンドにより指定されたデータ量のデータが記憶された領域のデータを読み出して、バッファの、データが既に格納されている領域の最終アドレスの次のアドレス以降の領域に格納し、そのバッファに格納された、今回のリードコマンドにより指定されたデータを外部に転送するとともに、記憶媒体からの、今回のリードコマンドにより指定されたデータの読出しが終了した後も、その記憶媒体からアドレス順に読出しを継続してバッファに格納する先読みを行なう読出制御手段と、
バッファ上の、記憶媒体上でのアドレスが連続しているデータが格納されたデータエリアに、そのデータエリア内の、外部に転送されていない残りのデータ量に基づいて、バッファ上に保存しておく重要度に応じた重み付けを行なう重み付け手段とを備え、
上記読出制御手段は、今回のリードコマンドにより要求されたデータがバッファに格納されておらず、かつそのバッファに空き領域が存在しないときは、記憶媒体の、今回のリードコマンドにより指定された読出先頭アドレス以降の領域から今回のリードコマンドにより指定されたデータ量のデータを読み出して、バッファの、重み付け手段により付された重みが最小のデータエリアの先頭アドレス以降の領域に格納し、そのバッファに格納された、今回のリードコマンドにより要求されたデータを外部に転送するとともに、さらに先読みを実行するものであることを特徴とする。
【００２０】
【発明の実施の形態】
以下、本発明の実施形態について説明する。
【００２１】
図１は、本発明の記憶装置の一実施形態である磁気ディスク装置の内部構造を示す図である。
【００２２】
この磁気ディスク装置１０のハウジング１１には、スピンドルモータ２６（図２参照）によって、回転軸１２を中心に回転駆動される磁気ディスク１３が収容されている。尚、このハウジング１１は図示しないカバーによって覆われるが、ここではカバーを取り外した状態が示されている。
【００２３】
この磁気ディスク１３は、本発明にいう記憶媒体の一例に相当する。また、この磁気ディスク装置１０のハウジング１１には、さらに、磁気ディスク１３に対向する浮上ヘッドスライダ１４、その浮上ヘッドスライダ１４を先端に固着し回動軸１５を中心に回動するキャリッジアーム１６、およびキャリッジアーム１６をボイスコイルモータ２５（図２参照）で回動駆動するアクチュエータ１７が装備されている。磁気ディスク１３に記憶されたデータの読出しにあたっては、アクチュエータ１７に備えられたボイスコイルモータによってキャリッジアーム１６が回動駆動され、浮上ヘッドスライダ１４が、回転する磁気ディスク１３上への所望のトラックに位置決めされる。浮上ヘッドスライダ１４には、磁気ヘッド２８（図２参照）が設置されており、この磁気ヘッド２８は、磁気ディスク１３に記憶された情報を、その磁気ディスク１３の回転に伴って順次に磁気的にピックアップし電気的な信号として出力する。
【００２４】
図２は、図１に示す磁気ディスク装置の機能構成ブロック図である。
【００２５】
ここには、バッファメモリ１８、ハードディスクコントローラ１９、プログラムメモリ２０、リード／ライト回路２１、ＣＰＵ（ＣＰＵ用ＲＡＭを含む）２２、発振器２３、サーボコントローラ２４、ボイスコイルモータ２５、スピンドルモータ２６、ヘッドＩＣ２７、磁気ヘッド２８、および、図１にも示した磁気ディスク１３が示されている。
【００２６】
磁気ディスク１３は、前述したようにスピンドルモータ２６によって回転駆動され、磁気ヘッド２８は、キャリッジ１６（図１参照）の先端に固定されているためそのキャリッジ１６がボイスコイルモータ２５によって回動駆動されることにより、その磁気ヘッド２８も駆動される。
【００２７】
サーボコントローラ２４には、ボイルコイルモータ２５を駆動するボイスコイルモータ駆動回路およびスピンドルモータを駆動するスピンドルモータ駆動回路が内蔵されており、サーボコントローラ２４は、ＣＰＵ２２からの指示に従って、ボイスコイルモータ２５およびスピンドルモータ２６を駆動する。
【００２８】
磁気ディスク１３に記憶された情報は磁気ヘッド２８によりピックアップされて電気信号に変換される。その電気信号はヘッドＩＣを経由することにより所定のデータ形式に変換されてリード／ライト回路２１に伝えられる。一方、磁気ディスク１３に情報を書き込む時は、リード／ライト回路２１により書込用のデータがヘッドＩＣ２７に伝えられ、磁気ヘッド２８により、その書込用のデータに対応した情報が磁気ディスクに記憶される。
【００２９】
ハードディスクコントローラ１９は、図示しないホストシステムとの間でデータやコマンドの送受信を行なうとともに、ホストシステムから、ライトコマンドとともに磁気ディスク１３への書込用のデータが送られてきたときは、ＣＰＵ２２にそのライトコマンドを通知して、ＣＰＵ２２に、磁気ヘッド２８が磁気ディスク１３上の所望のアドレス位置に駆動されるようサーボコントローラ２４に指示を出させ、そのデータを一旦バッファメモリ１８に格納した後、バッファメモリ１８からそのデータを読み出して、そのデータをリード／ライト回路２１に送るとともに書込みを指示する。また、このハードディスクコントローラ１９は、ホストシステムからリードコマンドが送られてきたときは、ＣＰＵ２２にそのリードコマンドを通知して、ＣＰＵ２２に、磁気ヘッド２８が磁気ディスク１３上の所望のアドレス位置に駆動されるようサーボコントローラ２４に指示を出させ、リード／ライト回路２１に対し、磁気ディスク１３からのデータの読出しを指示し、さらに、磁気ディスク１３から読み出されたデータをリード／ライト回路２１から受け取ってバッファメモリ１８に格納し、また、その受信したリードコマンドにより要求されたデータをバッファメモリ１８から読み出してホストシステムに送信する。
【００３０】
ＣＰＵ２２は、発振器２３で生成されたクロックに同期して、プログラムメモリ２０に格納されたプログラムを読み出して実行することにより、この磁気ディスク装置１０の全体を制御する。
【００３１】
本実施形態の特徴は、ホストシステムがリードコマンドを発行したときにＣＰＵ２２で動作するプログラムの内容や、それに応じて動作するハードディスクコントローラ１９等の動作内容にあるが、以下では、先ず、バッファメモリ１８にキャッシュデータが格納されていく様子について説明する。
【００３２】
図３〜図１４は、図２に示すバッファメモリ１８中の、磁気ディスク１３から読み出されたデータをキャッシュデータとして格納しておくリードバッファのメモリマップである。
【００３３】
図３は、リードバッファにキャッシュデータが全く存在しない初期状態を示している。バッファ先頭アドレス、バッファ最終アドレスは、図１，図２に示す磁気ディスク装置１０への電源投入時に設定される。
【００３４】
ここで、ホストシステムからリードコマンド▲１▼が発行されると、図４に示すように、そのリードコマンド▲１▼により要求されたデータ＊ａと、それに引き継ぐ先読みデータ＊ｂが磁気ディスク１３から読み出され、リードバッファのバッファ先頭アドレスから順に格納される。
【００３５】
図４に示すリング先頭アドレス、リング最終アドレスは、磁気ディスク１３からのデータ読出しが続いたときに、リードバッファのリング先頭アドレスから順にデータが格納され、リング最終アドレスまでデータが格納されると次のデータはリング先頭アドレスに戻って上書きされる、というように、データが循環的に上書きされる領域の先頭アドレス、最終アドレスである。ただし、リング先頭アドレスとリング最終アドレスとの間が先読みデータで満たされたときはその時点で上書きは停止される。また、後述するように、上書き禁止エリアが存在するときはそのエリアについては上書きされない。
【００３６】
これらリング先頭アドレス、リング最終アドレスは、この磁気ディスク１０への電源投入直後、あるいはリセット直後は、それぞれ、バッファ先頭アドレス、バッファ最終アドレスに一致している。
【００３７】
図４に示すリードコマンド▲１▼に対する先読み継続中に、リードコマンド▲１▼に対するランダムリードコマンド（リードコマンド▲１▼に対するシーケンシャルリードコマンドでなく、かつ磁気ディスク上、リードコマンド▲１▼に応じて読み出されるアドレスとは全く離れたアドレス（後述する「ギャップリードコマンド」の定義を満足しないアドレス）からデータを読み出すことを要求するリードコマンド）が発行されると、リードコマンド▲１▼に対する先読みは停止され、図５に示すように、リードコマンド▲２▼により要求されたデータ＊ｃおよびそれに引き続く先読みデータ＊ｄが、図５に示すリング先頭アドレス（リードコマンド▲１▼に応じて磁気ディスクから読み出されたデータ＊ａ，＊ｂが格納されたエリア▲１▼の最終アドレスの次のアドレス）から順に格納される。
【００３８】
この場合、キャッシュデータエリア（磁気ディスク上で連続したアドレスのデータが格納されたリードバッファ上の領域）は、エリア▲１▼と、エリア（＊ｃ＋＊ｄ）との２つ形成される。
【００３９】
一方、図４に示すリードコマンド▲１▼に対する先読み継続中に、磁気ディスク上の、リードコマンド▲１▼の最終読出アドレスに対し物理の＋１トラックのセクタ数以内（磁気ディスクが物理的に一回転する範囲内）だけ先に進んだアドレスを読出先頭アドレスとするリードコマンド（この条件を満たすリードコマンドを「ギャップリードコマンド」と称する）▲３▼が発行されたときは、図６に示すように、それまでの先読み＊ｂ１に引き続き、先読み＊ｂ２が実行され、さらに引き続いてリードコマンド▲３▼が要求するデータ＊ｃが磁気ディスクから読み出されてリードバッファに格納され、さらに先読み＊ｄが行なわれる。この場合、データ＊ａ，＊ｂ１，＊ｂ２，＊ｃ，＊ｄは、磁気ディスク上順次連続するアドレスのデータであり、したがって、リードバッファ上の、これらのデータ＊ａ，＊ｂ１，＊ｂ２，＊ｃ，＊ｄが格納された領域全てを合わせたものが１つのキャッシュデータエリアとして定義される。このように、ここでは、磁気ディスク上のアドレスの不連続点で区切られるリードバッファ上のエリアをキャッシュデータエリアと称している。
【００４０】
リードバッファ上にキャッシュデータエリアが形成されると、そのキャッシュデータエリア中の、ホストシステムに転送されたことのないデータのデータ量に基づいて、そのキャッシュデータエリアに“重み”が付される。ここでは、基本的には、ホストシステムに転送されたことのないデータのデータ量が多いほど大きな重みが付されるが、そのデータ量が所定の上限値を越えると、新たなリードコマンドに応じて磁気ディスクから新たに読み出されるデータの格納領域が極端に制限されるため、そのようなキャッシュデータエリアは、リードバッファ上に複数のキャッシュデータエリアが存在する場合、“重み”が最大のキャッシュデータエリアという扱いから外される。
【００４１】
図７は、リードバッファに▲１▼，▲２▼，▲４▼の３つのキャッシュデータエリアが存在し、これら３つのキャッシュデータエリアでリードバッファ全域が埋められている状態を示している。ここでは、ホストシステムへ転送されたことのないデータ量は、３つのキャッシュデータエリア▲１▼，▲２▼，▲４▼のいずれにおいても上限値は越えておらず、ホストシステムへ転送されたことのないデータ量の多い順（ここでは▲１▼＞▲２▼＞▲４▼の順）に大きな重みが付されたものとする。
【００４２】
このとき、ホストシステムからリードコマンド▲５▼が発行され、このリードコマンド▲５▼が要求しているデータが▲１▼，▲２▼，▲４▼のいずれのキャッシュデータエリアにも存在しない（これを「ヒットしない」と称する）ならば、リードコマンド▲５▼に応じて磁気ディスクからデータが読み出され、その読み出されたデータは、図８に示すように、“重み”が最小のキャッシュデータエリアである▲２▼のエリアの先頭アドレスから格納される。
【００４３】
図９は、図８の状態からリードコマンド▲５▼に応じたデータがリードバッファに格納され、その後さらにシーケンシャルリードコマンドが順次発行されたときの図である。シーケンシャルリードコマンドが順次発行されたときは、リードバッファ上の、リング先頭アドレス、リング最終アドレスで設定したリードバッファ領域▲５▼内のみデータの格納が行なわれ、“重み”が最大のキャッシュデータエリア▲１▼のデータはそのまま保存され続ける。
【００４４】
図１０は、図７と同様な状態、すなわち、リードバッファに▲１▼，▲２▼，▲４▼の３つのキャッシュデータエリアが存在し、この３つのキャッシュデータエリアでリードバッファ全域が埋められている状態を示す図であるが、ここでは、ホストシステムへ転送されたことのないデータ量は、▲２▼＞▲１▼＞▲４▼の順であり、この順に大きな重みが付されたものとする。この場合、リング先頭アドレスは、“重み”が最小のキャッシュデータエリア▲４▼の先頭アドレス、リング最終アドレスは、“重み”が最大のキャッシュデータエリア▲２▼の先頭アドレスの直前のアドレスに設定される。したがってこの状態でリードコマンド▲５▼が発行され、▲１▼，▲２▼，▲４▼のいずれのキャッシュデータエリアにもヒットしないならば、リードコマンド▲５▼に対応するデータが磁気ディスクから読み出されて、その読み出されたデータが、リードバッファ上のリング先頭アドレスから順に格納される。
【００４５】
図１１は、図１０に示す状態においてリードコマンド▲５▼が実行され、さらに引き続いてシーケンシャルコマンドが順次実行された状態を示す図であり、その間にデータが格納された領域は、リング先頭アドレスからリング最終アドレスまでの▲５▼−１，▲５▼−２の領域であり、その間“重み”が最大のキャッシュデータエリア▲２▼は保存され続ける。
【００４６】
すなわち、ここでは、リードコマンド▲５▼に対応するデータの格納開始位置は、リング先頭アドレスに一致し、その後シーケンシャルリードコマンドが続くとバッファ最終アドレスまでデータが格納され、その次のデータはバッファ先頭アドレスに格納され、その後も順次リング最終アドレスに向けて格納され、というように、“重み”が最大のキャッシュデータエリア▲２▼を飛ばして循環的にデータが上書きされるようになっている。
【００４７】
図１２は、図７に示すように３つのキャッシュデータエリア▲１▼，▲２▼，▲４▼（“重み”は大きな方から▲１▼＞▲４▼＞▲２▼の順）が存在している状態において、リードコマンド▲６▼が発行されたときを示している。
【００４８】
ここで、この図１２に示す＊ａは、リードコマンド▲１▼が要求したデータ、＊ｂ１，＊ｂ２はそのリードコマンド▲１▼の実行後の先読みデータ、＊ｇは、リードコマンド▲１▼の実行後の先読みデータであるとともに、リードコマンド▲６▼が要求したデータ、＊ｃはリードコマンド▲２▼の要求データ、＊ｄはそのリードコマンド▲２▼の実行後の先読みデータ、＊ｅはリードコマンド▲４▼の要求データ、＊ｆはリードコマンド▲４▼実行後の先読みデータである。
【００４９】
ここで発行されたリードコマンド▲６▼は、キャッシュデータエリア▲１▼が形成される基になったリードコマンド▲１▼（図４参照）に対するシーケンシャルコマンド（＊ｂ１の先頭を読出先頭アドレスとするコマンド）ではないが、キャッシュデータエリア▲１▼にフルヒットする（そのリードコマンドが要求するデータ全てが既にそこに格納されている）リードコマンドであるものとする。このとき、リードコマンド▲６▼はフルヒットではあるがシーケンシャルではないため先読みは行なわれず、リードコマンド▲６▼で要求されたデータがリードバッファから読み出されてホストシステムへ転送される。ここで、キャッシュデータエリア▲１▼は“重み”が最大のエリアであったが、リードコマンド▲６▼の実行により、キャッシュデータエリア▲１▼はホストシステムに転送されていないデータ量が減少し、その結果“重み”の順位が自ずと低下する結果となり、例えばここでは、その“重み”の順位が▲４▼＞▲１▼＞▲２▼に変化する。
【００５０】
図１３は、図７に示すように３つのキャッシュデータエリア▲１▼，▲２▼，▲４▼（“重み”は▲１▼＞▲４▼＞▲２▼の順）が存在する状態において、キャッシュデータエリア▲１▼が形成される基になったリードコマンド▲１▼（図４参照）に対するシーケンシャルリードコマンドであってかつキャッシュデータエリア▲１▼に対しフルヒットするリードコマンド▲７▼が発行された場合の説明図である。
【００５１】
このときは、リードコマンド▲７▼はキャッシュデータエリア▲１▼にフルヒットしているため、リードコマンド▲７▼が要求したデータをホストシステムに転送するにあたっては、そのデータをリードバッファから読み出して転送すればよく、磁気ディスクを新たにアクセスする必要はないが、ここではリードコマンド▲７▼はリードコマンド▲１▼に対するシーケンシャルリードコマンドであるため、さらに先読みが行なわれる。
【００５２】
この先読みを行なうにあたっては、リードコマンド▲７▼がヒットしたキャッシュデータエリア▲１▼は“重み”が最大のエリアであるため、このキャッシュデータエリア▲１▼の最大“重み”は解除され、“重み”が次に大きいキャッシュデータエリアであるキャッシュデータエリア▲４▼の“重み”が最大とされ、その最大“重み”のキャッシュデータエリア▲４▼への上書きを避けるようにリング先頭アドレス，リング最終アドレスが設定されるとともに、磁気ディスク上の、先読みデータ＊ｂ２（図１２参照）が記憶されていた領域の最終アドレスの次のアドレスから順に読み出されたデータが、リードバッファ上の、リードコマンド▲１▼の実行の先読みの最終アドレス（キャッシュデータエリア▲１▼の最終アドレス）の次のアドレス（キャッシュデータエリア▲２▼の先頭アドレス）から順に格納される。
【００５３】
図１４は、リードコマンド▲７▼を実行した後さらに先読みを行ない、次のリードコマンドが発行される前に先読みが終了した状態を示す図である。
【００５４】
先読みデータは、図１３に示すキャッシュデータエリア▲２▼の先頭アドレスから順に格納され、キャッシュデータエリア▲２▼の最終アドレスであるリング最終アドレスまで格納されると、今度はキャッシュデータエリア▲１▼の先頭アドレス（リードバッファの先頭アドレス）に設定されたリング先頭アドレスから順に先読みデータが格納され、かつ、図１３に示す、リードコマンド▲７▼の要求データが格納された領域（図１３に示す▲７▼リードデータ存在位置）の最終アドレスまで先読みデータが格納されて、先読みが停止する。この段階では、キャッシュデータエリア▲４▼はそのまま保存され、リードバッファ上の、キャッシュデータエリア▲４▼を除く領域全てに先読みデータが格納された状態となる。
【００５５】
次に、以上の動作を実現するための、図２に示すＣＰＵ２２で実行されるプログラムについて説明する。
【００５６】
図１５〜図１９は、リードコマンド受領時に実行されるリード制御プログラムのフローチャートである。但し、このフローチャートには、図２に示すＣＰＵ２２で実行される処理と、ＣＰＵ２２の指令を受けたハードディスクコントローラ１９等で実行される処理が区別なしに示されている。
【００５７】
この図１５〜図１９に示すプログラムは、基本的には、磁気ディスクがアクセスされていないとき（先読みが停止しているとき）にリードコマンドを受領すると、その実行が開始される。ただし後述するように、リードコマンドを受領した後先読み停止処理を行ない、その後、このプログラムが再度実行される場合もある。
【００５８】
リードコマンドが発行されたことに応じてこのプログラムの実行が開始されると、先ず図１５のステップ１＿１において、その発行されたリードコマンドから、磁気ディスク上の読出先頭アドレスと要求されたデータ量を表わす要求セクタ数の情報が取得され、次いでリードバッファ中にキャッシュセーブされたデータが存在するか否かが判定される（ステップ１＿２）。リードバッファ中にキャッシュセーブされたデータが存在しないとき、すなわちリードバッファが完全に空いた初期状態にあるときは、そのままミスヒット処理（図１６参照）に移行する。
【００５９】
ステップ１＿２において、リードバッファ中にキャッシュセーブされたデータが存在すると判定されると、そのリードコマンドから取得した先頭アドレスと要求セクタ数から、リードバッファに形成されたキャッシュデータエリア１つずつについて今回のリードコマンドがヒットするか否か検査され（ステップ１＿３）、フルヒットしたキャッシュデータエリアが存在するか否か（ステップ１＿４）、および一部ヒットしたキャッシュデータエリアが存在するか否か（ステップ１＿５）が判定される。フルヒットしたキャッシュデータエリアも一部ヒットしたキャッシュデータエリアも存在しないときは図１６のミスヒット処理に移行し、一部ヒットしたキャッシュデータエリアが存在するとき、およびフルヒットしたキャッシュデータエリアが存在するときは、図１９の、それぞれ一部ヒット処理、フルヒット処理に移行する。
【００６０】
図１６に示すミスヒット処理においては、リードバッファ中にキャッシュセーブされていない空きエリア（例えば図４に示すようなキャッシュデータ無しのエリア）が存在するか否かが判定され（ステップ２＿１）、リードバッファが満杯（空きエリアなし）のときは、図１８に示す、リードバッファが満杯のときのミスヒット処理に移行する。図１８の処理については後述する。
【００６１】
図１６のステップ２＿１において、空きエリアが存在すると判定されると、ステップ２＿２に進み、リードバッファ中にキャッシュデータエリアが存在するか否かが判定される。このステップ２＿２でリードバッファ中にキャッシュデータエリアが存在しない、すなわちリードバッファが図３に示すような初期状態にあると判定されたときは、ステップ２＿３に進んでリング先頭バッファがバッファ先頭アドレスに設定されるとともにリング最終バッファがバッファ最終アドレスに設定され、ステップ２＿６に進む。ステップ２＿６については後述する。
【００６２】
ステップ２＿２において、リードバッファ中にキャッシュデータエリアが存在すると判定されると、ステップ２＿４に進み、複数個のキャッシュデータエリアが存在する中でホストへの未転送セクタ数を一番多く持つキャッシュデータエリアを検出し、そのキャッシュデータエリアの“重み”を最大とする。ここで、リードバッファ中にキャッシュデータエリアが1つしか存在しないときは、その唯一のキャッシュデータエリアの“重み”が最大ということになる。
【００６３】
また、リードバッファ中にキャッシュデータエリアが複数存在する場合において、未転送セクタ数をあまりに多く持つキャッシュデータエリアが存在したときは、そのキャッシュデータエリアは“重み”最大のキャッシュデータエリアとい評価からは外される。未転送セクタ数が多過ぎるときは、そのキャッシュデータエリアのサイズが大き過ぎることを意味し、磁気ディスクから新たに読み出されたデータの格納領域のサイズが大幅に制限されてしまうからである。
【００６４】
次いで、ステップ２＿５に進み、ステップ２＿４で設定した“重み”が最大のキャッシュデータエリアが上書きされないようにリング先頭アドレス、リング最終アドレスが設定される。
【００６５】
ステップ２＿６では磁気ディスクから読み出されたデータがリードバッファ中の空きエリアの先頭アドレスから格納開始されるように格納アドレスを設定し、その磁気ディスクからのデータ読出しを開始し（開始をハードディスクコントローラ１９に指示し）、図１７に示すホストへのデータ転送処理に移行する。以後このデータ読出しは図２に示すハードディスクコントローラ１９により自動的に行なわれ、今回のリードコマンドにより要求されたデータの読出しが終了した後も、通常は、そのまま先読みが継続される。
【００６６】
図１７のステップ３＿１では、ホストへの転送可能なデータがリードバッファ中に存在したとき自動的にホスト転送を行なうようハードディスクコントローラ１９（図２参照）に指示が出される。ハードディスクコントローラ１９は、以後、その指示に従って、リードバッファ中に格納されたデータのうちホストシステムに転送すべきデータをセクタ単位で転送する。
【００６７】
ステップ３＿２では、リードバッファ中にホストシステムに転送可能なデータが存在するか否かがモニタされ、ステップ３＿３では、今回のリードコマンドが要求したデータの、ホストシステムへの転送が完了したか否か、すなわち今回のリードコマンドに応じた処理が終了したか否かがモニタされる。
【００６８】
さらにステップ３＿４では、先読みが停止したか否かがモニタされ、先読み中のときは、次のリードコマンドを受領したか否かがモニタされる。例えば図１４を参照して説明したような状況に達することにより先読みが終了すると、ステップ３＿９に進む。ステップ３＿９については後述する。
【００６９】
先読み続行中に次のリードコマンドを受け取ると、その受け取ったリードコマンドが前回のリードコマンドに対するシーケンシャルリードコマンドであるか否か（ステップ３＿６）、前回のリードコマンドの最終アドレスに対し磁気ディスク上、物理的な＋１トラックのセクタ数以内を読出先頭アドレスとするリードコマンド（ギャップリードコマンド）であるか否か（ステップ３＿７）が判定され、シーケンシャルリードコマンドあるいはギャップリードコマンドであったときはステップ３＿１に戻り、磁気ディスクからのデータ読出しが継続される。
【００７０】
一方、今回受け取ったリードコマンドが前回のリードコマンドに対しランダムリードコマンドであったときは、ステップ３＿８に進み、先読み停止処理が実行される。
【００７１】
ステップ３＿９では、キャッシュセーブ（キャッシュセーブパラメータ（後述する）をＣＰＵ内のＲＡＭテーブルに書き込む処理）が行なわれる。
【００７２】
ここで、キャッシュセーブパラメータは、そのキャッシュデータエリアの、リードバッファ上の先頭アドレス、そのキャッシュデータエリアに格納されたデータの、磁気ディスク上の先頭アドレス（先頭ＬＢＡ：ｌｏｇｉｃａｌ  ｂｌｏｃｋ  ａｄｄｒｅｓｓ）、そのキャッシュデータエリアのセクタサイズ、そのキャッシュデータエリアに格納されたデータのうちの、ホストへの未転送のセクタ数、および、後のリードコマンドが自分に対するシーケンシャルコマンドであるか否かの判定のための、自分のリードコマンドの読出先頭アドレスと要求セクタ数から求められる最終ＬＢＡの次のＬＢＡから構成され、キャッシュセーブが行なわれるとそこに新たなキャッシュデータエリアが１つ生成されたことになる。
【００７３】
ステップ３＿９におけるキャッシュセーブが終了するとこのルーチンを抜けることになるが、次のランダムリードコマンドを既に受領しているときは（ステップ３＿５〜３＿８参照）、そのリードコマンドの処理を実行するために、図１５のスタート位置からこのルーチンが再度実行される。
【００７４】
図１８は、図１６のミスヒット処理におけるステップ２＿１においてリードバッファが満杯状態のときに実行される、バッファ満杯状態におけるミスヒット処理を示しており、ステップ４＿１では、リードバッファ中にキャッシュデータエリアは１つのみ存在する（その１つのキャッシュデータエリアだけで満杯状態にある）か否かが判定され、キャッシュデータエリアが１つのみ存在するときは、ステップ４＿２に進み、リング先頭アドレスがバッファ先頭アドレスに一致するように設定されるとともにリング最終アドレスがバッファ最終アドレスに一致するように設定され、ステップ４＿３に進み、磁気ディスクからのリードデータが、リードバッファ上の、その唯一のキャッシュデータエリアの最終アドレスに引き続くアドレスから格納開始されるようにリードバッファへの格納アドレスを設定した後、磁気ディスクからのデータ読出しが行なわれる。
【００７５】
その後は、図１７を参照して説明したホストへのデータ転送処理が行なわれる。
【００７６】
図１９は、図１５において、リードバッファ上に一部ヒットあるいはフルヒットしたキャッシュデータエリアが存在すると判定された場合の処理であり、フルヒットのときはステップ５＿１から実行され、一部ヒットのときはステップ５＿２から実行される。
【００７７】
ステップ５＿１では、そのリードコマンドはフルヒットしたキャッシュデータエリア内の最終リードコマンド（そのキャッシュエリア作成の基になったリードコマンド、あるいは、図６を参照して説明したように複数のリードコマンドによって１つのキャッシュデータエリアが形成されるときは、それら複数のリードコマンドのうちの最終のリードコマンド）に対しシーケンシャルリードコマンドであるか否かが判定される。シーケンシャルコマンドでないときは、そのまま、図１７に示すホストへのデータ転送処理に移行する。このときは、先読みは行なわれない。
【００７８】
ステップ５＿１において、シーケンシャルコマンドではないと判定されると、ステップ５＿２に進む。このステップ５＿２に進むのは、フルヒットであって、かつシーケンシャルリードコマンドであるときと、シーケンシャルリードコマンドであるか否かを問わず、一部ヒットであるときである。
【００７９】
ステップ５＿２では、リードバッファ中に空きエリアが存在するか否かが判定され、ステップ５＿３では、リードバッファ中に存在するデータエリアは１つだけか否かが判定される。
【００８０】
リードバッファに空きエリアが存在せず（満杯状態にあり）、かつリードバッファ中にキャッシュデータエリアが１つのみ存在するときはステップ５＿４に進み、そうではないとき、すなわちリードバッファに空きエリアが存在するとき、あるいは空きエリアは存在しなくてもリードバッファに複数のキャッシュデータが存在するときはステップ５＿６に進む。
【００８１】
ステップ５＿４では、リードバッファが唯一のキャッシュデータエリアで満杯になっているため、リング先頭アドレス、リング最終アドレスがバッファ先頭アドレス、バッファ最終アドレスにそれぞれ一致するように設定され、ステップ５＿５において、その唯一のキャッシュデータエリアの最終アドレスに引き続くアドレスから格納が開始されるようにリードバッファへの格納アドレスが設定され、その後、磁気ディスクからのデータ読出しが行なわれる。
【００８２】
その後は、図１７のホストへのデータ転送処理に残る。
【００８３】
一方、ステップ４＿４に進んだときは、リードバッファ中に存在する複数個のキャッシュデータエリアのうち、ホストへの未転送セクタ数を一番多くもつキャッシュデータエリアを検出し、そのキャッシュデータエリアの“重み”を最大とする。尚、図１６のステップ２＿４の場合と同様、リードバッファ中にキャッシュデータエリアが１つしか存在しないときは、その唯一のキャッシュバッファエリアが“重み”最大のキャッシュデータエリアとなる。また、あまりに多くの未転送セクタをもつキャッシュデータエリアが“重み”最大から外される点も、図１６のステップ２＿４の場合と同じである。
【００８４】
ステップ４＿５では、ステップ４＿４で設定した“重み”が最大のキャッシュデータエリアが上書きされないようにリング先頭アドレス、リング最終アドレスが設定される。
【００８５】
ステップ４＿５では、“重み”が最小のキャッシュデータエリアが解除され、磁気ディスクから読み出されたデータが解除されたエリアの先頭バッファアドレスから格納が開始されるようにリードバッファへの格納アドレスが設定され、その後、磁気ディスクからのデータ読出しが行なわれる。ここで、リードバッファに空きエリアが存在するときはその空きエリアが“重み”最小のエリアとして取り扱われる。
【００８６】
その後は、図１７に示すホストへのデータ転送処理に移る。
【００８７】
本実施形態では以上のようなルーチンにより、いずれかのキャッシュデータエリアを解除してそこに上書きする必要があるときは、“重み”が最小のキャッシュデータエリアに上書きされ、また、“重み”が最大のキャッシュデータエリアのデータが保存されるようにデータ格納が行なわれ、したがって先読みにより得られたデータの保存と、磁気ディスクから新たに読み出されたデータの格納領域の確保との間で高度の調和が図られ、アクセス速度が向上する。
【００８８】
尚、上記実施形態は磁気ディスクを備え、その磁気ディスクからデータを読み出してホストに転送する磁気ディスク装置に関するものであるが、本発明は、磁気ディスクに限らず、光ディスク、光磁気ディスク、フロッピィディスク等、どのような記憶媒体からデータを読み出す装置にも適用することができる。
【００８９】
なお、本実施の形態においては、各キャッシュデータエリアに対して、外部に転送されていないデータ量のみに基づいて重み付けされたが、それに加えて、アクセス頻度や、最後にアクセスされてからの経過時間、または最後にアクセスされてからのリードコマンドの発行回数の少なくとも１つも考慮して重み付けを行ってもよい。この場合、アクセス頻度が低いほど重み付けが小さく、経過時間が長いほど重み付けが小さく、またリードコマンド発行回数多いほど重み付けが小さくなる。
【００９０】
【発明の効果】
以上、説明したように、本発明によれば、先読みしたデータの保有と記憶媒体から新たに読み出されたデータの、広い格納領域の確保との両立が図られ、アクセスタイムの短かい記憶装置が実現する。
【図面の簡単な説明】
【図１】本発明の記憶装置の一実施形態である磁気ディスク装置の内部構造を示す図である。
【図２】図１に示す磁気ディスク装置の機能構成ブロック図である。
【図３】磁気ディスクから読み出されたデータをキャッシュデータとして格納しておくリードバッファのメモリマップである。
【図４】磁気ディスクから読み出されたデータをキャッシュデータとして格納しておくリードバッファのメモリマップである。
【図５】磁気ディスクから読み出されたデータをキャッシュデータとして格納しておくリードバッファのメモリマップである。
【図６】磁気ディスクから読み出されたデータをキャッシュデータとして格納しておくリードバッファのメモリマップである。
【図７】磁気ディスクから読み出されたデータをキャッシュデータとして格納しておくリードバッファのメモリマップである。
【図８】磁気ディスクから読み出されたデータをキャッシュデータとして格納しておくリードバッファのメモリマップである。
【図９】磁気ディスクから読み出されたデータをキャッシュデータとして格納しておくリードバッファのメモリマップである。
【図１０】磁気ディスクから読み出されたデータをキャッシュデータとして格納しておくリードバッファのメモリマップである。
【図１１】磁気ディスクから読み出されたデータをキャッシュデータとして格納しておくリードバッファのメモリマップである。
【図１２】磁気ディスクから読み出されたデータをキャッシュデータとして格納しておくリードバッファのメモリマップである。
【図１３】磁気ディスクから読み出されたデータをキャッシュデータとして格納しておくリードバッファのメモリマップである。
【図１４】磁気ディスクから読み出されたデータをキャッシュデータとして格納しておくリードバッファのメモリマップである。
【図１５】リードコマンド受領時に実行されるリード制御プログラムのフローチャートである。
【図１６】リードコマンド受領時に実行されるリード制御プログラムのフローチャートである。
【図１７】リードコマンド受領時に実行されるリード制御プログラムのフローチャートである。
【図１８】リードコマンド受領時に実行されるリード制御プログラムのフローチャートである。
【図１９】リードコマンド受領時に実行されるリード制御プログラムのフローチャートである。
【符号の説明】
１０    磁気ディスク装置
１１    ハウジング
１２    回転軸
１３    磁気ディスク
１４    浮上ヘッドスライダ
１５    回動軸
１６    キャリッジアーム
１７    アクチュエータ
１８    バッファメモリ
１９    ハードディスクコントローラ
２０    プログラムメモリ
２１    リード／ライト回路
２２    ＣＰＵ
２３    発振器
２４    サーボコントローラ
２５    イスコイルモータ
２６    スピンドルモータ
２７    ヘッドＩＣ
２８    磁気ヘッド
【図１】
0003708757.tif 000002
【図２】
0003708757.tif 000003
【図３】
0003708757.tif 000004
【図４】
0003708757.tif 000005
【図５】
0003708757.tif 000006
【図６】
0003708757.tif 000007
【図７】
0003708757.tif 000008
【図８】
0003708757.tif 000009
【図９】
0003708757.tif 000010
【図１０】
0003708757.tif 000011
【図１１】
0003708757.tif 000012
【図１２】
0003708757.tif 000013
【図１３】
0003708757.tif 000014
【図１４】
0003708757.tif 000015
【図１５】
0003708757.tif 000016
【図１６】
0003708757.tif 000017
【図１７】
0003708757.tif 000018
【図１８】
0003708757.tif 000019
【図１９】
0003708757.tif 000020