(57)【要約】【課題】メモリにおける所望サイズの記憶領域を獲得する。【解決手段】メモリ３３から獲得した第１サイズのメモリ領域を、前記第１サイズに要求サイズを加えた第２サイズに拡張する指示を含む第１拡張要求を受信した場合、前記メモリ３３から、前記要求サイズの記憶領域とともに所定サイズの予約領域を獲得する拡張部３２２と、規定時間内に前記メモリ領域を前記第２サイズよりも大きい第３サイズに拡張する指示を含む第２拡張要求を受信しない場合、前記予約領域を解放し、前記予約領域を空き領域とする解放部３２３と、をそなえる。【選択図】図１１
2019040568.tif 000002
【特許請求の範囲】
【請求項１】
メモリから獲得した第１サイズのメモリ領域を、前記第１サイズに要求サイズを加えた第２サイズに拡張する指示を含む第１拡張要求を受信した場合、前記メモリから、前記要求サイズの記憶領域とともに所定サイズの予約領域を獲得する拡張部と、
規定時間内に前記メモリ領域を前記第２サイズよりも大きい第３サイズに拡張する指示を含む第２拡張要求を受信しない場合、前記予約領域を解放し、前記予約領域を空き領域とする解放部と、をそなえる
メモリ制御装置。
【請求項２】
前記第１拡張要求で指定された前記第２サイズに基づき、前記予約領域の前記所定サイズを決定する決定部、をそなえる
請求項１に記載のメモリ制御装置。
【請求項３】
前記決定部は、
前記第２拡張要求を受信した場合、前記第３サイズが前記第２サイズと前記所定サイズとの合計である前記メモリ領域のサイズ以下か否かを判定し、
前記第３サイズが前記メモリ領域のサイズよりも大きい場合、前記第２拡張要求で指定された前記第３サイズに基づき、前記予約領域の前記所定サイズを更新し、
前記拡張部は、前記メモリから、前記第２拡張要求で指定された要求サイズの記憶領域とともに前記決定部が更新した更新後の所定サイズの予約領域を獲得する、
請求項２に記載のメモリ制御装置。
【請求項４】
前記拡張部は、前記第２拡張要求で指定された前記第３サイズが前記メモリ領域のサイズ以下の場合、前記第２拡張要求に係る前記メモリ領域の拡張に前記予約領域を利用する、
請求項３に記載のメモリ制御装置。
【請求項５】
前記決定部は、前記第１拡張要求の要求元のプログラムの動作フェーズに基づき、前記予約領域の前記所定サイズを決定する、
請求項２〜４のいずれか１項に記載のメモリ制御装置。
【請求項６】
前記拡張部は、前記動作フェーズが初期設定フェーズの場合、前記メモリ領域に対する拡張要求に係る処理を実行する都度、前記規定時間の計時をリセットし、
前記解放部は、前記メモリ領域について、前記拡張部が直前の拡張要求に係る処理を実行してから前記規定時間内に次の拡張要求を受信しない場合、前記直前の拡張要求に係る処理で獲得されている予約領域を解放し、当該予約領域を空き領域とする、
請求項５に記載のメモリ制御装置。
【請求項７】
前記解放部は、前記動作フェーズが通常動作フェーズの場合、前記拡張部が前記第１拡張要求に係る処理を実行してから前記規定時間内に前記第２拡張要求を受信しない場合、前記予約領域を解放し、前記予約領域を空き領域とする、
請求項５又は請求項６に記載のメモリ制御装置。
【請求項８】
コンピュータに、
メモリから獲得した第１サイズのメモリ領域を、前記第１サイズに要求サイズを加えた第２サイズに拡張する指示を含む第１拡張要求を受信した場合、前記メモリから、前記要求サイズの記憶領域とともに所定サイズの予約領域を獲得し、
規定時間内に前記メモリ領域を前記第２サイズよりも大きい第３サイズに拡張する指示を含む第２拡張要求を受信しない場合、前記予約領域を解放し、前記予約領域を空き領域とする
処理を実行させる、メモリ制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、メモリ制御装置及びメモリ制御プログラムに関する。
【背景技術】
【０００２】
コンピュータでは、プログラムやデータ等を格納するメモリを管理するメモリ管理が行なわれる。
【０００３】
メモリ管理では、例えば、コンピュータが有するメモリ制御装置により、メモリ領域の獲得、獲得したメモリ領域の拡張、及び、メモリ領域の解放等の処理が、プログラムからの要求に応じて行なわれる。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００３−１３１９３８号公報
【特許文献２】特開２００７−３４５５６号公報
【特許文献３】特開２００７−３１０６２６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
メモリ制御装置は、獲得したメモリ領域を拡張する際に、当該メモリ領域のメモリアドレスに連続するメモリ領域が既に使用されている場合、当該メモリ領域を、拡張後のサイズの連続したメモリアドレスを持つメモリ領域に再割り当てする（Re-allocation）。再割り当てには、元のメモリ領域のデータを再割り当て先のメモリ領域にコピーするメモリコピー処理が含まれる。
【０００６】
上述した再割り当てにより、元のメモリ領域は解放される。しかし、解放により使用可能となるのは、例えば前後を使用済のメモリ領域に挟まれた限られたサイズのメモリ領域である。
【０００７】
従って、頻繁にメモリ領域の獲得、拡張、及び、解放等の処理を引き起こすプログラムが実行される環境では、メモリ領域の再割り当てが繰り返されることによって、メモリの断片化が進むことがある。これにより、メモリの空き容量は十分であるものの、メモリアドレスが連続した或るサイズ（例えば空き容量よりも小さいサイズ）のメモリ領域を確保できない場合がある。
【０００８】
以上のように、メモリ管理が行なわれるコンピュータでは、メモリにおける所望サイズの記憶領域を獲得することが困難となる場合がある。
【０００９】
１つの側面では、本発明は、メモリにおける所望サイズの記憶領域を獲得することを目的の１つとする。
【課題を解決するための手段】
【００１０】
１つの側面では、メモリ制御装置は、拡張部と、解放部と、をそなえてよい。前記拡張部は、メモリから獲得した第１サイズのメモリ領域を、前記第１サイズに要求サイズを加えた第２サイズに拡張する指示を含む第１拡張要求を受信した場合、前記メモリから、前記要求サイズの記憶領域とともに所定サイズの予約領域を獲得してよい。前記解放部は、規定時間内に前記メモリ領域を前記第２サイズよりも大きい第３サイズに拡張する指示を含む第２拡張要求を受信しない場合、前記予約領域を解放し、前記予約領域を空き領域としてよい。
【発明の効果】
【００１１】
１つの側面では、メモリにおける所望サイズの記憶領域を獲得することができる。
【図面の簡単な説明】
【００１２】
【図１】コンピュータの機能構成例を示すブロック図である。
【図２】メモリ管理部が記憶領域から獲得するメモリ領域の一例を示す図である。
【図３】メモリ獲得手順の一例を示す図である。
【図４】メモリ解放手順の一例を示す図である。
【図５】メモリ拡張手順の一例を示す図である。
【図６】メモリ領域の拡張を繰り返した場合の一例を示す図である。
【図７】一実施形態に係るコンピュータの機能構成例を示すブロック図である。
【図８】余分にメモリ領域を確保する場合の一例を示す図である。
【図９】全ての確保領域に予約領域を追加した場合のメモリサイズの一例を示す図である。
【図１０】一実施形態に係るストレージシステムの構成例を示すブロック図である。
【図１１】一実施形態に係る制御装置の機能構成例を示すブロック図である。
【図１２】プログラムで使用する型に応じたメモリの使い方の一例を示す図である。
【図１３】第１テーブルの一例を示す図である。
【図１４】第２テーブルの一例を示す図である。
【図１５】一実施形態に係るメモリ領域拡張手順の一例を示す図である。
【図１６】メモリ獲得処理の一例を示すフローチャートである。
【図１７】メモリ拡張処理の一例を示すフローチャートである。
【図１８】図１７に示す初期設定中の処理の一例を示すフローチャートである。
【図１９】図１７に示す初期設定中の処理の一例を示すフローチャートである。
【図２０】図１７に示す初期設定中の処理の一例を示すフローチャートである。
【図２１】図１７に示す通常動作中の処理の一例を示すフローチャートである。
【図２２】図１７に示す通常動作中の処理の一例を示すフローチャートである。
【図２３】図１７に示す通常動作中の処理の一例を示すフローチャートである。
【図２４】メモリ解放処理の一例を示すフローチャートである。
【図２５】監視処理の一例を示すフローチャートである。
【図２６】監視処理の一例を示すフローチャートである。
【発明を実施するための形態】
【００１３】
以下、図面を参照して本発明の実施の形態を説明する。ただし、以下に説明する実施形態は、あくまでも例示であり、以下に明示しない種々の変形や技術の適用を排除する意図はない。例えば、本実施形態を、その趣旨を逸脱しない範囲で種々変形して実施することができる。なお、以下の実施形態で用いる図面において、同一符号を付した部分は、特に断らない限り、同一若しくは同様の部分を表す。
【００１４】
〔１〕一実施形態
〔１−１〕メモリ管理について
以下、一実施形態に係るメモリ管理について説明する。「メモリ管理」は、プロセスやタスク等のプログラムからの要求に応じて、メモリ領域の獲得（以下、「メモリ獲得」と表記する場合がある）やメモリ領域の解放（以下、「メモリ解放」と表記する場合がある）を行なう手法である。
【００１５】
メモリ獲得は、例えば、プログラムにメモリの一部の記憶領域（メモリ領域）を動的に割り当てる手法であり、メモリ解放は、割り当てたメモリ領域が不要になったときに当該プログラム或いは他のプログラムにより再利用できるようにするための手法である。
【００１６】
例えば、メモリ管理は、図１に示すように、コントローラ１１０及びメモリ１２０をそなえるコンピュータ１００において行なわれてよい。図１の例では、コントローラのメモリ管理部１３０は、メモリ１２０のコントローラ用記憶領域（以下、単に「記憶領域」と表記する場合がある）１４０に対してメモリ管理を行なう。
【００１７】
メモリ管理部１３０がメモリ管理によって記憶領域１４０から獲得するメモリ領域は、図２に例示するように、不連続なメモリ領域ではなく、コントローラ１１０から見たときに連続した（例えばメモリアドレスが連続した）一塊のメモリ領域となる。
【００１８】
なお、メモリ管理部１３０が１００Ｂｙｔｅ（バイト）の要求に対して、記憶領域１４０の１００Ｂｙｔｅ分のメモリ領域を確保する場合、実際には、１００Ｂｙｔｅのデータ領域に加えて、メモリ管理を円滑に行なうためのｍｅｔａ（メタ）領域も確保される。
【００１９】
ｍｅｔａ領域は、数Ｂｙｔｅ（図２の例ではｘＢｙｔｅと表記）程度の領域であってよく、例示的に、確保したデータ領域のサイズ、タイムスタンプ、使用中や解放済等のステータス等の情報が設定されてよい。サイズ、タイムスタンプ、ステータス等の情報の少なくとも１つは、属性情報としてｍｅｔａ領域に設定されてもよい。なお、ｍｅｔａ領域は、例えば、データ領域の先頭に付加される管理ヘッダ領域であってよい。
【００２０】
以下の説明では、便宜上、メモリ管理により獲得、拡張或いは解放されるメモリ領域のサイズを要求されたデータ領域のサイズで示すが、実際には図２に例示するようにｍｅｔａ領域をさらに含むものとする。
【００２１】
ところで、物理的に連続していない（例えばメモリアドレスが連続していない）メモリ領域をプログラムから見たときに連続したメモリ領域（以下、「連続領域」と表記する場合がある）に見せるための手法として、種々の対応策が検討されている。
【００２２】
一例として、仮想記憶方式（或いは、セグメント方式若しくはページング方式）が知られている。仮想記憶方式では、連続していないメモリ領域を組み合わせることで、コントローラ１１０（制御プログラム）からは連続したメモリ領域に見せることができる。また、メモリ領域のサイズについても物理的な個々の空き容量に束縛されずにより大きなメモリ領域を確保できる。
【００２３】
しかし、仮想記憶方式は、高度なメモリ管理機構により実現されるものであり、仮想記憶方式により現実的な性能を得るには高価なハードウェアによるサポートが必要である。このため、コントローラ１１０及びメモリ１２０を有する全てのコンピュータ１００に仮想記憶方式を用いることは難しい。
【００２４】
一実施形態では、仮想記憶方式を用いないメモリ１２０を対象とし、メモリ１２０に対するメモリ管理によって、連続したメモリ領域を獲得することを保証する手法について説明する。
【００２５】
以下、コンピュータ１００において実行されるメモリ管理の手法について説明する。なお、以下に説明するメモリ管理の手法は、一実施形態においても実行されてよい。
【００２６】
〔１−１−１〕メモリ獲得の手法
メモリ管理では連続領域を確保するため、メモリ管理部１３０は、メモリ獲得を行なう前に、要求された連続領域が確保できるエリア（換言すれば「空き領域」）を記憶領域１４０内から探索する。空き領域の探索には種々の手法が用いられてよい。
【００２７】
例えば、メモリ管理部１３０は、図３の上部に示すように、記憶領域１４０における空き領域の断片化を防ぐために、要求されたメモリサイズができるだけ隙間なく収まる領域を探索してよい。そして、メモリ管理部１３０は、図３の下部に示すように、確保したメモリ領域のメモリアドレスをメモリ獲得要求元（例えばプログラム）に応答してよい。
【００２８】
〔１−１−２〕メモリ解放の手法
メモリ管理部１３０は、プログラムからメモリ解放指示を受け取ると（図４の上部参照）、メモリ解放指示に係るメモリ領域を解放し、当該メモリ領域を再利用できるように管理する（図４の下部参照）。
【００２９】
メモリ領域の解放は、例えば、ｍｅｔａ領域におけるステータスを使用中を示す情報から解放済を示す情報に更新する（マークする）ことを含んでよい。また、メモリ管理部１３０は、必要に応じて、空き領域の結合を行なってもよい。
【００３０】
例えば、図４の下部において、使用していたメモリ領域が１００Ｂｙｔｅであり、その後ろに続く（例えばメモリアドレスの連続する）連続領域が３００Ｂｙｔｅであると仮定する。この状態でメモリ領域を解放し、１００Ｂｙｔｅの空き領域と３００Ｂｙｔｅの空き領域とを別々に管理した場合、本来は４００Ｂｙｔｅの空き領域があるにもかかわらず、３００Ｂｙｔｅよりも大きいサイズのメモリ領域の配置（確保）が不可能となる。
【００３１】
空き領域の結合は、このような不都合を解消するための処理であり、メモリ解放の際に、別々に管理されていた隣接する複数の空き領域を結合して、メモリアドレスの連続する単一の空き領域（例えば４００Ｂｙｔｅの領域）として管理する手法である。
【００３２】
〔１−１−３〕メモリ拡張の手法
メモリ管理の基本的な手法は、上述したメモリ獲得及びメモリ解放であるが、これらの応用として、メモリ領域の拡張（以下、「メモリ拡張」と表記する場合がある）がある。メモリ拡張は、「メモリ拡張獲得」と称されてもよい。
【００３３】
メモリ拡張は、Ｃ言語では“realloc”という命令で実装されているものであり、使用中のメモリ領域の場所と、新たに要求されたメモリサイズとを指定することで、以下のような手順によりメモリ領域を再獲得する手法である。
【００３４】
例えば、メモリ管理部１３０は、元々獲得しているメモリ領域のサイズと、新たに要求されたメモリサイズとを比較し、比較結果に応じて、以下のいずれかの処理を行なう。
【００３５】
（ａ）比較結果が同じであれば、メモリ管理部１３０は、新たなメモリ領域の獲得を行なわずに、元々獲得しているメモリ領域の情報（例えばメモリアドレス）をメモリ拡張要求元のプログラムに通知する。
【００３６】
（ｂ）新たに要求されたメモリサイズの方が元々獲得しているメモリ領域のサイズよりも小さければ、メモリ管理部１３０は、元々獲得しているメモリ領域のうちの不要になった領域を解放し、元々獲得しているメモリ領域の情報をプログラムに通知する。
【００３７】
（ｃ）新たに要求されたメモリサイズの方が元々獲得しているメモリ領域のサイズよりも大きければ、メモリ管理部１３０は、以下のいずれかの処理を行なう。
【００３８】
（ｃ−１）現在のメモリ領域の配置のまま拡張可能であれば（例えばメモリ領域に続く連続領域が空き領域であれば）、メモリ管理部１３０は、新たに要求されたメモリサイズを獲得し、元々獲得しているメモリ領域の情報をプログラムに通知する。
【００３９】
（ｃ−２）現在のメモリ領域の配置のままでは拡張不可能であれば、メモリ管理部１３０は、新たに要求されたメモリサイズを獲得可能なメモリ領域を記憶領域１４０から再取得する。そして、メモリ管理部１３０は、元々獲得しているメモリ領域の内容を新たに獲得したメモリ領域にコピーし、元々獲得しているメモリ領域を解放した上で、新たに獲得したメモリ領域の情報をプログラムに通知する。
【００４０】
上記（ｃ−２）の処理の一例を図５に示す。図５の上部に例示するように、メモリ管理部１３０は、プログラムから、“abc”が格納された既存のメモリ領域を、“abcdefg”が格納できるようなメモリ領域に拡張する拡張指示を受け付ける。この場合、“abc”が格納されたメモリ領域に続く連続領域は使用中であるため、メモリ管理部１３０は、図５の下部に例示するように、“abc”＋“defg”を格納可能な新たなメモリ領域を獲得し、“abc”をメモリ領域から新たなメモリ領域にコピーする。そして、メモリ管理部１３０は、メモリ領域を解放した上で、新たなメモリ領域の情報をプログラムに通知する。
【００４１】
上述したように、メモリ獲得処理では隙間が少なくなるようにメモリ領域が獲得されていくため、メモリ管理部１３０は、メモリ拡張処理を行なう場合、上記（ｃ−２）に示すようなメモリコピーを伴うメモリ領域の再獲得処理を行なうことが多い。
【００４２】
一方、Ｃ＋＋のような高級言語では、“string”型や“std::vector”型等のような、ユーザが意識しなくとも変数の領域が足りなくなった時点で使用メモリ領域を拡張するような機能を持つ「型」が定義されている。このため、このような型が多用されると、ユーザの意識しない所でメモリ再配置が大量に発生する可能性がある。
【００４３】
また、メモリ１２０を利用するコントローラ１１０のプログラムによっては、一度確保したメモリ領域の拡張処理を頻繁に実行することがあり、プログラムの制御内容に応じて、大量のメモリ領域の再配置が発生するケースが考えられる。
【００４４】
図６は、図５において新たに獲得したメモリ領域に対して、さらに繰り返し少しずつ使用メモリサイズを拡張した場合の一例を示す図である。図６の例では、メモリ領域の拡張の都度、メモリ領域の再獲得が行なわれている。
【００４５】
例えば、図６の上部では、以下の手順で、メモリコピーを伴うメモリ領域の再獲得処理が行なわれている。
【００４６】
（ｉ）“abcdefg”を格納可能なメモリ領域を再獲得するときに、当該メモリ領域に“abc”をコピーする（図５参照）。
【００４７】
（ii）“abcdefg1”を格納可能なメモリ領域を再獲得するときに、当該メモリ領域に“abcdefg”をコピーする。
【００４８】
（iii）“abcdefg123”を格納可能なメモリ領域を再獲得するときに、当該メモリ領域に“abcdefg1”をコピーする。
【００４９】
（iv）“abcdefg123xyz”を格納可能なメモリ領域を再獲得するときに、当該メモリ領域に“abcdefg123”をコピーする。
【００５０】
上記のように、（ｉ）〜（iv）の手順において同じデータのコピーが複数回発生している。このように、メモリ管理においてデータのコピーが頻発すると、コントローラ１１０の処理性能が低下する可能性がある。
【００５１】
また、メモリ領域の再配置により、元々使用していたメモリ領域は不要となり、解放されるが、図６の下部に例示するように、メモリ領域の再配置が繰り返された結果、メモリ（記憶領域１４０）の断片化が進む場合がある。
【００５２】
断片化したメモリの隙間を埋める手法としては、メモリ領域の再配置（「メモリコンパクション」と称されてもよい）を行なうことが挙げられる。しかし、この手法を採用するためには、コントローラ１１０に対して、再配置後のメモリ領域の場所をプログラム側に何らかの方法で通知する専用の機構を設けることになる。このように、メモリ領域の再配置をプログラム側に通知することが困難になる等の不都合が生じ得るため、コントローラ１１０においてメモリ領域の再配置を単純に実施することは難しい。
【００５３】
また、アクセス性能が低速且つ小容量のメモリにおいては、メモリコピーの繰り返しによりコントローラ１１０のレスポンス低下を引き起こす場合がある。
【００５４】
以上のように、メモリの断片化が進むと、さらにメモリコピーが発生するケースが増加する悪循環となり得る。
【００５５】
そこで、以下に詳述する実施形態では、メモリの断片化を防ぎつつ、メモリコピーの発生頻度をできるだけ減らす手法について説明する。
【００５６】
〔１−２〕一実施形態について
〔１−２−１〕一実施形態の説明
図７は、一実施形態の一例としてのコンピュータ１０の構成例を示すブロック図である。図７に示すように、一実施形態に係るコンピュータ１０は、例示的に、コントローラ１１及びメモリ１３をそなえてよい。
【００５７】
コントローラ１１は、コンピュータ１０における種々の制御を行なう。コントローラ１１は、コントローラ１１の動作においてメモリ１３に関する処理を行なうメモリ管理部１２をそなえてよい。
【００５８】
メモリ管理部１２は、メモリ１３が有する少なくとも一部の記憶領域に対する種々のメモリ管理を行なうメモリ制御装置の一例である。以下、メモリ管理部１２が管理するメモリ１３の記憶領域をコントローラ用記憶領域（以下、単に「記憶領域」と表記する場合がある）１４と表記する。
【００５９】
なお、コンピュータ１０（コントローラ１１）は、図１に示すコンピュータ１００（コントローラ１１０）によるメモリ管理、例えば、メモリ獲得、メモリ解放、及び、メモリ拡張と同様の処理が可能であるものとする。以下の説明において、上述したメモリ管理の処理のうち、記憶領域１４の全体の空き状況に基づき、要求されたメモリ領域を確保可能か否かを判断する処理の説明を省略する。
【００６０】
図３〜図６を参照して説明した一実施形態に係る不都合は、例えば、図８に例示するように、記憶領域１４においてメモリ領域を予め余分に確保することで解決できる場合がある。これにより、単純に予約領域内に収まるサイズであれば、複数回の拡張要求に対しても、上述した（ｃ−１）のケースに従って、メモリ領域のコピーを行なうことなく使用メモリ領域を拡張でき、メモリコピーの回数を減らすことができる。
【００６１】
しかし、この手法により、全てのメモリ領域の獲得時に余分なメモリ領域を確保することは、図９に例示するように、消費メモリ量が増大する上、その大半が無駄になる可能性が高い。そこで、以下、予約領域を確保し過ぎないような手法について説明する。
【００６２】
例えば、コントローラ１１のメモリ管理部１２は、プログラムからのメモリ領域の確保要求に基づき、最初にメモリ獲得を行なう場合、メモリ領域の確保要求で指定された通りのメモリサイズを確保してよい。
【００６３】
また、メモリ管理部１２は、プログラムからメモリ拡張獲得要求を受信した場合、拡張獲得要求で指定されたメモリサイズに加えて、余分に、予約領域を確保してよい。
【００６４】
このとき、メモリ管理部１２は、最初のメモリ拡張要求に係るメモリサイズ、又は、直前のメモリ拡張獲得要求で指定されたメモリサイズ等に基づいて、拡張メモリサイズを決定してよい。なお、拡張メモリサイズは、メモリ拡張獲得要求で指定されたメモリサイズと、予約領域のサイズとを合計したサイズであってよい。
【００６５】
また、メモリ管理部１２は、規定時間内に予約領域に対する拡張獲得要求がこない場合、当該予約領域を解放し、空き領域に戻してよい。
【００６６】
以上の処理により、一実施形態に係るコントローラ１１は、メモリ領域の断片化に配慮しつつ、メモリコピーの回数を減らしてメモリ再配置（reallocation）の際の性能劣化を抑止できる。
【００６７】
〔１−２−２〕一実施形態の構成例
図１０は、一実施形態の一例としてのストレージシステム１の構成例を示すブロック図である。図１０に示すように、一実施形態に係るストレージシステム１は、例示的に、１以上（図１０の例では複数）のストレージ装置２、及び、ホスト装置５をそなえてよい。
【００６８】
ストレージ装置２は、例示的に、１以上の制御装置３、及び、１以上（図４の例では複数）の記憶装置４をそなえてよく、ホスト装置５に対して記憶装置４の記憶領域を提供してよい。例えば、ストレージ装置２は、ＲＡＩＤ（Redundant Arrays of Inexpensive Disks）を用いて複数の記憶装置４にデータを分散又は冗長化した状態で保存してもよい。
【００６９】
制御装置３は、ホスト装置５から複数の記憶装置４に対する種々のＩ／Ｏ（Input / Output）を制御する情報処理装置又は制御装置の一例である。また、制御装置３は、図７に示すコンピュータ１０の一例である。換言すれば、コンピュータ１０は、ストレージ装置２における種々の制御を行なう装置であってもよい。
【００７０】
記憶装置４は、種々のデータやプログラム等を格納するハードウェアの一例である。記憶装置４としては、例えば、ＳＳＤ（Solid State Drive）等の半導体ドライブ装置、不揮発性メモリ、ＨＤＤ（Hard Disk Drive）等の磁気ディスク装置等が挙げられる。不揮発性メモリとしては、例えば、フラッシュメモリ、ＳＣＭ（Storage Class Memory）、ＲＯＭ（Read Only Memory）等が挙げられる。
【００７１】
なお、ストレージ装置２は、制御装置３を格納する制御筐体、及び、記憶装置４を搭載する記憶筐体をそなえ、複数のストレージ装置２によってスケールアウト型のストレージシステムを構成してもよい。なお、この場合、制御筐体及び記憶筐体の双方が記憶装置４を搭載してもよい。
【００７２】
ホスト装置５は、ネットワーク６を介して１以上のストレージ装置２に対して書込要求や読出要求等の種々のＩ／Ｏを発行する。ホスト装置５としては、例えば業務サーバや基幹サーバ、或いはクライアントマシン等のコンピュータが挙げられる。図１０には１台のホスト装置５が示されているが、ストレージシステム１には複数のホスト装置５が存在してもよい。
【００７３】
ネットワーク６は、例えば、ＳＡＮ（Storage Area Network）を含んでよく、図示しない１以上のスイッチ等のネットワーク機器を含んでもよい。また、ネットワーク６は、インターネット、又は、ＬＡＮ（Local Area Network）若しくはＷＡＮ（Wide Area Network）等を含んでもよい。ストレージ装置２とホスト装置５との間は、ネットワーク６を介して、例えばＦＣ（Fibre Channel）又はｉＳＣＳＩ（Internet Small Computer System Interface）等に準拠した光ケーブル又はイーサネット（登録商標）ケーブルによって接続されてよい。
【００７４】
（ハードウェア構成例）
次に、図１０を参照して、制御装置３のハードウェア構成例について説明する。図１０に示すように、制御装置３は、例示的に、プロセッサ３ａ、メモリ３ｂ、記憶部３ｃ、ＩＦ（Interface）部３ｄ−１及び３ｄ−２、Ｉ／Ｏ部３ｅ、並びに、読取部３ｆをそなえてよい。
【００７５】
プロセッサ３ａは、種々の制御や演算を行なう演算処理装置の一例である。プロセッサ３ａは、各ブロック３ｂ〜３ｆとバスで相互に通信可能に接続されてよい。プロセッサ３ａとしては、ＣＰＵ、ＭＰＵ、ＤＳＰ、ＡＳＩＣ、ＦＰＧＡ等の集積回路（ＩＣ；Integrated Circuit）が用いられてもよい。なお、ＣＰＵはCentral Processing Unitの略称であり、ＭＰＵはMicro Processing Unitの略称であり、ＤＳＰはDigital Signal Processorの略称である。また、ＡＳＩＣはApplication Specific Integrated Circuitの略称であり、ＦＰＧＡはField Programmable Gate Arrayの略称である。
【００７６】
メモリ３ｂは、種々のデータやプログラムを格納するハードウェアの一例である。メモリ３ｂとしては、例えばＲＡＭ（Random Access Memory）等の揮発性メモリが挙げられる。なお、メモリ３ｂの一部の記憶領域は、記憶装置４に対するアクセス等に用いられるデータやプログラムを一時的に記憶するキャッシュメモリとして用いられてもよい。
【００７７】
記憶部３ｃは、種々のデータやプログラム等を格納するハードウェアの一例である。記憶部３ｃとしては、例えば、ＨＤＤ等の磁気ディスク装置、ＳＳＤ等の半導体ドライブ装置、不揮発性メモリ等の各種記憶装置が挙げられる。記憶部３ｃは、制御装置３の各種機能の全部若しくは一部を実現するプログラム３ｈを格納してもよい。プロセッサ３ａは、例えば、記憶部３ｃに格納されたプログラム３ｈをメモリ３ｂに展開して実行することにより、制御装置３の機能を実現できる。
【００７８】
ＩＦ部３ｄ−１は、ホスト装置５との間の接続及び通信の制御等を行なう通信インタフェースの一例である。ＩＦ部３ｄ−２は、記憶装置４との間の接続及び通信の制御等を行なう通信インタフェースの一例である。また、制御装置３は、作業者の作業端末との間の接続及び通信の制御等を行なう通信インタフェースをそなえてもよく、当該通信インタフェースを用いて、ネットワーク６又は図示しない他のネットワークからプログラム３ｈをダウンロードしてもよい。
【００７９】
Ｉ／Ｏ部３ｅは、マウス、キーボード、操作ボタン等の入力部、並びにディスプレイ又はプリンタ等の出力部の少なくとも一部を含んでよい。
【００８０】
読取部３ｆは、記録媒体３ｇに記録されたデータやプログラムを読み出すリーダの一例である。読取部３ｆは、記録媒体３ｇを接続又は挿入可能な接続端子又は装置を含んでもよい。読取部３ｆとしては、例えばＵＳＢ（Universal Serial Bus）等に準拠したアダプタ、記録ディスクへのアクセスを行なうドライブ装置、ＳＤカード等のフラッシュメモリへのアクセスを行なうカードリーダ等が挙げられる。なお、記録媒体３ｇにはプログラム３ｈが格納されてもよい。
【００８１】
記録媒体３ｇとしては、例示的に、磁気／光ディスクやフラッシュメモリ等の非一時的なコンピュータ読取可能な記録媒体が挙げられる。磁気／光ディスクとしては、例示的に、フレキシブルディスク、ＣＤ（Compact Disc）、ＤＶＤ（Digital Versatile Disc）、ブルーレイディスク、ＨＶＤ（Holographic Versatile Disc）等が挙げられる。フラッシュメモリとしては、例示的に、ＵＳＢメモリやＳＤカード等が挙げられる。なお、ＣＤとしては、例示的に、ＣＤ−ＲＯＭ、ＣＤ−Ｒ、ＣＤ−ＲＷ等が挙げられる。また、ＤＶＤとしては、例示的に、ＤＶＤ−ＲＯＭ、ＤＶＤ−ＲＡＭ、ＤＶＤ−Ｒ、ＤＶＤ−ＲＷ、ＤＶＤ＋Ｒ、ＤＶＤ＋ＲＷ等が挙げられる。
【００８２】
上述した制御装置３のハードウェア構成は例示である。従って、制御装置３内でのハードウェアの増減（例えば任意のブロックの追加や削除）、分割、任意の組み合わせでの統合、バスの追加又は省略等は適宜行なわれてもよい。
【００８３】
（機能構成例）
次に、図１１を参照して、制御装置３の機能構成例について説明する。図１１は一実施形態に係る制御装置３の機能構成例を示すブロック図である。図１１に示すように、制御装置３は、例示的に、ストレージ制御部３１及びＳＭＩ−Ｓ制御部３２をそなえてよい。ＳＭＩ−ＳはStorage Management Initiative - Specificationの略称である。
【００８４】
ストレージ制御部３１は、ホスト装置５や記憶装置４に対する制御を含むストレージ装置２における種々の制御を行なう。
【００８５】
ＳＭＩ−Ｓ制御部３２は、ＳＭＩ−Ｓに関する制御を行なう。ＳＭＩ−Ｓは、ＳＮＩＡ（Storage Networking Industry Association）が開発・保守するストレージに関する標準規格であり、共通のストレージ管理機能及び機能へのアクセスを提供する。ＳＭＩ−Ｓでは、独自の管理ＩＦとは異なり、標準ＩＦを使用することで、管理アプリケーションは複数のベンダの幅広いストレージ装置をサポートできる。
【００８６】
ＳＭＩ−Ｓは、Distributed Management Task Forceが定義したCommon Information ModelやWeb-Based Enterprise Managementに基づいており、ＡＮＳＩ標準のANSI INCITS 388-2004として承認されている。ＡＮＳＩはAmerican National Standards Instituteの略称である。
【００８７】
ＳＭＩ−Ｓ制御部３２は、図１１に例示するように、メモリ管理部３２ａをそなえてよい。メモリ管理部３２ａは、図７に示すメモリ管理部１２の一例である。
【００８８】
メモリ管理部３２ａは、メモリ制御装置の一例である。メモリ管理部３２ａは、制御装置３が利用するメモリ３ｂの中の一部の記憶領域を専用の記憶領域として確保し、制御装置３（例えばストレージ制御部３１）のメモリ管理とは別にメモリ管理を行ない、当該記憶領域の資源管理を行なう。このため、ＳＭＩ−Ｓ制御部３２は、ストレージ装置２内の他のプログラムとメモリ３ｂを共有することはなく、ＳＭＩ−Ｓ制御部３２に閉じたメモリ管理を行なうことができる。
【００８９】
以下、メモリ管理部３２ａが管理する記憶領域をＳＭＩ−Ｓ用記憶領域（単に「記憶領域」と称されてもよい）３３と表記する。なお、ストレージ装置２の規模により異なるが、例えば、メモリ３ｂは２ＧＢｙｔｅ〜１２ＧＢｙｔｅ程度のサイズであってよく、記憶領域３３は５０ＭＢｙｔｅ〜１００ＭＢｙｔｅ程度のサイズであってよい。
【００９０】
記憶領域３３は、ＳＭＩ−Ｓ制御部３２が利用するメモリの一例である。記憶領域３３は、図１１に例示するように、第１テーブル３３１及び第２テーブル３３２を記憶してよい。第１テーブル３３１及び第２テーブル３３２は、メモリ管理部３２ａによる記憶領域３３のメモリ管理に用いられる情報の一例である。第１テーブル３３１及び第２テーブル３３２の詳細については後述する。
【００９１】
なお、上述のように、連続していないメモリ領域を組み合わせることで、コントローラ１１（制御プログラム）からは連続したメモリ領域に見せることのできる仮想記憶方式が知られている。しかし、仮想記憶方式は、現実的な性能を得るには高価なハードウェアによるサポートが必要であり、ストレージ装置２やＳＭＩ−Ｓの制御プログラム部分に適用することは難しい。
【００９２】
そこで、図１１に示すように、一実施形態に係るＳＭＩ−Ｓ制御部３２のメモリ管理部３２ａは、例示的に、メモリ獲得部３２１、メモリ拡張部３２２、メモリ解放部３２３、及び、算出部３２４をそなえてよい。
【００９３】
メモリ獲得部３２１は、プログラム、例えば、ＳＭＩ−Ｓ制御部３２の機能を実現する制御プログラム（以下同様）からのメモリ獲得要求に応じて、記憶領域３３からメモリ領域を獲得してよい。
【００９４】
例えば、メモリ獲得部３２１は、最初にメモリ獲得を行なう場合は記憶領域３３から要求通りのメモリサイズを確保する。なお、メモリ獲得の手法の詳細は既述のため、説明を省略する。
【００９５】
メモリ拡張部３２２は、プログラムからのメモリ拡張獲得要求（以下、単に「拡張要求」と表記する場合がある）に応じて、当該要求で指定されたメモリ領域を拡張してよい。メモリ領域の拡張は、メモリ領域の再配置を含んでよい。なお、メモリ拡張の手法のうち、再配置を伴わない場合（単純に、元のメモリ領域に連続するメモリ領域を確保できる場合；上記（ｃ−１）の場合）の処理の詳細は既述のため、説明を省略する。
【００９６】
例えば、メモリ拡張部３２２は、再配置によりメモリ領域を拡張する場合、拡張要求で指定されたメモリ領域に追加して、後述する算出部３２４が算出したサイズ分だけ余分に、予約領域を確保する。なお、「予約領域」は「拡張領域」と称されてもよい。
【００９７】
換言すれば、メモリ拡張部３２２は拡張部の一例である。拡張部は、記憶領域３３から獲得した第１サイズのメモリ領域を、第１サイズに要求サイズを加えた第２サイズに拡張する指示を含む第１拡張要求を受信した場合、記憶領域３３から、要求サイズの記憶領域とともに所定サイズの予約領域を獲得してよい。
【００９８】
なお、メモリ拡張部３２２は、上述したメモリ領域の再配置を行なってよい。例えば、メモリ拡張部３２２は、記憶領域３３におけるメモリ領域とメモリ領域に連続する空き領域との第１合計サイズと、第２サイズと所定サイズとの第２合計サイズとを比較してよい。そして、メモリ拡張部３２２は、第１合計サイズが第２合計サイズよりも小さい場合、メモリ領域を、記憶領域３３における第２合計サイズ以上の空き連続領域に再配置してよい。
【００９９】
ところで、図１２に例示するように、ソフトウェアやプログラムの観点では、ＳＭＩ−Ｓ制御部３２は、図１２に示すような形で、メモリ３ｂの記憶領域３３を使用することがある。例えば、ＳＭＩ−Ｓ制御部３２は、先に挙げた“string”型や“std::vector”型で宣言した変数の領域については、領域が足りなくなる度にメモリ拡張指示を行ないメモリ領域を拡張する。一方、図１２に示すように、“int”型や“short”型のような数値データや、“char[32]”のような固定長の文字配列データ等については、プログラム言語の性質により、一度領域が確保されるとその後にサイズが変わることはない。
【０１００】
このように、プログラム側では、メモリ拡張が頻繁に行なわれるデータは或る程度限定されており、全ての記憶領域３３を余分に確保する必要はないといえる。
【０１０１】
しかし、メモリ管理部３２ａは、メモリ管理において、プログラムがどのように変数を宣言し、どのような場面でメモリ拡張を行なうのかといった点を認識することは難しい。
【０１０２】
そこで、上述のように、メモリ獲得部３２１は、最初にメモリ獲得を行なう場合は要求された通りのメモリサイズを確保する。そして、メモリ拡張部３２２は、最初のメモリ獲得後、拡張獲得で指示されたメモリ領域を再配置により拡張する場合に限定して、拡張するメモリ領域とともに、余分に予約領域を確保する。
【０１０３】
予約領域を確保する条件として、一度、メモリ拡張要求が発生したメモリ領域に限定したが、この場合においても、獲得したメモリ領域（予約領域）が使用されないと、結局は無駄なメモリ領域を確保したことになってしまう。
【０１０４】
そこで、メモリ解放部３２３は、メモリ領域の獲得要求又は拡張要求の後、一定時間（「規定時間」と称されてもよい）が経過するまでに、予約領域に対する拡張要求を受信しない場合、当該予約領域を解放して空き領域に戻してよい。
【０１０５】
換言すれば、メモリ解放部３２３は、規定時間内にメモリ領域を第２サイズよりも大きい第３サイズに拡張する指示を含む第２拡張要求を受信しない場合、予約領域を解放し、予約領域を空き領域とする解放部の一例である。
【０１０６】
なお、「一定時間」は、例えば、長く確保し過ぎると無駄な（不要である）予約領域を有効利用できない時間が長くなる。一方、「一定時間」を短く確保し過ぎると、本来は拡張要求が発生するにもかかわらず、確保した拡張領域が解放されて別の用途で使われてしまい、結局、メモリ領域の再配置が発生してしまう可能性がある。
【０１０７】
このため、メモリ解放部３２３は「一定時間」として適切な時間を設定してよい。
【０１０８】
例えば、ＳＭＩ−Ｓ制御部３２の動作フェーズは、プログラム開始時の動作フェーズ（初期設定フェーズ）及びプログラム動作時の動作フェーズ（通常動作フェーズ）の２つに分けることができる。動作フェーズに応じて、ＳＭＩ−Ｓ制御部３２による記憶領域３３の利用方法に違いがある。
【０１０９】
そこで、メモリ解放部３２３は、ＳＭＩ−Ｓ制御部３２の動作フェーズに合わせて、以下のように、メモリ領域を解放するまでの「一定時間」のカウントの起点を決定してよい。なお、ＳＭＩ−Ｓでは、クライアントからの要求に対して１０秒以内に応答することが定められている。以下の説明では、「一定時間」として、１０秒が設定された「応答許容時間」（Ｔ）が用いられるものとする。
【０１１０】
（Ａ−１）プログラム開始時の動作フェーズ（初期設定フェーズ）の場合。
【０１１１】
ストレージ装置２が起動し、ＳＭＩ−Ｓ制御部３２のプログラム開始後、暫くの間は初期設定が行なわれる。初期設定では、ＳＭＩ−Ｓ制御部３２は、その後の動作で用いるデータの準備を行なう。このため、比較的大きなサイズのメモリ獲得及びメモリ拡張が動作する可能性がある。
【０１１２】
なお、初期設定フェーズでは、ＳＭＩ−Ｓ制御部３２は、ストレージ装置２の状態や内部の設定を確認するため、他の動作モジュールとの通信を行なうことが多く、その結果によりメモリ拡張要求が発生することがある。このため、ＳＭＩ−Ｓ制御部３２は、通常動作フェーズよりも長い時間をかけてメモリ領域の拡張を繰り返し、処理に用いるメモリ領域を確保する。
【０１１３】
このような初期設定フェーズの動作を考慮して、メモリ管理部３２ａ（例えばメモリ拡張部３２２）は、メモリ領域ごとに、最初の拡張要求を契機にタイマをセットし、次の拡張要求があった場合にはタイマのカウントをリセットしてよい。換言すれば、メモリ拡張部３２２は、メモリ領域に対する拡張要求に係る処理を実行する都度、一定時間の計時をリセットしてよい。
【０１１４】
また、メモリ解放部３２３は、このような手法により計時を行ない、一定時間、例えば１０秒間、当該メモリ領域に対して新規のメモリ拡張要求が発生しなかった場合に、メモリ領域（拡張領域）を解放してよい。換言すれば、メモリ解放部３２３は、メモリ領域について、直前の拡張要求に係る処理が実行されてから一定時間内に次の拡張要求を受信しない場合、直前の拡張要求に係る処理で獲得されている予約領域を解放し、当該予約領域を空き領域としてよい。
【０１１５】
図１３は、記憶領域３３が記憶する第１テーブル３３１の一例を示す図である。第１テーブル３３１は、初期設定中の拡張メモリ領域を監視するテーブルの一例である。図１３に示すように、第１テーブル３３１は、例示的に、「メモリ領域」、「expanded_size」、及び、「タイマ」の情報を記憶してよい。
【０１１６】
「メモリ領域」は、各メモリ領域を識別する識別情報の一例である。第１テーブル３３１には、１つのメモリ領域について１つのエントリが設けられてよい。なお、メモリ領域の再配置が発生した場合、第１テーブル３３１には、再配置の前及び後のメモリ領域のエントリが存在してもよい。この場合、再配置前後のメモリ領域を区別できるように、例えば、更新回数やメモリアドレス等の情報がエントリに含まれてもよい。また、例えば、或るタイミングで再配置前の古いエントリ（或いは当該エントリのタイマ）を無効にするために、無効化フラグがエントリに含まれてもよい。
【０１１７】
「expanded_size」は当該メモリ領域に設定された拡張領域のサイズを示す情報である。メモリ領域に拡張領域が設定されていない場合には、「expanded_size」には“0”が設定されてよい。「タイマ」は、初期設定フェーズにおける拡張領域の解放を管理するタイマの一例である。「タイマ」としては、セット又はリセットされてからのカウント値に代えて、セット又はリセットされたときのタイムスタンプの情報等が設定されてもよい。
【０１１８】
このように、メモリ拡張部３２２は、初期設定フェーズにおいて、拡張領域を設定する都度、第１テーブル３３１の該当エントリを作成又は更新し、「expanded_size」、及び、「タイマ」の情報を設定してよい。そして、メモリ解放部３２３は、定期的に（例えば１秒ごとに）第１テーブル３３１の各エントリを参照し、「タイマ」の計時が一定時間を超えるメモリ領域について、拡張領域を解放する処理を行なってよい。
【０１１９】
（Ｂ−１）プログラム動作時の動作フェーズ（通常動作フェーズ）の場合。
【０１２０】
通常動作フェーズでは、ＳＭＩ−Ｓ制御部３２は、外部、例えば他のストレージ装置２からのコマンドを受け付けながら動作する場合、コマンド動作に利用するメモリ領域を必要に応じて確保しながら動作する。
【０１２１】
コマンド動作に利用するメモリサイズや、拡張要求で指定されるメモリサイズは、コマンドの種類により異なるが、通常動作フェーズでは、コマンド動作に利用するメモリサイズの算出は初期設定フェーズの動作に比べると短い時間で完了するものが殆どである。
【０１２２】
また、ＳＭＩ−Ｓでは、１０秒の応答許容時間が定められているため、最大でも１０秒でメモリ拡張要求に係る処理は完了するものと考えてよい。そこで、メモリ解放部３２３は、メモリ領域ごとに、最初の拡張要求を契機にタイマをセットし、次の拡張要求があった場合にもタイマのカウントをリセットせず、最初の拡張要求に係る処理から１０秒経過した場合に、メモリ領域（拡張領域）を解放してよい。
【０１２３】
図１４は、記憶領域３３が記憶する第２テーブル３３２の一例を示す図である。第２テーブル３３２は、通常動作中の拡張メモリ領域を監視するテーブルの一例である。図１４に示すように、第２テーブル３３２は、例示的に、「メモリ領域」、「expanded_size」、及び、「タイマ」の情報を記憶してよい。
【０１２４】
「メモリ領域」、「expanded_size」、及び、「タイマ」は、それぞれ、第１テーブル３３１における「メモリ領域」、「expanded_size」、及び、「タイマ」と同様である。
【０１２５】
メモリ拡張部３２２は、通常運用フェーズにおいて、最初の拡張領域を設定する際に、第２テーブル３３２の該当エントリを作成又は更新し、「expanded_size」、及び、「タイマ」の情報を設定してよい。そして、メモリ解放部３２３は、定期的に（例えば１秒ごとに）第２テーブル３３２の各エントリを参照し、「タイマ」の計時が一定時間を超えるメモリ領域について、拡張領域を解放する処理を行なってよい。
【０１２６】
以上のように、メモリ解放部３２３は、第２の処理において、メモリ拡張部３２２が多めに確保したメモリ領域のうち、第１テーブル３３１及び第２テーブル３３２に基づいて、使用しないと判断した部分を解放する。
【０１２７】
しかし、この手法により一定時間後にメモリ領域の解放を行なうと、図６に示すような「歯抜け」の空き領域が点在する、換言すればメモリの断片化が発生する可能性が高い。長期間のシステム動作を前提とするシステム（例えばストレージシステム１）では、可能な限り歯抜けの領域を少なくすることが望ましい。
【０１２８】
そこで、算出部３２４は、第２の処理に加えて、解放するメモリ領域ができるだけ少なくなるような拡張領域のサイズを算出してよい。これにより、メモリ拡張部３２２が余分に確保するメモリ領域の量をできるだけプログラムが本来使用する理論値に近づけることができる。
【０１２９】
換言すれば、算出部３２４は、第１拡張要求で指定された第２サイズに基づき、予約領域の所定サイズを決定する決定部の一例である。
【０１３０】
なお、ソフトウェアやプログラムの観点で記憶領域３３の使用方法を見ると、記憶領域３３は、単一の使用方法ではなく、プログラムの使用言語や目的により異なる。例えば、ＳＭＩ−Ｓ制御部３２による上述した２つの動作フェーズにおける記憶領域３３の使用方法は、それぞれ、以下のような傾向がある。算出部３２４は、以下のような傾向を利用することで、メモリ拡張を繰り返すプログラムが本来どの程度のメモリ領域を必要とするかを予め推測するのである。換言すれば、算出部３２４は、第１拡張要求の要求元のプログラムの動作フェーズに基づき、予約領域の所定サイズを決定するといえる。
【０１３１】
（Ａ−２）プログラム開始時の動作フェーズ（初期設定フェーズ）の場合。
【０１３２】
ＳＭＩ−Ｓ制御部３２は、上記（Ａ−１）に記載したような動作となる。このときメモリ管理部３２ａが獲得したメモリ領域は、後のプログラムで継続して利用されることを想定したものが多く、これらのメモリ領域の大半は解放されずに、プログラムの終了まで継続して使用されることが多い。
【０１３３】
（Ｂ−２）プログラム動作時の動作フェーズ（通常動作フェーズ）の場合。
【０１３４】
ＳＭＩ−Ｓ制御部３２は、上記（Ｂ−１）に記載したような動作となる。このときメモリ管理部３２ａが獲得したメモリ領域は、基本的に、コマンド動作が完了すると解放されることが多く、プログラムの終了まで継続して使用されるようなメモリ領域は殆ど存在しない。
【０１３５】
なお、以下の説明では、上記（Ａ−１）及び（Ａ−２）に記載した初期設定フェーズを（Ａ）と表記し、上記（Ｂ−１）及び（Ｂ−２）に記載した通常動作フェーズを（Ｂ）と表記する場合がある。
【０１３６】
プログラム側では上記のような違いがあるものの、メモリ管理部３２ａによるメモリ管理では、呼び出し元のプログラムがどのように動作し、獲得したメモリ領域がどのように使われているかを認識することは困難である。
【０１３７】
このため、算出部３２４は、メモリ拡張要求を受信したときに、メモリ管理で把握できる以下の情報を入力として、プログラムが今後利用すると推定されるメモリ拡張サイズ（expanded_size）を決定してよい。
【０１３８】
・メモリ領域の拡張要求を受信したときの現在のメモリ領域のサイズ（allocated_size）
【０１３９】
・メモリ拡張要求の要求サイズ（realloc_size）
【０１４０】
・メモリ拡張要求を受信してから次に当該メモリ領域に係るメモリ拡張要求を受信するまでの時間（秒）（realloc_time）
【０１４１】
・プログラム起動からの経過時間（Total_Time）、又は、上記（Ａ）及び（Ｂ）を判別できる内部状態フラグ（Flag）
【０１４２】
図１５は、メモリ領域の拡張手順の一例を示す図である。以下、図１５に沿いながら、一実施形態に係るメモリ管理部３２ａによるメモリ獲得手順の一例を説明する。
【０１４３】
図１５に示すように、メモリ管理部３２ａのメモリ獲得部３２１は、最初のメモリ領域獲得要求に応じて、メモリ領域を獲得する（図１５の（１）参照）。このとき、算出部３２４は、獲得したメモリ領域のサイズである“allocated_size”を取得する。“allocated_size”は、例えば、メモリ獲得要求で指定されたサイズであってもよい。
【０１４４】
メモリ管理部３２ａのメモリ拡張部３２２は、（１）のメモリ領域に対する最初のメモリ領域拡張要求を受信する（（２）参照）。そして、メモリ拡張部３２２は、拡張要求で指定された“realloc_size”に加えて、算出部３２４で算出された“expanded_size”を含む領域を獲得する（（３）参照）。すなわち、最初のメモリ領域拡張の結果としては、“realloc_size”と“expanded_size”とを加えた“allocated_size”が獲得される。
【０１４５】
なお、“expanded_size”はプログラムによるメモリ領域の利用状況に応じて解放され得る予約領域として扱われてよい。
【０１４６】
メモリ管理部３２ａは、（３）のメモリ領域に対する２回目のメモリ領域拡張要求を受信する（（４）参照）。なお、２回目の拡張要求では、（３）の“allocated_size”（realloc_size+expanded_size”）に収まる“realloc_size”が指定されているものとする。
【０１４７】
この場合、メモリ拡張部３２２は、（３）の“allocated_size”に収まる範囲内で、２回目の拡張要求で指定された“realloc_size”を獲得する（（５）参照）。この場合、２回目の拡張要求の結果の“expanded_size”は、最初の拡張要求の結果の“allocated_size”から２回目の拡張要求で指定された“realloc_size”を減じたサイズとなる。このとき、２回目の拡張要求に係るメモリ領域の拡張に“expanded_size”が利用されるため新たなメモリ領域の獲得は発生せず、また、“allocated_size”の更新も発生しない。
【０１４８】
メモリ管理部３２ａは、（５）のメモリ領域に対する３回目のメモリ領域拡張要求を受信する（（６）参照）。なお、３回目の拡張要求では、（５）の“allocated_size”（realloc_size+expanded_size”）に収まらない“realloc_size”が指定されているものとする。
【０１４９】
この場合、メモリ拡張部３２２は、（５）の拡張要求で指定された“realloc_size”に加えて、“realloc_size”に基づき算出部３２４で算出（更新）された“expanded_size”を含む領域を獲得する（（７）参照）。すなわち、３回目のメモリ領域拡張の結果としては、“realloc_size”と新たに算出された“expanded_size”とを加えた“allocated_size”が獲得される。
【０１５０】
以降のメモリ領域拡張要求についても、“realloc_size”が直前の“allocated_size”に収まるか否かに応じて、上記（４）及び（５）、又は、（６）及び（７）に例示する処理が行なわれてよい。
【０１５１】
なお、上述のように、メモリ管理部３２ａのメモリ解放部３２３は、ＳＭＩ−Ｓ制御部３２の動作フェーズに応じた起点から一定時間が経過すると、メモリ領域を解放してよい。
【０１５２】
例えば、ＳＭＩ−Ｓ制御部３２の動作フェーズが（Ａ）（初期設定フェーズ）の場合、メモリ解放部３２３は、直前のメモリ領域拡張が行なわれてからの経過時間“realloc_time”をカウントしてよい（図１５の“realloc_time for (A)”参照）。そして、メモリ解放部３２３は、“realloc_time”が一定時間を超えると、“allocated_size”のうちの“expanded_size”の分のメモリ領域を解放してよい。
【０１５３】
また、ＳＭＩ−Ｓ制御部３２の動作フェーズが（Ｂ）（通常動作フェーズ）の場合、メモリ解放部３２３は、最初のメモリ領域拡張が行なわれてからの経過時間“realloc_time”をカウントしてよい（図１５の“realloc_time for (B)”参照）。そして、メモリ解放部３２３は、“realloc_time”が一定時間を超えると、“allocated_size”のうちの“expanded_size”の分のメモリ領域を解放してよい。
【０１５４】
なお、メモリ解放部３２３は、例えば、プログラム起動からの経過時間（Total_Time）が所定時間内であれば動作フェーズが（Ａ）であると判断し、経過時間（Total_Time）が所定時間を超える場合に動作フェーズが（Ｂ）であると判断してよい。或いは、メモリ解放部３２３は、上記（Ａ）及び（Ｂ）を判別できる内部状態フラグ（Flag）に基づいて、動作フェーズを判断してもよい。内部状態フラグはＳＭＩ−Ｓ制御部３２により管理・更新されてよい。
【０１５５】
〔１−３〕動作例
次に、図１６〜図２６を参照して、上述の如く構成されたストレージ装置２の動作例を説明する。
【０１５６】
〔１−３−１〕メモリ獲得処理
はじめに、図１６を参照して、制御装置３のＳＭＩ−Ｓ制御部３２によるメモリ獲得処理の動作例を説明する。
【０１５７】
メモリ獲得部３２１は、メモリ獲得要求を受信すると（ステップＳ１）、記憶領域３３の空き容量に対して、獲得要求で指定されたサイズのメモリ領域を獲得可能か否かを判定する(ステップＳ２)。
【０１５８】
メモリ領域を獲得可能な場合（ステップＳ２でＹｅｓ）、メモリ獲得部３２１は、要求されたサイズを“allocated_size”として、メモリ管理ヘッダに退避する（ステップＳ３）。
【０１５９】
そして、メモリ獲得部３２１は、“allocated_size”分のメモリ領域を獲得し（ステップＳ４）、獲得できたメモリ領域の情報（例えばメモリアドレス等）を獲得要求の要求元であるプログラム等へ通知し（ステップＳ５）、処理が終了する。
【０１６０】
一方、メモリ領域を獲得不可能な場合（ステップＳ２でＮｏ）、メモリ獲得部３２１は、メモリ領域が獲得できなかった旨を要求元へ通知し（ステップＳ６）、処理が終了する。
【０１６１】
以上により、メモリ管理部３２ａによるメモリ獲得処理が終了する。
【０１６２】
なお、ステップＳ４におけるメモリ領域の獲得処理は、空き領域の探索、メモリ領域の確保による管理領域のデータ更新、ステップＳ３のメモリ管理ヘッダに基づくｍｅｔａデータの作成等を含んでよい。ステップＳ４の処理は既述の獲得処理と同様であってよく、その詳細な説明を省略する。
【０１６３】
〔１−３−２〕メモリ拡張処理
次に、図１７を参照して、制御装置３のＳＭＩ−Ｓ制御部３２によるメモリ拡張処理の動作例を説明する。
【０１６４】
メモリ拡張部３２２は、メモリ拡張要求を受信すると（ステップＳ１１）、記憶領域３３の空き容量に対して拡張要求で指定された“realloc_size”分のメモリ領域を獲得可能か否かを判定する（ステップＳ１２）。
【０１６５】
“realloc_size”分のメモリ領域を獲得不可能な場合（ステップＳ１２でＮｏ）、メモリ拡張部３２２は、メモリ領域が獲得できなかった旨を要求元へ通知し（ステップＳ１３）、処理が終了する。
【０１６６】
一方、“realloc_size”分のメモリ領域を獲得可能な場合（ステップＳ１２でＹｅｓ）、メモリ拡張部３２２は、要求元のプログラム、例えばＳＭＩ−Ｓ制御部３２のプログラムの動作状態（動作フェーズ）を取得する（ステップＳ１４）。
【０１６７】
例えば、メモリ拡張部３２２は、ＳＭＩ−Ｓ制御部３２が所定の場所（記憶領域３３等）に設定した、上記（Ａ）及び（Ｂ）を判別できる内部状態フラグ（Flag）を参照してよい。或いは、メモリ拡張部３２２は、プログラム起動からの経過時間（Total_Time）を取得し、経過時間が初期設定に係る予め決定又は計測された処理時間よりも短いか否かを判断することでＳＭＩ−Ｓ制御部３２の動作フェーズを判定してもよい。
【０１６８】
プログラムの動作状態が“初期設定中”の場合（ステップＳ１５でＹｅｓ）、ＳＭＩ−Ｓ制御部３２は初期設定フェーズである。この場合、メモリ拡張部３２２は、算出部３２４と協働して“初期設定中”の処理を行ない（ステップＳ１６）、処理が終了する。
【０１６９】
プログラムの動作状態が“初期設定中”ではない場合（ステップＳ１５でＮｏ）、ＳＭＩ−Ｓ制御部３２は通常動作フェーズである。この場合、メモリ拡張部３２２は、算出部３２４と協働して“通常動作中”の処理を行ない（ステップＳ１７）、処理が終了する。
【０１７０】
〔１−３−３〕“初期設定中”の処理
次に、図１８〜図２０を参照して、図１７のステップＳ１６に示す“初期設定中”の処理の動作例を説明する。
【０１７１】
図１８に示すように、ＳＭＩ−Ｓ制御部３２の算出部３２４は、最初の拡張要求か否かを判定し（ステップＳ２１）、最初の拡張要求の場合（ステップＳ２１でＹｅｓ）、“realloc_size”が２５６Ｂｙｔｅ以下か否かを判定する（ステップＳ２２）。なお、算出部３２４は、拡張要求のあったメモリ領域のメモリ管理ヘッダを参照することで、最初の拡張要求の有無を判断してよい。
【０１７２】
“realloc_size”が２５６Ｂｙｔｅ以下の場合（ステップＳ２２でＹｅｓ）、算出部３２４は、“expanded_size”に“256 - realloc_size”を設定し（ステップＳ２３）、処理がステップＳ２７に移行する。
【０１７３】
ＳＭＩ−Ｓでメモリ領域を拡張する２５６Ｂｙｔｅ以下のデータは、文字列である可能性が高く、“realloc_size + expanded_size”が文字列の最大サイズとして設定されていることが多い。このため、算出部３２４は、“realloc_size”が２５６Ｂｙｔｅ以下の場合には２５６Ｂｙｔｅになるように“expanded_size”を設定するのである。
【０１７４】
“realloc_size”が２５６Ｂｙｔｅ以下ではない場合（ステップＳ２２でＮｏ）、算出部３２４は、“realloc_size”が１０２４Ｂｙｔｅ以下か否かを判定する（ステップＳ２４）。
【０１７５】
“realloc_size”が１０２４Ｂｙｔｅ以下の場合（ステップＳ２４でＹｅｓ）、算出部３２４は、“expanded_size”に“1024 - realloc_size”を設定し（ステップＳ２５）、処理がステップＳ２７に移行する。
【０１７６】
ＳＭＩ−Ｓでメモリ領域を拡張する１０２４Ｂｙｔｅ以下のデータは、応答データとして１０２４Ｂｙｔｅが最大値であるデータの可能性が高い。このため、算出部３２４は、“realloc_size + expanded_size”がデータの最大値である１０２４Ｂｙｔｅになるように“expanded_size”を設定するのである。
【０１７７】
“realloc_size”が１０２４Ｂｙｔｅ以下ではない場合（ステップＳ２４でＮｏ）、算出部３２４は、“expanded_size”に“0”を設定し（ステップＳ２６）、処理がステップＳ２７に移行する。
【０１７８】
“realloc_size”が１０２４Ｂｙｔｅよりも大きい場合、メモリ領域はプログラム側である程度まとめて確保したバッファである可能性が高い。このため、算出部３２４は、“expanded_size”に“0”を設定し、拡張要求で指定されたサイズのみを確保するのである。
【０１７９】
ステップＳ２７では、メモリ拡張部３２２は、最初の拡張要求が処理済であることを拡張要求のあったメモリ領域のメモリ管理ヘッダに記録する。
【０１８０】
次いで、メモリ拡張部３２２は、“realloc_size + expanded_size”のメモリ領域を記憶領域３３から獲得可能か否かを判定する（ステップＳ２８）。獲得可能な場合（ステップＳ２８でＹｅｓ）、メモリ拡張部３２２は、“allocated_size”に“realloc_size + expanded_size”を設定し（ステップＳ２９）、処理がステップＳ３１に移行する。
【０１８１】
一方、“realloc_size + expanded_size”のメモリ領域を記憶領域３３から獲得不可能な場合（ステップＳ２８でＮｏ）、メモリ拡張部３２２は、“allocated_size”に“realloc_size”を設定し（ステップＳ３０）、処理がステップＳ３１に移行する。
【０１８２】
ステップＳ３１では、メモリ拡張部３２２は、“allocated_size”分のメモリ領域を記憶領域３３から獲得する。
【０１８３】
次いで、メモリ拡張部３２２は、初期設定中の拡張メモリ領域を監視する第１テーブル３３１に“expanded_size”の領域情報を登録し、タイマをセットする（ステップＳ３２）。
【０１８４】
そして、メモリ拡張部３２２は、獲得できたメモリ領域を拡張要求の要求元であるプログラムに通知し（ステップＳ３３）、処理が終了する。
【０１８５】
ここで、ステップＳ２１において、最初の拡張要求ではない場合（ステップＳ２１でＮｏ）、図１９に示すように、メモリ拡張部３２２は、“realloc_size”が“allocated_size”に収まるか否かを判定する（ステップＳ３４）。
【０１８６】
“realloc_size”が“allocated_size”に収まる場合（ステップＳ３４でＹｅｓ）、既存の“allocated_size”のメモリ領域内で拡張要求を処理できる。メモリ拡張部３２２は、“expanded_size”に“allocated_size - realloc_size”を設定する（ステップＳ３５）。
【０１８７】
また、メモリ拡張部３２２は、初期設定中の拡張メモリ領域を監視する第１テーブル３３１に登録済の“expanded_size”の領域情報をステップＳ３５で更新した新しい“expanded_size”に更新し、タイマカウントをリセットする（ステップＳ３６）。
【０１８８】
そして、メモリ拡張部３２２は、既存のメモリ領域を拡張要求の要求元であるプログラムに通知し（ステップＳ３７）、処理が終了する。
【０１８９】
また、ステップＳ３４において、“realloc_size”が“allocated_size”に収まらない場合（ステップＳ３４でＮｏ）、“realloc_size”が確保している予約領域を超えたため、再度のメモリ拡張が行なわれる。このとき、算出部３２４は、最初の拡張要求の際に確保したメモリ領域が足りない（不十分である）ため、“expanded_size”を更に大きな値に設定する。
【０１９０】
この場合、図２０に示すように、算出部３２４は、“realloc_size”が１０２４Ｂｙｔｅ以下か否かを判定する（ステップＳ３９）。
【０１９１】
“realloc_size”が１０２４Ｂｙｔｅ以下の場合（ステップＳ３９でＹｅｓ）、算出部３２４は、“expanded_size”に“1024 - realloc_size”を設定し（ステップＳ４０）、処理がステップＳ４４に移行する。
【０１９２】
ＳＭＩ−Ｓでメモリ領域を拡張する１０２４Ｂｙｔｅ以下のデータは、応答データとして１０２４Ｂｙｔｅが最大値であるデータの可能性が高い。このため、算出部３２４は、“realloc_size + expanded_size”がデータの最大値である１０２４Ｂｙｔｅになるように“expanded_size”を設定するのである。なお、ステップＳ４０の処理が行なわれるメモリ領域は、最初の拡張要求においてステップＳ２３（図１８参照）の処理が行なわれたメモリ領域である可能性が高い。
【０１９３】
“realloc_size”が１０２４Ｂｙｔｅ以下ではない場合（ステップＳ３９でＮｏ）、算出部３２４は、“realloc_size”が４０９６Ｂｙｔｅ以下か否かを判定する（ステップＳ４１）。
【０１９４】
“realloc_size”が４０９６Ｂｙｔｅ以下の場合（ステップＳ４１でＹｅｓ）、算出部３２４は、“expanded_size”に“4096 - realloc_size”を設定し（ステップＳ４２）、処理がステップＳ４４に移行する。
【０１９５】
すなわち、算出部３２４は、“realloc_size”が４０９６Ｂｙｔｅ以下である場合は“realloc_size + expanded_size”が４０９６Ｂｙｔｅになるように“expanded_size”を設定するのである。なお、ステップＳ４２の処理が行なわれるメモリ領域は、最初の拡張要求においてステップＳ２５（図１８参照）の処理が行なわれたメモリ領域である可能性が高い。
【０１９６】
“realloc_size”が４０９６Ｂｙｔｅ以下ではない場合（ステップＳ４１でＮｏ）、算出部３２４は、“expanded_size”に“0”を設定し（ステップＳ４３）、処理がステップＳ４４に移行する。すなわち、算出部３２４は、“expanded_size”に“0”を設定し、拡張要求で指定されたサイズのみを確保するのである。
【０１９７】
ステップＳ４４では、メモリ拡張部３２２は、“realloc_size + expanded_size”のメモリ領域を記憶領域３３から獲得可能か否かを判定する。獲得可能な場合（ステップＳ４４でＹｅｓ）、メモリ拡張部３２２は、“allocated_size”に“realloc_size + expanded_size”を設定し（ステップＳ４５）、処理がステップＳ４７に移行する。
【０１９８】
一方、“realloc_size + expanded_size”のメモリ領域を記憶領域３３から獲得不可能な場合（ステップＳ４４でＮｏ）、メモリ拡張部３２２は、“allocated_size”に“realloc_size”を設定し（ステップＳ４６）、処理がステップＳ４７に移行する。
【０１９９】
ステップＳ４７では、メモリ拡張部３２２は、“allocated_size”分のメモリ領域を記憶領域３３から獲得する。
【０２００】
次いで、メモリ拡張部３２２は、初期設定中の拡張メモリ領域を監視する第１テーブル３３１に“expanded_size”の領域情報を登録し、タイマをセットする（ステップＳ４８）。
【０２０１】
また、メモリ拡張部３２２は、第１テーブル３３１に対して、古い“expanded_size”のタイマを解除する（ステップＳ４９）。タイマの解除の手法としては、例えば、第１テーブル３３１内の該当エントリを削除する、或いは、当該エントリのタイマを無効に設定する等が挙げられる。
【０２０２】
そして、メモリ拡張部３２２は、獲得できたメモリ領域を拡張要求の要求元であるプログラムに通知し（ステップＳ５０）、処理が終了する。
【０２０３】
以上により、ＳＭＩ−Ｓ制御部３２が初期設定中における、メモリ管理部３２ａによるメモリ拡張処理が終了する。
【０２０４】
なお、上述した、ステップＳ２１〜Ｓ２６（図１８）、ステップＳ３４〜Ｓ３５（図１９）、及び、ステップＳ３９〜Ｓ４３（図２０）は、“expanded_size”の決定処理の一例である。また、ステップＳ２８〜Ｓ３２（図１８）、ステップＳ３６（図１９）、及び、ステップＳ４４〜Ｓ４９（図２０）は、拡張メモリ監視タイマの起動・停止処理の一例である。
【０２０５】
〔１−３−４〕“通常動作中”の処理
次に、図２１〜図２３を参照して、図１７のステップＳ１７に示す“通常動作中”の処理の動作例を説明する。
【０２０６】
図２１に示すように、ＳＭＩ−Ｓ制御部３２の算出部３２４は、最初の拡張要求か否かを判定し（ステップＳ５１）、最初の拡張要求の場合（ステップＳ５１でＹｅｓ）、“realloc_size”が２５６Ｂｙｔｅ以下か否かを判定する（ステップＳ５２）。なお、算出部３２４は、拡張要求のあったメモリ領域のメモリ管理ヘッダを参照することで、最初の拡張要求の有無を判断してよい。
【０２０７】
“realloc_size”が２５６Ｂｙｔｅ以下の場合（ステップＳ５２でＹｅｓ）、算出部３２４は、“expanded_size”に“256 - realloc_size”を設定し（ステップＳ５３）、処理がステップＳ５７に移行する。
【０２０８】
ＳＭＩ−Ｓでメモリ領域を拡張する２５６Ｂｙｔｅ以下のデータは、文字列である可能性が高く、“realloc_size + expanded_size”が文字列の最大サイズとして設定されていることが多い。このため、算出部３２４は、“realloc_size”が２５６Ｂｙｔｅ以下の場合には２５６Ｂｙｔｅになるように“expanded_size”を設定するのである。
【０２０９】
“realloc_size”が２５６Ｂｙｔｅ以下ではない場合（ステップＳ５２でＮｏ）、算出部３２４は、“realloc_size”が１０２４Ｂｙｔｅ以下か否かを判定する（ステップＳ５４）。
【０２１０】
“realloc_size”が１０２４Ｂｙｔｅ以下の場合（ステップＳ５４でＹｅｓ）、算出部３２４は、“expanded_size”に“1024 - realloc_size”を設定し（ステップＳ５５）、処理がステップＳ５７に移行する。
【０２１１】
ＳＭＩ−Ｓでメモリ領域を拡張する１０２４Ｂｙｔｅ以下のデータは、応答データとして１０２４Ｂｙｔｅが最大値であるデータの可能性が高い。このため、算出部３２４は、“realloc_size + expanded_size”がデータの最大値である１０２４Ｂｙｔｅになるように“expanded_size”を設定するのである。
【０２１２】
“realloc_size”が１０２４Ｂｙｔｅ以下ではない場合（ステップＳ５４でＮｏ）、算出部３２４は、“expanded_size”に“0”を設定し（ステップＳ５６）、処理がステップＳ５７に移行する。
【０２１３】
“realloc_size”が１０２４Ｂｙｔｅよりも大きい場合、メモリ領域はプログラム側である程度まとめて確保したバッファである可能性が高い。このため、算出部３２４は、“expanded_size”に“0”を設定し、拡張要求で指定されたサイズのみを確保するのである。
【０２１４】
ステップＳ５７では、メモリ拡張部３２２は、最初の拡張要求が処理済であることを拡張要求のあったメモリ領域のメモリ管理ヘッダに記録する。
【０２１５】
次いで、メモリ拡張部３２２は、“realloc_size + expanded_size”のメモリ領域を記憶領域３３から獲得可能か否かを判定する（ステップＳ５８）。獲得可能な場合（ステップＳ５８でＹｅｓ）、メモリ拡張部３２２は、“allocated_size”に“realloc_size + expanded_size”を設定し（ステップＳ５９）、処理がステップＳ６１に移行する。
【０２１６】
一方、“realloc_size + expanded_size”のメモリ領域を記憶領域３３から獲得不可能な場合（ステップＳ５８でＮｏ）、メモリ拡張部３２２は、“allocated_size”に“realloc_size”を設定し（ステップＳ６０）、処理がステップＳ６１に移行する。
【０２１７】
ステップＳ６１では、メモリ拡張部３２２は、“allocated_size”分のメモリ領域を記憶領域３３から獲得する。
【０２１８】
次いで、メモリ拡張部３２２は、通常動作中の拡張メモリ領域を監視する第２テーブル３３２に“expanded_size”の領域情報を登録し、タイマをセットする（ステップＳ６２）。
【０２１９】
そして、メモリ拡張部３２２は、獲得できたメモリ領域を拡張要求の要求元であるプログラムに通知し（ステップＳ６３）、処理が終了する。
【０２２０】
ここで、ステップＳ５１において、最初の拡張要求ではない場合（ステップＳ５１でＮｏ）、図２２に示すように、メモリ拡張部３２２は、“realloc_size”が“allocated_size”に収まるか否かを判定する（ステップＳ６４）。
【０２２１】
“realloc_size”が“allocated_size”に収まる場合（ステップＳ６４でＹｅｓ）、既存の“allocated_size”のメモリ領域内で拡張要求を処理できる。メモリ拡張部３２２は、“expanded_size”に“allocated_size - realloc_size”を設定する（ステップＳ６５）。
【０２２２】
また、メモリ拡張部３２２は、第１テーブル３３１及び／又は第２テーブル３３２に登録済の“expanded_size”の領域情報をステップＳ６５で更新した新しい“expanded_size”に更新する（ステップＳ６６）。第１テーブル３３１及び第２テーブル３３２の双方又は一方を更新するのは、初期設定中に確保されたメモリ領域が、通常動作中に拡張される場合もあるためである。
【０２２３】
なお、第１テーブル３３１に登録された“expanded_size”の領域情報を更新する場合、メモリ拡張部３２２は、初期設定中の更新処理と同様のロジックで更新してよい。例えば、メモリ拡張部３２２は、第１テーブル３３１に登録済の“expanded_size”の領域情報を更新した場合、タイマカウントをリセットする（ステップＳ６７）。また、第２テーブル３３２に登録された“expanded_size”の領域情報を更新する場合、メモリ拡張部３２２は、タイマカウントをリセットしない。
【０２２４】
そして、メモリ拡張部３２２は、既存のメモリ領域を拡張要求の要求元であるプログラムに通知し（ステップＳ６８）、処理が終了する。
【０２２５】
また、ステップＳ６４において、“realloc_size”が“allocated_size”に収まらない場合（ステップＳ６４でＮｏ）、“realloc_size”が確保している予約領域を超えたため、再度のメモリ拡張が行なわれる。このとき、算出部３２４は、最初の拡張要求の際に確保したメモリ領域が足りない（不十分である）ため、“expanded_size”を更に大きな値に設定する。
【０２２６】
この場合、図２３に示すように、算出部３２４は、“realloc_size”が１０２４Ｂｙｔｅ以上、且つ、“allocated_size”の２倍以上か否かを判定する（ステップＳ６９）。
【０２２７】
“realloc_size”が１０２４Ｂｙｔｅ以上、且つ、“allocated_size”の２倍以上の場合（ステップＳ６９でＹｅｓ）、算出部３２４は、“expanded_size”に“0”を設定し（ステップＳ７０）、処理がステップＳ７２に移行する。
【０２２８】
“realloc_size”が１０２４Ｂｙｔｅ以上で且つ“realloc_size”が“allocated_size”の２倍以上である場合、算出部３２４は、プログラムが必要なメモリ領域よりも大きなメモリ領域を確保しようとしていると判断する。この場合、特定のサイズを基準値とした“expanded_size”の計算手法では、想定以上のメモリ領域を確保してしまう可能性が高い。従って、算出部３２４は、“expanded_size”に“0”を設定し、拡張要求で指定されたサイズのみを確保するのである。
【０２２９】
一方、“realloc_size”が１０２４Ｂｙｔｅ以上ではない、又は、“allocated_size”の２倍以上ではない場合（ステップＳ６９でＮｏ）、処理がステップＳ７１に移行する。ステップＳ７１では、算出部３２４は、応答許容時間（Ｔ）の間に連続的にメモリ拡張が発生した場合でも耐え得る“expanded_size”を計算し、処理がステップＳ７２に移行する。
【０２３０】
上述のように、ＳＭＩ−Ｓでは、クライアントからの要求に対して１０秒以内に応答することが定められている。このため、算出部３２４は、最初のメモリ拡張が行なわれてからトータルで１０秒間のメモリ拡張に耐え得るような“expanded_size”の値を決定するのである。
【０２３１】
例えば、算出部３２４は、以下の計算により“expanded_size”を算出してよい。
【０２３２】
expanded_size = (allocated_size / realloc_time) * (10 - realloc_time)
- realloc_size
【０２３３】
ここで、上記算出式において、“(allocated_size / realloc_time)”は、１秒あたりのメモリ消費量を示す。また、“(10 - realloc_time)”は、メモリ領域を拡張し始めてから１０秒（応答許容時間）が経過するまでの秒数、すなわち、現在の時刻からの残りの秒数を示す。なお、“expanded_size”がマイナスになる場合、算出部３２４は、“expanded_size”に“0”を設定してよい。
【０２３４】
ステップＳ７２では、メモリ拡張部３２２は、“realloc_size + expanded_size”のメモリ領域を記憶領域３３から獲得可能か否かを判定する。獲得可能な場合（ステップＳ７２でＹｅｓ）、メモリ拡張部３２２は、“allocated_size”に“realloc_size + expanded_size”を設定し（ステップＳ７３）、処理がステップＳ７５に移行する。
【０２３５】
一方、“realloc_size + expanded_size”のメモリ領域を記憶領域３３から獲得不可能な場合（ステップＳ７２でＮｏ）、メモリ拡張部３２２は、“allocated_size”に“realloc_size”を設定し（ステップＳ７４）、処理がステップＳ７５に移行する。
【０２３６】
ステップＳ７５では、メモリ拡張部３２２は、“allocated_size”分のメモリ領域を記憶領域３３から獲得する。
【０２３７】
次いで、メモリ拡張部３２２は、第１テーブル３３１及び／又は第２テーブル３３２に新しい“expanded_size”の領域情報を登録する（ステップＳ７６）。第１テーブル３３１及び第２テーブル３３２の双方又は一方を更新するのは、初期設定中に確保されたメモリ領域が、通常動作中に拡張される場合もあるためである。
【０２３８】
なお、第１テーブル３３１に“expanded_size”の領域情報を登録する場合、メモリ拡張部３２２は、初期設定中の更新処理と同様のロジックで領域情報を更新してよい。例えば、メモリ拡張部３２２は、第１テーブル３３１に“expanded_size”の領域情報を登録する場合、タイマカウントをリセットする（ステップＳ７７）。
【０２３９】
また、第２テーブル３３２に“expanded_size”の領域情報を登録する場合、メモリ拡張部３２２は、タイマに、古い“expanded_size”のタイマを設定する（ステップＳ７８）。すなわち、通常運用中、メモリ拡張部３２２は、上記（Ｂ−１）のロジックにより、最初の拡張要求を契機にタイマをセットし、次の拡張要求があった場合にはタイマのカウントをリセットしない。上記のロジックを実現するために、メモリ拡張部３２２は、第２テーブル３３２に登録する“expanded_size”の領域情報に、古い“expanded_size”の領域情報のタイマカウントを引き継ぐようにするのである。
【０２４０】
また、メモリ拡張部３２２は、第１テーブル３３１及び／又は第２テーブル３３２に対して、古い“expanded_size”のタイマを解除する（ステップＳ７９）。タイマの解除の手法としては、例えば、第１テーブル３３１及び／又は第２テーブル３３２内の該当エントリを削除する、或いは、当該エントリのタイマを無効に設定する等が挙げられる。
【０２４１】
そして、メモリ拡張部３２２は、獲得できたメモリ領域を拡張要求の要求元であるプログラムに通知し（ステップＳ８０）、処理が終了する。なお、ステップＳ７６、Ｓ７８、及び、Ｓ７９における第２テーブル３３２に係る処理は、以下のような処理に置き換えられてもよい。例えば、メモリ拡張部３２２は、第２テーブル３３２に対して、新たなエントリを獲得して“expanded_size”の領域情報を登録するのではなく、古い“expanded_size”のエントリに対して、新たに獲得した領域の領域情報を更新登録してもよい。
【０２４２】
以上により、ＳＭＩ−Ｓ制御部３２が通常動作中における、メモリ管理部３２ａによるメモリ拡張処理が終了する。
【０２４３】
なお、上述した、ステップＳ５１〜Ｓ５６（図２１）、ステップＳ６４〜Ｓ６５（図２２）、及び、ステップＳ６９〜Ｓ７１（図２３）は、“expanded_size”の決定処理の一例である。また、ステップＳ５８〜Ｓ６２（図２１）、ステップＳ６６（図２２）、及び、ステップＳ７２〜Ｓ７９（図２３）は、拡張メモリ監視タイマの起動・停止処理の一例である。
【０２４４】
〔１−３−５〕メモリ解放処理
次に、図２４を参照して、制御装置３のＳＭＩ−Ｓ制御部３２によるメモリ解放処理の動作例を説明する。
【０２４５】
メモリ解放部３２３は、メモリ解放要求を受信すると（ステップＳ８１）、解放要求で指示された（解放対象の）メモリ領域について最初の拡張要求を処理済か否かを判定する（ステップＳ８２）。なお、メモリ解放部３２３は、例えば、図１８のステップＳ２７で登録されたメモリ管理ヘッダを参照することで、ステップＳ８２の判定を行なってよい。
【０２４６】
最初の拡張要求を処理済の場合（ステップＳ８２でＹｅｓ）、処理がステップＳ８５に移行する。
【０２４７】
一方、最初の拡張要求を処理済ではない場合（ステップＳ８２でＮｏ）、メモリ解放部３２３は、第１テーブル３３１及び／又は第２テーブル３３２を探索し、解放対象のメモリ領域の“expanded_size”の領域情報を削除する（ステップＳ８３）。
【０２４８】
そして、メモリ解放部３２３は、当該“expanded_size”のタイマを解除し（ステップＳ８４）、処理がステップＳ８５に移行する。
【０２４９】
ステップＳ８５では、メモリ解放部３２３は、解放対象の“allocated_size”分のメモリ領域を解放する。
【０２５０】
そして、メモリ解放部３２３は、解放できたメモリ領域を解放要求の要求元であるプログラムに通知し（ステップＳ８６）、処理が終了する。
【０２５１】
以上により、メモリ管理部３２ａによるメモリ解放処理が終了する。
【０２５２】
なお、ステップＳ８５におけるメモリ領域の解放処理は、空きメモリ領域のｍｅｔａデータの更新や空きメモリの結合等を含んでよい。ステップＳ８５の処理は既述の解放処理と同様であってよく、その詳細な説明を省略する。
【０２５３】
〔１−３−６〕監視処理
次に、図２５及び図２６を参照して、制御装置３のＳＭＩ−Ｓ制御部３２によるメモリ領域の監視処理の動作例を説明する。
【０２５４】
図２５に示すように、メモリ解放部３２３は、一定期間ごとに、例えば、１秒ごとに設定された監視タイミングを待ち合わせる（ステップＳ９１、ステップＳ９１でＮｏ）。
【０２５５】
監視タイミングが到来すると（ステップＳ９１でＹｅｓ）、メモリ解放部３２３は、第１テーブル３３１に登録済の“expanded_size”の領域情報を１つ抽出する（ステップＳ９２）。
【０２５６】
次いで、メモリ解放部３２３は、領域情報内のタイマが応答許容時間（Ｔ）を超えたか否かを判定する（ステップＳ９３）。タイマが応答許容時間（Ｔ）を超えていない場合（ステップＳ９３でＮｏ）、処理がステップＳ９８に移行する。
【０２５７】
一方、タイマが応答許容時間（Ｔ）を超えた場合（ステップＳ９３でＹｅｓ）、メモリ解放部３２３は、第１テーブル３３１から抽出した“expanded_size”の領域情報を削除する（ステップＳ９４）。
【０２５８】
また、メモリ解放部３２３は、“allocated_size”に“allocated_size - expanded_size”を設定し（ステップＳ９５）、該当するメモリ領域のｍｅｔａデータの“expanded_size”を“0”に変更する（ステップＳ９６）。なお、ｍｅｔａデータには、少なくとも“allocated_size”及び“realloc_size”が設定されているため、メモリ解放部３２３は、“expanded_size”を“0”に変更する代わりに、“allocated_sizeを“realloc_size”と同じ値に設定してもよい。この場合、ｍｅｔａデータには、“expanded_size”の情報が設定されていなくてもよい。
【０２５９】
そして、メモリ解放部３２３は、“expanded_size”分のメモリ領域を解放し（ステップＳ９７）、処理がステップＳ９８に移行する。
【０２６０】
ステップＳ９８では、メモリ解放部３２３は、全ての領域情報をチェックしたか否かを判定する。全ての領域情報をチェックしていない場合（ステップＳ９８でＮｏ）、処理がステップＳ９２に移行する。
【０２６１】
一方、全ての領域情報をチェックした場合（ステップＳ９８でＹｅｓ）、処理が図２６のステップＳ９９に移行する。
【０２６２】
図２６のステップＳ９９では、メモリ解放部３２３は、第２テーブル３３２に登録済の“expanded_size”の領域情報を１つ抽出する。
【０２６３】
次いで、メモリ解放部３２３は、領域情報内のタイマが応答許容時間（Ｔ）を超えたか否かを判定する（ステップＳ１００）。タイマが応答許容時間（Ｔ）を超えていない場合（ステップＳ１００でＮｏ）、処理がステップＳ１０５に移行する。
【０２６４】
一方、タイマが応答許容時間（Ｔ）を超えた場合（ステップＳ１００でＹｅｓ）、メモリ解放部３２３は、第２テーブル３３２から抽出した“expanded_size”の領域情報を削除する（ステップＳ１０１）。
【０２６５】
また、メモリ解放部３２３は、“allocated_size”に“allocated_size - expanded_size”を設定し（ステップＳ１０２）、該当するメモリ領域のｍｅｔａデータの“expanded_size”を“0”に変更する（ステップＳ１０３）。なお、ステップＳ９６と同様の理由で、メモリ解放部３２３は、“expanded_size”を“0”に変更する代わりに、“allocated_sizeを“realloc_size”と同じ値に設定してもよい。この場合、ｍｅｔａデータには、“expanded_size”の情報が設定されていなくてもよい。
【０２６６】
そして、メモリ解放部３２３は、“expanded_size”分のメモリ領域を解放し（ステップＳ１０４）、処理がステップＳ１０５に移行する。
【０２６７】
ステップＳ１０５では、メモリ解放部３２３は、全ての領域情報をチェックしたか否かを判定する。全ての領域情報をチェックしていない場合（ステップＳ１０５でＮｏ）、処理がステップＳ９９に移行する。
【０２６８】
一方、全ての領域情報をチェックした場合（ステップＳ１０５でＹｅｓ）、処理が図２５のステップＳ９１に移行する。
【０２６９】
以上により、メモリ管理部３２ａによるメモリ領域の監視処理が終了する。
【０２７０】
なお、ステップＳ９７及びＳ１０４におけるメモリ領域の解放処理は、空きメモリ領域のｍｅｔａデータの更新や空きメモリの結合等を含んでよい。ステップＳ９７及びＳ１０４の処理は既述の解放処理と同様であってよく、その詳細な説明を省略する。
【０２７１】
以上のように、一実施形態に係るストレージ装置２によれば、ＳＭＩ−Ｓが適用された環境において、reallocの際のメモリ管理が適切に処理される。
【０２７２】
例えば、メモリ管理部３２ａは、メモリ領域のreallocの際のメモリコピー回数を削減し性能劣化を防ぐとともに、余分なメモリサイズを削減できる。また、メモリ管理部３２ａは、メモリ領域の断片化についても考慮し、限られたリソースをできるだけ無駄なく利用することができる。
【０２７３】
従って、ＳＭＩ−Ｓ制御部３２によれば、メモリにおける所望サイズの記憶領域（メモリ領域）を獲得することができる。
【０２７４】
〔２〕その他
上述した一実施形態に係る技術は、以下のように変形、変更して実施することができる。
【０２７５】
例えば、図１１に示す制御装置３の各機能ブロックは、それぞれ任意の組み合わせで併合してもよく、分割してもよい。
【０２７６】
また、制御装置３の機能は、マルチプロセッサやマルチコアのプロセッサ３ａによって実現されてもよい。
【０２７７】
さらに、上述した一実施形態では、図７に示すコントローラ１１が図１１に示すＳＭＩ−Ｓ制御部３２である場合について説明したが、これに限定されるものではない。コントローラ１１は、メモリ１３を利用する種々の装置に実装されてもよい。また、上述した説明における“expanded_size”の決定・更新・削除等は、メモリ管理の呼び出し元のプログラムや言語の特性を利用して、種々の手法により実現されてよい。
【０２７８】
〔２〕付記
以上の実施形態に関し、さらに以下の付記を開示する。
【０２７９】
（付記１）
メモリから獲得した第１サイズのメモリ領域を、前記第１サイズに要求サイズを加えた第２サイズに拡張する指示を含む第１拡張要求を受信した場合、前記メモリから、前記要求サイズの記憶領域とともに所定サイズの予約領域を獲得する拡張部と、
規定時間内に前記メモリ領域を前記第２サイズよりも大きい第３サイズに拡張する指示を含む第２拡張要求を受信しない場合、前記予約領域を解放し、前記予約領域を空き領域とする解放部と、をそなえる
メモリ制御装置。
【０２８０】
（付記２）
前記第１拡張要求で指定された前記第２サイズに基づき、前記予約領域の前記所定サイズを決定する決定部、をそなえる
付記１に記載のメモリ制御装置。
【０２８１】
（付記３）
前記決定部は、
前記第２拡張要求を受信した場合、前記第３サイズが前記第２サイズと前記所定サイズとの合計である前記メモリ領域のサイズ以下か否かを判定し、
前記第３サイズが前記メモリ領域のサイズよりも大きい場合、前記第２拡張要求で指定された前記第３サイズに基づき、前記予約領域の前記所定サイズを更新し、
前記拡張部は、前記メモリから、前記第２拡張要求で指定された要求サイズの記憶領域とともに前記決定部が更新した更新後の所定サイズの予約領域を獲得する、
付記２に記載のメモリ制御装置。
【０２８２】
（付記４）
前記拡張部は、前記第２拡張要求で指定された前記第３サイズが前記メモリ領域のサイズ以下の場合、前記第２拡張要求に係る前記メモリ領域の拡張に前記予約領域を利用する、
付記３に記載のメモリ制御装置。
【０２８３】
（付記５）
前記決定部は、前記第１拡張要求の要求元のプログラムの動作フェーズに基づき、前記予約領域の前記所定サイズを決定する、
付記２〜４のいずれか１項に記載のメモリ制御装置。
【０２８４】
（付記６）
前記拡張部は、前記動作フェーズが初期設定フェーズの場合、前記メモリ領域に対する拡張要求に係る処理を実行する都度、前記規定時間の計時をリセットし、
前記解放部は、前記メモリ領域について、前記拡張部が直前の拡張要求に係る処理を実行してから前記規定時間内に次の拡張要求を受信しない場合、前記直前の拡張要求に係る処理で獲得されている予約領域を解放し、当該予約領域を空き領域とする、
付記５に記載のメモリ制御装置。
【０２８５】
（付記７）
前記解放部は、前記動作フェーズが通常動作フェーズの場合、前記拡張部が前記第１拡張要求に係る処理を実行してから前記規定時間内に前記第２拡張要求を受信しない場合、前記予約領域を解放し、前記予約領域を空き領域とする、
付記５又は付記６に記載のメモリ制御装置。
【０２８６】
（付記８）
前記拡張部は、前記メモリにおける前記メモリ領域と前記メモリ領域に連続する空き領域との第１合計サイズが、前記第２サイズと前記所定サイズとの第２合計サイズよりも小さい場合、前記メモリ領域を、前記メモリにおける前記第２合計サイズ以上の空き連続領域に再配置する、
付記１〜７のいずれか１項に記載のメモリ制御装置。
【０２８７】
（付記９）
コンピュータに、
メモリから獲得した第１サイズのメモリ領域を、前記第１サイズに要求サイズを加えた第２サイズに拡張する指示を含む第１拡張要求を受信した場合、前記メモリから、前記要求サイズの記憶領域とともに所定サイズの予約領域を獲得し、
規定時間内に前記メモリ領域を前記第２サイズよりも大きい第３サイズに拡張する指示を含む第２拡張要求を受信しない場合、前記予約領域を解放し、前記予約領域を空き領域とする
処理を実行させる、メモリ制御プログラム。
【０２８８】
（付記１０）
前記コンピュータに、
前記第１拡張要求で指定された前記第２サイズに基づき、前記予約領域の前記所定サイズを決定する
処理を実行させる、付記９に記載のメモリ制御プログラム。
【０２８９】
（付記１１）
前記決定は、
前記第２拡張要求を受信した場合、前記第３サイズが前記第２サイズと前記所定サイズとの合計である前記メモリ領域のサイズ以下か否かを判定し、
前記第３サイズが前記メモリ領域のサイズよりも大きい場合、前記第２拡張要求で指定された前記第３サイズに基づき、前記予約領域の前記所定サイズを更新し、
前記獲得は、前記メモリから、前記第２拡張要求で指定された要求サイズの記憶領域とともに前記更新した更新後の所定サイズの予約領域を獲得する、
付記１０に記載のメモリ制御プログラム。
【０２９０】
（付記１２）
前記獲得は、前記第２拡張要求で指定された前記第３サイズが前記メモリ領域のサイズ以下の場合、前記第２拡張要求に係る前記メモリ領域の拡張に前記予約領域を利用する、
付記１１に記載のメモリ制御プログラム。
【０２９１】
（付記１３）
前記決定は、前記第１拡張要求の要求元のプログラムの動作フェーズに基づき、前記予約領域の前記所定サイズを決定する、
付記１０〜１２のいずれか１項に記載のメモリ制御プログラム。
【０２９２】
（付記１４）
前記獲得は、前記動作フェーズが初期設定フェーズの場合、前記メモリ領域に対する拡張要求に係る処理を実行する都度、前記規定時間の計時をリセットし、
前記解放は、前記メモリ領域について、直前の拡張要求に係る処理を実行してから前記規定時間内に次の拡張要求を受信しない場合、前記直前の拡張要求に係る処理で獲得されている予約領域を解放し、当該予約領域を空き領域とする、
付記１３に記載のメモリ制御プログラム。
【０２９３】
（付記１５）
前記解放は、前記動作フェーズが通常動作フェーズの場合、前記第１拡張要求に係る処理を実行してから前記規定時間内に前記第２拡張要求を受信しない場合、前記予約領域を解放し、前記予約領域を空き領域とする、
付記１３又は付記１４に記載のメモリ制御プログラム。
【０２９４】
（付記１６）
前記獲得は、前記メモリにおける前記メモリ領域と前記メモリ領域に連続する空き領域との第１合計サイズが、前記第２サイズと前記所定サイズとの第２合計サイズよりも小さい場合、前記メモリ領域を、前記メモリにおける前記第２合計サイズ以上の空き連続領域に再配置する、
付記９〜１５のいずれか１項に記載のメモリ制御プログラム。
【符号の説明】
【０２９５】
１    ストレージシステム
１０    コンピュータ
１１    コントローラ
１２    メモリ管理部
１３    メモリ
１４    記憶領域
２    ストレージ装置
３    制御装置
３ａ    プロセッサ
３ｂ    メモリ
３１    ストレージ制御部
３２    ＳＭＩ−Ｓ制御部
３２ａ    メモリ管理部
３２１    メモリ獲得部
３２２    メモリ拡張部
３２３    メモリ解放部
３２４    算出部
３３    記憶領域
３３１    第１テーブル
３３２    第２テーブル
４    記憶装置
５    ホスト装置
６    ネットワーク
【図１】
2019040568.tif 000003
【図２】
2019040568.tif 000004
【図３】
2019040568.tif 000005
【図４】
2019040568.tif 000006
【図５】
2019040568.tif 000007
【図６】
2019040568.tif 000008
【図７】
2019040568.tif 000009
【図８】
2019040568.tif 000010
【図９】
2019040568.tif 000011
【図１０】
2019040568.tif 000012
【図１１】
2019040568.tif 000013
【図１２】
2019040568.tif 000014
【図１３】
2019040568.tif 000015
【図１４】
2019040568.tif 000016
【図１５】
2019040568.tif 000017
【図１６】
2019040568.tif 000018
【図１７】
2019040568.tif 000019
【図１８】
2019040568.tif 000020
【図１９】
2019040568.tif 000021
【図２０】
2019040568.tif 000022
【図２１】
2019040568.tif 000023
【図２２】
2019040568.tif 000024
【図２３】
2019040568.tif 000025
【図２４】
2019040568.tif 000026
【図２５】
2019040568.tif 000027
【図２６】
2019040568.tif 000028