以下は,本実施の形態の目次である。
[第1の実施の形態]
[本実施の形態のキャッシュ領域の動的割当の概略]
[専用領域獲得要求での専用キャッシュ領域の割当S15,S16]
[専用キャッシュ領域を利用するメモリアクセスS13]
[専用領域開放要求での専用キャッシュ領域の開放]
[本実施の形態のキャッシュ領域の動的割当処理の詳細]
[キャッシュ領域の割当判定の指標]
[実キャッシュヒット数]
[メモリアクセスの局所性]
[キャッシュ有効利用度,実キャッシュ有効利用度,キャッシュ攪乱力]
[専用領域獲得要求判定処理S16(1)]
[専用領域獲得要求判定処理S16(2)]
[定期割当見直し処理S18]
[定期割当見直し処理S18(1)]
[定期割当見直し処理S18(2)]
[定期割当見直し処理S18(3)]
[プロセス切り替え時のセクタID変換テーブルの入れ替え処理]
[第2の実施の形態]
以下,上記の目次にしたがって本実施の形態を説明する。
[第1の実施の形態]
図1は,本実施の形態におけるサーバの構成図である。サーバは,プロセッサユニット10と,メインメモリ16と,キーボードや表示装置などの入出力部17と,ハードディスクなどの大容量のストレージ18とを有する。プロセッサユニット10は,機械語命令を実行するCPU12と,キャッシュメモリとキャッシュメモリの制御部を有するキャッシュユニット13と,CPUからメインメモリ16へのアクセスの制御を行うバスインターフェース14とを有する。
ストレージ18には,オペレーションシステム(OS)と,コンパレータなどのミドルウエア(M-Ware)と,アプリケーションプログラム(APL)などが格納されている。これらのプログラムは,サーバ起動時にメインメモリ16内にロードされ,CPU12によって実行される。また,メインメモリ16は,アプリケーションプログラムAPLに含まれるプロセスの実行に必要なデータを記憶する。また,CPU12によるキャッシュメモリへのアクセス速度と比較すると,メインメモリ16へのアクセス速度は極端に遅い。一方,キャッシュメモリの容量は,メインメモリ16の容量に比較すると非常に小さい。
図2は,本実施の形態におけるサーバのハードウエアとソフトウエアの構成図である。ハードウエア1は,図1に示した構成を有し,図2には,特に,メインメモリ16と,キャッシュシステム13と,CPU12とが示されている。
キャッシュシステム13は,SRAMなど高速の半導体メモリなどで構成されるキャッシュメモリ130と,そのキャッシュメモリ130へアクセスするときに参照されるセクタID変換テーブル131,専用キャッシュ領域のサイズ設定などが行われるキャッシュセクタ情報設定部132,キャッシュメモリへアクセスするときに使用されるキャッシュアドレス変換部133などを有する。
本実施の形態において,CPU12は,通常の機械語命令に加えて,ローカルセクタIDが付加された機械語命令を実行する。後述するとおり,ローカルセクタIDは,その機械語命令が利用するキャッシュメモリの領域を識別するために使用される。
OS20は,アプリケーションプログラムの様々なプロセスにキャッシュメモリの領域(キャッシュセクタ)を動的に割り当てる場合に,セクタID変換テーブル131にローカルセクタIDに対して割り当てるキャッシュセクタIDをひもづける。そして,セクタID変換テーブル131は,キャッシュメモリにアクセスするときに参照され,機械語命令に付加されたローカルセクタIDをキャッシュメモリ内の使用領域を示すキャッシュセクタIDに変換する。このような方法により,OS20は,プログラムの様々なプロセスやプロセス内の処理に対して,専用キャッシュ領域を動的に割り当てて,そのプロセスやプロセス内の処理に割り当てた専用キャッシュ領域を使用させることができる。
キャッシュシステム13内のキャッシュセクタ情報設定部132は,キャッシュメモリの領域(キャッシュセクタ)に対してどの程度のキャッシュサイズを割り当てるかが設定される。後述するとおり,OS20は,専用キャッシュ領域を割り当てる場合に,そのキャッシュサイズをキャッシュセクタ情報設定部132に設定する。キャッシュアドレス変換部133は,CPU12によるメモリアクセスのアドレスをキャッシュメモリのアドレスに変換する。
図2のソフトウエア2は,オペレーションシステム(OS)20と,アプリケーションプログラムを機械語に変換するコンパイラなどのミドルウエア21と,複数のアプリケーションプログラムを有するアプリケーションプログラム群22とを有する。
OS内の関数制御管理部201は,アプリケーションプログラムの各プロセス内で呼び出される関数の管理を行う。一般に,関数制御管理部201は,関数が呼び出されるとその関数で利用されるデータをスタックデータとして管理し,また,関数が読み戻されるとスタックデータを開放する。
OS20は,マルチタスク(またはマルチプロセス)を切り替えながら各プロセスの処理を実行する。プロセス管理部202は,この各プロセスの切替制御を行う。本実施の形態では,特に,プロセス管理部202は,プロセスが切り替えられるたびに,キャッシュシステム13内のセクタID変換テーブル131を切り替える。これにより,各プロセスに対応して適切なキャッシュ領域の動的な割当を行うことができる。具体的には後述する。
割り込み処理プロセス203は,IO割り込みや内部プログラムからの例外的な割り込みなどが発生したときに,実行されるOS割り込み処理プログラムである。この割り込み処理プロセス内には,専用領域獲得要求と専用領域解放要求が含まれている。具体的には後述する。
本実施の形態では,OS12が,アプリケーションプログラムのプロセス内で発行される専用領域獲得要求に応答して,キャッシュメモリ内の例えば共用キャッシュ領域と,専用キャッシュ領域と,攪乱処理キャッシュ領域などの割当を,動的に実行する。この動的な割り当ては,専用領域獲得要求の対応する処理(以下対応処理)のメモリアクセスの特性や専用領域獲得要求時のキャッシュメモリのアクセス状況などに基づいて行われる。キャッシュ割当管理部204は,これらのキャッシュ領域の動的な割当に関する制御を行う。
上記の共用キャッシュ領域(または共用領域)とは,複数のプロセスや対応処理が共有して利用するキャッシュメモリの領域であり,あるプロセスや対応処理が共用キャッシュ領域を利用することで,他のプロセスや対応処理によって共用キャッシュ領域に記憶されたデータが追い出されることがある。
一方,専用キャッシュ領域(または専用領域)とは,ある専用領域獲得要求に対して割り当てられるキャッシュメモリの領域であり,その専用領域獲得要求の対象処理内のメモリアクセスは,それに割り当てられた専用キャッシュ領域を使用する。したがって,他のプロセスや対応処理のメモリアクセスにより専用キャッシュ領域内のデータが追い出されることはないし,専用キャッシュ領域へのアクセスにより,共用キャッシュ領域や他の専用キャッシュ領域のデータが追い出されることもない。
また,攪乱処理キャッシュ領域とは,対応する処理のキャッシュミスヒット率が非常に高い対応処理に対する専用領域獲得要求に対して割り当てられるキャッシュメモリの領域であり,一種の専用キャッシュ領域である。攪乱処理キャッシュ領域では,共用キャッシュ領域や他の専用キャッシュ領域から隔離して,そのキャッシュ制御が行われる。そのため,攪乱処理キャッシュ領域が割り当てられた対応処理の高いキャッシュミスヒット率により,共用キャッシュ領域や他の専用キャッシュ領域内のデータが追い出されてその後のキャッシュミスヒット率が高くなることが回避される。攪乱処理キャッシュ領域は,複数の専用領域獲得要求に割り当てられることがある。攪乱処理キャッシュ領域を設けることで,攪乱処理による高いキャッシュミスヒット率により共用キャッシュ領域や専用キャッシュ領域のデータが追い出されることが抑制され,キャッシュヒット率が極端に低下することが抑制される。
キャッシュ割当管理部204が実行する処理工程には,例えば,次のようなものがある。第1に,開発環境下において,各プロセスや専用領域獲得要求が対象とする対象処理などについて,メモリアクセス頻度や,専用キャッシュ領域を割り当てられた場合のキャッシュヒット率などのメモリアクセス特性の調査を行う特性調査工程と,第2に,プロセス切り替え時においてキャッシュシステム13内のセクタID変換テーブル131を入れ替える工程と,第3に,共用キャッシュ領域と,専用キャッシュ領域と,攪乱処理キャッシュ領域間のキャッシュ領域入れ替え判定工程と,第4に,キャッシュ領域入れ替え判定結果に基づくセクタID変換テーブルの更新及びキャッシュセクタ情報設定部132の割当キャッシュ領域のサイズ設定の更新工程などである。
ミドルウエア21のコンパイラは,ソースコードで記述されたアプリケーションプログラムを実行形式の機械語(オブジェクトコード)に変換する。このコンパイラは,一般的なコンパイル処理に加えて,各プロセスにおいて適宜発行される専用キャッシュ領域の割当を要求する専用領域獲得要求の機械語命令と,その割り当てられた専用領域を開放する専用領域開放要求の機械語命令を追加する。また,コンパイラは,発行する各専用領域獲得要求には,プロセス内でユニークなローカルセクタIDを付加する。そして,コンパイラは,獲得した専用キャッシュ領域を利用する機械語命令には,そのローカルセクタIDを付加する。これにより,専用領域獲得要求に対して,その対象処理で利用するキャッシュ領域に専用キャッシュ領域が動的に割り当てられ,キャッシュメモリ領域全体を有効に利用することができる。すなわち,後述するキャッシュ有効利用度や実キャッシュ有効利用度を高くすることができる。
アプリケーションプログラム(APL)22は,アプリケーションプログラムの実行形式である機械語にコンパイルされている。これにより,CPU12は,このアプリケーションプログラムの機械語を実行する。
[本実施の形態のキャッシュ領域の動的割当の概略]
図3は,本実施の形態におけるキャッシュ領域の動的割当の概略を示すフローチャート図である。まず,サーバにアプリケーションプログラムAPLをインストールした開発環境でシステムを稼働させる(S1)。まず,コンパイラをプロセッサ(CPU)に実行させて,アプリケーションプログラムAPLをコンパイルする(S2)。このコンパイル工程S2におけるキャッシュ領域の動的割当に関連する部分について以下説明する。
図4は,コンパイラ21がアプリケーションプログラムのソースコードを機械語にコンパイルする処理を示す図である。コンパイラは,アプリケーションプログラムのソースコードAPL_SCを,その実行形式である機械語(オブジェクトコード)APL_OCに変換する。一般的なコンパイラの機能は,オブジェクトコードを命令部とオペランドを有する機械語の命令に変換することである。
本実施の形態では,コンパイラは,さらに,アプリケーションプログラム内の複数のプロセス内に,キャッシュメモリの専用キャッシュ領域への割当を要求する専用領域獲得要求30と,それに対応する専用領域開放要求34とを適宜挿入する。この専用領域獲得要求30は,図4に示されるとおり,例えば,プロセスIDと,ローカルセクタIDと,専用領域獲得要求30の対象処理の優先度を有する機械語命令である。各プロセスにおいて,キャッシュ領域を占有して処理を行いたい部分で,この専用領域獲得要求30を発行してOS20に専用キャッシュ領域の割当を要求する。
プロセスIDは,OS20が管理している稼働プロセスPR1の識別情報である。ローカルセクタIDは,この専用領域獲得要求30の対象処理32を識別するための,プロセスPR1内におけるローカルな識別情報であり,割り当てられた専用キャッシュ領域を特定する識別情報である。
また,優先度は,対応処理32の優先度を示す値であり,例えば,0−7の8段階で表す。ただし,OS内部の処理を優先させる必要があるため,ユーザプログラムには例えば0−5までしか優先度が割り当てられないなどの制約をかけることが行われる。
一方,専用領域開放要求34は,これと対になる専用領域獲得要求30と同じプロセスIDとローカルセクタIDとを有する。これにより,OS20が割り当てた専用キャッシュ領域が開放され,その対応処理には共用キャッシュ領域が代わりに割り当てられる。
さらに,コンパイラは,専用領域獲得要求30と専用領域開放要求34との間の命令に,その命令が利用する専用キャッシュ領域を識別するローカルセクタIDを付与して,ローカルセクタID付き命令を生成する。したがって,専用領域獲得要求が対象とする対象処理32内の命令は,ローカルセクタIDに基づいて,割り当てられた専用キャッシュ領域を利用してメモリアクセスを実行する。ただし,専用領域獲得要求30と専用領域開放要求34との間の全ての命令が,専用キャッシュ領域を利用する必要があるわけではない。そのような命令には,ローカルセクタIDを例えば「0」に指定することで,専用キャッシュ領域ではなく通常の命令と同様に共用キャッシュ領域を利用してメモリアクセスを実行させることができる。
プロセスPR1内には,上記の専用領域獲得要求30が複数発行されることがある。そして,専用領域獲得要求30に対応する専用領域解放要求34は,それぞれ,専用領域を開放するに適切な位置で発行される。
図3に戻り,開発環境下で,専用領域獲得要求の特性調査を実行する(S3)。本実施の形態では,キャッシュメモリ内の一部の領域を専用キャッシュ領域として特定のプロセスまたはプロセス内の一部の処理に動的に割り当てる。動的に割り当てる目的は,適切に専用キャッシュ領域を割り当てることによりキャッシュメモリの単位時間当たりのキャッシュヒット数の総計を向上させ,キャッシュミスヒット数をできるだけ抑制することにある。そのため,専用領域獲得要求に対して専用キャッシュ領域を割り当てるべきか否かを判断するための情報が必要になる。
各プロセスの専用領域獲得要求が対象とする処理には,様々なタイプがある。例えば,次のようなものである。
「プロセス全体が専用領域獲得要求の対象処理であり,そのプロセス全体で利用する専用キャッシュ領域を要求するもの」
「専用領域獲得要求の対象処理がプロセス内の一部の処理であるもの」
「専用領域獲得要求の対象処理がメモリの広範囲にアクセスしてキャッシュ領域内のデータを追い出して攪乱するもの」
「専用領域獲得要求の対象処理がキャッシュ領域にデータを固定的に記憶させ,キャッシュミスヒットがほとんど発生しないもの」
「対象処理が超短時間で終了するもの」
「対象処理が専用キャッシュ領域利用時と共用キャッシュ領域利用時とでキャッシュヒット率が大きく異なるもの」
これらを事前に調査しておくことで,本番稼働時において専用領域獲得要求に対して専用キャッシュ領域を割り当てるべきかを適切に判断することができる。
そこで,工程S3において,開発環境下でコンパイルされた機械語のアプリケーションプログラム内の専用領域獲得要求に専用キャッシュ領域の割当を許可した場合に,どの程度キャッシュヒット率が向上するかの特性調査を実行する。具体的には,特性調査対象の専用領域獲得要求だけに専用キャッシュ領域を割り当て,且つ,その専用キャッシュ領域のサイズを0から徐々に大きくしながら,それぞれの場合の(1)短時間当たりのメモリアクセス回数(メモリアクセス頻度)と,(2)専用キャッシュ領域内のキャッシュヒット率とを取得する。
図5は,上記の特性調査で得られたキャッシュサイズ対キャッシュヒット率の特性例である。横軸のキャッシュサイズxを0から増大させた場合のそれぞれのキャッシュサイズでのキャッシュヒット率H(x)が縦軸に対応されている。一般的に,このキャッシュサイズ対キャッシュヒット率の特性は,キャッシュサイズが小さい範囲ではキャッシュサイズの増加はそれほどキャッシュヒット率の上昇に貢献しないが,あるキャッシュサイズの範囲ではキャッシュサイズの増加でキャッシュヒット率が急激に上昇し,そして,あるキャッシュサイズより大きいサイズではキャッシュヒット率の上昇はあまりない。
したがって,図5中の原点から延びる直線(一点鎖線)がキャッシュヒット率特性H(x)に接する点のキャッシュサイズx1が,キャッシュサイズの増大がキャッシュヒット率の向上に最も寄与する基準点となる。
なお,図5のキャッシュヒット率を調査する段階で,同時に単位時間当たりのメモリアクセス回数(メモリアクセス頻度)とキャッシュヒット数とキャッシュミスヒット数が取得される。
図20は,図3の工程S2とS3のサーバシステム内での処理を示す図である。また,図21は,図20のサーバシステム内の処理に対応するフローチャート図である。これらの図を参照して,図3の工程S2,S3の処理を説明する。
まず,サーバシステムの入力部からアプリケーションプログラムのソースコードが入力される(S201)。そして,コンパイラ21が,このアプリケーションプログラムのソースコードをコンパイルしてオブジェクトコード(機械語)に変換する(S202)。この機械語命令への変換については,図4で説明したとおりである。
次に,開発環境下でサーバシステムの入力部からシステム稼働が起動される(S301)。これに応答して,OS20内のプロセス管理部202がプロセス立ち上げ処理を実施してシステム稼働処理を行う(S302)。
この開発環境下でのプロセス稼働中に,OS20内のキャッシュ割当管理部204は,特性調査対象のアプリケーションプログラムに含まれている各専用領域獲得要求に対して,その要求を許可し,割り当てた専用キャッシュ領域を使用しながら命令を実行して,メモリアクセス頻度とキャッシュヒット率を計測する。この場合,キャッシュ割当管理部204は,専用キャッシュ領域のサイズを0から最大値まで変化させながらそれぞれのサイズでのメモリアクセス頻度とキャッシュヒット率を計測する(S303)。これにより,図5に示した特性グラフを生成する。
特性調査の開始に当たり,キャッシュ割当管理部204は,特性調査対象の専用領域獲得要求に対応したプロセスのセクタID変換テーブル131を読み出して,調査対象のローカルセクタIDに,割り当てる専用キャッシュ領域のキャッシュセクタIDを対応付け,その専用キャッシュ領域に設定したサイズを割り当てる(S304)。また,調査対象以外の専用領域獲得要求に対応したローカルセクタIDに対しては,共用キャッシュ領域を示すキャッシュセクタID=0を対応付ける。その結果,キャッシュメモリ130には,調査対象の処理のローカルセクタIDに対してのみ指定されたサイズの専用キャッシュ領域が生成される(S305)。
プロセス管理部202は,特性調査の開始の準備が整ったところで,調査対象プロセスの起動を行い(S306),アプリケーションプログラム22内の調査対象プロセスが実行される(S307)。この調査対象プロセスの実行中は,割り当てられた専用キャッシュ領域を使用してメモリアクセスが実行される。
全プロセスの全専用領域獲得要求の特性調査が終了するまで,処理S303-S307が繰り返し実行される。そして,全てが終了すると,キャッシュ割当管理部204は,調査対象プロセスのメモリアクセス頻度とキャッシュヒット率を記録して,特性調査を終了する(S308)。
図3に戻り,本番環境下でシステムを稼働すると(S10),次のような処理が実行される。OS12は,バックグランドで共用キャッシュ領域と専用領域獲得要求で獲得された専用キャッシュ領域のキャッシュヒット率を調査する(S11)。この調査で,共用キャッシュ領域と専用キャッシュ領域でのメモリアクセス頻度なども取得される。具体的には,各領域へのアクセス関数のカウンタや,キャッシュヒット回数のカウンタなどを利用して,調査する。
OS20は,上記の調査結果に基づいて,共用キャッシュ領域と専用キャッシュ領域の適正比率や,専用領域獲得要求毎の実キャッシュ有効利用度などを算出する。共用・専用領域の適正比率は,後で詳述するが,両領域へのメモリアクセス数の比率により算出される。また,実キャッシュ有効利用度は,専用キャッシュ領域を利用している場合と共用キャッシュ領域を利用している場合のキャッシュヒット率の差分に,メモリアクセス頻度を乗算し,さらに,優先度を乗算して求められる。後に詳述する。
そして,CPU12は,図4で説明したローカルセクタID付きの命令を実行する(S13)。この命令の実行については後で詳述する。
さらに,OS20は,キャッシュ領域の動的割当処理を行う(S14)。キャッシュメモリ内の領域の動的割当処理では,第1に,専用領域獲得要求が発行されたときに(S15),OS20内のキャッシュ割当管理部204が専用領域獲得要求について専用キャッシュ領域を割り当てるべきか否かの判定処理を行い,専用キャッシュ領域か,共用キャッシュ領域か,または攪乱処理キャッシュ領域かを割り当てる(S16)。
第2に,定期的な割当見直しタイミングで(S17),OS20内のキャッシュ割当管理部204が,定期割当見直し処理を実行する(S18)。この定期割当見直し処理には,(1)割当済み専用領域獲得要求の割当済み専用キャッシュ領域と未割当専用領域獲得要求が要求する未割当専用キャッシュ領域とを入れ替えるべきか否かの判定処理,(2)共用キャッシュ領域の一部を未割当専用領域獲得要求に専用キャッシュ領域として割り当てるべきか否かの判定処理,(3)その逆の,割当済み専用キャッシュ領域を開放して共用キャッシュ領域に変更すべきか否かの判定処理などが含まれる。そして,定期割当見直し処理S18では,キャッシュ割当管理部204が,判定結果に応じて,専用キャッシュ領域の置き換えや,専用キャッシュ領域の割当や開放を行う。
第3に,専用領域開放要求が発行されたときに(S19),キャッシュ割当管理部204が,要求された専用キャッシュ領域を開放して共用キャッシュ領域の一部にする開放要求処理を行う(S20)。
上記の工程S11-S20が,システム稼働が終了するまで繰り返される。
図6は,キャッシュ領域の構成と専用領域獲得要求についての割当について示す図である。キャッシュメモリ130は,共用キャッシュ領域130_1と,動的割当領域である専用キャッシュ領域130_2とを有する。専用キャッシュ領域130_2には,専用領域獲得要求に対して割り当てられる複数の専用キャッシュ領域と攪乱処理キャッシュ領域とが含まれる。つまり,攪乱処理キャッシュ領域は,一種の専用キャッシュ領域である。
キャッシュメモリ130は,共用キャッシュ領域と専用キャッシュ領域にセクタ分割されていて,各領域にはセクタIDが0から順に割り振られている。共用キャッシュ領域はセクタID=0である。共用キャッシュ領域は,複数のプロセスやプロセス内の対象処理が共通で使用するキャッシュ領域である。一方,専用キャッシュ領域は,判定により許可されたサイズを有し,割り当てられた専用領域獲得要求の対象プロセスが占有して使用するキャッシュ領域である。さらに,専用キャッシュ領域の一形態である攪乱処理キャッシュ領域は,専用領域獲得要求の対象処理のメモリアクセスが広範囲のアドレスに対して行われ,共用キャッシュ領域に割り当てるとその共用キャッシュ領域内の他のデータを追い出して攪乱してしまう場合に割り当てられる。したがって,複数の専用領域獲得要求に対して攪乱処理キャッシュ領域が割り当てられる場合がある。
専用領域獲得要求は,前述したとおり,アプリケーションプログラムAPL内のプロセス毎にあるいはプロセス内の対象処理毎に発行され,判定結果に応じて,専用領域獲得要求に専用キャッシュ領域が割り当てられる。したがって,必ずしも専用キャッシュ領域が割り当てられるとは限らず,共用キャッシュ領域が割り当てられて未割当専用領域獲得要求として専用キャッシュ領域の割当まで待たされる場合がある。キャッシュメモリ130は,サイズや分割可能数に上限があるからである。
図6に示した例では,プロセス1の専用領域獲得要求要求0,プロセス2の専用領域獲得要求0,3は,判定の結果共用キャッシュ領域130_1が割り当てられている。また,プロセス2の専用領域獲得要求1,2,4には,それぞれ専用キャッシュ領域であるセクタID=1,2,3が割り当てられている。また,プロセス3の専用領域獲得要求0に対しては,判定の結果,攪乱処理キャッシュ領域であるセクタID=4が割り当てられている。
図22は,図3の工程S13,S16,S19のサーバシステム内での処理を示す図である。また,図23は,図22のサーバシステム内の処理に対応するフローチャート図である。これらの図を参照して,専用領域獲得要求での専用キャッシュ領域の割当と,その専用キャッシュ領域を利用するメモリアクセスと,専用領域開放要求での専用キャッシュ領域の開放とを説明する。
[専用領域獲得要求での専用キャッシュ領域の割当S15,S16]
まず,アプリケーションプログラム22のプロセス内で,専用領域獲得要求が発行される(S400)。この専用領域獲得要求にはローカルセクタIDが付与されている。これに応答して,OS20内のキャッシュ割当管理部204は,専用キャッシュ領域の割当を許可するか否かの判定を実行する(S401)。この判定処理については,後述する。そして,割当が許可されると,キャッシュ割当管理部204は,割り当てる専用キャッシュ領域のキャッシュサイズをキャッシュセクタ情報設定部132に設定するとともに,キャッシュシステム13内のセクタID変換テーブル131に,ローカルセクタIDに対応するキャッシュセクタIDの欄に,割り当てた領域のセクタIDを設定する(S402)。
図7は,変換テーブルの一例を示す図である。図7中には,プロセスID=2,ローカルセクタID=2の専用領域獲得要求30に対して,プロセスID=2の変換テーブル131内のローカルセクタID=2に対してキャッシュセクタID=2の専用キャッシュ領域のセクタIDが記入されている。
[専用キャッシュ領域を利用するメモリアクセスS13]
アプリケーションプログラム22のプロセスが実行される場合,使用する専用キャッシュ領域を識別するローカルセクタID付きの命令(機械語命令)が発行される(S403)。そして,CPU12は,そのローカルセクタID付きの命令を解釈して実行する(S403-1)。この実行に際し,CPU12は,セクタID変換テーブル131を参照してローカルセクタIDに対応するキャッシュセクタIDを取得する(S403-2)。すなわち,図7中にS403-2として示す通りである。
そして,キャッシュアドレス変換部133が,メモリアクセスアドレスをキャッシュメモリ内のアドレスに変換して,キャッシュメモリ130内のキャッシュセクタID=2の専用領域獲得要求キャッシュ領域にキャッシュアクセスする(S403-3)。ここで,キャッシュミスヒットが発生すると,バスインターフェース14を介してメインメモリ16にアクセスする(S403-4)。キャッシュヒットの場合は,専用キャッシュ領域内のデータが読み出されまたは専用キャッシュ領域にデータが書き込まれる。
以上のように,専用キャッシュ領域が割り当てられている場合は,プロセス内の命令が割り当てられている専用キャッシュ領域を使用してメモリアクセスする。
[専用領域開放要求での専用キャッシュ領域の開放]
次に,アプリケーションプログラム22のプロセスで,専用領域開放要求が発行されると(S404),キャッシュ割当管理部204は,専用キャッシュ領域の開放処理を実行する(S405)。具体的には,セクタID変換テーブル内のローカルセクタIDに対応するキャッシュセクタIDを共用キャッシュ領域のID=0に変更する(S406)。すなわち,図7中にS406として示す通りである。また,キャッシュセクタ情報設定部132内の解放するキャッシュセクタIDのサイズが0に変更される。
[本実施の形態のキャッシュ領域の動的割当処理の詳細]
以下,キャッシュ領域の動的割当処理の詳細について説明する。動的割当処理は,図3で示されるとおり,専用領域獲得要求に対する判定処理S16と,定期的な割当見直しタイミングでの判定処理S18とがある。それらについて順に説明する前に,キャッシュ領域の割当判定の指標を説明する。
[キャッシュ領域の割当判定の指標]
[実キャッシュヒット数]
キャッシュメモリを共用キャッシュ領域と複数の専用キャッシュ領域(攪乱処理キャッシュ領域を含む)とに分割する目的は,キャッシュメモリ全体の単位時間当たりのキャッシュヒット数を最大化することにある。この単位時間当たりのキャッシュヒット数は,次の式により求めることができる。
単位時間当たりのキャッシュヒット数=キャッシュヒット率*メモリアクセス頻度(1)
したがって,専用領域獲得要求に専用キャッシュ領域を割り当てた場合に,専用領域獲得要求の対象処理のキャッシュヒット数が高ければ,その要求に専用キャッシュ領域を割り当てることで全体のキャッシュヒット数を高めることができる。そして,キャッシュヒット率が高いがメモリアクセス頻度が低い対象処理に対して専用キャッシュ領域を割り当てるよりも,キャッシュヒット率が多少低くてもメモリアクセス頻度が高い対象処理に専用キャッシュ領域を割り当てた方が,式(1)を大きくすることができ,メインメモリにアクセスする時間を短縮する回数が多くなり,全体としてメモリアクセスが短縮できる。
一方,アプリケーションプログラムの処理には優先度があり,特定のアプリケーションプログラムや特定のプロセスを特に高速化したいなどの要求がある。この要求が高いほど処理の優先度が高い。したがって,実際には以下の実キャッシュヒット数を最大化することがキャッシュ領域の動的割当の目的になる。
実キャッシュヒット数=Σ(処理のキャッシュヒット数*処理優先度) (2)
すなわち,上記式(2)において,Σは,専用領域獲得要求の対象とする処理のキャッシュヒット数にその処理の優先度を乗算したものを,全処理分累積することを意味する。
[メモリアクセスの局所性]
次に,専用領域獲得要求の対象の処理には,メモリアクセスの局所性が高いものと低いものがある。メモリアクセスの局所性は,メモリアクセスのアドレスの領域が狭い範囲に集中していれば局所性は高く,広い範囲に分散していれば局所性は低くなる。対象処理のメモリアクセスの局所性が低いと,キャッシュヒット率は低くなる。ただし,キャッシュサイズを大きくすることで局所性が高まり,キャッシュヒット率が高くなる場合がある。
図5に示されたキャッシュサイズに対するキャッシュヒット率の特性曲線の一例をみれば,上記の局所性とキャッシュサイズとの関係が理解できる。この例では,キャッシュサイズが小さい場合は,メモリアクセスのアドレス範囲に比較してキャッシュサイズが小さいため,キャッシュヒット率は向上していない。しかし,キャッシュサイズを増大させることで,メモリアクセスのアドレス範囲に比較してキャッシュサイズが追いつき,キャッシュヒット率が向上している。そして,キャッシュサイズを基準値xよりさらに大きくしてもキャッシュヒット率は向上していない。
さらに,メモリアクセスの局所性が極端に高い場合は,キャッシュサイズを増大しても,キャッシュヒット率を向上させることができず,キャッシュミスヒット率が高止まりする。このようなキャッシュミスヒット率が高い処理を,共用キャッシュ領域に割り当てると,キャッシュミスヒットが頻発して他の処理のデータを追い出してしまうことになる。このような処理を攪乱処理と称する。
したがって,このような攪乱処理に対しては,共用キャッシュ領域を割り当てるよりも専用のキャッシュ領域を割り当てることが,共有キャッシュ領域のキャッシュヒット率向上に有益である。ただし,このような攪乱処理は,専用キャッシュ領域を割り当てられたとしてもキャッシュミスヒットを頻発するので,式(2)の実キャッシュヒット率は上がらない。そこで,攪乱処理には,攪乱処理用のキャッシュ領域を割り当て,しかも,複数の攪乱処理に,共通の攪乱処理用キャッシュ領域を割り当てて,それらの処理を他のキャッシュ領域から隔離することが有効である。
[キャッシュ有効利用度,実キャッシュ有効利用度,キャッシュ攪乱力]
次に,専用領域獲得要求に対して専用のキャッシュ領域を割り当てるか否かの判断の指標として,キャッシュ有効利用度,実キャッシュ有効利用度,キャッシュ攪乱力について説明する。
キャッシュ有効利用度は,専用のキャッシュ領域を割り当てた場合のキャッシュヒット数よりも,共用キャッシュ領域を割り当てた場合のキャッシュヒット数がどのくらい向上するかを示す度合いである。すなわち,キャッシュ有効利用度は次の式(3)のとおりである。
キャッシュ有効利用度={(専用領域時キャッシュヒット率−共用領域時キャッシュヒット率)*メモリアクセス頻度}/使用専用キャッシュ領域のサイズ (3)
つまり,キャッシュ有効利用度(度合い)とは,共用キャッシュ領域を割り当てた場合よりも専用キャッシュ領域を割り当てた場合のほうがどれくらいキャッシュヒット率が増大するかを示すキャッシュヒット率の差分に,メモリアクセス頻度(単位時間当たりのメモリアクセス数)を乗算したキャッシュヒット数の増大を,単位キャッシュ領域当たりで示す指標である。
この場合,専用領域時キャッシュヒット率とメモリアクセス頻度は,事前に行う特性調査結果から取得することができ,共用領域時キャッシュヒット率は,本番稼働時に取得することができる。また,既に専用キャッシュ領域が割り当てられている場合は,その割当済み専用キャッシュ領域について,キャッシュヒット率を取得することが可能である。したがって,割当済み専用キャッシュ領域については,割り当てられたキャッシュサイズに対する実際のキャッシュヒット率を取得し,事前の特性調査での同じキャッシュサイズに対するキャッシュヒット率との比率を,事前特性調査で得た全キャッシュサイズに対するキャッシュヒット率に乗算して,推定キャッシュヒット率を求めることができる。この推定キャッシュヒット率については,後で再度詳述する。
次に,アプリケーションプログラムのプロセスには前述した優先度が存在し,優先度が高い処理ほど,優先的にキャッシュヒット数を向上させることが必要になる。そこで,以下の式(4)に示すとおり,上記のキャッシュ有効利用度に,対応する処理の優先度を乗算することで,実キャッシュ有効利用度を算出することができる。
実キャッシュ有効利用度=キャッシュ有効利用度*対応処理優先度 (4)
式(3)(4)において,専用領域時キャッシュヒット率を図5のH(x)に,共用領域時キャッシュヒット率をBASEHに,メモリアクセス頻度をMACCESSに,使用専用キャッシュ領域のサイズをxに,対応処理優先度をPRIORITYに置き換えると,式(4)の実キャッシュ有効利用度は,次の通りになる。
実キャッシュ有効利用度=[{H(x)−BASEH}*MACCESS*PRIORITY]/x (4)
この実キャッシュ有効利用度についても,割当済み専用キャッシュ領域に対しては上記の推定キャッシュヒット率を利用することも可能である。
式(3)のキャッシュ有効利用度と,それに優先度を乗じた式(4)の実キャッシュ有効利用度とは,主に,専用領域獲得要求に対して専用領域を割り当てるべきか否かの判断指標として利用される。
次に,前述のメモリアクセスの局所性が極端に高いほど,他の処理と同じ共用キャッシュ領域に割り当てられると他の処理のデータを追い出す力が強くなる。この追い出す力をキャッシュ攪乱力とする。このキャッシュ攪乱力は,以下の式(5)に示したとおり,キャッシュミスヒット率(1−キャッシュヒット率)にメモリアクセス頻度を乗算して算出することができる。
キャッシュ攪乱力=(1−キャッシュヒット率)*メモリアクセス頻度 (5)
キャッシュ攪乱力は,キャッシュ有効利用度とは相反する値となる。そして,このキャッシュ攪乱力は,開発環境下での特性調査でキャッシュヒット率とメモリアクセス頻度が取得されるので,予め処理毎にまたはプロセス毎に算出しておくことができる。このキャッシュ攪乱力がある基準値以上の処理は,キャッシュ攪乱処理と見なして,共用キャッシュ領域や他の専用キャッシュ領域から隔離して,攪乱処理キャッシュ領域に割り当てることで,他の処理のキャッシュヒット率の低下を抑制することができる。
キャッシュ攪乱力は,専用領域獲得要求に対して,専用領域を割り当てるべきか判定するときに,攪乱処理用の専用領域に割り当てるべきか否かの判断指標として利用される。
[専用領域獲得要求判定処理S16(1)]
図8は,図3に示した専用領域獲得要求に対する判定処理S16について第1の例のフローチャート図である。この第1の判定処理では,OS20内のキャッシュ割当管理部204が,専用領域獲得要求の対象処理のキャッシュ攪乱力(式(5))を算出して判定し(S30),キャッシュ攪乱力がある第1の基準値より高い場合は(S31のYES),その専用領域獲得要求に攪乱処理キャッシュ領域を割り当てる(S32)。
さらに,キャッシュ割当管理部204は,キャッシュ攪乱力が第1の基準値以下の場合は(S31のNO),その専用領域獲得要求の対象処理の実キャッシュ有効利用度(式(4))を算出して判定し(S33),実キャッシュ有効利用度が第2の基準値より高い場合は(S34のYES),その専用領域獲得要求に専用キャッシュ領域を割り当て(S35),実キャッシュ有効利用度が第2の基準値以下の場合は(S34のNO),その専用領域獲得要求に共用キャッシュ領域を割り当てる(S36)。
図9は,専用領域獲得要求に専用キャッシュ領域を割り当てる場合を説明する図である。図9中(1)のキャッシュメモリ130の分割状態において,専用領域獲得要求30が発行されたとする。この場合,専用領域獲得要求の対象処理の実キャッシュ有効度を式(4)に基づいて算出する。そして,その実キャッシュ有効度が第2の基準値より高ければ,図9中(2)のキャッシュメモリ130のように,その専用領域獲得要求30に対してキャッシュセクタID=2の専用キャッシュ領域を割り当てる。その結果,この割り当てられた専用キャッシュ領域は,それ以降,割当済み専用領域と称し,割り当てられた専用領域獲得要求は割当済み専用領域獲得要求と称することとする。
さらに,割り当てる専用キャッシュ領域のサイズについて説明する。図5に示したとおり,処理のキャッシュヒット率は,キャッシュサイズを増大することで急激に上昇し,ある基準キャッシュサイズx1で飽和する。そこで,実キャッシュ有効利用度は,図5のキャッシュサイズ対キャッシュヒット率の特性曲線の基準キャッシュサイズx1でのキャッシュヒット率を元に算出することが望ましい。そして,そのようにして算出した実キャッシュ有効利用度が第2の基準値より大きい場合には,その専用領域獲得要求に対して割り当てる専用キャッシュ領域のサイズは,基準キャッシュサイズx1に設定するのが望ましい。
このように,専用キャッシュ領域のキャッシュサイズを自動的に基準キャッシュサイズx1に割り当てるようにすることで,最適なキャッシュサイズを割り当てることが可能になる。
図9によれば,実キャッシュ有効利用度が第2の基準値より高い専用領域獲得要求に次々と専用キャッシュ領域を割り当てていくと,キャッシュメモリ130が専用キャッシュ領域であふれることになる。そこで,後述する定期割当見直し処理(3)により,共用キャッシュ領域と専用キャッシュ領域とのバランスを適正化することで,キャッシュメモリが専用キャッシュ領域であふれることを回避することができる。
[専用領域獲得要求判定処理S16(2)]
図10は,図3に示した専用領域獲得要求に対する判定処理S16について第2の例のフローチャート図である。この第2の判定処理では,OS20内のキャッシュ割当管理部204が,専用領域獲得要求の対象処理のキャッシュ攪乱力を算出して第1の基準値より大きい場合に攪乱処理キャッシュ領域を割り当てる(S30,S31,S32)ことは同じである。そして,キャッシュ割当管理部204は,キャッシュ攪乱力が第1の基準値以下の場合に,専用領域獲得要求の対象処理と割当済専用領域の実キャッシュ有効利用度(望ましくは実キャッシュ有効利用値の増加率)を比較判定して(S37),入れ替えることがより効率的である場合は(S37のYES),専用領域獲得要求に専用領域を割り当て,割当済専用領域を開放して,両者を入れ替える(S39)。逆に,入れ替えるのが効率的ではない場合は(S37のNO),専用領域獲得要求に共用キャッシュ領域を割り当てる(S40)。
図11は,専用領域獲得要求と割当済専用領域獲得要求との間で専用キャッシュ領域を入れ替える処理を説明する図である。図11中(1)のキャッシュメモリ130のような分割状態において,専用領域獲得要求30が発行されると,その対象処理のキャッシュ攪乱力が第1の基準値以下の場合,割当済み専用領域と入れ替えて新たな専用領域を割り当てることで,キャッシュメモリ全体のキャッシュヒット数を増大できるか否かを判定する。
図11に示した例では,キャッシュセクタID=2の割当済専用領域の実キャッシュ有効利用度よりも,専用領域獲得要求の対象処理の実キャッシュ有効利用度のほうが,入れ替えに要するオーバーヘッド値を超えて高いため,割当済専用領域を開放して共用キャッシュ領域に移動し,代わりに,専用領域獲得要求に新たな専用キャッシュ領域を割り当てている。
そこで,上記の比較判定S37について説明する。
まず,専用キャッシュ領域が既に割り当てられている場合と,未だ割り当てられていない場合とでキャッシュヒット率の取り扱いを異ならせる。割当済専用領域に対しては,推定キャッシュヒット率を採用し,未割当専用領域に対しては,事前調査で取得したキャッシュヒット率を採用する。
図12は,推定キャッシュヒット率を示す図である。図中,横軸はキャッシュサイズ,縦軸はキャッシュヒット率である。実線のH(x)は,事前調査で取得したキャッシュサイズに対するキャッシュヒット率の特性曲線である。それに対して,割当済み専用キャッシュ領域の場合は,割り当てられたキャッシュサイズx2に対するキャッシュヒット率を,キャッシュシステム内のカウンタなどから取得することができる。
その場合は,キャッシュサイズx2での現在のキャッシュヒット率SH(x2)と,事前調査時のキャッシュヒット率H(x2)との比率SH(x2)/H(x2)を,事前調査時の全キャッシュサイズに対するキャッシュヒット率H(x)に乗じることで,推定キャッシュヒット率SH(x)を得ることができる。即ち,次の式(6)の通りである。
SH(x)={SH(x2)/H(x2)}*H(x) (6)
この推定キャッシュヒット率SH(x)を利用すれば,上記の式(4)から,割当済み専用キャッシュ領域の実キャッシュ有効利用度は,次の式(7)のように導くことができる。
CCn=[{SH(x)−BASEH}*MACCESSn*PRIORITYn]/x (7)
ここで,nは,専用領域獲得要求の対象処理を示す。したがって,式(7)はある一つの対象処理に対する推定キャッシュヒット率SH(x)を利用した実キャッシュ有効利用度である。そして,未割当の専用領域獲得要求に対する実キャッシュ有効利用度は,前述の式(4)のとおりであり,以下のようになる。
実キャッシュ有効利用度n=[{H(x)−BASEH}*MACCESSn*PRIORITYn]/x (4)
専用領域獲得要求にはあるサイズxの専用キャッシュ領域が割り当てられる。したがって,割当済み専用キャッシュ領域との入れ替えを判定するためには,単位領域当たりの実キャッシュ有効利用度の増加値(実キャッシュ有効利用度の増加率)を考慮することが有効である。これを利用することで,割当済専用キャッシュ領域のサイズを+1するか−1するかにより実キャッシュ有効利用度がどの程度変化するかを考慮することができる。
上記の実キャッシュ有効利用度の増加率CHHn(x)は,割り当てる専用キャッシュ領域のサイズをx−1からxに増加したときの実キャッシュ有効利用度の増加量であり,式(7)から次の式(8)のようになる。
CHHn(x)={SH(x)−SH(x-1)}*MACCESSn*PRIORITYn (8)
式(8)からわかるとおり,式(7)のように領域サイズxで除算していないので,CHHn(x)は,実キャッシュ有効利用数の増加率である。以下,式(8)を実キャッシュ有効利用数の増加率と称する。
専用領域獲得要求に専用領域が未割当の場合は,推定キャッシュヒット率SH(x)を利用できないので,事前調査でのキャッシュヒット率H(x)を利用して,上記式(8)の実キャッシュ有効数の増加率CHHn(x)は,次の式(9)のようになる。
CHHn(x)={H(x)−H(x-1)}*MACCESSn*PRIORITYn (9)
本実施の形態の判定工程S37では,式(8)の実キャッシュ有効利用数の増加率を割当済み専用キャッシュ領域について算出した割当済専用領域リストLIST-FREEを利用する。以下,この割当済専用領域リストLIST-FREEについて説明する。
図13は,割当済専用領域リストLIST-FREEと未割当専用領域リストLIST-DEMANDとを示す図である。図13の右側が割当済専用領域リストLIST-FREEを示す。キャッシュメモリ130において,割当済みの専用領域(キャッシュセクタID=1,2)を,共用キャッシュ領域(キャッシュセクタID=0)に入れ替える場合に,実キャッシュ有効利用数の増加率がどうなるかを式(8)によって算出しておき,その増加率が少ない順に割当済専用領域リストLIST-FREEに登録しておく。増加率が少ないとは,割当済専用領域を共用領域に単位領域だけ入れ替えた場合の実キャッシュヒット数の減少が少ないことを意味し,現在のキャッシュメモリの有効利用に寄与していないことを意味する。
以上のように,図13の右側の割当済専用領域リストLIST-FREEには,増加率が小さい順にその増加率(LIST-FREE.CHH)が並べられている。
図13の左側が未割当専用領域リストLIST-DEMANDを示す。キャッシュメモリ130において,専用領域獲得要求に対して専用領域が未割当の場合には共用領域が割り当てられていて,さらに,専用領域獲得要求に対して一部のサイズだけ専用領域が割当られている場合には残りのサイズは共用領域に割り当てられているので,それらの専用領域に割り当てられていない未割当専用領域が,この未割当専用領域リストLIST-DEMANDに含まれる。
そして,それらの未割当専用領域を共用領域から専用領域に入れ替えた場合に,実キャッシュ有効利用数の増加率がどうなるかを式(9)によって算出しておき,その増加率が多い順に未割当専用領域リストLIST-DEMANDに登録しておく。増加率が多いとは,未割当専用領域を共用領域から専用領域に入れ替えた場合の実キャッシュヒット数の増加が多いことを意味し,入れ替えることによりキャッシュメモリの有効利用に大きく寄与することを意味する。
以上のように,図13の左側の未割当専用領域リストLIST-DEMANDには,増加率が大きい順にその増加率(LIST-DEMAND.CHH)が並べられている。
そこで,本実施の形態の判定工程S37では,専用領域獲得要求30に対して専用領域を割り当てた場合の実キャッシュ有効利用数の増加と,割当済専用領域リストLIST-FREEに登録されている割当済専用領域の実キャッシュ有効利用数の減少の差分が,入れ替えに要するオーバーヘッド値を超える場合は,入れ替えして専用領域獲得要求に専用領域を割り当てるべきと判断する。
この判断は,次の式(10)を満たすか否かにより行われる。
y*CCn(y)−Σ(m=1-y)LIST-FREEm.CHH>OVH2*{Σ(m=1-y)LIST-FREEm.PRIORITY} (10)
ここで,yは専用領域のサイズyを,mはリスト内の番号を示し,LIST-FREEm.CHH は実キャッシュ有効利用数の増加率を示し,OVH2は入れ替えに要するオーバーヘッド値を示し,LIST-FREEm.PRIORITYはその処理の優先度を示す。つまり,オーバーヘッド値OVH2が優先度で重み付けされている。
OS20内のキャッシュ割当部204は,y=1から式(10)を判定していき,式(10)の条件を満たす最大のサイズyを,専用領域獲得要求に割り当てる専用領域のサイズとする。すなわち,図13に示した専用領域獲得要求30と割当済専用領域リストLIST-FREEとの間の矢印で示した入れ替えを行う。その結果,サイズyに対応する割当済専用領域が共用領域に開放される。どのサイズyでも式(10)を満たさない場合は,専用領域獲得要求には専用領域を割り当てない。
図12に示されるとおり,キャッシュヒット率の特性は,キャッシュサイズをある程度大きくすると急激に増加する傾向にある。したがって,新たに割り当てる専用領域のサイズyを1から大きくすることで,式(10)の条件を満たすサイズyが見つかることがある。特に,サイズyが基準値x1の付近で式(10)の条件が満たされることがある。
式(10)の条件を満たすキャッシュサイズyと,専用領域獲得要求30が要求するキャッシュサイズとの関係は,例えば,次の通りである。条件を満たすキャッシュサイズyが要求するキャッシュサイズ以下であれば,キャッシュサイズyから要求するキャッシュサイズまでのサイズを割り当てることでキャッシュメモリの効率を向上することができる。一方,キャッシュサイズyが要求するキャッシュサイズを超えている場合は,式(10)の条件は満たされないと判定して専用領域を割り当てないのが好ましい。
図24は,本専用領域獲得要求判定処理S16(2)のフローチャート図である。図10と同じ処理には同じ番号を与えている。まず,キャッシュ割当管理部204は,キャッシュ攪乱力が第1の基準値を超えるか判定し(S30,31),超えていれば,専用の攪乱処理キャッシュ領域を割り当てる(S32)。その結果,セクタID変換テーブル131で,専用領域獲得要求のローカルセクタIDに,攪乱処理キャッシュ領域のキャッシュセクタIDが紐付けられる(S32-1)。
キャッシュ割当管理部204は,キャッシュ攪乱力が第1の基準値を超えていなければ,専用キャッシュ領域を割り当てるべきか否かの判定を,式(10)を満たすサイズyが存在するか否かで行う(S37,38)。キャッシュ割当管理部204は,条件を満たさない場合は,専用領域獲得要求に対して共用領域を割り当てて(S40),条件を満たす場合は,専用領域獲得要求に対してサイズyの専用領域を割り当てることをハードウエアに指示する(S39)。
ハードウエアでは,キャッシュ割当管理部204が,キャッシュセクタ情報設定部132に,新規に割り当てる専用キャッシュ領域とそのサイズyを設定する(S39-1)。また,入れ替え対象の割当済専用領域のキャッシュセクタIDの削除やサイズ変更も同時に行う(S39-1)。そして,キャッシュ割当管理部204が,セクタID変換テーブル131において,専用領域獲得要求のローカルセクタIDに,割り当てた専用キャッシュ領域のキャッシュセクタIDが紐付けられる(S39-2)。
[定期割当見直し処理S18]
次に,図3の定期割当見直し処理S18について3つの例を説明する。専用領域獲得要求に応答して,OS20内のキャッシュ割当管理部204は,専用キャッシュ領域を割り当てるべきか否か,割当済専用領域と入れ替えすべきか否かを判定した。
これに対して,キャッシュ割当管理部204は,定期的に,例えば2秒毎に,専用領域獲得要求に割り当てた割当済専用領域と,専用領域獲得要求に未だ割り当てていない未割当専用領域とを入れ替えるべきか否かの判定(例1,例2)と,共用領域と全専用領域とのサイズの比率がアクセス頻度の比率に基づく理想値とずれている場合に,共用領域を専用領域として未割当の専用領域獲得要求に新たに割り当てるか,または,割当済専用領域を開放して共用領域に入れ替えるかの判定(例3)とを行う。これらの判定において,前述の割当済専用領域リストLIST-FREEと未割当専用領域リストLIST-DEMANDを利用する。
[定期割当見直し処理S18(1)]
図14は,定期割当見直し処理S18の第1の例のフローチャート図である。図15は,定期割当見直し処理S18の第1の例を説明するための図である。図14において,定期的割当見直し処理S18では,キャッシュ割当管理部204は,未割当専用領域と割当済専用領域の入れ替え判定を行う(S50)。この判定処理では,図13で説明した未割当専用領域リストLIST-DEMAND内の未割当専用領域の実キャッシュ有効利用数の増加率CHHn(x)と,割当済専用領域リストLIST-FREE内の割当済専用領域の実キャッシュ有効利用数の増加率CHHn(x)とを比較する(S51)。比較対象は,例えば,図15に矢印で示されるとおり,未割当専用領域リストLIST-DEMAND内の最上位にある最大の増加率と,割当済専用領域リストLIST-FREE内の最上位にある最小の増加率とを比較し,さらに,下位にある増加率どうしを比較する。
そして,以下の式(11)の条件を満たす場合は,入れ替えで効率がアップすると見なすことができる(S52)。
LIST-DEMANDm.CHH - LIST-FREEm.CHH > OVH2 * LIST-FREEm.PRIORITY (11)
ここで,mはリストの順番を示し,OVH2は入れ替えに要するオーバヘッド値を示し,LIST-FREEm.PRIORITYは割当済専用領域リストLIST-FREE内の処理の優先度を示す。つまり,比較対象の未割当専用領域の増加率から割当済専用領域の増加率への差分が,入れ替えに伴うオーバーヘッド値OVH2を優先度で重み付けした値を超える場合は,入れ替えで効率がアップすると見なされる。
式(11)の条件が,両リストの先頭(m=1)から順番に判定され,この条件が満たされなくなる順番まで繰り返し判定される。ただし,式(11)には優先度LIST-FREEm.PRIORITYが算入されているので,右辺の値は優先度に応じて変動する。したがって,未割当専用領域リストLIST-DEMAND内の最上位にある最大の増加率CHHと比較される対象は,割当済専用領域リストLIST-FREE内の最上位の増加率CHHだけでなく,最上位から順に下位の増加率CHHも含まれる。式(11)を満たす組み合わせが見つかれば,それらが入れ替え対象になる。そして,未割当専用領域リストLIST-DEMAND内の次の増加率CHHについて,上記と同じ比較が行われ,式(11)を満たす組み合わせが検出される。
入れ替えで効率がアップすると見なされる場合は,キャッシュ割当管理部204は,未割当専用領域と割当済専用領域とを入れ替える処理を行う(S53)。具体的には,キャッシュセクタ情報設定部132に未割当専用領域に新たに専用領域を割り当てさせ,割り当てるサイズを登録させ,セクタID変換テーブル内の未割当専用領域獲得要求のローカルセクタIDに新たに割り当てる専用領域のキャッシュセクタIDを紐づける。逆に,キャッシュセクタ情報設定部132に割当済専用領域の登録を抹消させ,セクタID変換テーブル内の割当済専用領域獲得要求のローカルセクタIDに紐づけられているキャッシュセクタIDを共用領域のIDに変更する。
そして,入れ替え処理を行うと,入れ替えられた専用領域の増加率は,未割当専用領域リストLIST-DEMANDから割当済専用領域リストLIST-FREEに移動させ,同時に,割当済専用領域リストLIST-FREEから未割当専用領域リストLIST-DEMANDに移動させる。さらに,各リスト内で増加率CHHの値に基づいて,ソートし直しておく。
入れ替えで効率がアップすると見なされない場合は,キャッシュ割当管理部204は,未割当専用領域と割当済専用領域とを入れ替える処理は行わない(S54)。
[定期割当見直し処理S18(2)]
図16は,定期割当見直し処理S18の第2の例のフローチャート図である。図17は,定期割当見直し処理S18の第2の例を説明するための図である。図16において,定期的割当見直し処理S18では,キャッシュ割当管理部204は,未割当専用領域と割当済専用領域の入れ替え判定を行う(S60)。この判定処理では,図17に示したとおり,未割当専用領域リストLIST-DEMAND内の先頭の未割当専用領域の実キャッシュ有効利用数の増加率CHH1(x)の専用キャッシュ領域サイズxを増加させながら,割当済専用領域リストLIST-FREE内の割当済専用領域の実キャッシュ有効利用数の増加率CHHm(x)を先頭から増加させながら,両者の累積値の比較をする(S61)。
この判断S61は,次の式(10)を満たすか否かにより行われる。
Σ(x=1-y)LIST-DEMAND1.CHH(x)−Σ(m=1-y)LIST-FREEm.CHH >
OVH2*{Σ(m=1-y)LIST-FREEm.PRIORITY} (12)
ここで,yは専用領域のサイズyを,mはリスト内の番号を示し,LIST-DEMAND1.CHH, LIST-FREEm.CHH は実キャッシュ有効利用数の増加率を示し,OVH2は入れ替えに要するオーバーヘッド値を示し,LIST-FREEm.PRIORITYはその処理の優先度を示す。ここでも,オーバーヘッド値OVH2が優先度で重み付けされている。
OS20内のキャッシュ割当部204は,式(12)の判定をy=1から増加しながら行い,式(12)の条件を満たす最大のサイズyを検出する。すなわち,実キャッシュ有効利用数の増加率CHH1(x)は,単位サイズ増加させたときの実キャッシュ有効利用数の増加量である。そして,図12に示すとおり,専用キャッシュ領域のサイズxを増加させるほどキャッシュヒット率が上昇する傾向にあるので,未割当専用領域の実キャッシュ有効利用数の増加率CHH1(x)が最大化できる専用キャッシュ領域のサイズxに対して,同じサイズの割当済専用領域の増加率と比較して,入れ替え対象にする。式(10)と同じ考え方である。
上記式(12)を満たして入れ替えで効率がアップすると見なされる場合は,キャッシュ割当管理部204は,未割当専用領域と割当済専用領域とを入れ替える処理を行う(S63)。入れ替えで効率がアップすると見なされない場合は,キャッシュ割当管理部204は,入れ替え処理を行わない(S64)。
未割当専用領域獲得要求30が要求するキャッシュサイズと,式(12)を満たすキャッシュサイズyとの関係は,専用領域獲得要求判定処理(2)について図13で説明したのと同様である。つまり,式(12)を満たすキャッシュサイズyが要求するキャッシュサイズ以下であれば,サイズyと要求サイズとの間のサイズを割り当てる。また,キャッシュサイズyが要求キャッシュサイズを超える場合は,式(12)が満たされないとして,入れ替え処理は行わない。
[定期割当見直し処理S18(3)]
図18は,定期割当見直し処理S18の第3の例のフローチャート図である。図19は,定期割当見直し処理S18の第3の例を説明するための図である。定期割当見直し処理S18の第3の例では,現実の加重メモリアクセス比に基づく共用キャッシュ領域の理想サイズと,現実の共用キャッシュ領域のサイズとの間に乖離が発生している場合は,共用キャッシュ領域が理想のサイズ比に近づくように,共用キャッシュ領域を未割当専用領域獲得要求に専用キャッシュ領域として割り当てるか,割当済専用キャッシュ領域を開放して共用キャッシュ領域に割り当てるかの入れ替え処理を行う。
図19に示した左右のキャッシュメモリ130は,実線が実際のサイズ比を示し,破線が理想のサイズ比を示している。左側のキャッシュメモリ130は,共用キャッシュ領域が理想サイズよりも大きくなっているので,その分を専用領域として未割当専用領域獲得要求に割り当てることが望ましい。また,逆に,右側のキャッシュメモリ130は,共用キャッシュ領域が理想サイズよりも小さくなっているので,その分を割当済専用領域を開放して共用領域に変更することが望ましい。
共用キャッシュ領域の理想サイズは,次の式(13)(14)により求められる。
MACCESSXn=Σ(m=1-n)MACCESSm * PRIORITYm (13)
RSIZESHR=CEIL{(MACCESSXSHR/MACCESSXALL)* SIZEALL} (14)
ここで,MACCESSXnはn個の対象処理の加重メモリアクセス量の合計値を示し,MACCESSmは対象処理mのメモリアクセス量を示し,PRIORITYmは処理mの優先度を示す。さらに,RSIZESHRは共用キャッシュ領域(SHR)の理想的なサイズを示し,MACCESSXSHR,MACCESSXALL,SIZEALLは共有キャッシュ領域(SHR)へのアクセス量,全キャッシュ領域へのアクセス量,全キャッシュ領域のサイズを示す。また,CEILは切り上げを意味する。
したがって,式(13)によりn個の対象処理の加重メモリアクセス量の合計値が求められるので,共用キャッシュ領域を使用する対象処理全ての加重メモリアクセス量は,式(13)により算出できる。同様に,全専用キャッシュ領域または全キャッシュ領域を使用する対象処理全ての加重メモリアクセス量も,同様に式(13)により算出できる。
そして,式(14)は,共用キャッシュ領域の理想サイズRSIZESHRを,全キャッシュ領域サイズ(SIZEALL)を共用領域と専用領域への加重メモリアクセス量で按分して(MACCESSXSHR/MACCESSXALL)求めている。したがって,共用キャッシュ領域の理想サイズRSIZESHRは,共用領域と専用領域との加重メモリアクセス数の比率に基づいて求められる。
そして,前述した,共用キャッシュ領域の理想サイズと,現実のサイズとを比較して,その差分が入れ替えに要するオーバーヘッド値OVH1を超えるか否かの判断が行われる。その判断は,以下の式(15)が満たされるか否かによって行われる。
ABS{MACCESSXSHR - MACCESSXALL*(SIZESHR/SIZEALL) > OVH1 (15)
ここで,ABSは絶対値を示している。
式(15)は,プロセス実行中における共用キャッシュ領域に割り当てられた対象処理でのメモリアクセス頻度を各対象処理の優先度で重み付けした第1の加重アクセス頻度MACCESSXSHRと,各対象処理のメモリアクセス頻度を各対象処理の優先度で重み付けした加重アクセス頻度の累計値MACCESSXALLを共用キャッシュ領域と前記専用キャッシュ領域のサイズ比(SIZESHR/SIZEALL)で按分した共用キャッシュ領域の第2の加重アクセス頻度MACCESSXALL*(SIZESHR/SIZEALL)との差分が,オーバーヘッド値OVH1より高い場合の条件式である。この条件式が満たされる場合に,その差分に対応したサイズだけ,割当済み専用キャッシュ領域を共用キャッシュ領域に入れ替えるか,または共用キャッシュ領域を未割当専用キャッシュ領域に入れ替える。
上記式(15)は,式全体にSIZEALL/MACCESSXALLを乗算すると,次の式(16)になる。
ABS{(MACCESSXSHR/MACCESSXALL)*SIZEALL - SIZESHR} > OVH1*( SIZEALL/MACCESSXALL) (16)
ABS{(RSIZESHR - SIZESHR )} >OVH1*( SIZEALL/MACCESSXALL) (16)
すなわち,現実の加重アクセス頻度比による共用キャッシュ領域の理想的なサイズRSIZESHRと,現実のサイズSIZESHRとの差分がオーバーヘッド値を超えるか否かを判定することと同じである。
そこで,上記式(15)または(16)が満たされる場合は,共用キャッシュ領域のサイズが理想的なサイズに近づくように,割当済み専用キャッシュ領域を共用キャッシュ領域に入れ替えるか,逆に,共用キャッシュ領域を未割当専用キャッシュ領域ュ領域に入れ替える。
そのために,本実施の形態では,図19の左側に示すように,共用領域の理想サイズに比較して現実のサイズが大きい場合は,専用領域候補リストのサイズ(WAY数)を増加し,定期的見直しでは未割当専用領域獲得要求に対して専用領域を割り当てることができることを記録する。逆に,図19の右側に示すように,共用領域の理想サイズに比較して現実のサイズが小さい場合は,専用領域借りリストのサイズ(WAY数)を増加し,定期的見直しでは割当済専用領域を共用領域を割り当てることができることを記録する。
そして,定期的見直しでは,図19の左側に示すように,専用領域候補リストのサイズ(WAY数)分だけ,未割当専用領域リストLIST-DEMANDの先頭から専用領域を割り当てる。あるいは,図19の右側に示すように,専用領域借りリストのサイズ(WAY数)分だけ,割当済専用領域リストLIST-FREEの先頭から専用領域を開放する。
図18のフローチャートにしたがって再度説明すると,キャッシュ割当管理部204は,共用領域の理想サイズと現実サイズとの差分に基づいて,共用領域と専用領域の入れ替えの必要性を判定する(S70)。具体的には,専用領域候補リストのサイズが正であれば(S71),未割当専用領域獲得要求に専用領域を割り当てる(S72)。一方,専用領域借りリストのサイズが正であれば(S73),割当済専用領域を開放する(S74)。
キャッシュ割当管理部204は,共用領域の理想サイズと現実サイズとの差分がオーバーヘッド値を超えてない場合は,図14,16で説明した定期割当見直し処理(1)(2)を実行する(S75)。
上記の第3の例では, 専用領域候補リストに記録されたキャッシュサイズ(Way数)で割り当てることが望ましい。
[プロセス切り替え時のセクタID変換テーブルの入れ替え処理]
図25は,アプリケーションプログラムのプロセス22が切り替わるときのセクタID変換テーブルの入れ替え処理を示す図である。OS内のプロセス管理部202は,切り替え元の稼働プロセス22Aがプロセスを停止するときに,そのプロセスの停止処理を行い(S81),同時に,キャッシュ割当管理部204にセクタID変換テーブルの切替制御を指示し(S83),切り替え元の稼働プロセス22AのセクタID変換テーブルを,切り替え先の稼働プロセス22BのセクタID変換テーブルに入れ替えさせる(S84)。その後,プロセス管理部202は,切り替え先の稼働プロセス22Bのプロセス稼働を開始させる(S86)。
このように,プロセスが切り替わるときにプロセス管理部202がキャッシュ割当管理部204にセクタID変換テーブルを入れ替えさせ,切り替え先のプロセスがそのセクタID変換テーブルのキャッシュメモリ分割状態に基づいてメモリアクセスを行う。
第1の実施の形態では,図8の専用領域獲得要求に対する判定(1)では,専用領域獲得要求の対象処理の実キャッシュ有効利用度が第2の基準値を超えていれば,専用領域を割り当てた。この判定において,式(4)(7)において優先度を乗算していないキャッシュ有効利用度を指標にして専用領域の割当の有無を判断してもよい。
第1の実施の形態では,図10−13の専用領域獲得要求に対する判定(2)では,実キャッシュ有効利用数の増加率を判断指標にして,専用領域獲得要求に対して専用領域を割り当てるか否かを判断した。この判定においても,式(8)(9)において優先度を乗算していないキャッシュ有効利用数の増加率を指標にして専用領域の割当の有無を判断してもよい。
第1の実施の形態において,定期割当見直し(1)(2)(3)においても,同様に,優先度を考慮しない指標を利用して判断してもよい。
[第2の実施の形態]
第2の実施の形態は,プログラム内で関数やモジュールなどのサブルーチンが呼び出されたときにサブルーチンのローカル変数を記憶するスタックメモリ領域に対するキャッシュメモリの制御プログラムに関する。
前述のとおり,OSは,階層的に呼び出されるサブルーチンのローカル変数をメインメモリ内のスタックメモリ領域に一括して格納して管理する。そして,サブルーチンプログラムがローカル変数をリードまたはライトする場合は,メインメモリ内のスタックメモリ領域にメモリアクセスを実行する。このスタックメモリ領域へのメモリアクセスにおいても,通常のメモリアクセスの処理と同様に,まずキャッシュメモリでキャッシュヒット判定が行われ,キャッシュミスヒットの場合のメインメモリ内のスタックメモリ領域へのアクセスが行われる。
なお,サブルーチンには関数やモジュールが含まれるが,以下の実施の形態では,サブルーチンの一つである関数を例にして説明する。ただし,モジュールが呼び出されたり(コール),呼び戻されたり(リターン)した場合も,関数が呼び出されたり呼び戻されたりした場合と同様である。また,関数の引数はローカル変数として取り扱うことにする。
図26は,第2の実施の形態におけるキャッシュメモリとスタックメモリ領域との関係を示す図である。CPU(またはCPUコア)12に隣接してキャッシュメモリ130が設けられている。そして,CPU12が関数内のローカル変数についてメモリアクセスを実行すると,キャッシュメモリにキャッシュヒット判定が行われ,キャッシュヒットすればキャッシュメモリ内のデータにアクセスされ,キャッシュミスヒットすれば外部インターフェース14を介してメインメモリ16内のスタックメモリ領域内のデータにアクセスされる。
メインメモリ16内には,様々なデータやプログラムが記憶されている。例えば,プログラムPRが実行されると,各プログラムPR1−PR4毎に,変数や配列データなどを記憶するヒープ領域と,呼び出される関数のローカル変数を記憶するスタックメモリ領域STとが,メインメモリ16内に確保される。
そして,このスタックメモリ領域は,次のようなスタック構造になっている。すなわち,あるプログラム内で関数A,B,C,D,A,Cが順番に階層的に呼び出された場合は,それらの呼び出された関数のローカル変数データがその順番でスタックメモリ領域内に記憶される。図26に示されるように,関数A,B,C,D,A,Cが順番に呼び出された場合,スタックメモリ領域内には,関数A,B,C,D,A1,C1のローカル変数データが順番に記憶される。そして,関数の実行が終了してその関数が呼び戻されると,呼び出された関数に対応するスタックメモリ領域は開放される。したがって,同じ関数が異なるタイミングで呼び出された場合は,それらの呼び出された関数毎にローカル変数がスタックメモリ領域内に記憶される。
このようなメインメモリ16内のスタックメモリ領域内のデータにメモリアクセスが実行されると,メモリアクセスされたデータがキャッシュメモリ130内にも記憶される。図26の例では,関数B,C,Dのローカル変数データがキャッシュメモリ130内に記憶されている。
図27は,関数のローカル変数とスタックメモリ領域内の変数データとを示す図である。図27の例では,関数Aには,引数in_in1, in_in2と,変数int_va1, String_Va2とが利用されている。この場合,これらの引数と変数が,関数Aのローカル変数データとして,関数Aに対応するスタックメモリ領域内にひとまとめにして記憶される。
図28は,プログラム内の関数とスタックメモリ領域とを示す図である。図28に例示したプログラムは,関数Aが呼び出され,関数A内で関数Bが呼び出され,関数B内で関数Cが呼び出され,関数C内で関数Dが呼び出され,その関数Dが終了して呼び戻された後に,関数Eが読み出される例である。
この場合,スタックメモリ領域には,図示されるように,関数Aのローカル変数データ(図27のローカル変数in1,in2,va1,va2)の領域と,関数Bのローカル変数データの領域と,関数Cのローカル変数データの領域と,関数Dのローカル変数データの領域とが,スタックメモリ内にスタック構造で確保される。そして,関数Dが終了して呼び戻されると,スタックメモリ内から関数Dのローカル変数データの領域が開放され,その後関数Eが呼び出されると,スタックメモリ内に関数Eのローカル変数データの領域が新たに確保される。
図29,図30は,スタックメモリ領域に対するキャッシュメモリの問題点について説明する図である。これらの例は,いずれもキャッシュメモリ130を複数の関数が共用して使用する例である。
図29には,スタックメモリ領域STの例と,それに対応するキャッシュメモリ130の変化の例とが示されている。(1)関数Cが長時間実行された例では,関数A,B,Cが順番に階層的に読み出されて,スタックメモリ領域ST内に関数A,B,Cのローカル変数データの領域が順番に確保されている。それに伴い,関数Cが呼び出された直後のキャッシュメモリ130−1内には,関数A,B,Cのローカル変数データの領域が書き込まれている。しかし,関数Cが長時間実行されると,関数Cのプロセスのデータや,スタックメモリ領域以外のメモリ領域のデータのメモリアクセにより,キャッシュメモリ130−1内に一旦は書き込まれたがその後アクセスされなかった関数A,Bのローカル変数データが追い出されて削除されてしまう。
このような場合に,実行中の関数Cが終了して,その直後に関数Bのローカル変数データにメモリアクセスが実行されると,キャッシュメモリ130−2内には関数Bのローカル変数データは削除されているので,キャッシュミスヒットを連発する。
(2)関数Dを呼び出した例では,関数A,B,Cが順番に階層的に読み出されて,スタックメモリ領域ST内に関数A,B,Cのローカル変数データが順番に記憶されている状態で,新しい関数Dが呼び出されている。その場合,キャッシュメモリ130において,既に実行された関数Xのローカル変数データがキャッシュメモリ130−3に記憶されている場合には,その関数Xのローカル変数データをメインメモリ16に転送して退避させ,その関数Xのローカル変数データが記憶されていた領域に,メインメモリ16から読み出した関数Dのローカル変数データを上書きする必要がある。したがって,関数Dを読み出したことによる処理に,関数Xのローカル変数データをメインメモリに退避する処理が含まれてしまい,オーバーヘッドが大きくなる。
図30には,(3)大量の関数を短期的に呼び出した例におけるキャッシュメモリ130−5から130−6への変化が示されている。この例では,関数Aを呼び出したことによりキャッシュメモリ130−5には関数Aのローカル変数データが記憶され,更に,関数B〜Zが短時間で連続して階層的に呼び出されることで,キャッシュメモリ130−6内の広い領域に,それらの関数のローカル変数データが次々に記憶されている。その結果,キャッシュメモリ130−6内の他のプロセスのデータが消去されてキャッシュメモリ130−6内が乱されるおそれがある。それに伴い,他のプロセスのキャッシュミスヒット率が低下するおそれがある。
[第2の実施の形態の概略]
そこで,第2の実施の形態では,キャッシュメモリ制御プログラムにより,図29,30で指摘したような問題点を解決する。第2の実施の形態のキャッシュメモリ制御プログラムによれば,キャッシュメモリ内に一旦は記憶された過去に呼び出された関数のローカル変数データが,他のプロセスによるメモリアクセスで消去されないようにするために,呼び出される関数に対してそれぞれ専用キャッシュ領域を割り当てる。
ただし,連続して多数の関数が呼び出された場合に,キャッシュメモリ内に多数の専用キャッシュ領域が割り当てられることになり,他のプロセスにとり一定の容量しかないキャッシュメモリの利用効率が低下する。つまり,他のプロセスに割り当てられるキャッシュ領域のサイズが小さくなりキャッシュヒット率が低下する。
そこで,キャッシュメモリ制御プログラムは,プログラム内で呼び出される関数に対するスタックメモリ領域のために,限られた個数のキャッシュ領域をスタックメモリ用キャッシュ領域群として確保する。さらに,そのスタックメモリ用キャッシュ領域群内に,現在実行中の第1の関数に割り当てた第1の専用キャッシュ領域と,実行中の第1の関数の直前に呼び出された単数または複数の第2の関数にそれぞれ割り当てた第2の専用キャッシュ領域と,複数の空きキャッシュ領域とを維持するように,呼び出された関数と呼び戻された関数に対する専用キャッシュ領域の割当制御を行う。
上記の空きキャッシュ領域とは,メインメモリに退避することが必要などの有効なデータが記憶されていないキャッシュ領域であり,即座に新たなデータを上書きすることが可能なキャッシュ領域である。また,この空きキャッシュ領域には,他の関数やプロセスのメモリアクセスによるデータが書き込まれることがない,一種の専用キャッシュ領域である。
そして,スタックメモリ用キャッシュ領域群内の複数のキャッシュ領域は,例えば,一定のサイズを有する。通常,関数のローカル変数を格納するスタックメモリ領域の容量は1MB以下と小さいので,スタックメモリ用キャッシュ領域群内に複数の関数それぞれに割り当てるキャッシュ領域を維持しても,それほど多くのメモリ容量を占有することはない。
図31は,第2の実施の形態における,関数Eが実行中の時間T1と関数Eが終了して呼び戻された時間T2のスタックメモリ領域STとキャッシュメモリ130内のスタックメモリ用キャッシュ領域群130−STとを示す図である。スタックメモリ領域STには,関数A,B,C,D,Eのローカル変数データが順番に記憶されている。それに対して,キャッシュメモリ制御プログラムは,キャッシュメモリ130内に,複数の関数に対するスタックメモリ領域のために,例えば5個のキャッシュ領域(セクタID=0−4)をスタックメモリ用キャッシュ領域群130−STとして確保する。
さらに,キャッシュメモリ制御プログラムは,関数Eが実行中の時間T1では,スタックメモリ用キャッシュ領域群130−ST(1)内に,実行中の関数Eに割り当てた第1の専用キャッシュ領域(セクタID=4)と,その関数Eの直前に連続して読み出された2つの関数C,Dに割り当てた第2の専用キャッシュ領域(セクタID=2,3)と,次に呼び出される関数用の空きキャッシュ領域(セクタID=0)と,2番目に呼び出される関数用の空きキャッシュ領域(セクタID=1)とを維持している。
つまり,スタックメモリ領域ST側に示したように,実行中の関数Eを中心としてその直前に呼び出された関数C,Dとその後呼び出される関数用の2つの空きキャッシュ領域に対応するキャッシュ領域が,スタックメモリ用キャッシュ領域群130−ST(1)内に維持される。
関数EにセクタID=4の専用キャッシュ領域が割り当てられている理由は,階層的に呼び出された関数AからEが,スタックメモリ用キャッシュ領域群130−ST内のセクタID=0の専用キャッシュ領域から順番に割り当てられるからである。その結果,スタックメモリの深さが0番から始まるとすると,スタックの深さが5番目である関数Eには,セクタID=4の専用キャッシュ領域が割り当てられる。
次に,関数Eが終了して呼び戻された時間T2では,キャッシュメモリ制御プログラムは,時間T1で2番目の関数用の空きキャッシュ領域(セクタID=1)を専用キャッシュ領域として関数Bに割り当てて,関数Bのローカル変数データをメインメモリにメモリアクセス(プリフェッチ)して関数Bに割り当てた専用キャッシュ領域(セクタID=1)内に展開する。更に,キャッシュメモリ制御プログラムは,時間T1で関数Eに割り当てていた専用キャッシュ領域(セクタID=4)を次の関数用の空きキャッシュ領域に割り当て,時間T1で次の関数用の空きキャッシュ領域(セクタID=0)を2番目の関数用の空きキャッシュ領域に割り当てる。このセクタID=4,0をそれぞれ次の関数用空きキャッシュ領域,2番目の関数用空きキャッシュ領域に割り当てるのは,後述するとおりOSのキャッシュ割当管理部204がキャッシュセクタ情報設定部132に行えばよく,キャッシュメモリ内のデータの書き込みや退避は必要ない。
その結果,キャッシュメモリ制御プログラムは,関数Eが終了して関数Dが実行開始される時間T2では,スタックメモリ用キャッシュ領域群130−ST(2)内に,スタックメモリ領域STの実行中の関数Dに割り当てた第1の専用キャッシュ領域(ID=3)を中心として,その直前に呼び出された2個の関数C,Bに割り当てた第2の専用キャッシュ領域(ID=2,1)と,その直後に呼び出される予定の2個の関数用の空きキャッシュ領域(ID=4,0)とを維持する。したがって,スタックメモリ用キャッシュ領域群130−STのサイズは,時間T1からT2において5個に限定される。
ここで,直前の関数に割り当てる第2の専用キャッシュ領域の数2と,その後の関数用空きキャッシュ領域の数2は一例であり,スタックメモリ用キャッシュ領域群のキャッシュ領域の数5も一例である。これらの数の設定については後述する。ただし,これらの数は固定の限られた数に設定され,スタックメモリ用キャッシュ領域群13−STのサイズがある固定範囲内に限定される。
図32は,第2の実施の形態における,関数Eが実行中の時間T1と関数Eが終了して呼び戻された時間T3のスタックメモリ領域STとキャッシュメモリ130内のスタックメモリ用キャッシュ領域群130−STとを示す図である。関数Eが実行中の時間T1でのスタックメモリ用キャッシュ領域群130−ST(1)は,図31と同じである。
次に,関数Eの次の関数Fが呼び出された時間T3では,キャッシュメモリ制御プログラムは,時間T1での次の関数用の空きキャッシュ領域(セクタID=0)を専用キャッシュ領域として呼び出された関数Fに割り当てて,関数Fのローカル変数データをメインメモリにアクセス(プリフェッチ)して関数Fに割り当てた専用キャッシュ領域(セクタID=0)内に書込む。更に,キャッシュメモリ制御プログラムは,時間T1で関数Cに割り当てていた専用キャッシュ領域(セクタID=2)内の関数Cのローカル変数データをメインメモリに退避し,退避後のキャッシュ領域(セクタID=2)を2番目の関数用の空きキャッシュ領域に割り当てる。
その結果,キャッシュメモリ制御プログラムは,関数Fが呼び出されて実行開始される時間T3では,スタックメモリ用キャッシュ領域群130−ST(3)内に,スタックメモリ領域STの実行中の関数Fに割り当てた第1の専用キャッシュ領域(ID=0)を中心として,その直前に呼び出された2個の関数E,Dに割り当てた第2の専用キャッシュ領域(ID=4,3)と,その直後に呼び出される2個の関数用の空きキャッシュ領域(ID1,2)とを,維持する。したがって,スタックメモリ用キャッシュ領域群130−STのサイズは,時間T1からT3において5個に限定される。
以上のように,キャッシュメモリ制御プログラムは,関数が終了して呼び戻され,または,新たな関数が呼び出された場合に,スタックメモリ用キャッシュ領域群130−STを,スタックメモリ領域ST内の実行中の関数に割り当てられた第1の専用キャッシュ領域を中心にして,実行中の関数の直前に連続して呼び出されたN個の関数に割り当てられたN個の第2の専用キャッシュ領域と,実行中の関数の直後に連続して呼び出されるM個の関数に割り当てられたM個の専用空きキャッシュ領域とに維持する。そのために,必要に応じて,スタックメモリ用キャッシュ領域群から追い出される関数の専用キャッシュ領域内のローカル変数データをメインメモリに退避し,スタックメモリ用キャッシュ領域群内に新たに加えられる関数のローカル変数データをプリフェッチしてメインメモリから専用キャッシュ領域に書き込み展開する。
上記のように制御することで,限られたサイズのスタックメモリ用キャッシュ領域群130−ST内において,今後実行される可能性が高い関数のローカル変数データが別々の専用キャッシュ領域に格納され,今後呼び出される関数のローカル変数データを他のデータの退避なしで即座に書き込むことができる専用空きキャッシュ領域が維持される。よって,図29,30で説明したような問題点は回避される。
次に,第2の専用キャッシュ領域のN個と,空きキャッシュ領域のM個の設定について説明する。
図33は,実行中の関数の直前に連続して呼び出されたN個の関数に割り当てられたN個の第2の専用キャッシュ領域の個数Nについて説明する図である。図31で説明したとおり,キャッシュメモリ制御プログラムは,関数Eが終了して呼び戻されると,関数Bのスタックメモリ領域内のローカル変数データをプリフェッチ開始して,関数Bに割り当てられた空きキャッシュ領域にそのローカル変数データを書き込み始める。つまり,関数Bのローカル変数データのキャッシュリストア処理である。このスタックメモリ領域へのプリフェッチは,CPUユニットの外のメインメモリへのメモリアクセスを伴うので,一般に長い時間を要する。
そして,関数Eの終了に続いて,関数D,Cが連続して終了したとすると,関数D,Cの終了処理後に,関数Bのローカル変数データへのメモリアクセスが開始される。このとき,関数Bのローカル変数データが関数Bに割り当てられた空きキャッシュ領域にキャッシュリストアを完了して書込まれていれば,キャッシュヒットミスは生じない。
さらに,関数E,D,Cの終了時,つまり呼び戻し時に必要な処理が行われる。例えば,実行中の関数のCPU内のレジスタやテーブルの退避と復帰処理などのソフトウエアによる処理である。
そこで,関数Eの終了処理後に,関数D,Cの終了処理(呼び戻し処理)中に,関数Bのローカル変数データへのメモリアクセスによるキャッシュリストアが完了する必要がある。
したがって,第2の専用キャッシュ領域の個数Nは,以下の式で求められる個数以上であることが必要になる。
N=CEIL{スタックメモリ内の関数のローカル変数データのメモリアクセス時間/関数呼び戻し処理に必要な時間} (17)
ここで,CEILは切り上げを意味する。
すなわち,第2の専用キャッシュ領域の個数Nを,少なくとも式(17)の数にすることで,スタックメモリ用キャッシュ領域群のキャッシュ領域の個数を最小限に保ちつつ,関数の実行終了後の直前に呼び出された関数のローカル変数データへのメモリアクセスで確実にキャッシュヒットさせることができる。図31の例では,式17のNがN=2の例である。
この第2の専用キャッシュ領域の個数Nは,関数Bのスタックメモリ内のローカル変数データをキャッシュ領域に事前にキャッシュリストアするのに要する時間を,プリフェッチ対象関数までの関数の数で示している。そこで,この個数Nを,プリフェッチサイズ2(Prefetch_Size2)と称する。
図34は,実行中の関数の直後に連続して呼び出される予定のM個の関数に割り当てられたM個の専用空きキャッシュ領域の個数Mについて説明する図である。図32で説明したとおり,キャッシュメモリ制御プログラムは,関数Eの次の関数Fが呼び出されると,関数Cのローカル変数データをメインメモリ内のスタックメモリ領域内に退避開始する。この退避処理は,スタックメモリ領域への書き込み処理であるので,一般に長い時間を要する。
そして,関数Fの読み出しに続いて,関数G,Hが連続して呼び出されたとすると,関数G,Hの呼び出し処理後に,関数Hのローカル変数データへのメモリアクセスが開始される。このときまでに,関数Cに割り当てられていた専用キャッシュ領域内のローカル変数データの退避処理が完了していれば,2番目の関数用の空きキャッシュ領域(ID=2)に,既存データの退避処理を行うことなく,呼び出された関数Hのローカル変数データを書き込むことができる。
さらに,関数Fの呼び出し処理後に,関数G,Hの呼び出し処理中に,空きキャッシュ領域(ID=0)の関数Cのローカル変数データの退避処理を完了する必要がある。
したがって,専用空きキャッシュ領域の個数Mは,以下の式で求められる個数以上であることが必要になる。
M=CEIL{スタックメモリ内への関数のローカル変数データのメモリアクセス時間(データ転送時間)/関数呼び出し処理に必要な時間} (18)
すなわち,専用空きキャッシュ領域の個数Mを,少なくとも式(18)の数にすることで,スタックメモリ用キャッシュ領域群のキャッシュ領域の個数を最小限にしつつ,関数が呼び出されたときの関数のローカル変数データへのメモリアクセスを,既存データの退避処理を行うことなく即座に開始することができる。図32の例では,式18のMがM=2の例である。
この専用空きキャッシュ領域の個数Mは,個数Nと同様に,プリフェッチサイズ1(Prefetch_Size1)と称する。
図35は,第2の実施の形態におけるキャッシュメモリ制御プログラムによるセクタID変換テーブルの制御を示す図である。図31,図32の例では,スタックメモリ用キャッシュ領域群130−ST内の5個のキャッシュ領域を,1個の第1の専用キャッシュ領域と2個の第2の専用キャッシュ領域と2個の専用空きキャッシュ領域とに,循環的に変更している。
すなわち,図31の関数Eが終了して呼び戻されるときは,スタックメモリ用キャッシュ領域群130−STのキャッシュセクタIDを−1して5つのキャッシュ領域との対応を変更している。ただし,ID=0は−1することでID=4にされる。その結果,実行中の関数に割り当てられる専用キャッシュ領域のキャッシュセクタIDは,関数EのキャッシュセクタID=4から関数DのキャッシュセクタID=3に変更されている。
逆に,図32の関数Fが読み出されるときは,スタックメモリ用キャッシュ領域群130−STのキャッシュセクタIDを+1して5つのキャッシュ領域との対応を変更している。ただし,ID=4は+1することでID=0にされる。その結果,実行中の関数に割り当てられる専用キャッシュ領域のキャッシュセクタIDは,関数EキャッシュセクタID=4から関数FのキャッシュセクタID=0に変更されている。
このように循環的に対応関係を変更することで,セクタID変換テーブルの書き換えが容易になる。図35には,セクタID変換テーブル131が示されている。この例では,セクタID変換テーブル131のローカルセクタID=0は,共用キャッシュメモリ領域に割り当てられ,ローカルセクタID=1は,実行中の関数に割り当てられた専用キャッシュメモリ領域が割り当てられ,ローカルセクタID=2〜Nは,スタックメモリ用キャッシュ領域群とは別の専用キャッシュメモリ領域に割り当てられる。したがって,関数が呼び戻されたり呼び出されたりするたびに,OS内のキャッシュ割当管理部204は,セクタID変換テーブル131内のローカルセクタID=1に対応するキャッシュセクタIDを,実行中の関数に割り当てられた第1の専用キャッシュ領域のセクタIDに書き換える。
一方,関数内のローカル変数へのメモリアクセス命令は,コンパイルされてローカルセクタID=1を有する機械語命令に変換される。例えば,図4の機械語命令32が,ローカルセクタIDがID=1,命令文がローカル変数へのメモリアクセス命令になるように変換される。その結果,実行中の関数におけるローカル変数へのメモリアクセス命令が実行されると,図22に示したように,CPUによるメモリアクセス命令の実行処理で,セクタID変換テーブル131のローカルセクタID=1に対応するキャッシュセクタIDが参照され,実行中の関数に割り当てられた第1の専用キャッシュ領域を使用してメモリアクセスが実行される。
上記のように循環的に対応関係を変更することで,実行中の関数に対してどのキャッシュセクタIDが割り当てられているかを簡単に検出することができる。すなわち,対象関数のスタックの深さを,スタックメモリ用キャッシュ領域群のキャッシュ領域の総数(図31,32の例では5個)で除算した余りが,対象関数に割り当てられたキャッシュセクタIDになる。ただし,スタックメモリ領域の先頭をスタックの深さ0とカウントする。したがって,関数Eは,スタックの深さが4であるので,余り(4/5)=4となり,キャッシュセクタID=4の専用キャッシュ領域が割り当てられる。図31,32に示した通りである。
したがって,キャッシュ割当管理部204は,関数が呼び戻されたら元の関数のスタックの深さから,割り当てられた専用キャッシュメモリのキャッシュセクタIDを上記の演算で取得し,セクタID変換テーブルのローカルセクタID=1に対応するキャッシュセクタIDを書き換える。これにより,実行中の関数のメモリアクセスは,その関数に割り当てられた専用キャッシュ領域を利用して行われる。
[第2の実施の形態の詳細]
次に,第2の実施の形態について詳細に説明する。図1,2に示した構成は,第2の実施の形態においても同じである。そして,スタックメモリとキャッシュメモリとの関係は,図26に示した通りである。
図36は,コンパイル工程と対象プロセス起動工程とを示すフローチャート図である。まず,入力部17が起動するソースプログラムを受け付けると(S611),コンパイラ21が,ソースプログラムをコンパイルして機械語プログラムに変換する(S612)。このコンパイルにより,各関数のローカル変数へのアクセス命令は,ローカルセクタID=1を付加した機械語命令に変換される。さらに,コンパイルされたプログラムが開発環境下で実行されて,OSのキャッシュ割当管理部204が,関数呼び戻しに要する時間と,関数呼び出しに要する時間と,メモリアクセス時間とをテスト計測し,スタックメモリ用キャッシュ領域群のキャッシュ領域数と,前述のN個(プリフェッチサイズ2),M個(プリフェッチサイズ1)を計算する(S613)。
次に,本番環境下で,入力部17がコンパイルされたプログラムの起動指令を受け付けると(S614),OSのプロセス管理部202が対象プロセスを起動する(S615)。それとともに,キャッシュ割当管理部204がスタックメモリ用のキャッシュ領域群を事前に計算したキャッシュ領域の数だけ確保するよう指示する(S616)。この指示に応答して,キャッシュメモリ130にスタックメモリ用キャッシュ領域群130-STが確保され,キャッシュセクタ情報設定部132にそれが設定される(S617)。そして,プロセス管理部202がプログラムの各プロセスを実行する(S618)。この各プロセスの実行中に関数が呼び出されたり,呼び戻されたりすると,プロセス管理部202は,関数呼び出し処理と関数呼び戻し処理を実行する(S618)。
図37は,関数呼び戻し処理のフローチャート図である。図37には,呼び出し元関数22−1と呼び出し先関数22−2とが示されている。呼び出し元関数22−1とは,ある関数を呼び出した関数であり,呼び出し先関数22−2とは,その呼び出された関数である。関数呼び戻し処理は,図31で概略説明したが,以下ではOSによる具体的な処理を説明する。
まず,関数呼び戻し処理では,呼び出し先関数22−2がその関数の処理を終了する(S621)。これに応答して,OSの関数制御管理部201が呼び出し先関数の終了処理を実行する(S622)。呼び出し先関数の終了処理には,終了する関数についてのCPU内のレジスタやテーブルの退避などが含まれる。呼び出し先関数の終了処理の後に,キャッシュ割当管理部204が,呼び出し元関数からプリフェッチサイズ1(N個)前の関数に,スタックメモリ用キャッシュ領域群130-ST内の空きキャッシュ領域を専用キャッシュ領域として割り当てて,その関数のローカル変数データをメインメモリ内のスタックメモリ領域からプリフェッチ(メモリアクセス)して,割り当てられた空きキャッシュ領域にそのデータを書き込み,展開する(S623)。この空きキャッシュ領域のキャッシュセクタIDは,呼び出し元関数に割り当てられる専用キャッシュ領域のキャッシュセクタIDよりもプリフェッチサイズ1(N)前である。
これに伴い,キャッシュメモリ130では,プリフェッチサイズ1(N)前の関数のローカル変数データが,それに対するプリフェッチのメモリアクセス処理により,割り当てられた空きキャッシュ領域に書き込まれ展開される。ただし,このメモリアクセスはメインメモリに対する処理になるため処理時間が長くなるので,このメモリアクセス処理が完了するのを待つことなく,次の処理が実行される。
OSのキャッシュ割当管理部204が,セクタID変換テーブルを更新して,ローカルセクタID=1に対応するキャッシュセクタIDを,呼び出し元関数に対応するキャッシュセクタIDに変更する(S625)。すなわち,図35の時間T2で示したとおりである。
そして,OSの関数制御管理部201が,呼び出し元関数の再開処理を実行する(S626)。この再開処理には,再開する関数についてのCPU内のレジスタやテーブルの設定などが含まれる。その後,呼び出し元関数22−1が処理を再開する(S627)。この呼び出し元関数が処理を再開してローカル変数アクセス命令を実行すると,既にキャッシュメモリ130内の呼び出し元関数に割り当てられているスタックメモリ用キャッシュ領域群130−ST内の専用キャッシュ領域内にそのローカル変数データが書き込まれたままになっているので,キャッシュミスヒットすることはない。
図38は,関数呼び出し処理のフローチャート図である。関数呼び出し処理は,図32で概略説明したが,以下ではOSによる具体的な処理を説明する。
まず,関数呼び出し処理では,呼び出し元関数17が関数呼び出しを発生する(S631)。これにより呼び出し先関数が呼び出される。これに応答して,OSの関数制御管理部201が,現在の関数を一時的に停止し,呼び出し先関数への引き渡し処理を実行する(S632)。このとき,関数制御管理部201が,呼び出し先関数にスタックメモリ用キャッシュ領域群内の次の関数用空きキャッシュ領域が割り当て,呼び出し先関数のローカル変数へのメモリアクセスが開始される。次の関数用空きキャッシュ領域には有効なデータが格納されていないので,この呼び出し先関数のローカル変数のメモリアクセスは,元のデータをスタックメモリへ退避処理することなく,開始することができる。
そして,OSのキャッシュ割当管理部204が,呼び出し先関数からプリフェッチサイズ2(M個)前の専用キャッシュ領域の関数のデータを,メインメモリ内のスタックメモリ領域に退避開始させ,2番目の関数用空きキャッシュ領域を確保する(S633)。これにより,キャッシュメモリ130では,呼び出し先関数からプリフェッチサイズ2(M)前の専用キャッシュ領域内の関数のローカル変数データがそのスタックメモリ領域に退避され,2番目の関数用空きキャッシュ領域にされる(S634)。ただし,この退避処理はメインメモリへのアクセスを伴うため処理時間が長くなるので,このメモリアクセス処理が完了するのを待つことなく,次の処理が実行される。
OSのキャッシュ割当管理部204が,セクタID変換テーブルを更新して,ローカルセクタID=1に対応するキャッシュセクタIDを,呼び出し先関数に対応するキャッシュセクタIDに変更する(S635)。すなわち,図35の時間T3で示したとおりである。
そして,OSの関数制御管理部201が,呼び出し先関数の開始処理を実行する(S636)。この開始処理には,開始する関数についてのCPU内のレジスタやテーブルの設定などが含まれる。その後,呼び出し先関数22−2が処理を開始する(S637)。この呼び出し先関数が処理を再開してローカル変数アクセス命令を実行すると,既にデータが退避済みの空きキャッシュ領域を利用してメモリアクセスを開始することができる。
また,呼び出し元関数の直前に呼び出されていた関数のうち,呼び出し先関数からプリフェッチサイズ1(N)前より前の関数のローカル変数データが専用キャッシュ領域から退避されて2番目の関数用空きキャッシュ領域として維持されるので,その後更に関数呼び出しが発生してもその関数についてのローカル変数のメモリアクセスを退避処理なしに開始することができる。
上記の第2の実施の形態では,キャッシュメモリ制御プログラムは,スタックメモリ用キャッシュ領域群130−ST内に,実行中の関数に割り当てた第1の専用キャッシュ領域と,その直前に呼び出された第2の数(N)の関数に割り当てた第2の専用キャッシュ領域と,第3の数(M)の専用空きキャッシュ領域とを維持している。
しかしながら,キャッシュメモリ制御プログラムは,スタックメモリ用キャッシュ領域群130−ST内に,実行中の関数に割り当てた第1の専用キャッシュ領域と,その直前に呼び出された第2の数(N)の関数に割り当てた第2の専用キャッシュ領域とを維持し,専用空きキャッシュ領域を維持しないようにしても良い。ただし,この場合は,新たな関数が呼び出された場合に,以前に呼び出された関数の専用キャッシュ領域内のデータを一旦退避してから新たな関数のローカル変数データをメモリアクセスしなければならず,メモリアクセスまでの時間が遅れることになる。
以上の通り,第2の実施の形態によれば,関数やモジュールなどのサブルーチンのローカル変数を格納するスタックメモリ領域について,それぞれのサブルーチンに専用キャッシュ領域が割り当てられ,且つ,そのスタックメモリ用キャッシュ領域群のサイズを最小限の大きさで維持するので,キャッシュメモリの領域を効率的に利用しながら,サブルーチンのローカル変数へのメモリアクセスのキャッシュヒット率を向上させ,また,サブルーチンのローカル変数へのメモリアクセスを効率よく開始させることたできる。
以上の実施の形態をまとめると,次の付記のとおりである。
(付記1)
キャッシュメモリ制御工程をプロセッサに実行させるプロセッサ読み取り可能なキャッシュメモリ制御プログラムであって,
前記キャッシュメモリ制御工程は,
プログラム内で呼び出されるサブルーチンに対するスタックメモリ領域に,複数のキャッシュ領域を有するスタックメモリ用キャッシュ領域群を割り当てるスタックメモリ用キャッシュ領域群割当工程と,
前記スタックメモリ用キャッシュ領域群内の複数のキャッシュ領域を,実行中の第1のサブルーチンに割り当てられた第1の専用キャッシュ領域と,前記第1のサブルーチンの直前に呼び出された第2の数の第2のサブルーチンに割り当てられた第2の専用キャッシュ領域と,第3の数の空きキャッシュ領域とに維持するキャッシュ領域割当工程とを有するキャッシュメモリ制御プログラム。
(付記2)
付記1において,
前記キャッシュ領域割当工程は,
前記第1のサブルーチンが終了して前記第2のサブルーチンのうち前記第1のサブルーチンの直前に呼び出されたサブルーチンが実行開始されるときに,前記第2のサブルーチンより前に呼び出された第3のサブルーチンに前記空きキャッシュ領域を専用キャッシュ領域として割り当てて,前記第3のサブルーチンのスタックメモリ領域内のデータをプリフェッチするキャッシュメモリ制御プログラム。
(付記3)
付記2において,
前記キャッシュ領域割当工程は,
前記第2の数を,前記スタックメモリ領域内のデータのメモリアクセスに要する時間を,前記サブルーチンの呼び戻し処理に要する時間で除算した数以上に維持するキャッシュメモリ制御プログラム。
(付記4)
付記1において,
前記キャッシュ領域割当工程は,
前記第1のサブルーチンが実行中に新たな第4のサブルーチンが呼び出されたときに,前記第2のサブルーチンのうち最も早く呼び出されたサブルーチンの専用キャッシュ領域内のデータを前記スタックメモリ領域に退避させて,前記最も早く呼び出されたサブルーチンの専用キャッシュ領域を前記空きキャッシュ領域に割り当てるキャッシュメモリ制御プログラム。
(付記5)
付記4において,
前記キャッシュ領域割当工程は,
前記第3の数を,前記専用キャッシュ領域内のデータを前記スタックメモリ領域内に退避するのに要する時間を,前記サブルーチンの呼び出し処理に要する時間で除算した数以上に維持するキャッシュメモリ制御プログラム。
(付記6)
キャッシュメモリ制御工程をプロセッサに実行させるプロセッサ読み取り可能なキャッシュメモリ制御プログラムであって,
前記キャッシュメモリ制御工程は,
プログラム内で呼び出されるサブルーチンに対するスタックメモリ領域に,第1の数のキャッシュ領域を有するスタックメモリ用キャッシュ領域群を割り当てるスタックメモリ用キャッシュ領域群割当工程と,
前記プログラム内で呼び出されたサブルーチンに,前記スタックメモリ用キャッシュ領域群内のキャッシュ領域を専用キャッシュ領域として割り当てると共に,前記割り当てられた専用キャッシュ領域を,実行中の第1のサブルーチンに割り当てられた第1の専用キャッシュ領域と前記第1のサブルーチンの直前に呼び出された単数または複数の第2のサブルーチンに割り当てられた第2の専用キャッシュ領域とに維持するキャッシュ領域割当工程とを有するキャッシュメモリ制御プログラム。
(付記7)
付記6において,
前記キャッシュ領域割当工程は,
前記スタックメモリ用キャッシュ領域群内の前記第1及び第2の専用キャッシュ領域以外のキャッシュ領域を,有効なキャッシュデータが記録されていない空きキャッシュ領域として維持するキャッシュメモリ制御プログラム。
(付記8)
キャッシュメモリ制御方法であって,
プログラム内で呼び出されるサブルーチンに対するスタックメモリ領域に,複数のキャッシュ領域を有するスタックメモリ用キャッシュ領域群を割り当てるスタックメモリ用キャッシュ領域群割当工程と,
前記スタックメモリ用キャッシュ領域群内の複数のキャッシュ領域を,実行中の第1のサブルーチンに割り当てられた第1の専用キャッシュ領域と,前記第1のサブルーチンの直前に呼び出された第2の数の第2のサブルーチンに割り当てられた第2の専用キャッシュ領域と,第3の数の空きキャッシュ領域とに維持するキャッシュ領域割当工程とを有するキャッシュメモリ制御方法。
(付記9)
キャッシュメモリ制御方法であって,
プログラム内で呼び出されるサブルーチンに対するスタックメモリ領域に,複数のキャッシュ領域を有するスタックメモリ用キャッシュ領域群を割り当てるスタックメモリ用キャッシュ領域群割当工程と,
前記プログラム内で呼び出されたサブルーチンに,前記スタックメモリ用キャッシュ領域群内のキャッシュ領域を専用キャッシュ領域として割り当てると共に,前記割り当てられた専用キャッシュ領域を,実行中の第1のサブルーチンに割り当てられた第1の専用キャッシュ領域と前記第1のサブルーチンの直前に呼び出された単数または複数の第2のサブルーチンに割り当てられた第2の専用キャッシュ領域とに維持するキャッシュ領域割当工程とを有するキャッシュメモリ制御方法。
(付記10)
キャッシュメモリを内蔵するプロセッサであって,
プログラム内で呼び出されるサブルーチンに対するスタックメモリ領域に,複数のキャッシュ領域を有するスタックメモリ用キャッシュ領域群を割り当てるスタックメモリ用キャッシュ領域群割当手段と,
前記スタックメモリ用キャッシュ領域群内の複数のキャッシュ領域を,実行中の第1のサブルーチンに割り当てられた第1の専用キャッシュ領域と,前記第1のサブルーチンの直前に呼び出された第2の数の第2のサブルーチンに割り当てられた第2の専用キャッシュ領域と,第3の数の空きキャッシュ領域とに維持するキャッシュ領域割当手段とを有するプロセッサ。
(付記11)
キャッシュメモリを内蔵するプロセッサであって,
プログラム内で呼び出されるサブルーチンに対するスタックメモリ領域に,複数のキャッシュ領域を有するスタックメモリ用キャッシュ領域群を割り当てるスタックメモリ用キャッシュ領域群割当手段と,
前記プログラム内で呼び出されたサブルーチンに,前記スタックメモリ用キャッシュ領域群内のキャッシュ領域を専用キャッシュ領域として割り当てると共に,前記割り当てられた専用キャッシュ領域を,実行中の第1のサブルーチンに割り当てられた第1の専用キャッシュ領域と前記第1のサブルーチンの直前に呼び出された単数または複数の第2のサブルーチンに割り当てられた第2の専用キャッシュ領域とに維持するキャッシュ領域割当手段とを有するプロセッサ。