以下に添付図面を参照して、本発明にかかる制御方法、制御装置、制御プログラム、および記録媒体の実施の形態を詳細に説明する。
(制御装置100のヒープメモリ制御の一例)
図1は、実施の形態にかかる制御装置100のヒープメモリ制御の一例を示す説明図である。制御装置100は、既に実行終了したソフトウェアによって確保されたままのヒープメモリM内のメモリブロックを解放するコンピュータである。
ここで、ソフトウェアとは、規定された処理を制御装置100に実行させる命令コードであって、例えば、タスクであってもよいし、プロセスであってもよいし、スレッドであってもよい。実行終了したソフトウェアとは、例えば、規定された処理を実行終了したソフトウェアであってもよいし、killコマンドによって強制終了したソフトウェアであってもよいし、バグによって強制終了したソフトウェアであってもよい。
換言すれば、実行終了したソフトウェアとは、例えば、実行中のソフトウェアの中にないソフトウェアである。実行中のソフトウェアとは、例えば、制御装置100がマルチタスク方式であれば、タイムスライスの割り当てを待つ待機中のソフトウェアを含む。
ヒープメモリMとは、例えば、ソフトウェアによって使用される記憶領域である。メモリブロックとは、例えば、ヒープメモリM内の一区切りの記憶領域であって、ヘッダ情報を有する。ヒープメモリM内のヘッダ情報とは、例えば、メモリブロックの属性を示す情報である。
確保とは、例えば、ヒープメモリM内のメモリブロックを、ソフトウェアが使用する記憶領域として割り当てることである。解放とは、例えば、ソフトウェアが使用する記憶領域として割り当てたメモリブロックを、特定のソフトウェアが使用する記憶領域として割り当てられていない状態に戻すことである。以下の説明では、特定のソフトウェアが使用する記憶領域として割り当てられていない状態のメモリブロックを「空きメモリブロック」と表記する場合がある。
図1の例では、制御装置100は、ヒープメモリMを有する。また、制御装置100は、ソフトウェアT1〜T3を実行している。また、制御装置100は、ヒープメモリM内のメモリブロックM1〜M3は、各々、ソフトウェアT1〜T3によって確保されている。また、制御装置100は、ソフトウェアT1〜T3の各々のソフトウェアの識別子を、ソフトウェアT1〜T3の各々のソフトウェアによって確保されたメモリブロックと対応付けて記憶する記憶部101を有する。
ここで、実行中のソフトウェアT3がバグによって強制終了した場合を例に挙げて、ソフトウェアT3によって確保されたままのメモリブロックを制御装置100が解放する動作の一例について説明する。
図1において、(1)制御装置100は、記憶部101を参照して、いずれかのソフトウェアによって確保されたままのメモリブロックM1〜M3を特定する。(2)制御装置100は、特定したメモリブロックM1〜M3を確保したままのソフトウェアT1〜T3の各々のソフトウェアが、実行中のソフトウェアの中にあるか否かを判定する。(3)制御装置100は、実行中のソフトウェアの中にないと判定したソフトウェアによって確保されたままのメモリブロックを解放する。以下の説明では、実行中のソフトウェアの中にないと判定したソフトウェアによって確保されたままのメモリブロックを「異常メモリブロック」と表記する場合がある。
図1の例では、制御装置100は、具体的には、記憶部101を参照して、メモリブロックM1を確保したままのソフトウェアT1を特定する。次に、制御装置100は、特定したソフトウェアT1が、実行中のソフトウェアの中にあるか否かを判定する。そして、制御装置100は、ソフトウェアT1が実行中のソフトウェアの中にあると判定して、ソフトウェアT1によって確保されたままのメモリブロックM1を解放しない。
また、制御装置100は、具体的には、記憶部101を参照して、メモリブロックM3を確保したままのソフトウェアT3を特定する。次に、制御装置100は、特定したソフトウェアT3が、実行中のソフトウェアの中にあるか否かを判定する。そして、制御装置100は、ソフトウェアT3が実行中のソフトウェアの中にないと判定して、ソフトウェアT3によって確保されたままのメモリブロックM3を解放する。
これにより、制御装置100は、既に実行終了したソフトウェアによって確保されたままのメモリブロックを解放することができる。したがって、制御装置100は、既に実行終了したソフトウェアによって確保されたままのメモリブロックが増大してヒープメモリMのメモリブロックが不足(枯渇)することを防止することができる。メモリブロックの不足とは、ヒープメモリM内にソフトウェアに割り当てるべきサイズのメモリブロックがなくなることである。
換言すれば、制御装置100は、メモリリークを防止することができる。結果として、制御装置100は、ソフトウェアに割り当てるヒープメモリM内のメモリブロックが不足することを防止し、ソフトウェアを正常に実行することができる。
一方で、制御装置100は、実行中のソフトウェアによって確保されたままのメモリブロックを解放しない。したがって、制御装置100は、実行中のソフトウェアが使用しているメモリブロックを解放して実行中のソフトウェアに不具合が発生することを防止することができる。結果として、制御装置100は、ソフトウェアを正常に実行することができる。
図1の例では、制御装置100は、マルチタスク方式であったが、これに限らない。例えば、制御装置100は、シングルタスク方式であってもよい。
(制御装置100のハードウェア構成例)
図2は、制御装置100のハードウェア構成例を示すブロック図である。図2において、制御装置100は、CPU(Central Processing Unit)201と、ROM(Read Only Memory)202と、RAM(Random Access Memory)203と、磁気ディスクドライブ(Hard Disk Drive)204と、磁気ディスク205と、光ディスクドライブ206と、光ディスク207と、ディスプレイ208と、インターフェース(I/F:Interface)209と、キーボード210と、マウス211と、スキャナ212と、プリンタ213と、を備えている。また、各構成部はバス200によってそれぞれ接続されている。
ここで、CPU201は、制御装置100の全体の制御を司る。ROM202は、ブートプログラムなどのプログラムを記憶している。RAM203は、CPU201のワークエリアとして使用される。RAM203は、例えば、ヒープメモリMになる。磁気ディスクドライブ204は、CPU201の制御にしたがって磁気ディスク205に対するデータのリード/ライトを制御する。磁気ディスク205は、磁気ディスクドライブ204の制御で書き込まれたデータを記憶する。
光ディスクドライブ206は、CPU201の制御にしたがって光ディスク207に対するデータのリード/ライトを制御する。光ディスク207は、光ディスクドライブ206の制御で書き込まれたデータを記憶したり、光ディスク207に記憶されたデータをコンピュータに読み取らせたりする。
ディスプレイ208は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ208は、例えば、液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
I/F209は、通信回線を通じてLAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどのネットワーク214に接続され、このネットワーク214を介して他の装置に接続される。そして、I/F209は、ネットワーク214と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。I/F209には、例えば、モデムやLANアダプタなどを採用することができる。
キーボード210は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス211は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
スキャナ212は、画像を光学的に読み取り、制御装置100内に画像データを取り込む。なお、スキャナ212は、OCR(Optical Character Reader)機能を持たせてもよい。また、プリンタ213は、画像データや文書データを印刷する。プリンタ213には、例えば、レーザプリンタやインクジェットプリンタを採用することができる。なお、光ディスクドライブ206、光ディスク207、ディスプレイ208、キーボード210、マウス211、スキャナ212、およびプリンタ213の少なくともいずれか1つは、なくてもよい。
(ヒープメモリMのデータ構造の一例)
図3は、ヒープメモリMのデータ構造の一例を示す説明図である。
図3に示すように、ヒープメモリMは、ヒープメモリM全体の管理情報を記憶するヒープメモリヘッダ301と、ソフトウェアに割り当てるメモリブロックと、メモリブロックの管理情報を記憶するメモリブロックヘッダ302と、を含む。
ヒープメモリヘッダ301は、size、magic、occupied、myid、next、およびprev、のフィールドを有し、各フィールドに情報を設定することによりヒープメモリM全体の管理情報を記憶する。
sizeには、ヘッダのByte数が記憶される。magicには、マジックナンバーが記憶される。マジックナンバーとは、例えば、ヒープメモリMの形式を識別する識別子である。occupiedには、ヒープメモリMが使用中であるか否かを示す情報が記憶される。myidには、ヒープメモリヘッダに固有の識別子が記憶される。nextには、複数のメモリブロックのうちで先頭にあるメモリブロックの管理情報を記憶するメモリブロックヘッダへのポインタが記憶される。prevには、複数のメモリブロックのうちで末尾にあるメモリブロックの管理情報を記憶するメモリブロックヘッダへのポインタが記憶される。
メモリブロックヘッダ302は、size、magic、occupied、myid、next、およびprev、のフィールドを有し、各フィールドに情報を設定することによりメモリブロックの管理情報を記憶する。
sizeには、メモリブロックのByte数が記憶される。magicには、マジックナンバーが記憶される。occupiedには、メモリブロックが使用中であるか否かを示す情報が記憶される。myidには、メモリブロックを確保したソフトウェアの識別子が記憶される。ソフトウェアの識別子とは、例えば、タスクIDやプロセスID、タスクIDとタスクがメモリブロックを確保した時点を示す時点情報を結合したデータ、または結合したデータをハッシュ関数に代入することにより得られるハッシュ値である。nextには、複数のメモリブロックのうちで1つ後ろにあるメモリブロックの管理情報を記憶するメモリブロックヘッダへのポインタが記憶される。prevには、複数のメモリブロックのうちで1つ前にあるメモリブロックの管理情報を記憶するメモリブロックヘッダへのポインタが記憶される。
(時間情報管理テーブル400のデータ構造の一例)
図4は、時間情報管理テーブル400のデータ構造の一例を示す説明図である。
図4に示すように、時間情報管理テーブル400は、timeのフィールドを含む。timeには、ソフトウェアがメモリブロックを確保した最新の時点を示す時点情報が記憶される。時点を示す時点情報とは、例えば、年月日をハッシュ関数に代入することにより得られるハッシュ値である。
図4の例では、時間情報管理テーブル400のレコードの先頭からの番号が、ソフトウェアの識別子に対応する。換言すれば、先頭から1番目のレコードは、ソフトウェアの識別子「1」に対応し、ソフトウェアの識別子「1」により識別されるソフトウェアがメモリブロックを確保した最新の時点を示す時点情報を記憶する。このため、時間情報管理テーブル400は、識別子最大値の分のレコードを有する。
このように、制御装置100は、ソフトウェアの識別子に対応付けてソフトウェアがメモリブロックを確保した最新の時点を示す時点情報を記憶する。これにより、制御装置100は、既に実行終了したソフトウェアの識別子を使い回した場合に、同一の識別子を持つ複数のソフトウェアによってメモリブロックが確保されたとしても対応することができる。
制御装置100は、例えば、或る識別子により識別される第1のソフトウェアによって第1のメモリブロックが確保された場合、第1のメモリブロックに第1のメモリブロックが確保された時点を示す第1の時点情報を対応付けて記憶する。さらに、制御装置100は、或る識別子と、第1の時点情報とを対応付けて記憶する。
また、制御装置100は、第1のソフトウェアが強制終了した後、或る識別子を第2のソフトウェアに割り振ったとする。そして、制御装置100は、或る識別子により識別される第2のソフトウェアによって第2のメモリブロックが確保された場合、第2のメモリブロックに、第2のメモリブロックが確保された時点を示す第2の時点情報を対応付けて記憶する。さらに、制御装置100は、或る識別子と、第2の時点情報とを対応付けて記憶する。
ここで、制御装置100は、第1のメモリブロックが異常メモリブロックであるか否かを判定する。制御装置100は、第1のメモリブロックに対応する第1の時点情報が、或る識別子に対応する第1の時点情報および第2の時点情報の中で最新の時点情報であるか否かを判定する。
これにより、制御装置100は、第1のメモリブロックを確保したソフトウェアが、現在或る識別子の割り振られている第2のソフトウェアではなく、過去に或る識別子が割り振られていたソフトウェアであると判定する。したがって、制御装置100は、第1のメモリブロックを確保したソフトウェアが既に実行終了しているとして、第1のメモリブロックを異常メモリブロックと判定することができる。
ここでは、制御装置100は、或る識別子と対応付けて第1の時点情報と第2の時点情報とを両方記憶したが、これに限らない。例えば、制御装置100は、或る識別子と対応付けて最新の時点情報を記憶してもよい。これにより、制御装置100は、時点情報の記憶に使用する記憶領域のサイズを低減することができる。
(制御装置100の機能的構成例)
次に、図5を用いて、制御装置100の機能的構成例について説明する。
図5は、制御装置100の機能的構成例を示すブロック図である。制御装置100は、記憶部101と、実行部501と、更新部502と、計時部503と、取得部504と、判定部505と、制御部506と、を含む。
記憶部101と、実行部501と、更新部502と、計時部503と、取得部504と、判定部505と、制御部506とは、例えば、図2に示したROM202、RAM203、磁気ディスク205、光ディスク207などの記憶装置に記憶されたプログラムをCPU201に実行させることにより、または、I/F209により、その機能を実現する。
記憶部101は、メモリ内の記憶領域のうちのソフトウェアからの割当要求に応じてソフトウェアが使用する記憶領域として割り当てた使用領域と対応付けて、ソフトウェアの識別子を記憶する。記憶部101は、例えば、メモリブロックヘッダのmyidのフィールドを用いて、メモリブロックと対応付けてソフトウェアの識別子を記憶する。記憶部101は、ソフトウェアからの割当要求に応じてソフトウェアが使用する記憶領域として割り当てた使用領域と対応付けて、ソフトウェアの識別子と、ソフトウェアが使用する記憶領域として使用領域を割り当てた時点を示す時点情報と、を記憶してもよい。
また、記憶部101は、ソフトウェアの識別子と、ソフトウェアからの割当要求に応じてソフトウェアが使用する記憶領域として使用領域を割り当てた時点を示す時点情報と、を対応付けて記憶する。記憶部101は、例えば、時間情報管理テーブル400を用いて、ソフトウェアの識別子と、ソフトウェアの識別子が示すソフトウェアがメモリブロックを確保した時点を示す時点情報と、を対応付けて記憶する。
実行部501は、OSやソフトウェアを実行する。実行部501は、例えば、OSを実行して、ヒープメモリMの初期化要求を発行する。また、実行部501は、例えば、ソフトウェアを実行して、malloc関数を実行することにより、メモリブロックの確保要求を発行する。また、実行部501は、例えば、ソフトウェアを実行して、free関数を実行することにより、メモリブロックの解放要求を発行する。実行結果は、例えば、RAM203、磁気ディスク205、光ディスク207などの記憶領域に記憶される。これにより、実行部501は、確保処理や解放処理などのトリガを発生させることができる。
更新部502は、ヒープメモリMを更新する。更新部502は、例えば、実行部501によって発行された初期化要求を検出して、ヒープメモリMの初期化処理を実行してヒープメモリMを初期化する。また、更新部502は、例えば、実行部501によって発行されたヒープメモリMの確保要求を検出して、ヒープメモリMの確保処理を実行して、OSを介してヒープメモリM内のメモリブロックをソフトウェアに割り当てる。また、更新部502は、例えば、実行部501によって発行されたヒープメモリMの解放要求を検出して、ヒープメモリMの解放処理を実行して、OSを介してヒープメモリM内のメモリブロックを解放する。
また、更新部502は、ソフトウェアからの割当要求があった場合、記憶部101に、割当要求された使用領域と対応付けて、ソフトウェアの識別子を記憶する。更新部502は、例えば、実行部501によって発行されたヒープメモリMの確保要求を検出して、実行部501によって実行されて確保要求を発行したソフトウェアにメモリブロックを割り当てる。そして、更新部502は、メモリブロックヘッダのmyidのフィールドにソフトウェアの識別子を記憶する。また、更新部502は、メモリブロックヘッダのmyidのフィールドに、ソフトウェアの識別子と、ソフトウェアがメモリブロックを確保した時点を示す時点情報と、を記憶してもよい。
また、更新部502は、ソフトウェアからの割当要求があった場合、記憶部101にソフトウェアの識別子に対応する時点情報が記憶されているか否かを判定する。そして、更新部502は、記憶されていれば、当該時点情報の代わりに、割当要求に応じてソフトウェアが使用する記憶領域として使用領域を割り当てた時点を示す時点情報を記憶する。更新部502は、例えば、実行部501によって発行されたヒープメモリMの確保要求を検出して、時間情報管理テーブル400において実行部501によって実行されて確保要求を発行したソフトウェアの識別子に対応する時点情報を、最新の時点情報に更新する。
また、更新部502は、ソフトウェアからのソフトウェアが使用する記憶領域として割り当てた使用領域の解放要求があった場合、解放要求から特定される使用領域に対応するソフトウェアの識別子を記憶部101から削除する。更新部502は、例えば、実行部501によって発行されたヒープメモリMの解放要求を検出して、解放要求されたメモリブロックのメモリブロックヘッダから、実行部501によって実行されて解放要求を発行したソフトウェアの識別子を削除する。
また、更新部502は、後述する判定部505から使用領域の更新要求があった場合、更新要求から特定される使用領域に対応するソフトウェアの識別子を記憶部101から削除してもよい。更新部502は、例えば、判定部505からのヒープメモリMの更新要求を検出して、更新要求されたメモリブロックのメモリブロックヘッダから、ソフトウェアの識別子を削除する。これにより、更新部502は、ヒープメモリヘッダやヒープメモリMやメモリブロックヘッダや時間情報管理テーブルを、最新の状態に更新することができる。
計時部503は、一定時間ごとに判定要求を発行する。これにより、計時部503は、判定処理のトリガを発生させることができる。取得部504は、計時部503からの判定要求を検出し、実行部501からの確保要求を検出し、実行部501からの解放要求を検出し、または判定部505からの更新要求を検出した場合、以下に示す処理を実行する。
取得部504は、記憶部101から、メモリ内のいずれかの使用領域に対応するソフトウェアの識別子を取得する。取得部504は、例えば、いずれかのメモリブロックのメモリブロックヘッダのmyidのフィールドから、ソフトウェアの識別子を取得する。また、取得部504は、記憶部101から、いずれかの使用領域を割り当てた時点を示す時点情報を取得してもよい。取得部504は、例えば、いずれかのメモリブロックのメモリブロックヘッダのmyidのフィールドから、ソフトウェアの識別子とともに、ソフトウェアがメモリブロックを確保した時点を示す時点情報を取得してもよい。取得したデータは、例えば、RAM203、磁気ディスク205、光ディスク207などの記憶領域に記憶される。これにより、取得部504は、判定部505による判定処理に用いるデータを取得することができる。
判定部505は、実行中のソフトウェアの中に、取得した識別子により識別されるソフトウェアがあるか否かを判定する。判定部505は、例えば、取得したソフトウェアの識別子を用いて、ソフトウェアの状態を検出して、ソフトウェアがIdle状態である場合に、実行中のソフトウェアの中に取得した識別子により識別されるソフトウェアがないと判定する。
また、判定部505は、取得した識別子により識別されるソフトウェアがあると判定した場合、記憶部101を参照して、取得した時点情報が、取得した識別子に対応する最新の時点情報と一致するか否かを判定してもよい。判定部505は、例えば、取得した識別子により識別されるソフトウェアがあると判定した場合、時間情報管理テーブル400を参照して、取得した時点情報が、取得した識別子に対応する最新の時点情報と一致するか否かを判定してもよい。
判定部505は、識別子により識別されるソフトウェアがないと判定した場合、および、取得した時点情報が最新の時点情報と一致しないと判定した場合、いずれかの使用領域の解放要求と更新要求とを発行する。判定結果は、例えば、RAM203、磁気ディスク205、光ディスク207などの記憶領域に記憶される。これにより、判定部505は、メモリブロックが異常メモリブロックであるか否かを判定することができる。
制御部506は、識別子により識別されるソフトウェアがないと判定した場合、いずれかの使用領域を解放する。また、制御部506は、取得した時点情報が最新の時点情報と一致しないと判定した場合、いずれかの使用領域を解放してもよい。制御部506は、例えば、判定部505からの解放要求を検出して、解放要求されたメモリブロックを解放する。また、制御部506は、ソフトウェアからの割当要求を検出して、ソフトウェアに使用領域を割り当ててもよい。これにより、制御部506は、既に実行終了したソフトウェアによって確保されたままのメモリブロックを解放することができる。
(制御装置100によるヒープメモリ制御の具体例)
次に、図6〜図15を用いて、制御装置100によるヒープメモリ制御の具体例について説明する。
図6は、制御装置100によるヒープメモリ制御の流れを示す説明図である。図6に示すように、制御装置100は、ソフトウェアAと、ソフトウェアBと、制御プログラムと、OSとを実行する。
図6の例では、OSは、一定時間ごとに判定要求を発行する。また、制御プログラムは、OSから発行された判定要求を検出して、上述した取得部504、判定部505、および制御部506の処理を実行する。
(1)ソフトウェアAは、例えば、制御装置100の利用者からの操作を受けて実行される。ここで、ソフトウェアAは、malloc関数を実行し、OSを介して、メモリブロックを確保する。このとき、制御プログラムは、ソフトウェアAの識別子を、確保したメモリブロックのメモリブロックヘッダのmyidのフィールドに記憶する。
(2)ソフトウェアBは、ソフトウェアAを中断させて、ソフトウェアAから切り替わって実行される。また、制御プログラムは、OSから発行された判定要求を検出して、ソフトウェアBを中断させて、ソフトウェアBから切り替わって実行される。
ソフトウェアBは、制御プログラムが終了すると、制御プログラムから切り替わって実行される。ここで、ソフトウェアBは、malloc関数を実行し、OSを介して、メモリブロックを確保する。このとき、制御プログラムは、ソフトウェアBの識別子を、確保したメモリブロックのメモリブロックヘッダのmyidのフィールドに記憶する。
(3)ソフトウェアAは、ソフトウェアBを中断させて、ソフトウェアBから切り替わって実行される。また、制御プログラムは、OSから発行された判定要求を検出して、ソフトウェアAを中断させて、ソフトウェアAから切り替わって実行される。
ソフトウェアAは、制御プログラムが終了すると、制御プログラムから切り替わって実行される。ソフトウェアAは、free関数を実行し、OSを介して、メモリブロックを解放する。このとき、制御プログラムは、ソフトウェアAの識別子を、解放したメモリブロックのメモリブロックヘッダのmyidのフィールドから削除する。ソフトウェアAは、実行終了したとする。
ソフトウェアBは、ソフトウェアAが実行終了したため、ソフトウェアAから切り替わって実行される。ここで、ソフトウェアBは、バグによって強制終了したとする。このため、ソフトウェアBによってメモリブロックは確保されたままになる。
(4)制御プログラムは、OSから発行された判定要求を検出して、実行される。制御プログラムは、ソフトウェアによって確保されたままのメモリブロックのメモリブロックヘッダのmyidのフィールドから、ソフトウェアの識別子を取得する。
次に、制御プログラムは、実行中のソフトウェアの中に、取得した識別子により識別されるソフトウェアBがあるか否かを判定する。ここで、制御プログラムは、実行中のソフトウェアの中に、ソフトウェアBがないため、メモリブロックを異常メモリブロックであると判定して、メモリブロックを解放する。
これにより、制御プログラムは、既に実行終了したソフトウェアによって確保されたままのメモリブロックを解放することができる。したがって、制御プログラムは、既に実行終了したソフトウェアによって確保されたままのメモリブロックが増大してヒープメモリMのメモリブロックが不足することを防止することができる。結果として、制御プログラムは、ソフトウェアに割り当てるヒープメモリM内のメモリブロックが不足することを防止し、ソフトウェアを正常に実行することができる。
図7は、制御装置100の初期化処理におけるヒープメモリMの更新内容を示す説明図である。図7において、制御装置100は、ヒープメモリMを初期化する。ここで、図7は、図6の初期状態に対応する。
図7に示すように、制御装置100は、ヒープメモリヘッダ701を作成し、ヒープメモリMを1つのメモリブロックとして扱い、先頭にメモリブロックヘッダ702を作成する。
制御装置100は、作成したメモリブロックヘッダ702のsizeのフィールドに、メモリブロックのサイズを示す10000Byteを設定する。ここで、メモリブロックのサイズは、例えば、ヒープメモリMのサイズを示す10000Byteからメモリブロックヘッダ702のサイズを減算した結果である。しかしながら、以下の説明では、簡単のため、メモリブロックヘッダ702のサイズを0Byteとして扱うこととする。
制御装置100は、作成したメモリブロックヘッダ702のoccupiedのフィールドに、未使用であることを示す0を設定する。制御装置100は、作成したメモリブロックヘッダ702のmyidのフィールドに、まだソフトウェアに割り当てられていない空きメモリブロックであることを示す0x0を設定する。
制御装置100は、作成したメモリブロックヘッダ702のnextのフィールドに、ヒープメモリヘッダ701の先頭アドレスを設定する。制御装置100は、作成したメモリブロックヘッダ702のprevのフィールドに、ヒープメモリヘッダ701の先頭アドレスを設定する。
制御装置100は、ヒープメモリヘッダ701のnextに、作成したメモリブロックヘッダ702の先頭アドレスを記憶する。制御装置100は、ヒープメモリヘッダ701のprevに、作成したメモリブロックヘッダ702の先頭アドレスを記憶する。これにより、制御装置100は、ヒープメモリMを初期化することができる。
図8は、制御装置100の確保処理におけるヒープメモリMの更新内容を示す説明図である。図8において、制御装置100は、ソフトウェアAに100Byteのメモリブロックを割り当てる。ここで、図8に示すヒープメモリMは、図6の(1)においてソフトウェアAにメモリブロックを割り当てた状態に対応する。
図8に示すように、制御装置100は、先頭のメモリブロックヘッダ702に続く100Byteの記憶領域を、メモリブロックとしてソフトウェアAに割り当てて、残りの9900Byteのメモリブロックの先頭にメモリブロックヘッダ801を作成する。
制御装置100は、先頭のメモリブロックヘッダ702のsizeのフィールドに、ソフトウェアAに割り当てたメモリブロックの記憶領域のサイズを示す100Byteを設定する。制御装置100は、先頭のメモリブロックヘッダ702のoccupiedのフィールドに、使用中であることを示す1を設定する。
制御装置100は、先頭のメモリブロックヘッダ702のmyidのフィールドに、ソフトウェアAの識別子と、ソフトウェアAにメモリブロックを割り当てた時点と、を示す0x00010303を設定する。
制御装置100は、先頭のメモリブロックヘッダ702のnextのフィールドに、作成したメモリブロックヘッダ801の先頭アドレスを設定する。制御装置100は、先頭のメモリブロックヘッダ702のprevのフィールドに、ヒープメモリヘッダ701の先頭アドレスを設定する。
制御装置100は、作成したメモリブロックヘッダ801のsizeのフィールドに、メモリブロックのサイズを示す9900Byteを設定する。制御装置100は、作成したメモリブロックヘッダ801のoccupiedのフィールドに、未使用であることを示す0を設定する。制御装置100は、作成したメモリブロックヘッダ801のmyidのフィールドに、まだソフトウェアに割り当てられていない空きメモリブロックであることを示す0x0を設定する。
制御装置100は、作成したメモリブロックヘッダ801のnextのフィールドに、ヒープメモリヘッダ701の先頭アドレスを設定する。制御装置100は、作成したメモリブロックヘッダ801のprevのフィールドに、メモリブロックヘッダ702の先頭アドレスを設定する。制御装置100は、ヒープメモリヘッダ701のprevを、作成したメモリブロックヘッダ801の先頭アドレスに更新する。これにより、制御装置100は、ソフトウェアAにメモリブロックを割り当てることができる。結果として、制御装置100は、ソフトウェアAの処理のために使用するワークエリアとしてメモリブロックを使用して、ソフトウェアAを実行することができる。
図9は、制御装置100の確保処理における時間情報管理テーブル400の更新内容を示す説明図である。図9において、制御装置100は、ソフトウェアAに100Byteのメモリブロックを割り当てたとき、時間情報管理テーブル400を更新する。ここで、図9は、図6の(1)においてソフトウェアAにメモリブロックを割り当てたときに時間情報管理テーブル400を更新する場合に対応する。
制御装置100は、ソフトウェアAの識別子が1であるため、時間情報管理テーブル400の1番目のレコードにソフトウェアAにメモリブロックを割り当てた時点を示す時点情報0x0303を記憶する。これにより、制御装置100は、ソフトウェアAと対応付けて、ソフトウェアAにメモリブロックを割り当てた最新の時点を示す時点情報を記憶しておくことができる。
また、制御装置100は、図8および図9と同様にして、ソフトウェアBに100Byteのメモリブロックを割り当て、時間情報管理テーブル400を更新したとする。ここで、図8および図9と同様にして、ソフトウェアBに100Byteのメモリブロックを割り当てることは、図6の(2)においてソフトウェアBにメモリブロックを割り当てる場合に対応する。これにより、制御装置100は、ソフトウェアBにメモリブロックを割り当てることができる。結果として、制御装置100は、ソフトウェアBの処理のために使用するワークエリアとしてメモリブロックを使用してソフトウェアBを実行することができる。また、制御装置100は、ソフトウェアBと対応付けて、ソフトウェアBにメモリブロックを割り当てた最新の時点を示す時点情報を記憶しておくことができる。
図10は、制御装置100のソフトウェアAからの解放要求に基づく解放処理におけるヒープメモリMの更新内容を示す説明図である。図10において、制御装置100は、ソフトウェアAに割り当てたメモリブロックを解放する。ここで、図10は、図6の(3)においてソフトウェアAに割り当てたメモリブロックを解放する場合に対応する。
図10に示すように、制御装置100は、先頭のメモリブロックヘッダ702に続く100ByteのソフトウェアAに割り当てたメモリブロックを解放する。
ここで、制御装置100は、メモリブロックヘッダ702のprevとのフィールドを参照して、メモリブロックヘッダ702の前にあるメモリブロックヘッダが使用中であるか否かを判定する。制御装置100は、前にあるメモリブロックヘッダが使用中でないと判定した場合は、前にあるメモリブロックヘッダに、メモリブロックヘッダ702を結合する。
また、制御装置100は、メモリブロックヘッダ702のnextのフィールドを参照して、メモリブロックヘッダ702の後ろにあるメモリブロックヘッダが使用中であるか否かを判定する。制御装置100は、後ろにあるメモリブロックヘッダが使用中でないと判定した場合は、後ろにあるメモリブロックヘッダを、メモリブロックヘッダ702に結合する。図10の例では、制御装置100は、メモリブロックヘッダ702の後ろにあるメモリブロックヘッダ801が使用中であるため、メモリブロックヘッダ801を結合しない。
制御装置100は、先頭のメモリブロックヘッダ702のsizeのフィールドに、100Byteを設定する。制御装置100は、先頭のメモリブロックヘッダ702のoccupiedのフィールドに、未使用であることを示す0を設定する。制御装置100は、先頭のメモリブロックヘッダ702のmyidのフィールドから、ソフトウェアAの識別子と、ソフトウェアAにメモリブロックを割り当てた時点と、を示す0x00010303を削除する。これにより、制御装置100は、ヒープメモリMに空きメモリブロックを増加させることができ、ヒープメモリMが不足することを防止することができる。
図11は、制御装置100のソフトウェアAからの解放要求に基づく解放処理における時間情報管理テーブル400の更新内容を示す説明図である。図11において、制御装置100は、ソフトウェアAに割り当てたメモリブロックを解放するとき、時間情報管理テーブル400を更新する。ここで、図11は、図6の(3)においてソフトウェアAに割り当てたメモリブロックを解放したときに時間情報管理テーブル400を更新する場合に対応する。制御装置100は、ソフトウェアAの識別子が1であるため、時間情報管理テーブル400の1番目のレコードを初期化して、0x0000を記憶する。これにより、制御装置100は、時間情報管理テーブル400を更新することができる。
図12は、制御装置100の判定処理に基づく解放処理におけるヒープメモリMの更新内容を示す説明図である。図12において、制御装置100は、ソフトウェアBに割り当てたメモリブロックを解放する。ここで、図12は、図6の(4)においてソフトウェアBに割り当てたメモリブロックを解放する場合に対応する。
図12に示すように、制御装置100は、順次、メモリブロックヘッダのmyidのフィールドの内容を取得する。制御装置100は、例えば、メモリブロックヘッダ801のmyidのフィールドの内容を取得し、取得した内容のうちのソフトウェアBの識別子と、ソフトウェアBにメモリブロックを割り当てた時点を示す時点情報と、を取得する。
次に、制御装置100は、取得したソフトウェアBの識別子を用いて、実行中のソフトウェアの中に、ソフトウェアBがあるか否かを判定する。ここで、制御装置100は、実行中のソフトウェアの中に、ソフトウェアBがないため、ソフトウェアBに割り当てたメモリブロックを解放する。メモリブロックを解放する処理については、図10に示した処理と同様のため、説明を省略する。
また、制御装置100は、実行中のソフトウェアの中に、ソフトウェアBがある場合、取得した時点情報が示す時点と、時間情報管理テーブル400の2番目のレコードの時点情報が示す時点と、が一致するか否かを判定する。ここで、制御装置100は、時点が一致しない場合、ソフトウェアBに割り当てたメモリブロックを解放する。メモリブロックを解放する処理については、図10に示した処理と同様のため、説明を省略する。
一方で、制御装置100は、取得した時点情報が示す時点と、時間情報管理テーブル400の2番目のレコードの時点情報が示す時点と、が一致する場合、ソフトウェアBに割り当てたメモリブロックを解放しない。
図13は、図12におけるヒープメモリMの更新結果を示す説明図である。制御装置100は、図12の処理を実行することにより、図13に示すようにヒープメモリMを更新する。これにより、制御装置100は、既に実行終了したソフトウェアによって確保されたままのメモリブロックを解放することができる。したがって、制御装置100は、既に実行終了したソフトウェアによって確保されたままのメモリブロックが増大してヒープメモリMのメモリブロックが不足することを防止することができる。結果として、制御装置100は、ソフトウェアに割り当てるヒープメモリM内のメモリブロックが不足することを防止し、ソフトウェアを正常に実行することができる。
一方で、制御装置100は、実行中のソフトウェアによって確保されたままのメモリブロックを解放しない。したがって、制御装置100は、実行中のソフトウェアが使用しているメモリブロックを解放して実行中のソフトウェアに不具合が発生することを防止することができる。結果として、制御装置100は、ソフトウェアを正常に実行することができる。
図14は、制御装置100の判定処理に基づく解放処理における時間情報管理テーブル400の更新内容を示す説明図である。図14において、制御装置100は、ソフトウェアBに割り当てたメモリブロックを解放するとき、時間情報管理テーブル400を更新する。ここで、図14は、図6の(4)においてソフトウェアBに割り当てたメモリブロックを解放したときに時間情報管理テーブル400を更新する場合に対応する。制御装置100は、ソフトウェアBの識別子が1であるため、時間情報管理テーブル400の2番目のレコードを初期化して、0x0000を記憶する。
図15は、図14における時間情報管理テーブル400の更新結果を示す説明図である。制御装置100は、図14の処理を実行することにより、図15に示すように時間情報管理テーブル400を更新する。これにより、制御装置100は、時間情報管理テーブル400を更新することができる。
(制御装置100の制御処理手順の一例)
次に、図16を用いて、制御装置100の制御処理手順の一例について説明する。
図16は、制御装置100の制御処理手順の一例を示すシーケンス図である。図16において、実行部501は、OSを読み込んでOSを実行して制御装置100を起動する(ステップS1601)。次に、実行部501は、更新部502に、初期化処理要求を送信する(ステップS1602)。更新部502は、初期化処理要求を検出して、初期化処理を実行する(ステップS1603)。ここで、更新部502は、初期化処理を終了すると、実行部501に応答を送信する。
実行部501は、ソフトウェアを実行する(ステップS1604)。実行部501は、ソフトウェア内のmalloc関数を実行することにより、更新部502および制御部506に、確保要求を送信する(ステップS1605)。更新部502および制御部506は、確保処理を実行する(ステップS1606)。ここで、更新部502および制御部506は、確保処理を終了すると、実行部501に応答を送信する。
また、ここで、実行部501が実行するソフトウェアが強制終了したとする。計時部503は、時間管理処理を実行する(ステップS1607)。計時部503は、時間管理処理を実行することにより、更新部502、取得部504、判定部505、および制御部506は、判定要求を送信する。
更新部502、取得部504、判定部505、および制御部506は、判定要求を検出すると、判定処理を実行する(ステップS1608)。ここで、更新部502、取得部504、判定部505、および制御部506は、判定処理を終了すると、計時部503に応答を送信する。
これにより、制御装置100は、既に実行終了したソフトウェアによって確保されたままのメモリブロックを解放することができる。したがって、制御装置100は、既に実行終了したソフトウェアによって確保されたままのメモリブロックが増大してヒープメモリMのメモリブロックが不足することを防止することができる。結果として、制御装置100は、ソフトウェアに割り当てるヒープメモリM内のメモリブロックが不足することを防止し、ソフトウェアを正常に実行することができる。
一方で、制御装置100は、実行中のソフトウェアによって確保されたままのメモリブロックを解放しない。したがって、制御装置100は、実行中のソフトウェアが使用しているメモリブロックを解放して実行中のソフトウェアに不具合が発生することを防止することができる。結果として、制御装置100は、ソフトウェアを正常に実行することができる。
(制御装置100の初期化処理手順の一例)
次に、図17を用いて、制御装置100の初期化処理手順の一例について説明する。
図17は、制御装置100の初期化処理手順の一例を示すフローチャートである。図17において、制御装置100は、ヒープメモリMの先頭アドレスを取得する(ステップS1701)。次に、制御装置100は、メモリブロックヘッダを作成して、取得した先頭アドレスに基づいて、メモリブロックヘッダの各フィールドに情報を設定する(ステップS1702)。そして、制御装置100は、メモリブロックヘッダを作成して、メモリブロックヘッダの各フィールドに情報を設定する(ステップS1703)。これにより、制御装置100は、ヒープメモリMを初期化することができる。
(制御装置100の確保処理手順の一例)
次に、図18を用いて、制御装置100の確保処理手順の一例について説明する。
図18は、制御装置100の確保処理手順の一例を示すフローチャートである。図18において、制御装置100は、全てのメモリブロックを選択したか否かを判定する(ステップS1801)。ここで、全てのメモリブロックを選択していない場合(ステップS1801:No)、制御装置100は、ヒープメモリヘッダおよびメモリブロックヘッダを参照して、メモリブロックを選択する(ステップS1802)。
次に、制御装置100は、選択したメモリブロックが、未使用であって、確保要求されたサイズ以上であるか否かを判定する(ステップS1803)。ここで、制御装置100は、未使用ではない場合、または確保要求されたサイズ未満である場合(ステップS1803:No)、制御装置100は、ステップS1801の処理に戻る。
一方で、未使用であって、確保要求されたサイズ以上である場合(ステップS1803:Yes)、制御装置100は、確保要求を発行したソフトウェアの識別子と、確保した時点を示す時点情報と、を含むデータを生成する(ステップS1804)。次に、制御装置100は、選択したメモリブロックの先頭アドレスに、確保要求されたサイズ分のアドレスを加算して、加算したアドレスから後ろの領域を空きメモリブロックとして設定する(ステップS1805)。
そして、制御装置100は、ヒープメモリヘッダおよびメモリブロックヘッダを更新する(ステップS1806)。次に、選択したメモリブロックのメモリブロックヘッダのsizeのフィールドに、確保したメモリブロックのサイズを設定し、occupiedのフィールドに、使用中を示す1を設定する(ステップS1807)。
そして、制御装置100は、選択したメモリブロックのメモリブロックヘッダのmyidのフィールドに、生成したデータを設定する(ステップS1808)。次に、制御装置100は、確保した時点を示す時点情報を、時間情報管理テーブル400に設定する(ステップS1809)。
次に、制御装置100は、選択したメモリブロックの先頭アドレスへのポインタを実行部501に送信する(ステップS1810)。そして、制御装置100は、確保処理を終了する。
また、ステップS1801において、全てのメモリブロックを選択した場合(ステップS1801:Yes)、制御装置100は、メモリブロックを確保できなかったとして、NULLポインタを実行部501に送信する(ステップS1811)。そして、制御装置100は、確保処理を終了する。これにより、制御装置100は、ソフトウェアにメモリブロックを割り当てることができる。結果として、制御装置100は、ソフトウェアの処理のために使用するワークエリアとしてメモリブロックを使用して、ソフトウェアを実行することができる。
(制御装置100の時間管理処理手順の一例)
次に、図19を用いて、制御装置100の時間管理処理手順の一例について説明する。
図19は、制御装置100の時間管理処理手順の一例を示すフローチャートである。図19において、制御装置100は、所定時間が経過したか否かを判定する(ステップS1901)。ここで、所定時間が経過していない場合(ステップS1901:No)、制御装置100は、時間管理処理を終了する。
一方で、所定時間が経過した場合(ステップS1901:Yes)、制御装置100は、判定要求を発行する(ステップS1902)。次に、制御部506は、所定時間の計時を初めからやり直す(ステップS1903)。そして、制御部506は、時間管理処理を終了する。これにより、制御装置100は、一定時間ごとに、判定要求を発行することができる。
(制御装置100の判定処理手順の一例)
次に、図20を用いて、制御装置100の判定処理手順の一例について説明する。
図20は、制御装置100の判定処理手順の一例を示すフローチャートである。図20において、制御装置100は、全てのメモリブロックを選択したか否かを判定する(ステップS2001)。ここで、全てのメモリブロックを選択していない場合(ステップS2001:No)、制御装置100は、ヒープメモリヘッダおよびメモリブロックヘッダを参照して、メモリブロックを選択する(ステップS2002)。
次に、制御装置100は、選択したメモリブロックが、使用中であるか否かを判定する(ステップS2003)。ここで、制御装置100は、使用中ではない場合(ステップS2003:No)、制御装置100は、ステップS2001の処理に戻る。
一方で、使用中である場合(ステップS2003:Yes)、制御装置100は、選択したメモリブロックのメモリブロックヘッダのmyidのフィールドから、選択したメモリブロックを確保したソフトウェアの識別子と、確保した時点を示す時点情報と、を含むデータを取得する(ステップS2004)。次に、制御装置100は、時間情報管理テーブル400から、取得したデータに含まれるソフトウェアの識別子により識別されるソフトウェアがメモリブロックを確保した最新の時点を示す時点情報を取得する(ステップS2005)。
そして、制御装置100は、取得したデータに含まれる時点情報が示す時点と、取得した最新の時点を示す時点情報が示す最新の時点と、が一致するか否かを判定する(ステップS2006)。ここで、一致しない場合(ステップS2006:No)、制御装置100は、ステップS2001の処理に戻る。
一方で、一致する場合(ステップS2006:Yes)、制御装置100は、ソフトウェアの識別子から、ソフトウェアの状態を特定する(ステップS2007)。次に、制御装置100は、ソフトウェアの状態がアイドル状態か否かを判定する(ステップS2008)。ここで、アイドル状態ではない場合(ステップS2008:No)、制御装置100は、ステップS2001の処理に戻る。一方で、アイドル状態である場合(ステップS2008:Yes)、制御装置100は、解放処理を実行して(ステップS2009)、ステップS2001の処理に戻る。
また、ステップS2001において、全てのメモリブロックを選択した場合(ステップS2001:Yes)、制御装置100は、解放するメモリブロックがないとして、判定処理を終了する。これにより、制御装置100は、ソフトウェアに割り当てられたメモリブロックが異常メモリブロックであるか否かを判定することができる。
(制御装置100の解放処理手順の一例)
次に、図21を用いて、制御装置100の解放処理手順の一例について説明する。
図21は、制御装置100の解放処理手順の一例を示すフローチャートである。図21において、制御装置100は、選択したメモリブロックの前にあるメモリブロックが未使用であるか否かを判定する(ステップS2101)。ここで、制御装置100は、未使用ではない場合(ステップS2101:No)、ステップS2103の処理に移行する。
一方で、未使用である場合(ステップS2101:Yes)、制御装置100は、選択したメモリブロックを、選択したメモリブロックの前にあるメモリブロックに結合する(ステップS2102)。
次に、制御装置100は、選択したメモリブロックの後ろにあるメモリブロックが未使用であるか否かを判定する(ステップS2103)。ここで、制御装置100は、未使用ではない場合(ステップS2103:No)、ステップS2105の処理に移行する。
一方で、未使用である場合(ステップS2103:Yes)、制御装置100は、選択したメモリブロックに、選択したメモリブロックの後ろにあるメモリブロックを結合する(ステップS2104)。
次に、制御装置100は、選択したメモリブロック、または結合したメモリブロックのメモリブロックヘッダに情報を設定して、未使用のメモリブロックに設定する(ステップS2105)。そして、制御装置100は、選択したメモリブロック、または結合したメモリブロックの内容をクリアする(ステップS2106)。次に、制御装置100は、ヒープメモリヘッダに情報を設定する(ステップS2107)。そして、制御装置100は、解放処理を終了する。これにより、制御装置100は、異常メモリブロックを解放することができる。
以上説明したように、制御装置100によれば、ソフトウェアに確保されたメモリブロックについて、実行中のソフトウェアの中に当該ソフトウェアがなければ、異常メモリブロックであると判定することができる。これにより、制御装置100は、既に実行終了したソフトウェアによって確保されたままのメモリブロックを解放することができる。
したがって、制御装置100は、既に実行終了したソフトウェアによって確保されたままのメモリブロックが増大してヒープメモリMのメモリブロックが不足することを防止することができる。結果として、制御装置100は、ソフトウェアに割り当てるヒープメモリM内のメモリブロックが不足することを防止し、ソフトウェアを正常に実行することができる。また、制御装置100は、ヒープメモリM内の空きメモリブロックを纏めることができ、使用中のメモリブロックを探索する効率を向上させることができる。
ここで、例えば、ソフトウェアの実行開始から所定時間が経過したときに自動的にメモリブロックを解放することが考えられる。しかしながら、この場合、所定時間が経過したときにソフトウェアがまだ実行中であると、ソフトウェアが使用中のメモリブロックを解放して、ソフトウェアが異常動作してしまうことがある。一方で、制御装置100は、実行中のソフトウェアによって確保されたままのメモリブロックを解放しない。したがって、制御装置100は、実行中のソフトウェアが使用しているメモリブロックを解放して実行中のソフトウェアに不具合が発生することを防止することができる。結果として、制御装置100は、ソフトウェアを正常に実行することができる。
また、制御装置100によれば、メモリブロックを確保した時点を示す時点情報をメモリブロックに対応付けて記憶し、ソフトウェアの識別子とソフトウェアがメモリブロックを確保した最新の時点を示す時点情報とを対応付けて記憶することができる。これにより、制御装置100は、メモリブロックを確保した時点と、ソフトウェアがメモリブロックを確保した最新の時点とが一致するか否かを判定して、ソフトウェアの識別子が使い回しされているかを判定することができる。したがって、制御装置100は、ソフトウェアの識別子に使用するデータ量を低減することができる。
なお、本実施の形態で説明した制御方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本制御プログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本制御プログラムは、インターネット等のネットワークを介して配布してもよい。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)コンピュータが、
メモリ内の記憶領域のうちのソフトウェアからの割当要求に応じて前記ソフトウェアが使用する記憶領域として割り当てた使用領域と対応付けて、前記ソフトウェアの識別子を記憶する記憶部から、前記メモリ内のいずれかの使用領域に対応するソフトウェアの識別子を取得し、
実行中のソフトウェアの中に、取得した前記識別子により識別されるソフトウェアがあるか否かを判定し、
前記識別子により識別されるソフトウェアがないと判定した場合、前記いずれかの使用領域を解放する、
処理を実行することを特徴とする制御方法。
(付記2)前記コンピュータが、
前記ソフトウェアからの前記ソフトウェアが使用する記憶領域として割り当てた使用領域の解放要求があった場合、前記解放要求から特定される使用領域に対応する前記ソフトウェアの識別子を前記記憶部から削除する処理を実行することを特徴とする付記1に記載の制御方法。
(付記3)前記記憶部は、前記ソフトウェアからの割当要求に応じて前記ソフトウェアが使用する記憶領域として割り当てた使用領域と対応付けて、前記ソフトウェアの識別子と、前記ソフトウェアが使用する記憶領域として使用領域を割り当てた時点を示す時点情報と、を記憶し、
前記取得する処理は、
前記記憶部から、前記いずれかの使用領域に対応するソフトウェアの識別子と、前記いずれかの使用領域を割り当てた時点を示す時点情報と、を取得し、
前記判定する処理は、
実行中のソフトウェアの中に、取得した前記識別子により識別されるソフトウェアがあるか否かを判定し、取得した前記識別子により識別されるソフトウェアがあると判定した場合、前記ソフトウェアの識別子と、前記ソフトウェアからの割当要求に応じて前記ソフトウェアが使用する記憶領域として使用領域を割り当てた時点を示す時点情報と、を対応付けて記憶する第2の記憶部を参照して、取得した前記時点情報が、取得した前記識別子に対応する最新の時点情報と一致するか否かを判定し、
前記解放する処理は、
取得した前記時点情報が前記最新の時点情報と一致しないと判定した場合、前記いずれかの使用領域を解放することを特徴とする付記1または2に記載の制御方法。
(付記4)前記コンピュータが、
前記ソフトウェアからの割当要求があった場合、前記第2の記憶部に前記ソフトウェアの識別子に対応する時点情報が記憶されていれば、当該時点情報の代わりに、前記割当要求に応じて前記ソフトウェアが使用する記憶領域として使用領域を割り当てた時点を示す時点情報を記憶する処理を実行することを特徴とする付記3に記載の制御方法。
(付記5)メモリ内の記憶領域のうちのソフトウェアからの割当要求に応じて前記ソフトウェアが使用する記憶領域として割り当てた使用領域と対応付けて、前記ソフトウェアの識別子を記憶する記憶部と、
前記記憶部から、前記メモリ内のいずれかの使用領域に対応するソフトウェアの識別子を取得する取得部と、
実行中のソフトウェアの中に、前記取得部によって取得された前記識別子により識別されるソフトウェアがあるか否かを判定する判定部と、
前記判定部によって前記識別子により識別されるソフトウェアがないと判定された場合、前記いずれかの使用領域を解放する制御部と、
を有することを特徴とする制御装置。
(付記6)コンピュータに、
メモリ内の記憶領域のうちのソフトウェアからの割当要求に応じて前記ソフトウェアが使用する記憶領域として割り当てた使用領域と対応付けて、前記ソフトウェアの識別子を記憶する記憶部から、前記メモリ内のいずれかの使用領域に対応するソフトウェアの識別子を取得し、
実行中のソフトウェアの中に、取得した前記識別子により識別されるソフトウェアがあるか否かを判定し、
前記識別子により識別されるソフトウェアがないと判定した場合、前記いずれかの使用領域を解放する、
処理を実行させることを特徴とする制御プログラム。
(付記7)コンピュータに、
メモリ内の記憶領域のうちのソフトウェアからの割当要求に応じて前記ソフトウェアが使用する記憶領域として割り当てた使用領域と対応付けて、前記ソフトウェアの識別子を記憶する記憶部から、前記メモリ内のいずれかの使用領域に対応するソフトウェアの識別子を取得し、
実行中のソフトウェアの中に、取得した前記識別子により識別されるソフトウェアがあるか否かを判定し、
前記識別子により識別されるソフトウェアがないと判定した場合、前記いずれかの使用領域を解放する、
処理を実行させることを特徴とする制御プログラムを記録したコンピュータに読み取り可能な記録媒体。