(57)【要約】【課題】アクセス頻度の高い関数や実行時間が多大な関数を動的に検出して、動的に高速動作可能なメモリへメモリ資源を配置、転送してすることにより実行動作速度を向上させる高速メモリへの動的コード転送方法を提供する。【解決手段】アクセス速度が異なるメモリを備えるシステムにおけるメモリへのコード転送方法であって、システムの動作中に、予め指定したコードの使用頻度を集計して統計情報を生成するステップと、統計情報から使用頻度が多いコードを検出するステップと、検出したコードが記録されているメモリよりアクセス速度が速いメモリに、検出したコードを転送して配置するステップと、を有するメモリへのコード転送方法である。【選択図】図１
2009064112.tif 000002
【特許請求の範囲】
【請求項１】
アクセス速度が異なるメモリを備えるシステムにおけるメモリへのコード転送方法であって、
前記システムの動作中に、予め指定したコードの使用頻度を集計して統計情報を生成し、
前記統計情報から使用頻度が多い前記コードを検出し、
検出したコードが記録されているメモリよりアクセス速度が速いメモリに、前記検出したコードを転送して配置する、
ことを特徴とするメモリへのコード転送方法。
【請求項２】
前記統計情報は、起動回数または走行数を有し、
起動回数には予め指定されたコードが起動するごとに起動した回数が記録され、
走行数には前記コードを実行するたびに走行した回数が記録される、
ことを特徴とする請求項１に記載のメモリへのコード転送方法。
【請求項３】
使用頻度が高い前記コードの検出は、
前記起動回数と予め設定された起動回数閾値を比較して前記起動回数閾値以上であるか否かを検出するか、または前記走行数と予め設定された走行数閾値を比較して前記走行数閾値以上であるか否かを検出する、ことにより使用頻度が高い前記コードを検出することを特徴とする請求項２に記載のメモリへのコード転送方法。
【請求項４】
前記検出したコードをアクセス速度が速い高速メモリに転送するとき、
前記高速メモリに前記検出したコードがなく、前記高速メモリの空き領域に前記検出したコードを記録できるかを判定し、前記高速メモリに前記検出したコードが転送可能であるときに転送を行うことを特徴とする請求項１に記載のメモリへのコード転送方法。
【請求項５】
前記高速メモリに空き領域がなければ、前記高速メモリに既に登録されているコードを削除して空き領域を確保し、前記検出したコードを転送することを特徴とする請求項５に記載のメモリへのコード転送方法。
【請求項６】
コンピュータに、
アクセス速度が異なるメモリを備えるシステムの動作中に、予め指定したコードの使用頻度を集計して統計情報を生成する処理と、
前記統計情報から使用頻度が多い前記コードを検出する処理と、
検出したコードが記録されているメモリよりアクセス速度が速いメモリに、前記検出したコードを転送して配置する処理と、
を実行させるためのコード転送プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、アクセス速度の異なる複数のメモリ領域にメモリ資源を割り付ける技術に関する。
【背景技術】
【０００２】
従来、限られたメモリ領域に効果的にメモリ資源（ソースコード）を割り付けて動作させるために、予め利用者がベクタファイルなどを作成し、そのベクタファイルに基づいてコンパイラやリンカがメモリ領域にメモリ資源を配置している。
【０００３】
例えば、高速に動作させたいメモリ資源が複数あるが、高速動作可能なメモリ領域のメモリ容量がメモリ資源のプログラム容量より少ない場合、利用者が比較的アクセス頻度の高いメモリ資源を選んで高速動作可能なメモリ領域に割り付けられるようにベクタファイルを作成している。
【０００４】
また、ベクタファイルにより一度割り付けられたメモリ資源は、プログラム実行中にメモリ領域の変更をすることが難しいため、ＣＰＵのキャッシュ機能を利用してアクセス頻度の高いデータや命令をキャッシュ領域へ保持し高速化を実施している。
【０００５】
特許文献１によれば、シミュレータ部は、アクセス速度の異なる少なくとも２つのメモリ領域を持つプロセッサシステムをモデル化してプログラムをシミュレーションする。資源割付部は、シミュレーション結果に基づいて、高速メモリ領域には可能な限りデータを配置せずにプログラムの目標実行速度を維持できるように、プログラム実行で使用するデータ領域を、高速メモリ領域と低速メモリ領域とに分配配置する最適なメモリ配置を決定する。上記のようなシステムにおけるメモリ配置の最適解を、システムモデルのシミュレーションを通じて自動的に生成してメモリ資源最適化を支援する方法が提案されている。
【０００６】
特許文献２によれば、関数テーブルをプログラム可能とすることによって関数演算を高速に行い、かつ関数テーブルの内容を書き換えることによって複数の関数演算に対応することができる演算装置が提案されている。
【０００７】
特許文献３によれば、アプリケーションコード（プログラム）内にライブラリアドレス一覧テーブルを設け、このテーブルにライブラリのアドレスを登録する手順を設けることにより、ライブラリとダイナミックにリンクする提案がされている。
【０００８】
特許文献４によれば、高速メモリ領域への割り当てが可能な変数が存在する場合に、変数を高速メモリに割り当てることのできる言語処理装置が提案されている。
特許文献５によれば、キャッシュメモリ内のデータが充分に利用されないままリプレースする場合、元のデータについてキャッシュメモリへの登録を以降禁止することができるので、キャッシュメモリの利用効率を高め、ミス率を低減する提案がされている。
【０００９】
しかしながら、特許文献１のような装置において、プログラムを高速動作可能なメモリへ静的に配置した場合、実際の動作がこのメモリへの配置で最適であることが保障されない。同様に、シュミュレーションにより頻度の高いプログラムを検出した場合でも実際の動作条件の変化により、シュミュレーション結果が最適であることを保障することが困難になるという問題がある。
【００１０】
また、ＣＰＵキャッシュ機能では、データアクセス、命令アクセスが対象であるため、
プログラムコードそのものの配置先が遅いメモリの場合、制御時間の大半が遅いメモリに配置されたプログラムコードのメモリリードに占められてしまう。
【００１１】
また、特許文献１〜５には使用頻度の高いメモリ資源を、使用頻度に応じて動的に高速動作可能なメモリに格納するものではない。
【特許文献１】特開２００４−７０８６２号公報
【特許文献２】特開平０９−０２２３４３号公報
【特許文献３】特開平１０−２５４７１１号公報
【特許文献４】特開２０００−３３９１７３号公報
【特許文献５】特開平０５−２７４２２５号公報
【発明の開示】
【発明が解決しようとする課題】
【００１２】
本発明は上記のような実情に鑑みてなされたものであり、アクセス頻度の高い関数や実行時間が多大な関数を動的に検出して、動的に高速動作可能なメモリへメモリ資源を配置、転送することにより実行動作速度を向上させる高速メモリへの動的コード転送方法を提供することを目的とする。
【課題を解決するための手段】
【００１３】
本発明の態様のひとつであるアクセス速度が異なるメモリを備えるシステムにおけるメモリへのコード転送方法であって、前記システムの動作中に、予め指定したコードの使用頻度を集計して統計情報を生成し、前記統計情報から使用頻度が多い前記コードを検出し、検出したコードが記録されているメモリよりアクセス速度が速いメモリに、前記検出したコードを転送して配置する。
【００１４】
上記構成により、アクセス頻度の高い関数や実行時間が多大な関数を動的に検出して、動的に高速動作可能なメモリへメモリ資源を配置、転送することにより実行動作速度を向上させることができる。
【００１５】
好ましくは、前記統計情報は、起動回数または走行数を有し、起動回数には予め指定されたコードが起動するごとに起動した回数が記録され、走行数には前記コードを実行するたびに走行した回数を記録してもよい。
【００１６】
好ましくは、前記起動回数と予め設定された起動回数閾値を比較して前記起動回数閾値以上であるか否かを検出するか、または前記走行数と予め設定された走行数閾値を比較して前記走行数閾値以上であるか否かを検出する、ことにより使用頻度が高い前記コードを検出してもよい。
【００１７】
好ましくは、前記検出したコードをアクセス速度が速いメモリに転送するとき、前記高速メモリに前記検出したコードがなく、前記高速メモリの空き領域に前記検出したコードを記録できるかを判定し、前記高速メモリに前記検出したコードが転送可能であるときに転送を行ってもよい。
【００１８】
好ましくは、前記高速メモリに空き領域がなければ、前記高速メモリに既に登録されているコードを削除して空き領域を確保し、前記検出したコードを転送してもよい。
【発明の効果】
【００１９】
本発明は、アクセス頻度の高い関数や実行時間が多大な関数を動的に検出して、動的に高速動作可能なメモリへメモリ資源を配置、転送することによりシステムの動作速度を向上させることができる。
【発明を実施するための最良の形態】
【００２０】
（原理説明）
複数のアクセス速度が異なるメモリを備えるシステムにおいて、動作頻度の高いコードを検出し、システムが運用中であっても動作頻度の高いコードを高速動作可能なメモリへ動的に配置する。
【００２１】
ここで、コードとは、利用者によりプログラミングされたソースコードに対してコンパイルおよびリンクを実施することにより作成された実行形式のコードであり、ライブラリに登録されている関数や利用者が指定したコードである。
【００２２】
コードの検出は、エントリテーブルにあるコードであるかを判別して検出する。
エントリテーブルは、実際に動的にメモリ配置を変更したいコードの一部または全てのコードが格納されているアドレスとメモリサイズなどを示すエントリキー情報と、そのコードの起動頻度である起動回数とスタックの走行数を示す統計情報により構成される。
【００２３】
動的にコードを高速動作可能なメモリへ配置する場合、アプリケーションプログラムなどに利用者が予め任意の契機で開始、終了、期間を設定することにより、統計情報の収集と集計を周期的に実行する。
【００２４】
統計情報は、エントリテーブルに登録されているコードが起動された場合に、エントリテーブルに登録されたコードに対応する起動回数、走行数を収集して記録する。
その後、予め設定した起動回数閾値を統計情報の起動回数が越えたこと、または予め設定した統計情報の走行数閾値を走行数が越えたことを検出する。
【００２５】
高速動作可能なメモリへの配置は、高速動作可能なメモリに空き容量があり、統計情報集計テーブルなどに記録したコードが配置できるかを判定し、高速動作可能なメモリへ配置できる場合には、該当するコードを高速動作可能なメモリへ転送する。
【００２６】
高速動作可能なメモリに配置したコードは、次回の起動から、高速動作可能メモリ内のコードを動作させるために、エントリテーブルのエントリキー情報のアドレスを書き換える。また、高速動作可能なメモリにどのコードが配置されているのかを管理するための情報も更新する。
【００２７】
なお、高速動作可能なメモリへ配置する起動回数閾値、走行数閾値を越えたコードが新たに発生しても、配置先の高速動作可能なメモリに十分な容量が確保できない場合には、一度、高速動作可能なメモリへ配置したコードのエントリテーブルを初期値に戻す。そして、高速動作可能なメモリに十分な空き容量を確保したのち、新たにコードの配置を実施する。
【００２８】
以下図面に基づいて、本発明の実施形態について詳細を説明する。
（実施例１）
（構成）
図１は、アクセス速度が異なるメモリが混在するシステムの構成を示す図である。図１に示すシステムは、ＣＰＵ１０１、高速動作可能なメモリ１０２、フラッシュメモリ１０３から構成される回路を備えている。ＣＰＵ１０１、高速動作可能なメモリ１０２、フラッシュメモリ１０３は、バスライン１０４を介して接続されている。
【００２９】
ＣＰＵ１０１は、コンパイラおよびリンカにより生成された複数のコードが記録されているメモリ領域からコードを読み出し、そのコードの内容に基づいて動作する。
また、ＣＰＵ１０１は、エントリテーブルの先頭アドレスを格納するメモリ（レジスタなど）を設けエントリテーブルのエントリキー情報にて、コード（関数コードなど）を起動する。
【００３０】
統計情報の解析を行うソフトウェアは、ＯＳ（Operating System）により管理され、高速メモリ１０２を制御するデータとして、高速メモリ管理情報を使用する。
高速メモリ管理情報には、起動回数閾値、走行数閾値、統計項目の優先度により構成される。これらの情報は、利用者が変更することができる。
【００３１】
ＣＰＵ１０１には、統計情報を収集するか否かのメモリ（レジスタなど）を設け、統計情報収集の場合、動的に配置するコード起動の際に統計情報の収集を実施する。
高速動作可能なメモリ１０２には、電源投入時やリセット時にはベクタファイルにより指定されたコードが静的に記録される。運用時は、アクセス頻度の高いコードが検出され、検出されたコードを動的に高速動作可能なメモリ１０２に転送する。以後、高速動作可能なメモリ１０２を単に高速メモリと呼ぶこととする。
【００３２】
フラッシュメモリ１０３は高速メモリ１０２よりアクセス速度の遅いメモリである。フラッシュメモリ１０３は、電源投入時やリセット時にはベクタファイルにより指定されたコードが静的に記録される。
【００３３】
なお、図１では高速メモリ１０２よりアクセス速度が遅いメモリとしてフラッシュメモリ１０３を示したが、フラッシュメモリに限定するものではない。
統計情報集計処理は、ＯＳの周期タスクによって動作する。ＣＰＵ１０１にて収集した統計情報をサーチし、高速メモリ管理情報を使用し、閾値を越えたかの判定を行う。閾値を超えた関数を検出した場合、統計情報集計テーブルに格納する。また、エントリテーブル上の統計情報のクリアを実施する。
【００３４】
作成された統計情報集計テーブルは、高速メモリ更新処理によって実行される高速メモリ１０２への転送の制御に使用する。
高速メモリ更新処理は、高速メモリ管理情報によって高速メモリ１０２に配置できるか判定を行う。例えば、同周期に複数のコードが転送対象となった場合には、統計項目優先度を判定し、優先順に制御を実施する。
【００３５】
また、この時、高速メモリの空き容量が無く、最も頻度情報が少ない配置済みコードを元に戻すことにより新規に検出した関数が配置可能であれば、頻度情報が少ないコードのアドレスを元に戻す制御を実施する。
【００３６】
検出したコードが配置可能なメモリ容量を確保可能な場合、高速メモリ１０２へ検出したコードの転送（コピー）を実施する。
頻度の少ない配置コードを戻す場合や新規に検出したコードを配置した場合には、エントリテーブルと高速メモリ管理情報テーブルの更新を行い、高速メモリ１０２内の配置を有効に活用できるように、メモリの再配置を実施する。
【００３７】
（コンパイラとリンカ）
図１に示したシステムにおいて、利用者がプログラミングしたコードをコンパイルする際に、フラッシュメモリ１０３のような低速動作のメモリにあるコードを、運用中に高速メモリ１０２へ配置するために必要なコードを付加してコンパイルする。
【００３８】
つまり、コンパイラへ動的にメモリ配置を変更したいコードのアドレスとメモリサイズを示すエントリキー情報と転送用コードを、利用者がプログラミングしたコードに組み込
みコンパイルを行う。例えば、拡張言語などを用いてエントリキー情報や転送用コードを組み込んでもよい。
【００３９】
また、コンパイラは、動的に配置する利用者により指定された複数のコードに対して、図２に示すエントリテーブルを生成する。
図２に示したエントリテーブルは、エントリインデックス値領域、コード先頭アドレス／サイズ領域、起動回数保存領域、走行回数保存領域からなるエントリ領域を、複数有している。
【００４０】
エントリインデックス値領域は、高速に動作させたいコードのコード名称に対応する番号が格納されている。例えば、プログラミングされたコード名、関数名など（エントリキー情報）が記録されている。
【００４１】
先頭アドレス／サイズ領域は、エントリインデックス値に対応するコードの先頭アドレスとサイズなど（エントリキー情報）が記録される領域である。
起動回数保存領域は、エントリインデックス値に対応するコードが起動した回数（統計情報）を記録する。
【００４２】
走行回数保存領域は、エントリインデックス値に対応するコードが起動した際に、スタックへ移行した回数（統計情報）を記録する。
例えば、コンパイラは静的に配置したコードに対しては従来のアセンブラ展開を実施するが、動的に配置するコードに対しては、起動先をエントリキー情報から取得し、起動するコードに対してアセンブラ展開を実施する。
【００４３】
リンカは、メモリ領域にエントリテーブルの領域を確保する。また、高速動作を必要としないコードについては従来どおりのリンクを行う。
（動作説明）
図３に本発明の処理シーケンスを示し動作を説明する。図３に示す処理シーケンスは、アプリケーション３１、ＯＳ３２、ＣＰＵ１０１（ハードウェア）の動作を示している。
【００４４】
アプリケーション３１は、統計情報開始、停止、収集期間をＯＳ３２へ通知し、任意の契機でＣＰＵ１０１へ統計情報を収集するか否かを、収集レジスタを操作することにより統計情報の収集を行えるようにする。収集開始を受け付けたＯＳ３２は、ＣＰＵ１０１へ収集レジスタにより指示し、統計情報収集処理を開始する（統計情報収集処理開始３５）。
【００４５】
アプリケーションの実行中にエントリテーブルに登録されているコードを検出すると、図３の動作開始指示３３に示すようにＯＳ３２に対して通知をする。
ＯＳ３２が通知を受けるとＣＰＵ１０１に設けられた収集レジスタの設定をする通知を、図３の収集レジスタ設定３４に示すようにＣＰＵ１０１に対して通知をする。
【００４６】
ＣＰＵ１０１は通知を受けると起動回数と走行数をカウントしてエントリテーブルの起動回数保存領域、走行回数保存領域に記録する。
次に、エントリテーブルの内容を周期的に集計するため、図３の周期タスク生成３６により制御される集計周期処理開始３７を実行する。
【００４７】
図４は、統計情報を収集する処理フローを示す図である。
コード起動時に、そのコード走行中の走行数をスタック領域にカウントしていき、そのコード終了時に、スタック内の走行数と、起動回数をエントリテーブルに保存する。
【００４８】
ステップＳ４１では統計情報を収集するか判定する。エントリテーブルのエントリインデックス値領域に記録されているエントリインデックス値と実行するコードが同じであるかを判定する。エントリインデックス値に記録されているコードと一致した場合にはステップＳ４２に移行する。一致していない場合には高速メモリに１０２に配置する必要がないコードであるためステップＳ４７に移行する。
【００４９】
ステップＳ４２ではコードが起動され実行される。
ステップＳ４３では実行中のコードの走行数をカウントしてスタック領域に格納する。
ステップＳ４４では該コードの実行が終了する。
【００５０】
ステップＳ４５では該コードの起動回数が記録されている起動回数保存領域に対応するコードが起動するたびに１を加算（インクリメント）して記録する。
ステップＳ４６ではスタック領域に記録した走行数を収集して走行回数保存領域に登録する。
【００５１】
ステップＳ４７ではエントリテーブルに記録されていないコードを起動させ、ステップＳ４８ではコードの実行が完了する。
図５に、走行数をスタック領域に記録する場合の例について示す。
【００５２】
図５（Ａ）はコードに含まれる関数コードＡ、関数コードＢ、関数コードＣがネスト構造である場合について示されている。関数コードＡの走行数は、関数コードＢの両側にある前半処理と後半処理の走行数の合計である。関数コードＢの走行数は、関数コードＣの両側にある前半処理と後半処理の走行数の合計である。そして、関数コードＣの走行数は関数コードＣ内の走行数である。
【００５３】
図５（Ｂ）は、図５（Ａ）に示した構造において走行数をどのようにスタック領域に記録しておくかを示した図である。
図５（Ｂ）に示したメモリ領域には、関数コードＡ〜Ｃが利用する領域があり、各領域はユーザスタック領域５１、スタック走行回数保存領域５２、旧フレームポインタ保存領域５３、戻りプログラムカウンタ保存領域５４から構成される。
【００５４】
ユーザスタック領域５１は、各関数コードに移行する際に必要なデータを退避させる領域である。現在、実行している関数コードを完了するとユーザスタック領域５１に退避したデータは再び元に戻される。
【００５５】
スタック走行回数保存領域５２は走行数を収集する領域である。例えば、図５（Ａ）のような関数コードＡの前半処理→関数Ｂの前半処理→関数Ｃの処理→関数Ｂの後半処理→関数Ａの後半処理の順に各々の関数コードの走行数をカウントして保存する。なお、スタック走行回数保存領域５２はユーザスタック領域５１の一部を利用してもよい。
【００５６】
旧フレームポインタ保存領域５３は、各関数コードのフレームポインタの示す内容が保存されている。
戻りプログラムカウンタ保存領域５４は、プログラムカウンタの戻り値を記録する領域である。
【００５７】
関数コードＡ前半処理が起動されると関数コードＡ用のスタック走行回数保存領域５２に走行数が記録される。次に、関数コードＡの実行中関数コードＢが呼ばれると関数コードＢが起動する。関数コードＢ用のスタック走行回数保存領域５２に関数コードＢ前半処理の走行数が記録される。
【００５８】
関数コードＢの実行中関数コードＣが呼ばれると関数コードＣが起動する。関数コードＣ用のスタック走行回数保存領域５２に関数コードＣ処理の走行数が記録される。
次に、関数コードＣの処理が完了すると関数コードＢの処理に戻り、関数コードＢ関数コードＢ用のスタック走行回数保存領域５２に関数コードＢ後半処理の走行数が関数コードＢ前半処理の走行数に加算され記録される。
【００５９】
関数コードＢの処理が完了すると関数コードＡの処理に戻り、関数コードＡ後半処理が起動されると関数コードＡ用のスタック走行回数保存領域５２に関数コードＡ後半処理の走行数が関数コードＡ前半処理の走行数に加算され記録される。
【００６０】
そして、ステップＳ４６で説明したように、各関数コードのスタック走行回数保存領域５２に記録した走行数を加算し、関数コードごとにエントリテーブルの走行回数保存領域に登録する。
【００６１】
図６は、ＯＳにより制御される周期タスク生成により実行開始指示される集計周期処理の処理フローを示す図である。
ステップＳ６１では、コード（例えば関数コードなど）に対応したエントリテーブルの起動回数保存領域、走行回数保存領域に記録されている起動回数と走行数を検出する。また、走行回数が１回であるとはアセンブラレベルでは１ステップであることから、各コードの走行数がわかれば実行時間が算出できるため、各コードの走行時間を用いて検出してもよい。
【００６２】
ステップＳ６２では、図７に示した高速メモリ管理情報に予め設定した起動回数閾値を統計情報の起動回数が越えたか、または予め設定した統計情報の走行数閾値を統計情報の起動回数が越えたかを判定する。起動回数閾値または走行数閾値の範囲を越えたときステップＳ６３に移行する。越えていない場合には次のコードのサーチをするためにステップＳ６１に移行する。
【００６３】
ステップＳ６３では、上記起動回数閾値または走行数閾値の範囲を越えたコードのエントリキー情報と統計情報を統計情報集計テーブルに格納する。統計情報集計テーブルはエントリキー情報と統計情報を格納するための領域を有している。
【００６４】
ステップＳ６４では、対応するコードのエントリテーブルの統計情報をクリアする。
ステップＳ６５ではエントリキテーブルに登録されているコード全てのサーチが完了したかを判定し、完了していればステップＳ６６に移行する。全てのコードのサーチが完了していない場合にはステップＳ６１に移行する。
【００６５】
ステップＳ６６では、統計情報集計テーブルにデータがあるかを判定する。格納されたコードのエントリキー情報と統計情報からなるデータがある場合にはステップＳ６７に移行する。
【００６６】
ステップＳ６７では図８に示す高速メモリ更新処理を行う。
図７（Ａ）は、高速メモリ管理情報を格納するメモリ領域の構造を示す図である。高速メモリ管理情報は、高速メモリ１０２の使用状態を管理する領域とエントリテーブルに登録されているコードを制御する設定値が記録されている。
【００６７】
高速メモリ管理情報は、高速メモリ最大サイズ、高速メモリ残サイズ、周期時間、周期回数、起動回数閾値、起動回数優先度、走行数閾値、走行数優先度、高速メモリ格納情報から構成されている。
【００６８】
高速メモリ最大サイズには高速メモリ１０２を使用できる最大サイズが記録されている。
高速メモリ残サイズは、高速メモリ１０２の現在使用しているメモリの残りのメモリ容量が記録されている。
【００６９】
周期時間は集計周期処理の起動時間が記録されている。周期回数には、集計処理が何回実行されたかが記録されている。
起動回数閾値にはエントリテーブルに記録されている起動回数と比較するために、予め利用者が設定した値である。また、エントリテーブルに登録したコードごとに起動回数閾値を設けてもよい。
【００７０】
走行数閾値にはエントリテーブルに記録されている走行数と比較するために、予め利用者が設定した値である。また、エントリテーブルに登録したコードごとに走行数閾値を設けてもよい。
【００７１】
起動回数優先度と走行数優先度は、高速メモリ１０２へのコード配置の実行開始を起動回数に基づいて実行するか、走行回数に基づいて実行するかを選択する。例えば、フラグを用いて優先度を決める。起動回数を優先する場合にはフラグを立て、走行数を優先する場合にはフラグを立てない。また、起動回数と走行数が上記起動回数閾値と走行数閾値を越えた場合に高速メモリ１０２へのコード配置を実行するときは、起動回数と走行数用にフラグを設けて、２つのフラグを有効にすることが考えられる。
【００７２】
高速メモリ格納情報は、各コードに対応する高速メモリ格納コードキー情報、初期コードアドレス値、高速メモリアドレス値、高速メモリ格納統計情報から構成されている。
高速メモリ格納コードキー情報は、高速メモリ１０２に登録されているコードのエントリキー情報が格納されている。
【００７３】
初期コードアドレス値は、高速メモリ１０２に配置される前の低速メモリ（フラッシュメモリ１０３）に配置されていたときの先頭アドレスが記録されている。
高速メモリアドレス値は、高速メモリ１０２に配置されたコードの先頭アドレスが記録されている。
【００７４】
高速メモリ格納統計情報は起動回数と走行回数が記録されている。
図７（Ｂ）は、上記統計情報集計テーブルを示し、検出された使用頻度の高いコードのエントリキー情報と統計情報を記録する。
【００７５】
例えば、記録する順番は古い順にメモリ領域のアドレス番地の番号の小さい方に記録していくことにより古いコードを簡単にサーチすることができる。また、エントリキー情報に登録した順番を記録しておいてもよい。
【００７６】
図８は、高速メモリ１０２へコードを配置する制御フロー示した図である。図９は、フラッシュメモリ１０３にある関数コードＡ〜Ｃのうち関数コードＢを高速メモリ１０２に転送することを示す図である。
【００７７】
ステップＳ８１では高速メモリ１０２に既にそのコードが配置済みであるかを判定する。
例えば、統計情報集計テーブルに記録されたエントリキー情報に基づいて判定する。
【００７８】
エントリテーブルに記録されているコードであり、起動回数または走行数が、設定された起動回数閾値または走行数閾値を越えたコードが、既に高速メモリ１０２に配置されて
いる場合にはステップＳ８２に移行する。まだ配置されていない場合にはステップＳ８３に移行する。図９では関数コードＢが検出される。
【００７９】
ステップＳ８２では高速メモリ１０２に配置するコードの容量以上の空き領域があるかを判定する。空き領域がある場合にはステップＳ８６に移行する。空き領域がない場合にはステップＳ８３に移行する。図９の場合は関数コードＢのメモリ容量と空き領域を比較する。
【００８０】
ステップＳ８３では、高速メモリ１０２に配置されている最も古いコードを削除すると高速メモリ１０２に空き領域が確保できるかを判定する。削除しても空き領域が確保できない場合にはこのフローを抜ける。メモリ領域を確保できる場合ステップＳ８４に移行する。ここで、最も古いコードの検出は、統計情報集計テーブルに記録されたエントリキー情報の順番などをサーチすることにより判定する。
【００８１】
ステップＳ８４では、最も古いコードに対応するエントリテーブルの統計情報の起動回数と走行数をクリアする。また、最も古いコードに対応するエントリテーブルのエントリキー情報を高速メモリ管理情報の初期コードアドレスを参照して更新する。
【００８２】
ステップＳ８５では、ステップＳ８４において更新したコードに対応する高速メモリ管理情報の高速メモリ格納情報を更新する。つまり、更新したコードに対応する高速メモリアドレスをクリアする。また、高速メモリ残りサイズも更新する。
【００８３】
また、統計情報集計テーブルに記録されている最も古いコードに対応するエントリキー情報と統計情報を削除する。
ステップＳ８６では高速メモリ１０２に配置するコードを高速メモリ１０２の空き領域に転送する。図９では関数コードＢを転送する。
【００８４】
ステップＳ８７では、起動回数または走行数が設定された起動回数閾値または走行数閾値を越えたことを検出されたコードを配置した高速メモリ１０２の先頭アドレスを、エントリテーブルのエントリキー情報に反映する。
【００８５】
ステップＳ８８では、検出されたコードを配置した高速メモリ１０２の先頭アドレスを、高速メモリ管理情報の高速メモリアドレスに反映させる。また、高速メモリ残りサイズも更新する。
【００８６】
なお、上記実施例のフローに示した制御処理は、その制御処理を遂行させる命令が記述されたプログラムをコンピュータに実行させることにより実現することができる。
このプログラムをＣＤ−ＲＯＭなどの記憶媒体に記憶しておけば、コンピュータに、そのプログラムをインストールすることにより、制御処理を実現することができる。また、このプログラムを通信ネットワークを介してコンピュータにダウンロードしてもよい。
また、本発明は、上記実施の形態に限定されるものでなく、本発明の要旨を逸脱しない範囲内で種々の改良、変更が可能である。
【００８７】
（付記１）
アクセス速度が異なるメモリを備えるシステムにおけるメモリへのコード転送方法であって、
前記システムの動作中に、予め指定したコードの使用頻度を集計して統計情報を生成し、
前記統計情報から使用頻度が多い前記コードを検出し、
検出したコードが記録されているメモリよりアクセス速度が速いメモリに、前記検出し
たコードを転送して配置する、
ことを特徴とするメモリへのコード転送方法。
（付記２）
前記統計情報は、起動回数または走行数を有し、
起動回数には予め指定されたコードが起動するごとに起動した回数を記録し、
走行数には前記コードを実行するたびに走行した回数を記録する、
ことを特徴とする付記１に記載のメモリへのコード転送方法。
（付記３）
使用頻度が高い前記コードの検出は、
前記起動回数と予め設定された起動回数閾値を比較して前記起動回数閾値以上であるか否かを検出するか、または前記走行数と予め設定された走行数閾値を比較して前記走行数閾値以上であるか否かを検出する、ことにより使用頻度が高い前記コードを検出することを特徴とする付記２に記載のメモリへのコード転送方法。
（付記４）
前記検出したコードをアクセス速度が速いメモリに転送するとき、
既に前記高速メモリに前記検出したコードがなく、前記高速メモリの空き領域に前記検出したコードを記録できるかを判定し、前記高速メモリに前記検出したコードが転送可能であるときに転送を行うことを特徴とする付記１に記載のメモリへのコード転送方法。
（付記５）
前記高速メモリに空き領域がなければ、前記高速メモリに既に登録されているコードを削除して空き領域を確保し、前記検出したコードを転送することを特徴とする付記５に記載のメモリへのコード転送方法。
（請求項６）
コンピュータに、
アクセス速度が異なるメモリを備えるシステムの動作中に、予め指定したコードの使用頻度を集計して統計情報を生成する処理と、
前記統計情報から使用頻度が多い前記コードを検出する処理と、
検出したコードが記録されているメモリよりアクセス速度が速いメモリに、前記検出したコードを転送して配置する処理と、
を実行させるためのコード転送プログラム。
（付記７）
前記起動回数または前記走行数に優先順をつけることを特徴とする付記２に記載のメモリへのコード転送方法。
【図面の簡単な説明】
【００８８】
【図１】本発明の実施形態によるシステム構成例を示す図である。
【図２】エントリテーブルの構成を示す図である。
【図３】アプリケーションによって実行される処理を示すフロー図である。
【図４】統計情報の収集制御の処理を示すフロー図である。
【図５】統計情報の走行数のカウント制御を示すフロー図である。
【図６】統計情報の集計周期処理の処理制御を示すフロー図である。
【図７】高速メモリ管理情報の構成を示す図である。
【図８】高速メモリへコードを格納する処理を示すフロー図である。
【図９】低速メモリから高速メモリにコードを転送する図である。
【符号の説明】
【００８９】
１０１  ＣＰＵ
１０２  高速メモリ（高速動作可能なメモリ）
１０３  フラッシュメモリ
３１  アプリケーション
３２  ＯＳ
３３  開始指示
３４  収集レジスタ設定
３５  統計情報収集処理開始
３６  周期タスク生成
３７  集計周期処理開始
【図１】
2009064112.tif 000003
【図２】
2009064112.tif 000004
【図３】
2009064112.tif 000005
【図４】
2009064112.tif 000006
【図５】
2009064112.tif 000007
【図６】
2009064112.tif 000008
【図７】
2009064112.tif 000009
【図８】
2009064112.tif 000010
【図９】
2009064112.tif 000011