(57)【要約】【課題】スタックオーバーフローを起こしたタスクの実行を安全に継続する。【解決手段】ステップＳ１０１でスタックオーバーフローの検出を待つ。ステップＳ１０２で前記スタックオーバーフローによってスタック領域が破壊されるタスクを検索する。ステップＳ１０３で前記スタック領域が破壊されるタスクを停止する。ステップＳ１０４で前記オーバーフローを起こしたタスクのスタック領域を拡張する。このような処理により、仮想記憶等を使用することなく、スタックオーバーフローを起こしたタスクの実行を停止することなく継続することができ、停止させることが許されないタスクの実行を保証できるという効果がある。【選択図】図１
2009251681.tif 000002
【特許請求の範囲】
【請求項１】
スタックオーバーフローを起こしたタスクのスタック領域を拡張するスタック領域の拡張方法であって、
スタックオーバーフローの検出を待つステップと、
前記スタックオーバーフローによってスタック領域が破壊されるタスクを検索するステップと、
前記スタック領域が破壊されるタスクを停止するステップと、
前記オーバーフローを起こしたタスクのスタック領域を拡張するステップとを有することを特徴とするスタック領域の拡張方法。
【請求項２】
前記オーバーフローを起こしたタスクのスタック領域を拡張するステップは、オーバーフローを起こしたタスクのスタックサイズを、オーバーフローによって破壊されるタスクのスタックサイズを足した値にすることでスタック領域を拡張することを特徴とする請求項１に記載のスタック領域の拡張方法。
【請求項３】
前記スタックオーバーフローの検出を待つステップは、割込みが発生したときに実行され、割込みの要因がスタックオーバーフローであると判断された時に前記タスクを検索するステップを実行し、そうでない場合は処理を行わずに復帰することでスタックオーバーフローの検出を待つことを特徴とする請求項１に記載のスタック領域の拡張方法。
【請求項４】
スタックオーバーフローを起こしたタスクのスタック領域を拡張するスタック領域の拡張方法をコンピュータに実行させるためのプログラムであって、
スタックオーバーフローの検出を待つステップと、
前記スタックオーバーフローによってスタック領域が破壊されるタスクを検索するステップと、
前記スタック領域が破壊されるタスクを停止するステップと、
前記オーバーフローを起こしたタスクのスタック領域を拡張するステップとをコンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マルチタスクシステムにおいてスタックオーバーフローを検出した時にスタック領域を拡張するスタック領域の拡張方法及びプログラムに関する。
【背景技術】
【０００２】
従来、マルチタスクシステムにおいてスタック領域を拡張する方法に関する技術には、タスクごとにスタック領域の予約領域を設定し、スタックオーバーフローが発生したときにその予約領域をスタック領域として使用するものがある（特許文献１を参照のこと）。
【０００３】
特許文献１にかかる技術は、マルチスレッドタスクを構成する複数のスレッドのタスクの割り当てを行うマルチスレッドタスクのスタック割り当て方法に関する。この技術は、特に、ページ固定を前提としたスーパーコンピュータ用の大規模なベクトルプログラムを実行するマルチプロセッサシステムのマルチスレッドタスクのスタック割り当て方法に適用して有効な技術である。また、仮想記憶空間に存在する各スレッド毎のスタック領域の上限に予約領域を設定し、その予約領域を最初に使用するときに、スタック領域の使用領域に仮想記憶空間の記憶領域を割り当て、スタック領域の使用領域を使用することを特徴としている。
【０００４】
また、機器組込用のマイクロプロセッサでマルチタスク処理を行う場合において、スタック領域の初期化データと比較することでスタックのオーバーフローを検出し、スタックオーバーフローを起こしたタスクを停止するものがある（特許文献２を参照のこと）。
【０００５】
特許文献２にかかる技術は、マイクロプロセッサ上でマルチタスク処理を行う場合に、特定のタスクが割り当てられたスタック領域をオーバーフローし、他のタスクのスタック領域を使用することのないようにタスクを管理する。これにより、マイクロプロセッサの暴走を未然に防ぐために有効な技術である。
【０００６】
また、その他にもスタックオーバーフローを検出する方法に関しては、次のようなものがある。特許文献３、特許文献４、特許文献５、特許文献６はいずれもスタックオーバーフロー検出回路をＣＰＵ外部に構成し、スタックポインタ又はそれに類するレジスタとスタック領域を比較することでスタック領域を破壊する前に割込み等で通知するものである。
【０００７】
また、特許文献７はスタックオーバーフローを周期的な割込み処理の中で判断するものである。この技術では、特殊なハードウェアを追加することなくスタックオーバーフローを検出するためには、他のタスク等で利用しているスタック領域や変数領域を破壊した後で検出するか、あるいは、スタック領域に連続する予備領域を特殊な値で初期化しておく。そして、その特殊な値が別の値に変更されていることをあるタイミングで調べることで検出する。
【０００８】
以上のような技術が本発明の背景技術としてあげられる。
【０００９】
【特許文献１】特開平９−１６７１１４号公報
【特許文献２】特開２０００−７６０８１号公報
【特許文献３】特開昭６２−２１２７３３号公報
【特許文献４】特開平２−８９４５号公報
【特許文献５】特開平９−１９８２５８号公報
【特許文献６】特開２０００−２０３５２号公報
【特許文献７】特開２００４−１５７６６２号公報
【発明の開示】
【発明が解決しようとする課題】
【００１０】
しかしながら、上記の従来の技術には、仮想記憶領域にスタック領域を拡張しなければタスクの実行を継続できない、あるいは、スタックオーバーフローを起こしたタスクは実行を継続できない、といった問題がある。
【００１１】
例えば設計段階のミスで、機械を制御するタスクのスタック領域を充分確保していなかった場合、予期せずスタックを大量に消費してスタックオーバーフローを起こしてしまう。本来なら設計段階でスタック領域を充分確保することが望ましいが、スタック消費量の見積りが困難な場合もある。
【００１２】
通常はスタックオーバーフローが発生しても安全にシステムを停止させる方法を講じておく必要があるが、稼動させたままエラー処理を行なった方が安全な場合もあり、スタックオーバーフローを起こしたタスクを停止させることが必ずしも良いとは限らない。本発明は係る問題点を解消する。
【課題を解決するための手段】
【００１３】
本発明のスタック領域の拡張方法は、スタックオーバーフローを起こしたタスクのスタック領域を拡張するスタック領域の拡張方法であって、スタックオーバーフローの検出を待つステップと、前記スタックオーバーフローによってスタック領域が破壊されるタスクを検索するステップと、前記スタック領域が破壊されるタスクを停止するステップと、前記オーバーフローを起こしたタスクのスタック領域を拡張するステップとを有することを特徴とする。
また、本発明のプログラムは、スタックオーバーフローを起こしたタスクのスタック領域を拡張するスタック領域の拡張方法をコンピュータに実行させるためのプログラムであって、スタックオーバーフローの検出を待つステップと、前記スタックオーバーフローによってスタック領域が破壊されるタスクを検索するステップと、前記スタック領域が破壊されるタスクを停止するステップと、前記オーバーフローを起こしたタスクのスタック領域を拡張するステップとをコンピュータに実行させるためのプログラムである。
なお、本発明におけるタスクとスレッドは呼び方が異なるだけで同じ意味で使われるが、特許文献１に記述されているタスクは単数又は複数のスレッドから構成されるものとして表現されている。また、タスクはＵＮＩＸ（登録商標）のプロセスモデルで扱われるプロセスに該当するものである。
【発明の効果】
【００１４】
本発明によれば、仮想記憶等を使用することなく、スタックオーバーフローを起こしたタスクの実行を停止することなく継続することができ、停止させることが許されないタスクの実行を保証できるという効果がある。
【発明を実施するための最良の形態】
【００１５】
（第１の実施の形態）
以下、本発明の実施の形態について説明する。図１は、本発明に係るスタック領域の拡張方法の処理の流れを示すフローチャートである。以下、順を追って処理の流れを、具体的なマルチタスクシステムに実施した例とともに説明する。
【００１６】
マルチタスクシステムとしてμＩＴＲＯＮ等のリアルタイムＯＳを想定しているが、本実施形態はマルチタスクシステムを限定するものではなく、仮想記憶を採用していない一般的な組込み向けのマルチタスクシステムに実施可能なものである。本実施形態では図１に示すフローチャートに基づく処理の開始から終了までをシステムが停止するまで繰り返す一つのタスクとして実現する。
【００１７】
タスクが生成され、システムによって実行権が該タスクに移動すると、フローチャートに示す処理が開始されステップＳ１０１が実行される。ステップＳ１０１では、スタックオーバーフローの検出を待つ。スタックオーバーフローの検出方法については前述の先行技術に委ね、ここでは詳細な説明は省略するが、例えば特許文献２に記載の方法によって特にハードウェアを変更することなくスタックオーバーフローを検出する。スタックオーバーフローを検出した時点でステップＳ１０１は終了し、次のステップＳ１０２を実行する。
【００１８】
ステップＳ１０２では、前記スタックオーバーフローによってスタック領域が破壊されるタスクを検索する。スタックオーバーフローが発生した場合、通常はスタックポインタにその値（アドレス）が格納されている。図３に示すようなタスク管理テーブル３０１によって管理されるタスク毎のスタック領域開始アドレスとスタックサイズからどのタスクのスタック領域が破壊されようとしているのか検索することができる。スタックサイズが省略されているタスク管理テーブルであれば、各タスクのスタック開始アドレスとスタックポインタの大小を比較することでスタックオーバーフローの被害を受けるタスクを特定することができる。
【００１９】
また、特許文献２の方法では、スタック境界最終部の破壊にとどまる場合もあるが、このような場合でもスタック領域が隣接するタスクのスタック領域が破壊されたものとして扱う。
【００２０】
このように、ステップＳ１０２ではスタックオーバーフローによってスタック領域が破壊されるタスクを検索し、次のステップＳ１０３を実行する。
【００２１】
ステップＳ１０３では、前記スタック領域が破壊されるタスクを停止する。マルチタスクシステムでは、次に実行するタスクは図４に示すようなタスクの優先順位ごとのリストで順序付けられたタスクキューで管理されていることが多い。
【００２２】
図４（ａ）はタスク停止前のタスクキューを示している。タスク優先度１からタスク優先度３まで定義され、タスク優先度１のタスクキューにはタスク４とタスク１とタスク６がキューイングされ、タスク１が実行中である。タスク優先度２のタスクキューにはタスク２がキューイングされており、実行権が取得できるのを待っている。タスク優先度３のタスクキューにはタスク５とタスク３がキューイングされている状態である。
【００２３】
ステップＳ１０１から始まる本タスクは図４ではタスク４に該当し、タスク優先度１の先頭で現在実行されている状況である。図４の状況では、停止するタスク２についてタスクキューから削除することでタスクの停止を行う。停止するタスクをタスクキューから削除することでステップＳ１０３の処理を終了し、ステップＳ１０４を実行する。
【００２４】
図４（ｂ）はタスク停止後のタスクキューの状態を表しているが、ここではタスク２を停止状態のキューに移動することでタスク２の削除を実現し、タスク２のその後の処理に関してはマルチタスクシステムに委ねられる。ステップＳ１０４では、前記オーバーフローを起こしたタスクのスタック領域を拡張する。
【００２５】
図２は、タスク１がスタックオーバーフローを起こしてタスク２のスタック領域を破壊する前（図２（ａ））と、破壊した後（図２（ｂ））のメモリマップを表している。ステップＳ１０３でタスク２が停止し、タスク２のスタック領域はもはや空き領域となっているので、スタックオーバーフローを起こしたタスク１のスタック領域として利用することが可能である。そして、請求項２に記載されているように、図３に示すタスク管理テーブル３０１から停止するタスク２のスタックサイズをスタックオーバーフローを起こしたタスク１のスタックサイズに加える。これにより、タスク１のスタック領域を拡張する。本実施形態のようにソフトウェアでスタックオーバーフローを検出する場合は、スタック領域を特殊な値で初期化する必要がある。その場合は、ステップＳ１０４を終了する前にスタックを拡張する領域に対して初期化を行う。ステップＳ１０４を終了したあとは、再びステップＳ１０１へ戻り新たなスタックオーバーフロー検出を待つ。
【００２６】
以上のように実施することで、本発明によれば、仮想記憶等を使用することなく、スタックオーバーフローを起こしたタスクを停止することなく実行を継続することができ、停止させることが許されないタスクの実行を保証できる。
【００２７】
（第２の実施の形態）
次に、本発明の第２の実施の形態について説明する。図５は請求項３の処理の流れを示すフローチャートである。本実施形態では、スタックオーバーフローの検出をハードウェアで行い、マルチタスクシステムへは割込みという形で通知される。ハードウェアによりスタックオーバーフローを検出する方法に関しては先行技術で説明したように様々な方法があり、本発明の主眼とするものではないため説明は省略するが、いずれの方法を採用しても特に問題はない。
【００２８】
例えば、特許文献３、特許文献４、特許文献５、特許文献６はいずれもスタックオーバーフロー検出回路をＣＰＵ外部に構成し、スタックポインタ又はそれに類するレジスタとスタック領域を比較する。これにより、スタック領域を破壊する前に割込み等で通知するが、本実施形態においても同様の方法を実施し、システムに割込みが通知されると図５のステップＳ５０１が実行される。
【００２９】
ステップＳ５０１では、割り込みの要因を割込み要因レジスタの値等を取得することにより調査し、スタックオーバーフローが割込みの要因であった場合は次のステップを実行する。次のステップ以下は先に述べた第１の実施形態のステップＳ１０２以下と同様であるため説明は省略するが、最後のステップＳ１０４が終了したあとはタスク２がタスクキューから削除される。
【００３０】
そして、タスク１のスタック領域がタスク２のスタック領域と統合されることにより拡張され、最終的に割込み処理から復帰することで終了する。また、ステップＳ５０１で割込み要因がスタックオーバーフローでなかった場合は、ステップＳ５０５を実行する。
【００３１】
ステップＳ５０５では、スタックオーバーフロー以外の割込み処理を実行し、割込み処理を終了する。
【００３２】
以上のように実施することで、本発明のスタック領域の拡張方法によれば、仮想記憶等を使用することなく、スタックオーバーフローを起こしたタスクを停止することなく実行を継続することができ、停止させることが許されないタスクの実行を保証できる。
【００３３】
ここで、第１の実施形態及び第２の実施形態に係る処理を実施するためのハードウェアの構成の一例としてのコンピュータ６００を図６に示す。コンピュータ６００は、図６に示すように、ＣＰＵ６０１と、ＲＯＭ６０２と、ＲＡＭ６０３と、キーボード（ＫＢ）６０９のキーボードコントローラ（ＫＢＣ）６０５とを有する。更に、表示部としてのＣＲＴディスプレイ（ＣＲＴ）６１０のＣＲＴコントローラ（ＣＲＴＣ）６０６と、ハードディスク（ＨＤ）６１１及びフレキシブルディスク（ＦＤ）６１２のディスクコントローラ（ＤＫＣ）６０７を有する。更に、ネットワーク６４０との接続のためのネットワークインターフェースコントローラ（ＮＩＣ）６０８を有する。コンピュータ６００が有するこれら各部は、システムバス６０４を介して互いに通信可能に接続される。
【００３４】
ＣＰＵ６０１は、ＲＯＭ６０２或いはＨＤ６１１に記憶されたソフトウェア、或いはＦＤ６１２より供給されるソフトウェアを実行することで、システムバス６０４に接続された各構成部を総括的に制御する。すなわち、ＣＰＵ６０１は、所定の処理シーケンスに従った処理プログラムを、ＲＯＭ６０２、或いはＨＤ６１１、或いはＦＤ６１２から読み出して実行することで、本実施の形態での動作を実現するための制御を行う。
【００３５】
ＲＡＭ６０３は、ＣＰＵ６０１の主メモリ或いはワークエリア等として機能する。ＫＢＣ６０５は、ＫＢ６０９や図示していないポインティングデバイス等からの指示入力を制御する。ＣＲＴＣ６０６は、ＣＲＴ６１０の表示を制御する。ＤＫＣ６０７は、ブートプログラム、種々のアプリケーション、編集ファイル、ユーザファイル、ネットワーク管理プログラム、及び本実施の形態における所定の処理プログラム等を記憶するＨＤ６１１及びＦＤ６１２とのアクセスを制御する。ＮＩＣ６０８は、必要に応じて、ネットワーク６４０上の装置或いはシステムと双方向にデータをやりとりする。
【００３６】
また、本発明を実現するために、上述した実施形態の機能を実現するソフトウェアのプログラムコード（コンピュータプログラム）を記録した記憶媒体を用いても良い。この場合には記憶媒体をシステム或いは装置に供給し、そのシステム或いは装置のコンピュータ（又はＣＰＵやＭＰＵ）が記憶媒体に格納されたプログラムコードを読み出し実行することによって本発明の目的が達成される。
【００３７】
この場合、記憶媒体から読み出されたプログラムコード自体が上述した実施形態の機能を実現することになり、プログラムコード自体及びそのプログラムコードを記憶した記憶媒体は本発明を構成することになる。
【００３８】
プログラムコードを供給するための記憶媒体としては、例えば、フレキシブルディスク、ハードディスク、光ディスク、光磁気ディスク、ＣＤ−ＲＯＭ、ＣＤ−Ｒ、磁気テープ、不揮発性のメモリカード、ＲＯＭ等を用いることができる。
【００３９】
また、そのプログラムコードの指示に基づき、コンピュータ上で稼動しているＯＳ（基本システム或いはオペレーティングシステム）等が実際の処理の一部又は全部を行う場合も含まれることは言うまでもない。
【００４０】
さらに、記憶媒体から読み出されたプログラムコードが、コンピュータに挿入された機能拡張ボードやコンピュータに接続された機能拡張ユニットに備わるメモリに書き込まれてもよい。この場合には、書き込まれたプログラムコードの指示に基づき、その機能拡張ボードや機能拡張ユニットに備わるＣＰＵ等が実際の処理の一部又は全部を行ってもよい。
【図面の簡単な説明】
【００４１】
【図１】本発明の処理の流れを示すフローチャートである。
【図２】本発明のスタックオーバーフロー前後のスタック領域を表すメモリマップを示す図である。
【図３】本発明のタスク管理テーブルとスタック領域の関係を表す図である。
【図４】本発明のタスクのスケジューリングを管理するタスクキューを表す図である。
【図５】本発明の第２の実施の形態に係る処理の流れを示すフローチャートである。
【図６】本発明に係る処理を実施するためのハードウェアの一例を示す図である。
【符号の説明】
【００４２】
６００  コンピュータ
６０１  ＣＰＵ
６０２  ＲＯＭ
６０３  ＲＡＭ
６０７  ディスクコントローラ（ＤＫＣ）
６１１  ハードディスク（ＨＤ）
【図１】
2009251681.tif 000003
【図２】
2009251681.tif 000004
【図３】
2009251681.tif 000005
【図４】
2009251681.tif 000006
【図５】
2009251681.tif 000007
【図６】
2009251681.tif 000008