(57)【要約】【課題】強制終了したソフトウェアに割り当てられたメモリ内の記憶領域を解放すること。【解決手段】制御装置１００は、ソフトウェアＴ１〜Ｔ３の識別子を、ソフトウェアＴ１〜Ｔ３の各々のソフトウェアによって確保されたメモリブロックと対応付けて記憶部１０１に記憶しておく。制御装置１００は、記憶部１０１を参照して、いずれかのソフトウェアによって確保されたままのメモリブロックＭ１〜Ｍ３を特定する。次に、制御装置１００は、特定したメモリブロックＭ１〜Ｍ３を確保したままのソフトウェアＴ１〜Ｔ３の各々のソフトウェアが、実行中のソフトウェアの中にあるか否かを判定する。そして、制御装置１００は、実行中のソフトウェアの中にないと判定したソフトウェアによって確保されたままのメモリブロックを解放する。【選択図】図１
2014206871.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータが、
メモリ内の記憶領域のうちのソフトウェアからの割当要求に応じて前記ソフトウェアが使用する記憶領域として割り当てた使用領域と対応付けて、前記ソフトウェアの識別子を記憶する記憶部から、前記メモリ内のいずれかの使用領域に対応するソフトウェアの識別子を取得し、
実行中のソフトウェアの中に、取得した前記識別子により識別されるソフトウェアがあるか否かを判定し、
前記識別子により識別されるソフトウェアがないと判定した場合、前記いずれかの使用領域を解放する、
処理を実行することを特徴とする制御方法。
【請求項２】
前記コンピュータが、
前記ソフトウェアからの前記ソフトウェアが使用する記憶領域として割り当てた使用領域の解放要求があった場合、前記解放要求から特定される使用領域に対応する前記ソフトウェアの識別子を前記記憶部から削除する処理を実行することを特徴とする請求項１に記載の制御方法。
【請求項３】
前記記憶部は、前記ソフトウェアからの割当要求に応じて前記ソフトウェアが使用する記憶領域として割り当てた使用領域と対応付けて、前記ソフトウェアの識別子と、前記ソフトウェアが使用する記憶領域として使用領域を割り当てた時点を示す時点情報と、を記憶し、
前記取得する処理は、
前記記憶部から、前記いずれかの使用領域に対応するソフトウェアの識別子と、前記いずれかの使用領域を割り当てた時点を示す時点情報と、を取得し、
前記判定する処理は、
実行中のソフトウェアの中に、取得した前記識別子により識別されるソフトウェアがあるか否かを判定し、取得した前記識別子により識別されるソフトウェアがあると判定した場合、前記ソフトウェアの識別子と、前記ソフトウェアからの割当要求に応じて前記ソフトウェアが使用する記憶領域として使用領域を割り当てた時点を示す時点情報と、を対応付けて記憶する第２の記憶部を参照して、取得した前記時点情報が、取得した前記識別子に対応する最新の時点情報と一致するか否かを判定し、
前記解放する処理は、
取得した前記時点情報が前記最新の時点情報と一致しないと判定した場合、前記いずれかの使用領域を解放することを特徴とする請求項１または２に記載の制御方法。
【請求項４】
メモリ内の記憶領域のうちのソフトウェアからの割当要求に応じて前記ソフトウェアが使用する記憶領域として割り当てた使用領域と対応付けて、前記ソフトウェアの識別子を記憶する記憶部と、
前記記憶部から、前記メモリ内のいずれかの使用領域に対応するソフトウェアの識別子を取得する取得部と、
実行中のソフトウェアの中に、前記取得部によって取得された前記識別子により識別されるソフトウェアがあるか否かを判定する判定部と、
前記判定部によって前記識別子により識別されるソフトウェアがないと判定された場合、前記いずれかの使用領域を解放する制御部と、
を有することを特徴とする制御装置。
【請求項５】
コンピュータに、
メモリ内の記憶領域のうちのソフトウェアからの割当要求に応じて前記ソフトウェアが使用する記憶領域として割り当てた使用領域と対応付けて、前記ソフトウェアの識別子を記憶する記憶部から、前記メモリ内のいずれかの使用領域に対応するソフトウェアの識別子を取得し、
実行中のソフトウェアの中に、取得した前記識別子により識別されるソフトウェアがあるか否かを判定し、
前記識別子により識別されるソフトウェアがないと判定した場合、前記いずれかの使用領域を解放する、
処理を実行させることを特徴とする制御プログラム。
【請求項６】
コンピュータに、
メモリ内の記憶領域のうちのソフトウェアからの割当要求に応じて前記ソフトウェアが使用する記憶領域として割り当てた使用領域と対応付けて、前記ソフトウェアの識別子を記憶する記憶部から、前記メモリ内のいずれかの使用領域に対応するソフトウェアの識別子を取得し、
実行中のソフトウェアの中に、取得した前記識別子により識別されるソフトウェアがあるか否かを判定し、
前記識別子により識別されるソフトウェアがないと判定した場合、前記いずれかの使用領域を解放する、
処理を実行させることを特徴とする制御プログラムを記録したコンピュータに読み取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、制御方法、制御装置、制御プログラム、および記録媒体に関する。
【背景技術】
【０００２】
従来、ソフトウェアに規定された処理を実行するために、メモリ内の記憶領域をソフトウェアのワークエリアとして動的に割り当てる技術がある。例えば、ソフトウェアによってｍａｌｌｏｃ関数が呼び出されるとＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）がメモリ内の記憶領域を確保し、ソフトウェアによってｆｒｅｅ関数が呼び出されるとＯＳが確保したメモリ内の記憶領域を解放する。
【０００３】
関連する技術としては、例えば、同一使用者の複数のメモリ領域を一度に解放する技術がある。具体的には、メモリ使用者が、メモリ解放制御部のＩＤ登録手段を介してメモリ領域を獲得し、その際メモリ使用者を識別するＩＤとメモリ領域のアドレスの対応をＩＤ管理テーブルに登録する。そして、メモリ使用者が、獲得したメモリが必要なくなったと判断した場合、メモリ解放制御部の解放忘れメモリ返却手段を呼び出し、メモリ使用者のＩＤから、解放されていないメモリ領域を探して解放する。
【０００４】
また、アプリケーション終了により不必要になった資源の回収を実行する技術がある。例えば、アプリケーション実行装置が、アプリケーションからの資源の提供の要求に応じて資源を提供したときに、資源の提供を要求したアプリケーションを識別する識別子を取得し、提供した資源と取得したアプリケーション識別子を組にしてテーブルに保持する。そして、アプリケーションが終了すると、終了したアプリケーションのアプリケーション識別子を取得し、取得した識別子に対応する資源をテーブルから特定し、特定した資源を解放する。また、メモリ領域を獲得したプログラムからの解放通知によらず、時間監視により自動的にメモリ領域を解放する技術がある。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平１１−１２００７３号公報
【特許文献２】特開２００２−２５９１４６号公報
【特許文献３】特開平３−２７１８４２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、上述した従来技術では、ソフトウェアが強制終了したときには、ソフトウェアに割り当てられたメモリ内の記憶領域を解放することができない場合がある。このため、例えば、解放していないメモリ内の記憶領域が増大して、メモリ内の空き領域が不足してしまうことがある。
【０００７】
１つの側面では、本発明は、強制終了したソフトウェアに割り当てられたメモリ内の記憶領域を解放することを目的とする。
【課題を解決するための手段】
【０００８】
本発明の一側面によれば、メモリ内の記憶領域のうちのソフトウェアからの割当要求に応じてソフトウェアが使用する記憶領域として割り当てた使用領域と対応付けて、ソフトウェアの識別子を記憶する記憶部から、メモリ内のいずれかの使用領域に対応するソフトウェアの識別子を取得し、実行中のソフトウェアの中に、取得した識別子により識別されるソフトウェアがあるか否かを判定し、識別子により識別されるソフトウェアがないと判定した場合、いずれかの使用領域を解放する制御方法、制御装置、制御プログラム、および記録媒体が提案される。
【発明の効果】
【０００９】
本発明の一態様によれば、強制終了したソフトウェアに割り当てられたメモリ内の記憶領域を解放することができるという効果を奏する。
【図面の簡単な説明】
【００１０】
【図１】図１は、実施の形態にかかる制御装置１００のヒープメモリ制御の一例を示す説明図である。
【図２】図２は、制御装置１００のハードウェア構成例を示すブロック図である。
【図３】図３は、ヒープメモリＭのデータ構造の一例を示す説明図である。
【図４】図４は、時間情報管理テーブル４００のデータ構造の一例を示す説明図である。
【図５】図５は、制御装置１００の機能的構成例を示すブロック図である。
【図６】図６は、制御装置１００によるヒープメモリ制御の流れを示す説明図である。
【図７】図７は、制御装置１００の初期化処理におけるヒープメモリＭの更新内容を示す説明図である。
【図８】図８は、制御装置１００の確保処理におけるヒープメモリＭの更新内容を示す説明図である。
【図９】図９は、制御装置１００の確保処理における時間情報管理テーブル４００の更新内容を示す説明図である。
【図１０】図１０は、制御装置１００のソフトウェアＡからの解放要求に基づく解放処理におけるヒープメモリＭの更新内容を示す説明図である。
【図１１】図１１は、制御装置１００のソフトウェアＡからの解放要求に基づく解放処理における時間情報管理テーブル４００の更新内容を示す説明図である。
【図１２】図１２は、制御装置１００の判定処理に基づく解放処理におけるヒープメモリＭの更新内容を示す説明図である。
【図１３】図１３は、図１２におけるヒープメモリＭの更新結果を示す説明図である。
【図１４】図１４は、制御装置１００の判定処理に基づく解放処理における時間情報管理テーブル４００の更新内容を示す説明図である。
【図１５】図１５は、図１４における時間情報管理テーブル４００の更新結果を示す説明図である。
【図１６】図１６は、制御装置１００の制御処理手順の一例を示すシーケンス図である。
【図１７】図１７は、制御装置１００の初期化処理手順の一例を示すフローチャートである。
【図１８】図１８は、制御装置１００の確保処理手順の一例を示すフローチャートである。
【図１９】図１９は、制御装置１００の時間管理処理手順の一例を示すフローチャートである。
【図２０】図２０は、制御装置１００の判定処理手順の一例を示すフローチャートである。
【図２１】図２１は、制御装置１００の解放処理手順の一例を示すフローチャートである。
【発明を実施するための形態】
【００１１】
以下に添付図面を参照して、本発明にかかる制御方法、制御装置、制御プログラム、および記録媒体の実施の形態を詳細に説明する。
【００１２】
（制御装置１００のヒープメモリ制御の一例）
図１は、実施の形態にかかる制御装置１００のヒープメモリ制御の一例を示す説明図である。制御装置１００は、既に実行終了したソフトウェアによって確保されたままのヒープメモリＭ内のメモリブロックを解放するコンピュータである。
【００１３】
ここで、ソフトウェアとは、規定された処理を制御装置１００に実行させる命令コードであって、例えば、タスクであってもよいし、プロセスであってもよいし、スレッドであってもよい。実行終了したソフトウェアとは、例えば、規定された処理を実行終了したソフトウェアであってもよいし、ｋｉｌｌコマンドによって強制終了したソフトウェアであってもよいし、バグによって強制終了したソフトウェアであってもよい。
【００１４】
換言すれば、実行終了したソフトウェアとは、例えば、実行中のソフトウェアの中にないソフトウェアである。実行中のソフトウェアとは、例えば、制御装置１００がマルチタスク方式であれば、タイムスライスの割り当てを待つ待機中のソフトウェアを含む。
【００１５】
ヒープメモリＭとは、例えば、ソフトウェアによって使用される記憶領域である。メモリブロックとは、例えば、ヒープメモリＭ内の一区切りの記憶領域であって、ヘッダ情報を有する。ヒープメモリＭ内のヘッダ情報とは、例えば、メモリブロックの属性を示す情報である。
【００１６】
確保とは、例えば、ヒープメモリＭ内のメモリブロックを、ソフトウェアが使用する記憶領域として割り当てることである。解放とは、例えば、ソフトウェアが使用する記憶領域として割り当てたメモリブロックを、特定のソフトウェアが使用する記憶領域として割り当てられていない状態に戻すことである。以下の説明では、特定のソフトウェアが使用する記憶領域として割り当てられていない状態のメモリブロックを「空きメモリブロック」と表記する場合がある。
【００１７】
図１の例では、制御装置１００は、ヒープメモリＭを有する。また、制御装置１００は、ソフトウェアＴ１〜Ｔ３を実行している。また、制御装置１００は、ヒープメモリＭ内のメモリブロックＭ１〜Ｍ３は、各々、ソフトウェアＴ１〜Ｔ３によって確保されている。また、制御装置１００は、ソフトウェアＴ１〜Ｔ３の各々のソフトウェアの識別子を、ソフトウェアＴ１〜Ｔ３の各々のソフトウェアによって確保されたメモリブロックと対応付けて記憶する記憶部１０１を有する。
【００１８】
ここで、実行中のソフトウェアＴ３がバグによって強制終了した場合を例に挙げて、ソフトウェアＴ３によって確保されたままのメモリブロックを制御装置１００が解放する動作の一例について説明する。
【００１９】
図１において、（１）制御装置１００は、記憶部１０１を参照して、いずれかのソフトウェアによって確保されたままのメモリブロックＭ１〜Ｍ３を特定する。（２）制御装置１００は、特定したメモリブロックＭ１〜Ｍ３を確保したままのソフトウェアＴ１〜Ｔ３の各々のソフトウェアが、実行中のソフトウェアの中にあるか否かを判定する。（３）制御装置１００は、実行中のソフトウェアの中にないと判定したソフトウェアによって確保されたままのメモリブロックを解放する。以下の説明では、実行中のソフトウェアの中にないと判定したソフトウェアによって確保されたままのメモリブロックを「異常メモリブロック」と表記する場合がある。
【００２０】
図１の例では、制御装置１００は、具体的には、記憶部１０１を参照して、メモリブロックＭ１を確保したままのソフトウェアＴ１を特定する。次に、制御装置１００は、特定したソフトウェアＴ１が、実行中のソフトウェアの中にあるか否かを判定する。そして、制御装置１００は、ソフトウェアＴ１が実行中のソフトウェアの中にあると判定して、ソフトウェアＴ１によって確保されたままのメモリブロックＭ１を解放しない。
【００２１】
また、制御装置１００は、具体的には、記憶部１０１を参照して、メモリブロックＭ３を確保したままのソフトウェアＴ３を特定する。次に、制御装置１００は、特定したソフトウェアＴ３が、実行中のソフトウェアの中にあるか否かを判定する。そして、制御装置１００は、ソフトウェアＴ３が実行中のソフトウェアの中にないと判定して、ソフトウェアＴ３によって確保されたままのメモリブロックＭ３を解放する。
【００２２】
これにより、制御装置１００は、既に実行終了したソフトウェアによって確保されたままのメモリブロックを解放することができる。したがって、制御装置１００は、既に実行終了したソフトウェアによって確保されたままのメモリブロックが増大してヒープメモリＭのメモリブロックが不足（枯渇）することを防止することができる。メモリブロックの不足とは、ヒープメモリＭ内にソフトウェアに割り当てるべきサイズのメモリブロックがなくなることである。
【００２３】
換言すれば、制御装置１００は、メモリリークを防止することができる。結果として、制御装置１００は、ソフトウェアに割り当てるヒープメモリＭ内のメモリブロックが不足することを防止し、ソフトウェアを正常に実行することができる。
【００２４】
一方で、制御装置１００は、実行中のソフトウェアによって確保されたままのメモリブロックを解放しない。したがって、制御装置１００は、実行中のソフトウェアが使用しているメモリブロックを解放して実行中のソフトウェアに不具合が発生することを防止することができる。結果として、制御装置１００は、ソフトウェアを正常に実行することができる。
【００２５】
図１の例では、制御装置１００は、マルチタスク方式であったが、これに限らない。例えば、制御装置１００は、シングルタスク方式であってもよい。
【００２６】
（制御装置１００のハードウェア構成例）
図２は、制御装置１００のハードウェア構成例を示すブロック図である。図２において、制御装置１００は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）２０１と、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）２０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）２０３と、磁気ディスクドライブ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）２０４と、磁気ディスク２０５と、光ディスクドライブ２０６と、光ディスク２０７と、ディスプレイ２０８と、インターフェース（Ｉ／Ｆ：Ｉｎｔｅｒｆａｃｅ）２０９と、キーボード２１０と、マウス２１１と、スキャナ２１２と、プリンタ２１３と、を備えている。また、各構成部はバス２００によってそれぞれ接続されている。
【００２７】
ここで、ＣＰＵ２０１は、制御装置１００の全体の制御を司る。ＲＯＭ２０２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ２０３は、ＣＰＵ２０１のワークエリアとして使用される。ＲＡＭ２０３は、例えば、ヒープメモリＭになる。磁気ディスクドライブ２０４は、ＣＰＵ２０１の制御にしたがって磁気ディスク２０５に対するデータのリード／ライトを制御する。磁気ディスク２０５は、磁気ディスクドライブ２０４の制御で書き込まれたデータを記憶する。
【００２８】
光ディスクドライブ２０６は、ＣＰＵ２０１の制御にしたがって光ディスク２０７に対するデータのリード／ライトを制御する。光ディスク２０７は、光ディスクドライブ２０６の制御で書き込まれたデータを記憶したり、光ディスク２０７に記憶されたデータをコンピュータに読み取らせたりする。
【００２９】
ディスプレイ２０８は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ２０８は、例えば、液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【００３０】
Ｉ／Ｆ２０９は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク２１４に接続され、このネットワーク２１４を介して他の装置に接続される。そして、Ｉ／Ｆ２０９は、ネットワーク２１４と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ２０９には、例えば、モデムやＬＡＮアダプタなどを採用することができる。
【００３１】
キーボード２１０は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス２１１は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
【００３２】
スキャナ２１２は、画像を光学的に読み取り、制御装置１００内に画像データを取り込む。なお、スキャナ２１２は、ＯＣＲ（Ｏｐｔｉｃａｌ  Ｃｈａｒａｃｔｅｒ  Ｒｅａｄｅｒ）機能を持たせてもよい。また、プリンタ２１３は、画像データや文書データを印刷する。プリンタ２１３には、例えば、レーザプリンタやインクジェットプリンタを採用することができる。なお、光ディスクドライブ２０６、光ディスク２０７、ディスプレイ２０８、キーボード２１０、マウス２１１、スキャナ２１２、およびプリンタ２１３の少なくともいずれか１つは、なくてもよい。
【００３３】
（ヒープメモリＭのデータ構造の一例）
図３は、ヒープメモリＭのデータ構造の一例を示す説明図である。
【００３４】
図３に示すように、ヒープメモリＭは、ヒープメモリＭ全体の管理情報を記憶するヒープメモリヘッダ３０１と、ソフトウェアに割り当てるメモリブロックと、メモリブロックの管理情報を記憶するメモリブロックヘッダ３０２と、を含む。
【００３５】
ヒープメモリヘッダ３０１は、ｓｉｚｅ、ｍａｇｉｃ、ｏｃｃｕｐｉｅｄ、ｍｙｉｄ、ｎｅｘｔ、およびｐｒｅｖ、のフィールドを有し、各フィールドに情報を設定することによりヒープメモリＭ全体の管理情報を記憶する。
【００３６】
ｓｉｚｅには、ヘッダのＢｙｔｅ数が記憶される。ｍａｇｉｃには、マジックナンバーが記憶される。マジックナンバーとは、例えば、ヒープメモリＭの形式を識別する識別子である。ｏｃｃｕｐｉｅｄには、ヒープメモリＭが使用中であるか否かを示す情報が記憶される。ｍｙｉｄには、ヒープメモリヘッダに固有の識別子が記憶される。ｎｅｘｔには、複数のメモリブロックのうちで先頭にあるメモリブロックの管理情報を記憶するメモリブロックヘッダへのポインタが記憶される。ｐｒｅｖには、複数のメモリブロックのうちで末尾にあるメモリブロックの管理情報を記憶するメモリブロックヘッダへのポインタが記憶される。
【００３７】
メモリブロックヘッダ３０２は、ｓｉｚｅ、ｍａｇｉｃ、ｏｃｃｕｐｉｅｄ、ｍｙｉｄ、ｎｅｘｔ、およびｐｒｅｖ、のフィールドを有し、各フィールドに情報を設定することによりメモリブロックの管理情報を記憶する。
【００３８】
ｓｉｚｅには、メモリブロックのＢｙｔｅ数が記憶される。ｍａｇｉｃには、マジックナンバーが記憶される。ｏｃｃｕｐｉｅｄには、メモリブロックが使用中であるか否かを示す情報が記憶される。ｍｙｉｄには、メモリブロックを確保したソフトウェアの識別子が記憶される。ソフトウェアの識別子とは、例えば、タスクＩＤやプロセスＩＤ、タスクＩＤとタスクがメモリブロックを確保した時点を示す時点情報を結合したデータ、または結合したデータをハッシュ関数に代入することにより得られるハッシュ値である。ｎｅｘｔには、複数のメモリブロックのうちで１つ後ろにあるメモリブロックの管理情報を記憶するメモリブロックヘッダへのポインタが記憶される。ｐｒｅｖには、複数のメモリブロックのうちで１つ前にあるメモリブロックの管理情報を記憶するメモリブロックヘッダへのポインタが記憶される。
【００３９】
（時間情報管理テーブル４００のデータ構造の一例）
図４は、時間情報管理テーブル４００のデータ構造の一例を示す説明図である。
【００４０】
図４に示すように、時間情報管理テーブル４００は、ｔｉｍｅのフィールドを含む。ｔｉｍｅには、ソフトウェアがメモリブロックを確保した最新の時点を示す時点情報が記憶される。時点を示す時点情報とは、例えば、年月日をハッシュ関数に代入することにより得られるハッシュ値である。
【００４１】
図４の例では、時間情報管理テーブル４００のレコードの先頭からの番号が、ソフトウェアの識別子に対応する。換言すれば、先頭から１番目のレコードは、ソフトウェアの識別子「１」に対応し、ソフトウェアの識別子「１」により識別されるソフトウェアがメモリブロックを確保した最新の時点を示す時点情報を記憶する。このため、時間情報管理テーブル４００は、識別子最大値の分のレコードを有する。
【００４２】
このように、制御装置１００は、ソフトウェアの識別子に対応付けてソフトウェアがメモリブロックを確保した最新の時点を示す時点情報を記憶する。これにより、制御装置１００は、既に実行終了したソフトウェアの識別子を使い回した場合に、同一の識別子を持つ複数のソフトウェアによってメモリブロックが確保されたとしても対応することができる。
【００４３】
制御装置１００は、例えば、或る識別子により識別される第１のソフトウェアによって第１のメモリブロックが確保された場合、第１のメモリブロックに第１のメモリブロックが確保された時点を示す第１の時点情報を対応付けて記憶する。さらに、制御装置１００は、或る識別子と、第１の時点情報とを対応付けて記憶する。
【００４４】
また、制御装置１００は、第１のソフトウェアが強制終了した後、或る識別子を第２のソフトウェアに割り振ったとする。そして、制御装置１００は、或る識別子により識別される第２のソフトウェアによって第２のメモリブロックが確保された場合、第２のメモリブロックに、第２のメモリブロックが確保された時点を示す第２の時点情報を対応付けて記憶する。さらに、制御装置１００は、或る識別子と、第２の時点情報とを対応付けて記憶する。
【００４５】
ここで、制御装置１００は、第１のメモリブロックが異常メモリブロックであるか否かを判定する。制御装置１００は、第１のメモリブロックに対応する第１の時点情報が、或る識別子に対応する第１の時点情報および第２の時点情報の中で最新の時点情報であるか否かを判定する。
【００４６】
これにより、制御装置１００は、第１のメモリブロックを確保したソフトウェアが、現在或る識別子の割り振られている第２のソフトウェアではなく、過去に或る識別子が割り振られていたソフトウェアであると判定する。したがって、制御装置１００は、第１のメモリブロックを確保したソフトウェアが既に実行終了しているとして、第１のメモリブロックを異常メモリブロックと判定することができる。
【００４７】
ここでは、制御装置１００は、或る識別子と対応付けて第１の時点情報と第２の時点情報とを両方記憶したが、これに限らない。例えば、制御装置１００は、或る識別子と対応付けて最新の時点情報を記憶してもよい。これにより、制御装置１００は、時点情報の記憶に使用する記憶領域のサイズを低減することができる。
【００４８】
（制御装置１００の機能的構成例）
次に、図５を用いて、制御装置１００の機能的構成例について説明する。
【００４９】
図５は、制御装置１００の機能的構成例を示すブロック図である。制御装置１００は、記憶部１０１と、実行部５０１と、更新部５０２と、計時部５０３と、取得部５０４と、判定部５０５と、制御部５０６と、を含む。
【００５０】
記憶部１０１と、実行部５０１と、更新部５０２と、計時部５０３と、取得部５０４と、判定部５０５と、制御部５０６とは、例えば、図２に示したＲＯＭ２０２、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶装置に記憶されたプログラムをＣＰＵ２０１に実行させることにより、または、Ｉ／Ｆ２０９により、その機能を実現する。
【００５１】
記憶部１０１は、メモリ内の記憶領域のうちのソフトウェアからの割当要求に応じてソフトウェアが使用する記憶領域として割り当てた使用領域と対応付けて、ソフトウェアの識別子を記憶する。記憶部１０１は、例えば、メモリブロックヘッダのｍｙｉｄのフィールドを用いて、メモリブロックと対応付けてソフトウェアの識別子を記憶する。記憶部１０１は、ソフトウェアからの割当要求に応じてソフトウェアが使用する記憶領域として割り当てた使用領域と対応付けて、ソフトウェアの識別子と、ソフトウェアが使用する記憶領域として使用領域を割り当てた時点を示す時点情報と、を記憶してもよい。
【００５２】
また、記憶部１０１は、ソフトウェアの識別子と、ソフトウェアからの割当要求に応じてソフトウェアが使用する記憶領域として使用領域を割り当てた時点を示す時点情報と、を対応付けて記憶する。記憶部１０１は、例えば、時間情報管理テーブル４００を用いて、ソフトウェアの識別子と、ソフトウェアの識別子が示すソフトウェアがメモリブロックを確保した時点を示す時点情報と、を対応付けて記憶する。
【００５３】
実行部５０１は、ＯＳやソフトウェアを実行する。実行部５０１は、例えば、ＯＳを実行して、ヒープメモリＭの初期化要求を発行する。また、実行部５０１は、例えば、ソフトウェアを実行して、ｍａｌｌｏｃ関数を実行することにより、メモリブロックの確保要求を発行する。また、実行部５０１は、例えば、ソフトウェアを実行して、ｆｒｅｅ関数を実行することにより、メモリブロックの解放要求を発行する。実行結果は、例えば、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶領域に記憶される。これにより、実行部５０１は、確保処理や解放処理などのトリガを発生させることができる。
【００５４】
更新部５０２は、ヒープメモリＭを更新する。更新部５０２は、例えば、実行部５０１によって発行された初期化要求を検出して、ヒープメモリＭの初期化処理を実行してヒープメモリＭを初期化する。また、更新部５０２は、例えば、実行部５０１によって発行されたヒープメモリＭの確保要求を検出して、ヒープメモリＭの確保処理を実行して、ＯＳを介してヒープメモリＭ内のメモリブロックをソフトウェアに割り当てる。また、更新部５０２は、例えば、実行部５０１によって発行されたヒープメモリＭの解放要求を検出して、ヒープメモリＭの解放処理を実行して、ＯＳを介してヒープメモリＭ内のメモリブロックを解放する。
【００５５】
また、更新部５０２は、ソフトウェアからの割当要求があった場合、記憶部１０１に、割当要求された使用領域と対応付けて、ソフトウェアの識別子を記憶する。更新部５０２は、例えば、実行部５０１によって発行されたヒープメモリＭの確保要求を検出して、実行部５０１によって実行されて確保要求を発行したソフトウェアにメモリブロックを割り当てる。そして、更新部５０２は、メモリブロックヘッダのｍｙｉｄのフィールドにソフトウェアの識別子を記憶する。また、更新部５０２は、メモリブロックヘッダのｍｙｉｄのフィールドに、ソフトウェアの識別子と、ソフトウェアがメモリブロックを確保した時点を示す時点情報と、を記憶してもよい。
【００５６】
また、更新部５０２は、ソフトウェアからの割当要求があった場合、記憶部１０１にソフトウェアの識別子に対応する時点情報が記憶されているか否かを判定する。そして、更新部５０２は、記憶されていれば、当該時点情報の代わりに、割当要求に応じてソフトウェアが使用する記憶領域として使用領域を割り当てた時点を示す時点情報を記憶する。更新部５０２は、例えば、実行部５０１によって発行されたヒープメモリＭの確保要求を検出して、時間情報管理テーブル４００において実行部５０１によって実行されて確保要求を発行したソフトウェアの識別子に対応する時点情報を、最新の時点情報に更新する。
【００５７】
また、更新部５０２は、ソフトウェアからのソフトウェアが使用する記憶領域として割り当てた使用領域の解放要求があった場合、解放要求から特定される使用領域に対応するソフトウェアの識別子を記憶部１０１から削除する。更新部５０２は、例えば、実行部５０１によって発行されたヒープメモリＭの解放要求を検出して、解放要求されたメモリブロックのメモリブロックヘッダから、実行部５０１によって実行されて解放要求を発行したソフトウェアの識別子を削除する。
【００５８】
また、更新部５０２は、後述する判定部５０５から使用領域の更新要求があった場合、更新要求から特定される使用領域に対応するソフトウェアの識別子を記憶部１０１から削除してもよい。更新部５０２は、例えば、判定部５０５からのヒープメモリＭの更新要求を検出して、更新要求されたメモリブロックのメモリブロックヘッダから、ソフトウェアの識別子を削除する。これにより、更新部５０２は、ヒープメモリヘッダやヒープメモリＭやメモリブロックヘッダや時間情報管理テーブルを、最新の状態に更新することができる。
【００５９】
計時部５０３は、一定時間ごとに判定要求を発行する。これにより、計時部５０３は、判定処理のトリガを発生させることができる。取得部５０４は、計時部５０３からの判定要求を検出し、実行部５０１からの確保要求を検出し、実行部５０１からの解放要求を検出し、または判定部５０５からの更新要求を検出した場合、以下に示す処理を実行する。
【００６０】
取得部５０４は、記憶部１０１から、メモリ内のいずれかの使用領域に対応するソフトウェアの識別子を取得する。取得部５０４は、例えば、いずれかのメモリブロックのメモリブロックヘッダのｍｙｉｄのフィールドから、ソフトウェアの識別子を取得する。また、取得部５０４は、記憶部１０１から、いずれかの使用領域を割り当てた時点を示す時点情報を取得してもよい。取得部５０４は、例えば、いずれかのメモリブロックのメモリブロックヘッダのｍｙｉｄのフィールドから、ソフトウェアの識別子とともに、ソフトウェアがメモリブロックを確保した時点を示す時点情報を取得してもよい。取得したデータは、例えば、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶領域に記憶される。これにより、取得部５０４は、判定部５０５による判定処理に用いるデータを取得することができる。
【００６１】
判定部５０５は、実行中のソフトウェアの中に、取得した識別子により識別されるソフトウェアがあるか否かを判定する。判定部５０５は、例えば、取得したソフトウェアの識別子を用いて、ソフトウェアの状態を検出して、ソフトウェアがＩｄｌｅ状態である場合に、実行中のソフトウェアの中に取得した識別子により識別されるソフトウェアがないと判定する。
【００６２】
また、判定部５０５は、取得した識別子により識別されるソフトウェアがあると判定した場合、記憶部１０１を参照して、取得した時点情報が、取得した識別子に対応する最新の時点情報と一致するか否かを判定してもよい。判定部５０５は、例えば、取得した識別子により識別されるソフトウェアがあると判定した場合、時間情報管理テーブル４００を参照して、取得した時点情報が、取得した識別子に対応する最新の時点情報と一致するか否かを判定してもよい。
【００６３】
判定部５０５は、識別子により識別されるソフトウェアがないと判定した場合、および、取得した時点情報が最新の時点情報と一致しないと判定した場合、いずれかの使用領域の解放要求と更新要求とを発行する。判定結果は、例えば、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶領域に記憶される。これにより、判定部５０５は、メモリブロックが異常メモリブロックであるか否かを判定することができる。
【００６４】
制御部５０６は、識別子により識別されるソフトウェアがないと判定した場合、いずれかの使用領域を解放する。また、制御部５０６は、取得した時点情報が最新の時点情報と一致しないと判定した場合、いずれかの使用領域を解放してもよい。制御部５０６は、例えば、判定部５０５からの解放要求を検出して、解放要求されたメモリブロックを解放する。また、制御部５０６は、ソフトウェアからの割当要求を検出して、ソフトウェアに使用領域を割り当ててもよい。これにより、制御部５０６は、既に実行終了したソフトウェアによって確保されたままのメモリブロックを解放することができる。
【００６５】
（制御装置１００によるヒープメモリ制御の具体例）
次に、図６〜図１５を用いて、制御装置１００によるヒープメモリ制御の具体例について説明する。
【００６６】
図６は、制御装置１００によるヒープメモリ制御の流れを示す説明図である。図６に示すように、制御装置１００は、ソフトウェアＡと、ソフトウェアＢと、制御プログラムと、ＯＳとを実行する。
【００６７】
図６の例では、ＯＳは、一定時間ごとに判定要求を発行する。また、制御プログラムは、ＯＳから発行された判定要求を検出して、上述した取得部５０４、判定部５０５、および制御部５０６の処理を実行する。
【００６８】
（１）ソフトウェアＡは、例えば、制御装置１００の利用者からの操作を受けて実行される。ここで、ソフトウェアＡは、ｍａｌｌｏｃ関数を実行し、ＯＳを介して、メモリブロックを確保する。このとき、制御プログラムは、ソフトウェアＡの識別子を、確保したメモリブロックのメモリブロックヘッダのｍｙｉｄのフィールドに記憶する。
【００６９】
（２）ソフトウェアＢは、ソフトウェアＡを中断させて、ソフトウェアＡから切り替わって実行される。また、制御プログラムは、ＯＳから発行された判定要求を検出して、ソフトウェアＢを中断させて、ソフトウェアＢから切り替わって実行される。
【００７０】
ソフトウェアＢは、制御プログラムが終了すると、制御プログラムから切り替わって実行される。ここで、ソフトウェアＢは、ｍａｌｌｏｃ関数を実行し、ＯＳを介して、メモリブロックを確保する。このとき、制御プログラムは、ソフトウェアＢの識別子を、確保したメモリブロックのメモリブロックヘッダのｍｙｉｄのフィールドに記憶する。
【００７１】
（３）ソフトウェアＡは、ソフトウェアＢを中断させて、ソフトウェアＢから切り替わって実行される。また、制御プログラムは、ＯＳから発行された判定要求を検出して、ソフトウェアＡを中断させて、ソフトウェアＡから切り替わって実行される。
【００７２】
ソフトウェアＡは、制御プログラムが終了すると、制御プログラムから切り替わって実行される。ソフトウェアＡは、ｆｒｅｅ関数を実行し、ＯＳを介して、メモリブロックを解放する。このとき、制御プログラムは、ソフトウェアＡの識別子を、解放したメモリブロックのメモリブロックヘッダのｍｙｉｄのフィールドから削除する。ソフトウェアＡは、実行終了したとする。
【００７３】
ソフトウェアＢは、ソフトウェアＡが実行終了したため、ソフトウェアＡから切り替わって実行される。ここで、ソフトウェアＢは、バグによって強制終了したとする。このため、ソフトウェアＢによってメモリブロックは確保されたままになる。
【００７４】
（４）制御プログラムは、ＯＳから発行された判定要求を検出して、実行される。制御プログラムは、ソフトウェアによって確保されたままのメモリブロックのメモリブロックヘッダのｍｙｉｄのフィールドから、ソフトウェアの識別子を取得する。
【００７５】
次に、制御プログラムは、実行中のソフトウェアの中に、取得した識別子により識別されるソフトウェアＢがあるか否かを判定する。ここで、制御プログラムは、実行中のソフトウェアの中に、ソフトウェアＢがないため、メモリブロックを異常メモリブロックであると判定して、メモリブロックを解放する。
【００７６】
これにより、制御プログラムは、既に実行終了したソフトウェアによって確保されたままのメモリブロックを解放することができる。したがって、制御プログラムは、既に実行終了したソフトウェアによって確保されたままのメモリブロックが増大してヒープメモリＭのメモリブロックが不足することを防止することができる。結果として、制御プログラムは、ソフトウェアに割り当てるヒープメモリＭ内のメモリブロックが不足することを防止し、ソフトウェアを正常に実行することができる。
【００７７】
図７は、制御装置１００の初期化処理におけるヒープメモリＭの更新内容を示す説明図である。図７において、制御装置１００は、ヒープメモリＭを初期化する。ここで、図７は、図６の初期状態に対応する。
【００７８】
図７に示すように、制御装置１００は、ヒープメモリヘッダ７０１を作成し、ヒープメモリＭを１つのメモリブロックとして扱い、先頭にメモリブロックヘッダ７０２を作成する。
【００７９】
制御装置１００は、作成したメモリブロックヘッダ７０２のｓｉｚｅのフィールドに、メモリブロックのサイズを示す１００００Ｂｙｔｅを設定する。ここで、メモリブロックのサイズは、例えば、ヒープメモリＭのサイズを示す１００００Ｂｙｔｅからメモリブロックヘッダ７０２のサイズを減算した結果である。しかしながら、以下の説明では、簡単のため、メモリブロックヘッダ７０２のサイズを０Ｂｙｔｅとして扱うこととする。
【００８０】
制御装置１００は、作成したメモリブロックヘッダ７０２のｏｃｃｕｐｉｅｄのフィールドに、未使用であることを示す０を設定する。制御装置１００は、作成したメモリブロックヘッダ７０２のｍｙｉｄのフィールドに、まだソフトウェアに割り当てられていない空きメモリブロックであることを示す０ｘ０を設定する。
【００８１】
制御装置１００は、作成したメモリブロックヘッダ７０２のｎｅｘｔのフィールドに、ヒープメモリヘッダ７０１の先頭アドレスを設定する。制御装置１００は、作成したメモリブロックヘッダ７０２のｐｒｅｖのフィールドに、ヒープメモリヘッダ７０１の先頭アドレスを設定する。
【００８２】
制御装置１００は、ヒープメモリヘッダ７０１のｎｅｘｔに、作成したメモリブロックヘッダ７０２の先頭アドレスを記憶する。制御装置１００は、ヒープメモリヘッダ７０１のｐｒｅｖに、作成したメモリブロックヘッダ７０２の先頭アドレスを記憶する。これにより、制御装置１００は、ヒープメモリＭを初期化することができる。
【００８３】
図８は、制御装置１００の確保処理におけるヒープメモリＭの更新内容を示す説明図である。図８において、制御装置１００は、ソフトウェアＡに１００Ｂｙｔｅのメモリブロックを割り当てる。ここで、図８に示すヒープメモリＭは、図６の（１）においてソフトウェアＡにメモリブロックを割り当てた状態に対応する。
【００８４】
図８に示すように、制御装置１００は、先頭のメモリブロックヘッダ７０２に続く１００Ｂｙｔｅの記憶領域を、メモリブロックとしてソフトウェアＡに割り当てて、残りの９９００Ｂｙｔｅのメモリブロックの先頭にメモリブロックヘッダ８０１を作成する。
【００８５】
制御装置１００は、先頭のメモリブロックヘッダ７０２のｓｉｚｅのフィールドに、ソフトウェアＡに割り当てたメモリブロックの記憶領域のサイズを示す１００Ｂｙｔｅを設定する。制御装置１００は、先頭のメモリブロックヘッダ７０２のｏｃｃｕｐｉｅｄのフィールドに、使用中であることを示す１を設定する。
【００８６】
制御装置１００は、先頭のメモリブロックヘッダ７０２のｍｙｉｄのフィールドに、ソフトウェアＡの識別子と、ソフトウェアＡにメモリブロックを割り当てた時点と、を示す０ｘ０００１０３０３を設定する。
【００８７】
制御装置１００は、先頭のメモリブロックヘッダ７０２のｎｅｘｔのフィールドに、作成したメモリブロックヘッダ８０１の先頭アドレスを設定する。制御装置１００は、先頭のメモリブロックヘッダ７０２のｐｒｅｖのフィールドに、ヒープメモリヘッダ７０１の先頭アドレスを設定する。
【００８８】
制御装置１００は、作成したメモリブロックヘッダ８０１のｓｉｚｅのフィールドに、メモリブロックのサイズを示す９９００Ｂｙｔｅを設定する。制御装置１００は、作成したメモリブロックヘッダ８０１のｏｃｃｕｐｉｅｄのフィールドに、未使用であることを示す０を設定する。制御装置１００は、作成したメモリブロックヘッダ８０１のｍｙｉｄのフィールドに、まだソフトウェアに割り当てられていない空きメモリブロックであることを示す０ｘ０を設定する。
【００８９】
制御装置１００は、作成したメモリブロックヘッダ８０１のｎｅｘｔのフィールドに、ヒープメモリヘッダ７０１の先頭アドレスを設定する。制御装置１００は、作成したメモリブロックヘッダ８０１のｐｒｅｖのフィールドに、メモリブロックヘッダ７０２の先頭アドレスを設定する。制御装置１００は、ヒープメモリヘッダ７０１のｐｒｅｖを、作成したメモリブロックヘッダ８０１の先頭アドレスに更新する。これにより、制御装置１００は、ソフトウェアＡにメモリブロックを割り当てることができる。結果として、制御装置１００は、ソフトウェアＡの処理のために使用するワークエリアとしてメモリブロックを使用して、ソフトウェアＡを実行することができる。
【００９０】
図９は、制御装置１００の確保処理における時間情報管理テーブル４００の更新内容を示す説明図である。図９において、制御装置１００は、ソフトウェアＡに１００Ｂｙｔｅのメモリブロックを割り当てたとき、時間情報管理テーブル４００を更新する。ここで、図９は、図６の（１）においてソフトウェアＡにメモリブロックを割り当てたときに時間情報管理テーブル４００を更新する場合に対応する。
【００９１】
制御装置１００は、ソフトウェアＡの識別子が１であるため、時間情報管理テーブル４００の１番目のレコードにソフトウェアＡにメモリブロックを割り当てた時点を示す時点情報０ｘ０３０３を記憶する。これにより、制御装置１００は、ソフトウェアＡと対応付けて、ソフトウェアＡにメモリブロックを割り当てた最新の時点を示す時点情報を記憶しておくことができる。
【００９２】
また、制御装置１００は、図８および図９と同様にして、ソフトウェアＢに１００Ｂｙｔｅのメモリブロックを割り当て、時間情報管理テーブル４００を更新したとする。ここで、図８および図９と同様にして、ソフトウェアＢに１００Ｂｙｔｅのメモリブロックを割り当てることは、図６の（２）においてソフトウェアＢにメモリブロックを割り当てる場合に対応する。これにより、制御装置１００は、ソフトウェアＢにメモリブロックを割り当てることができる。結果として、制御装置１００は、ソフトウェアＢの処理のために使用するワークエリアとしてメモリブロックを使用してソフトウェアＢを実行することができる。また、制御装置１００は、ソフトウェアＢと対応付けて、ソフトウェアＢにメモリブロックを割り当てた最新の時点を示す時点情報を記憶しておくことができる。
【００９３】
図１０は、制御装置１００のソフトウェアＡからの解放要求に基づく解放処理におけるヒープメモリＭの更新内容を示す説明図である。図１０において、制御装置１００は、ソフトウェアＡに割り当てたメモリブロックを解放する。ここで、図１０は、図６の（３）においてソフトウェアＡに割り当てたメモリブロックを解放する場合に対応する。
【００９４】
図１０に示すように、制御装置１００は、先頭のメモリブロックヘッダ７０２に続く１００ＢｙｔｅのソフトウェアＡに割り当てたメモリブロックを解放する。
【００９５】
ここで、制御装置１００は、メモリブロックヘッダ７０２のｐｒｅｖとのフィールドを参照して、メモリブロックヘッダ７０２の前にあるメモリブロックヘッダが使用中であるか否かを判定する。制御装置１００は、前にあるメモリブロックヘッダが使用中でないと判定した場合は、前にあるメモリブロックヘッダに、メモリブロックヘッダ７０２を結合する。
【００９６】
また、制御装置１００は、メモリブロックヘッダ７０２のｎｅｘｔのフィールドを参照して、メモリブロックヘッダ７０２の後ろにあるメモリブロックヘッダが使用中であるか否かを判定する。制御装置１００は、後ろにあるメモリブロックヘッダが使用中でないと判定した場合は、後ろにあるメモリブロックヘッダを、メモリブロックヘッダ７０２に結合する。図１０の例では、制御装置１００は、メモリブロックヘッダ７０２の後ろにあるメモリブロックヘッダ８０１が使用中であるため、メモリブロックヘッダ８０１を結合しない。
【００９７】
制御装置１００は、先頭のメモリブロックヘッダ７０２のｓｉｚｅのフィールドに、１００Ｂｙｔｅを設定する。制御装置１００は、先頭のメモリブロックヘッダ７０２のｏｃｃｕｐｉｅｄのフィールドに、未使用であることを示す０を設定する。制御装置１００は、先頭のメモリブロックヘッダ７０２のｍｙｉｄのフィールドから、ソフトウェアＡの識別子と、ソフトウェアＡにメモリブロックを割り当てた時点と、を示す０ｘ０００１０３０３を削除する。これにより、制御装置１００は、ヒープメモリＭに空きメモリブロックを増加させることができ、ヒープメモリＭが不足することを防止することができる。
【００９８】
図１１は、制御装置１００のソフトウェアＡからの解放要求に基づく解放処理における時間情報管理テーブル４００の更新内容を示す説明図である。図１１において、制御装置１００は、ソフトウェアＡに割り当てたメモリブロックを解放するとき、時間情報管理テーブル４００を更新する。ここで、図１１は、図６の（３）においてソフトウェアＡに割り当てたメモリブロックを解放したときに時間情報管理テーブル４００を更新する場合に対応する。制御装置１００は、ソフトウェアＡの識別子が１であるため、時間情報管理テーブル４００の１番目のレコードを初期化して、０ｘ００００を記憶する。これにより、制御装置１００は、時間情報管理テーブル４００を更新することができる。
【００９９】
図１２は、制御装置１００の判定処理に基づく解放処理におけるヒープメモリＭの更新内容を示す説明図である。図１２において、制御装置１００は、ソフトウェアＢに割り当てたメモリブロックを解放する。ここで、図１２は、図６の（４）においてソフトウェアＢに割り当てたメモリブロックを解放する場合に対応する。
【０１００】
図１２に示すように、制御装置１００は、順次、メモリブロックヘッダのｍｙｉｄのフィールドの内容を取得する。制御装置１００は、例えば、メモリブロックヘッダ８０１のｍｙｉｄのフィールドの内容を取得し、取得した内容のうちのソフトウェアＢの識別子と、ソフトウェアＢにメモリブロックを割り当てた時点を示す時点情報と、を取得する。
【０１０１】
次に、制御装置１００は、取得したソフトウェアＢの識別子を用いて、実行中のソフトウェアの中に、ソフトウェアＢがあるか否かを判定する。ここで、制御装置１００は、実行中のソフトウェアの中に、ソフトウェアＢがないため、ソフトウェアＢに割り当てたメモリブロックを解放する。メモリブロックを解放する処理については、図１０に示した処理と同様のため、説明を省略する。
【０１０２】
また、制御装置１００は、実行中のソフトウェアの中に、ソフトウェアＢがある場合、取得した時点情報が示す時点と、時間情報管理テーブル４００の２番目のレコードの時点情報が示す時点と、が一致するか否かを判定する。ここで、制御装置１００は、時点が一致しない場合、ソフトウェアＢに割り当てたメモリブロックを解放する。メモリブロックを解放する処理については、図１０に示した処理と同様のため、説明を省略する。
【０１０３】
一方で、制御装置１００は、取得した時点情報が示す時点と、時間情報管理テーブル４００の２番目のレコードの時点情報が示す時点と、が一致する場合、ソフトウェアＢに割り当てたメモリブロックを解放しない。
【０１０４】
図１３は、図１２におけるヒープメモリＭの更新結果を示す説明図である。制御装置１００は、図１２の処理を実行することにより、図１３に示すようにヒープメモリＭを更新する。これにより、制御装置１００は、既に実行終了したソフトウェアによって確保されたままのメモリブロックを解放することができる。したがって、制御装置１００は、既に実行終了したソフトウェアによって確保されたままのメモリブロックが増大してヒープメモリＭのメモリブロックが不足することを防止することができる。結果として、制御装置１００は、ソフトウェアに割り当てるヒープメモリＭ内のメモリブロックが不足することを防止し、ソフトウェアを正常に実行することができる。
【０１０５】
一方で、制御装置１００は、実行中のソフトウェアによって確保されたままのメモリブロックを解放しない。したがって、制御装置１００は、実行中のソフトウェアが使用しているメモリブロックを解放して実行中のソフトウェアに不具合が発生することを防止することができる。結果として、制御装置１００は、ソフトウェアを正常に実行することができる。
【０１０６】
図１４は、制御装置１００の判定処理に基づく解放処理における時間情報管理テーブル４００の更新内容を示す説明図である。図１４において、制御装置１００は、ソフトウェアＢに割り当てたメモリブロックを解放するとき、時間情報管理テーブル４００を更新する。ここで、図１４は、図６の（４）においてソフトウェアＢに割り当てたメモリブロックを解放したときに時間情報管理テーブル４００を更新する場合に対応する。制御装置１００は、ソフトウェアＢの識別子が１であるため、時間情報管理テーブル４００の２番目のレコードを初期化して、０ｘ００００を記憶する。
【０１０７】
図１５は、図１４における時間情報管理テーブル４００の更新結果を示す説明図である。制御装置１００は、図１４の処理を実行することにより、図１５に示すように時間情報管理テーブル４００を更新する。これにより、制御装置１００は、時間情報管理テーブル４００を更新することができる。
【０１０８】
（制御装置１００の制御処理手順の一例）
次に、図１６を用いて、制御装置１００の制御処理手順の一例について説明する。
【０１０９】
図１６は、制御装置１００の制御処理手順の一例を示すシーケンス図である。図１６において、実行部５０１は、ＯＳを読み込んでＯＳを実行して制御装置１００を起動する（ステップＳ１６０１）。次に、実行部５０１は、更新部５０２に、初期化処理要求を送信する（ステップＳ１６０２）。更新部５０２は、初期化処理要求を検出して、初期化処理を実行する（ステップＳ１６０３）。ここで、更新部５０２は、初期化処理を終了すると、実行部５０１に応答を送信する。
【０１１０】
実行部５０１は、ソフトウェアを実行する（ステップＳ１６０４）。実行部５０１は、ソフトウェア内のｍａｌｌｏｃ関数を実行することにより、更新部５０２および制御部５０６に、確保要求を送信する（ステップＳ１６０５）。更新部５０２および制御部５０６は、確保処理を実行する（ステップＳ１６０６）。ここで、更新部５０２および制御部５０６は、確保処理を終了すると、実行部５０１に応答を送信する。
【０１１１】
また、ここで、実行部５０１が実行するソフトウェアが強制終了したとする。計時部５０３は、時間管理処理を実行する（ステップＳ１６０７）。計時部５０３は、時間管理処理を実行することにより、更新部５０２、取得部５０４、判定部５０５、および制御部５０６は、判定要求を送信する。
【０１１２】
更新部５０２、取得部５０４、判定部５０５、および制御部５０６は、判定要求を検出すると、判定処理を実行する（ステップＳ１６０８）。ここで、更新部５０２、取得部５０４、判定部５０５、および制御部５０６は、判定処理を終了すると、計時部５０３に応答を送信する。
【０１１３】
これにより、制御装置１００は、既に実行終了したソフトウェアによって確保されたままのメモリブロックを解放することができる。したがって、制御装置１００は、既に実行終了したソフトウェアによって確保されたままのメモリブロックが増大してヒープメモリＭのメモリブロックが不足することを防止することができる。結果として、制御装置１００は、ソフトウェアに割り当てるヒープメモリＭ内のメモリブロックが不足することを防止し、ソフトウェアを正常に実行することができる。
【０１１４】
一方で、制御装置１００は、実行中のソフトウェアによって確保されたままのメモリブロックを解放しない。したがって、制御装置１００は、実行中のソフトウェアが使用しているメモリブロックを解放して実行中のソフトウェアに不具合が発生することを防止することができる。結果として、制御装置１００は、ソフトウェアを正常に実行することができる。
【０１１５】
（制御装置１００の初期化処理手順の一例）
次に、図１７を用いて、制御装置１００の初期化処理手順の一例について説明する。
【０１１６】
図１７は、制御装置１００の初期化処理手順の一例を示すフローチャートである。図１７において、制御装置１００は、ヒープメモリＭの先頭アドレスを取得する（ステップＳ１７０１）。次に、制御装置１００は、メモリブロックヘッダを作成して、取得した先頭アドレスに基づいて、メモリブロックヘッダの各フィールドに情報を設定する（ステップＳ１７０２）。そして、制御装置１００は、メモリブロックヘッダを作成して、メモリブロックヘッダの各フィールドに情報を設定する（ステップＳ１７０３）。これにより、制御装置１００は、ヒープメモリＭを初期化することができる。
【０１１７】
（制御装置１００の確保処理手順の一例）
次に、図１８を用いて、制御装置１００の確保処理手順の一例について説明する。
【０１１８】
図１８は、制御装置１００の確保処理手順の一例を示すフローチャートである。図１８において、制御装置１００は、全てのメモリブロックを選択したか否かを判定する（ステップＳ１８０１）。ここで、全てのメモリブロックを選択していない場合（ステップＳ１８０１：Ｎｏ）、制御装置１００は、ヒープメモリヘッダおよびメモリブロックヘッダを参照して、メモリブロックを選択する（ステップＳ１８０２）。
【０１１９】
次に、制御装置１００は、選択したメモリブロックが、未使用であって、確保要求されたサイズ以上であるか否かを判定する（ステップＳ１８０３）。ここで、制御装置１００は、未使用ではない場合、または確保要求されたサイズ未満である場合（ステップＳ１８０３：Ｎｏ）、制御装置１００は、ステップＳ１８０１の処理に戻る。
【０１２０】
一方で、未使用であって、確保要求されたサイズ以上である場合（ステップＳ１８０３：Ｙｅｓ）、制御装置１００は、確保要求を発行したソフトウェアの識別子と、確保した時点を示す時点情報と、を含むデータを生成する（ステップＳ１８０４）。次に、制御装置１００は、選択したメモリブロックの先頭アドレスに、確保要求されたサイズ分のアドレスを加算して、加算したアドレスから後ろの領域を空きメモリブロックとして設定する（ステップＳ１８０５）。
【０１２１】
そして、制御装置１００は、ヒープメモリヘッダおよびメモリブロックヘッダを更新する（ステップＳ１８０６）。次に、選択したメモリブロックのメモリブロックヘッダのｓｉｚｅのフィールドに、確保したメモリブロックのサイズを設定し、ｏｃｃｕｐｉｅｄのフィールドに、使用中を示す１を設定する（ステップＳ１８０７）。
【０１２２】
そして、制御装置１００は、選択したメモリブロックのメモリブロックヘッダのｍｙｉｄのフィールドに、生成したデータを設定する（ステップＳ１８０８）。次に、制御装置１００は、確保した時点を示す時点情報を、時間情報管理テーブル４００に設定する（ステップＳ１８０９）。
【０１２３】
次に、制御装置１００は、選択したメモリブロックの先頭アドレスへのポインタを実行部５０１に送信する（ステップＳ１８１０）。そして、制御装置１００は、確保処理を終了する。
【０１２４】
また、ステップＳ１８０１において、全てのメモリブロックを選択した場合（ステップＳ１８０１：Ｙｅｓ）、制御装置１００は、メモリブロックを確保できなかったとして、ＮＵＬＬポインタを実行部５０１に送信する（ステップＳ１８１１）。そして、制御装置１００は、確保処理を終了する。これにより、制御装置１００は、ソフトウェアにメモリブロックを割り当てることができる。結果として、制御装置１００は、ソフトウェアの処理のために使用するワークエリアとしてメモリブロックを使用して、ソフトウェアを実行することができる。
【０１２５】
（制御装置１００の時間管理処理手順の一例）
次に、図１９を用いて、制御装置１００の時間管理処理手順の一例について説明する。
【０１２６】
図１９は、制御装置１００の時間管理処理手順の一例を示すフローチャートである。図１９において、制御装置１００は、所定時間が経過したか否かを判定する（ステップＳ１９０１）。ここで、所定時間が経過していない場合（ステップＳ１９０１：Ｎｏ）、制御装置１００は、時間管理処理を終了する。
【０１２７】
一方で、所定時間が経過した場合（ステップＳ１９０１：Ｙｅｓ）、制御装置１００は、判定要求を発行する（ステップＳ１９０２）。次に、制御部５０６は、所定時間の計時を初めからやり直す（ステップＳ１９０３）。そして、制御部５０６は、時間管理処理を終了する。これにより、制御装置１００は、一定時間ごとに、判定要求を発行することができる。
【０１２８】
（制御装置１００の判定処理手順の一例）
次に、図２０を用いて、制御装置１００の判定処理手順の一例について説明する。
【０１２９】
図２０は、制御装置１００の判定処理手順の一例を示すフローチャートである。図２０において、制御装置１００は、全てのメモリブロックを選択したか否かを判定する（ステップＳ２００１）。ここで、全てのメモリブロックを選択していない場合（ステップＳ２００１：Ｎｏ）、制御装置１００は、ヒープメモリヘッダおよびメモリブロックヘッダを参照して、メモリブロックを選択する（ステップＳ２００２）。
【０１３０】
次に、制御装置１００は、選択したメモリブロックが、使用中であるか否かを判定する（ステップＳ２００３）。ここで、制御装置１００は、使用中ではない場合（ステップＳ２００３：Ｎｏ）、制御装置１００は、ステップＳ２００１の処理に戻る。
【０１３１】
一方で、使用中である場合（ステップＳ２００３：Ｙｅｓ）、制御装置１００は、選択したメモリブロックのメモリブロックヘッダのｍｙｉｄのフィールドから、選択したメモリブロックを確保したソフトウェアの識別子と、確保した時点を示す時点情報と、を含むデータを取得する（ステップＳ２００４）。次に、制御装置１００は、時間情報管理テーブル４００から、取得したデータに含まれるソフトウェアの識別子により識別されるソフトウェアがメモリブロックを確保した最新の時点を示す時点情報を取得する（ステップＳ２００５）。
【０１３２】
そして、制御装置１００は、取得したデータに含まれる時点情報が示す時点と、取得した最新の時点を示す時点情報が示す最新の時点と、が一致するか否かを判定する（ステップＳ２００６）。ここで、一致しない場合（ステップＳ２００６：Ｎｏ）、制御装置１００は、ステップＳ２００１の処理に戻る。
【０１３３】
一方で、一致する場合（ステップＳ２００６：Ｙｅｓ）、制御装置１００は、ソフトウェアの識別子から、ソフトウェアの状態を特定する（ステップＳ２００７）。次に、制御装置１００は、ソフトウェアの状態がアイドル状態か否かを判定する（ステップＳ２００８）。ここで、アイドル状態ではない場合（ステップＳ２００８：Ｎｏ）、制御装置１００は、ステップＳ２００１の処理に戻る。一方で、アイドル状態である場合（ステップＳ２００８：Ｙｅｓ）、制御装置１００は、解放処理を実行して（ステップＳ２００９）、ステップＳ２００１の処理に戻る。
【０１３４】
また、ステップＳ２００１において、全てのメモリブロックを選択した場合（ステップＳ２００１：Ｙｅｓ）、制御装置１００は、解放するメモリブロックがないとして、判定処理を終了する。これにより、制御装置１００は、ソフトウェアに割り当てられたメモリブロックが異常メモリブロックであるか否かを判定することができる。
【０１３５】
（制御装置１００の解放処理手順の一例）
次に、図２１を用いて、制御装置１００の解放処理手順の一例について説明する。
【０１３６】
図２１は、制御装置１００の解放処理手順の一例を示すフローチャートである。図２１において、制御装置１００は、選択したメモリブロックの前にあるメモリブロックが未使用であるか否かを判定する（ステップＳ２１０１）。ここで、制御装置１００は、未使用ではない場合（ステップＳ２１０１：Ｎｏ）、ステップＳ２１０３の処理に移行する。
【０１３７】
一方で、未使用である場合（ステップＳ２１０１：Ｙｅｓ）、制御装置１００は、選択したメモリブロックを、選択したメモリブロックの前にあるメモリブロックに結合する（ステップＳ２１０２）。
【０１３８】
次に、制御装置１００は、選択したメモリブロックの後ろにあるメモリブロックが未使用であるか否かを判定する（ステップＳ２１０３）。ここで、制御装置１００は、未使用ではない場合（ステップＳ２１０３：Ｎｏ）、ステップＳ２１０５の処理に移行する。
【０１３９】
一方で、未使用である場合（ステップＳ２１０３：Ｙｅｓ）、制御装置１００は、選択したメモリブロックに、選択したメモリブロックの後ろにあるメモリブロックを結合する（ステップＳ２１０４）。
【０１４０】
次に、制御装置１００は、選択したメモリブロック、または結合したメモリブロックのメモリブロックヘッダに情報を設定して、未使用のメモリブロックに設定する（ステップＳ２１０５）。そして、制御装置１００は、選択したメモリブロック、または結合したメモリブロックの内容をクリアする（ステップＳ２１０６）。次に、制御装置１００は、ヒープメモリヘッダに情報を設定する（ステップＳ２１０７）。そして、制御装置１００は、解放処理を終了する。これにより、制御装置１００は、異常メモリブロックを解放することができる。
【０１４１】
以上説明したように、制御装置１００によれば、ソフトウェアに確保されたメモリブロックについて、実行中のソフトウェアの中に当該ソフトウェアがなければ、異常メモリブロックであると判定することができる。これにより、制御装置１００は、既に実行終了したソフトウェアによって確保されたままのメモリブロックを解放することができる。
【０１４２】
したがって、制御装置１００は、既に実行終了したソフトウェアによって確保されたままのメモリブロックが増大してヒープメモリＭのメモリブロックが不足することを防止することができる。結果として、制御装置１００は、ソフトウェアに割り当てるヒープメモリＭ内のメモリブロックが不足することを防止し、ソフトウェアを正常に実行することができる。また、制御装置１００は、ヒープメモリＭ内の空きメモリブロックを纏めることができ、使用中のメモリブロックを探索する効率を向上させることができる。
【０１４３】
ここで、例えば、ソフトウェアの実行開始から所定時間が経過したときに自動的にメモリブロックを解放することが考えられる。しかしながら、この場合、所定時間が経過したときにソフトウェアがまだ実行中であると、ソフトウェアが使用中のメモリブロックを解放して、ソフトウェアが異常動作してしまうことがある。一方で、制御装置１００は、実行中のソフトウェアによって確保されたままのメモリブロックを解放しない。したがって、制御装置１００は、実行中のソフトウェアが使用しているメモリブロックを解放して実行中のソフトウェアに不具合が発生することを防止することができる。結果として、制御装置１００は、ソフトウェアを正常に実行することができる。
【０１４４】
また、制御装置１００によれば、メモリブロックを確保した時点を示す時点情報をメモリブロックに対応付けて記憶し、ソフトウェアの識別子とソフトウェアがメモリブロックを確保した最新の時点を示す時点情報とを対応付けて記憶することができる。これにより、制御装置１００は、メモリブロックを確保した時点と、ソフトウェアがメモリブロックを確保した最新の時点とが一致するか否かを判定して、ソフトウェアの識別子が使い回しされているかを判定することができる。したがって、制御装置１００は、ソフトウェアの識別子に使用するデータ量を低減することができる。
【０１４５】
なお、本実施の形態で説明した制御方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本制御プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本制御プログラムは、インターネット等のネットワークを介して配布してもよい。
【０１４６】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０１４７】
（付記１）コンピュータが、
メモリ内の記憶領域のうちのソフトウェアからの割当要求に応じて前記ソフトウェアが使用する記憶領域として割り当てた使用領域と対応付けて、前記ソフトウェアの識別子を記憶する記憶部から、前記メモリ内のいずれかの使用領域に対応するソフトウェアの識別子を取得し、
実行中のソフトウェアの中に、取得した前記識別子により識別されるソフトウェアがあるか否かを判定し、
前記識別子により識別されるソフトウェアがないと判定した場合、前記いずれかの使用領域を解放する、
処理を実行することを特徴とする制御方法。
【０１４８】
（付記２）前記コンピュータが、
前記ソフトウェアからの前記ソフトウェアが使用する記憶領域として割り当てた使用領域の解放要求があった場合、前記解放要求から特定される使用領域に対応する前記ソフトウェアの識別子を前記記憶部から削除する処理を実行することを特徴とする付記１に記載の制御方法。
【０１４９】
（付記３）前記記憶部は、前記ソフトウェアからの割当要求に応じて前記ソフトウェアが使用する記憶領域として割り当てた使用領域と対応付けて、前記ソフトウェアの識別子と、前記ソフトウェアが使用する記憶領域として使用領域を割り当てた時点を示す時点情報と、を記憶し、
前記取得する処理は、
前記記憶部から、前記いずれかの使用領域に対応するソフトウェアの識別子と、前記いずれかの使用領域を割り当てた時点を示す時点情報と、を取得し、
前記判定する処理は、
実行中のソフトウェアの中に、取得した前記識別子により識別されるソフトウェアがあるか否かを判定し、取得した前記識別子により識別されるソフトウェアがあると判定した場合、前記ソフトウェアの識別子と、前記ソフトウェアからの割当要求に応じて前記ソフトウェアが使用する記憶領域として使用領域を割り当てた時点を示す時点情報と、を対応付けて記憶する第２の記憶部を参照して、取得した前記時点情報が、取得した前記識別子に対応する最新の時点情報と一致するか否かを判定し、
前記解放する処理は、
取得した前記時点情報が前記最新の時点情報と一致しないと判定した場合、前記いずれかの使用領域を解放することを特徴とする付記１または２に記載の制御方法。
【０１５０】
（付記４）前記コンピュータが、
前記ソフトウェアからの割当要求があった場合、前記第２の記憶部に前記ソフトウェアの識別子に対応する時点情報が記憶されていれば、当該時点情報の代わりに、前記割当要求に応じて前記ソフトウェアが使用する記憶領域として使用領域を割り当てた時点を示す時点情報を記憶する処理を実行することを特徴とする付記３に記載の制御方法。
【０１５１】
（付記５）メモリ内の記憶領域のうちのソフトウェアからの割当要求に応じて前記ソフトウェアが使用する記憶領域として割り当てた使用領域と対応付けて、前記ソフトウェアの識別子を記憶する記憶部と、
前記記憶部から、前記メモリ内のいずれかの使用領域に対応するソフトウェアの識別子を取得する取得部と、
実行中のソフトウェアの中に、前記取得部によって取得された前記識別子により識別されるソフトウェアがあるか否かを判定する判定部と、
前記判定部によって前記識別子により識別されるソフトウェアがないと判定された場合、前記いずれかの使用領域を解放する制御部と、
を有することを特徴とする制御装置。
【０１５２】
（付記６）コンピュータに、
メモリ内の記憶領域のうちのソフトウェアからの割当要求に応じて前記ソフトウェアが使用する記憶領域として割り当てた使用領域と対応付けて、前記ソフトウェアの識別子を記憶する記憶部から、前記メモリ内のいずれかの使用領域に対応するソフトウェアの識別子を取得し、
実行中のソフトウェアの中に、取得した前記識別子により識別されるソフトウェアがあるか否かを判定し、
前記識別子により識別されるソフトウェアがないと判定した場合、前記いずれかの使用領域を解放する、
処理を実行させることを特徴とする制御プログラム。
【０１５３】
（付記７）コンピュータに、
メモリ内の記憶領域のうちのソフトウェアからの割当要求に応じて前記ソフトウェアが使用する記憶領域として割り当てた使用領域と対応付けて、前記ソフトウェアの識別子を記憶する記憶部から、前記メモリ内のいずれかの使用領域に対応するソフトウェアの識別子を取得し、
実行中のソフトウェアの中に、取得した前記識別子により識別されるソフトウェアがあるか否かを判定し、
前記識別子により識別されるソフトウェアがないと判定した場合、前記いずれかの使用領域を解放する、
処理を実行させることを特徴とする制御プログラムを記録したコンピュータに読み取り可能な記録媒体。
【符号の説明】
【０１５４】
１００  制御装置
５０１  実行部
５０２  更新部
５０３  計時部
５０４  取得部
５０５  判定部
５０６  制御部
【図１】
2014206871.tif 000003
【図２】
2014206871.tif 000004
【図３】
2014206871.tif 000005
【図４】
2014206871.tif 000006
【図５】
2014206871.tif 000007
【図６】
2014206871.tif 000008
【図７】
2014206871.tif 000009
【図８】
2014206871.tif 000010
【図９】
2014206871.tif 000011
【図１０】
2014206871.tif 000012
【図１１】
2014206871.tif 000013
【図１２】
2014206871.tif 000014
【図１３】
2014206871.tif 000015
【図１４】
2014206871.tif 000016
【図１５】
2014206871.tif 000017
【図１６】
2014206871.tif 000018
【図１７】
2014206871.tif 000019
【図１８】
2014206871.tif 000020
【図１９】
2014206871.tif 000021
【図２０】
2014206871.tif 000022
【図２１】
2014206871.tif 000023