(58)【調査した分野】(Int.Cl.,DB名)
前記プロセス(P1)の開始において、前記少なくとも1つのアプリケーションスレッド(F1、F2)は、その実行を続ける前に、前記少なくとも1つのロギングスレッド(Fj)の初期設定に対して待機し、前記ロギングスレッドは、それ自体を前記少なくとも1つの処理要素(Fs、PJ)のサブセットと同期させることによって初期化される、請求項1〜5のいずれか1項に記載の方法。
前記少なくとも1つのロギングスレッドは、信号を受信すると、前記信号に関連付けられる第2のロギング情報を発行し、次いで、前記信号に関連付けられる処理コードをトリガする、請求項1〜8のいずれか1項に記載の方法。
前記アプリケーションスレッドは、信号を受信すると、前記信号に関連付けられる第1のロギング情報を前記少なくとも1つのロギングスレッドに送信し、所与の時間待機した後、前記プロセスを終了させる、請求項1〜9のいずれか1項に記載の方法。
【発明の概要】
【発明が解決しようとする課題】
【0005】
しかしながら、この並列性(膨大である可能性がある)にもかかわらず、応答時間と非常に大量の計算の処理とを両立することは、深刻な制約である。
【0006】
さらに、ロギングは、例として、表示端末またはメモリに対する入力/出力を必要とする。入力/出力機構は処理時間の点でコストがかかる。結果として、ロギングはソフトウェアアプリケーションの性能上に影響を及ぼす。
【0007】
重要なソフトウェアアプリケーションの枠組では、その性能を低下させないためにロギングを行わないことが非常に頻繁に選択される。この結果、このソフトウェアアプリケーションの誤動作の検出および修正が困難になる。
【0008】
発明の概要
本発明の目的は、重要なソフトウェアアプリケーション、特に並列ソフトウェアアプリケーションを含む、効率的なロギングを可能にする機構を提供することによって先行技術を改善することである。
【課題を解決するための手段】
【0009】
この目的のため、本発明は、
−情報処理装置のアセンブリにわたって少なくとも1つのアプリケーションスレッドと少なくとも1つのロギングスレッドとを含むプロセスを実行することと、
−少なくとも1つのアプリケーションスレッド内にロギングイベントを検出し、第1のロギング情報を前記少なくとも1つのロギングスレッドに直ちに送信することと、
−前記第1のロギング情報を受信し、前記第1のロギング情報から開始する第2のロギング情報を生成することと、
−前記少なくとも1つのロギングスレッドに先に登録された少なくとも1つの処理要素に発行インターフェイスを介して前記第2のロギング情報を発行することとを備える、ロギング方法を提供する。
【0010】
好ましい実施の形態によれば、本発明は以下の特徴の1つ以上を備え、それらは、別々に、または互いとの部分的もしくは全体的な組合せにおいて用いられてもよく、
−前記少なくとも1つの処理要素は、前記プロセスに属する出力スレッドを含む。
【0011】
−前記少なくとも1つの処理要素は、前記プロセスとは異なるロギングプロセスのスレッドを含む。
【0012】
−前記アプリケーションスレッドは、前記第1の情報を、前記少なくとも1つのロギングスレッドに、非同期的に、通信インターフェイスを介して送信する。
【0013】
−前記通信インターフェイスおよび前記発行インターフェイスはソケットタイプであり、ZeroMQライブラリに従う。
【0014】
−前記プロセスの開始において、前記少なくとも1つのアプリケーションスレッドは、その実行を続ける前に、前記少なくとも1つのロギングスレッドの初期設定に対して待機し、前記ロギングスレッドは、それ自体を前記少なくとも1つの処理要素のサブセットと同期させることによって、それ自体を初期化する。
【0015】
−前記第1のロギング情報は名称およびレベルを含む。
−前記プロセスが複製されると、前記少なくとも1つのロギングスレッドは終了され、次いで、最初の親プロセス内で再起動される。
【0016】
−前記少なくとも1つのロギングスレッドは、信号を受信すると、前記信号に関連付けられる第2のロギング情報を発行し、次いで、前記信号に関連付けられる処理コードをトリガする。
【0017】
−前記アプリケーションスレッドは、信号を受信すると、前記信号に関連付けられる第1のロギング情報を前記少なくとも1つのロギングスレッドに送信し、所与の時間待機した後、前記プロセスを終了させる。
【0018】
本発明の他の特徴および利点は、例として与えられた本発明の好ましい1つの実施の形態の以下の記載を、添付された図面を参照して読むことで明らかになる。
【発明を実施するための形態】
【0020】
本発明の詳細な記載
ソフトウェアの観点からは、ソフトウェアアプリケーションは1つ以上のプロセスからなる。
【0021】
「プロセス」は、情報処理システム(またはコンピュータ)によって実行されているプログラムとして見なされてもよい。プロセスは以下を備えるとして定義されてもよい:
−リードオンリメモリにあってもよいが、最も頻繁には大容量メモリからランダムアクセスメモリにダウンロードされる、実行されるべき命令のセット;
−スタック、作業データなどを保存するためのランダムアクセスメモリ内のアドレス指定空間;
−ネットワークポートなどのようなリソース。
【0022】
同じプロセスはいくつかのスレッド(またはタスクまたは軽いプロセス)を備えてもよい。プロセスとは対照的に、スレッドは独自の仮想メモリを破棄せず、同じプロセスのすべてのスレッドとそれを共有する。
【0023】
図1によって示された例では、アプリケーションは2つのプロセスP
1、P
2を備える。プロセスP
1は3つのスレッドF
1、F
2、F
3を備える。図示されないが、プロセスP
2もいくつかのスレッドを備えてもよい。
【0024】
スレッドは、プロセスの寿命、およびより強い理由で、アプリケーションの実行時間とは異なる寿命を有してもよいことが注目され:スレッドは、プロセスの実行中に動的に実行され、スレッドが提供されたタスクが終わると、いつでも終了されてもよい。したがって、
図1はソフトウェアアプリケーションの実行における所与の瞬間での状況を示す。
【0025】
以下では、スレッドF
1、F
2は、それらをロギングスレッドまたはF
j、および以下に記載される出力スレッドF
sから区別するために、「アプリケーションスレッド」と呼ばれる。
【0026】
ソフトウェアアプリケーションが実行されることを可能にする情報処理システムは、典型的には情報処理装置のアセンブリから形成された並列システムである。
【0027】
各情報処理装置はたとえば関連付けられる回路(メモリなど)を伴うマイクロプロセッサであってもよく、そのとき、システムは相互接続されたマイクロプロセッサのアセンブリから形成される。別の例は、システムを形成する単一のマイクロプロセッサのそれであり、物理コアのアセンブリから構成される。そのようなマイクロプロセッサは概して「マルチコア」と呼ばれる。
【0028】
実現されるアーキテクチャとは無関係に、
図1の例のプロセスP
1、P
2、P
J、およびそれらが含むスレッドは、並列に実行されてもよい。
【0029】
プロセスP1が起動すると、少なくとも1つのスレッドも起動する。この第1のスレッドは、その後、他のスレッドの実行を開始することができる。これらのスレッドはもちろんアプリケーションスレッドであってもよい(言いかえれば、アプリケーションに属し、アプリケーションの「ロジック」が実現されることを可能にする)が、とりわけロギングスレッドF
Jであってもよい。
【0030】
以下では、
図1において示されるように、1つのロギングスレッドのみが記載される。しかしながら、特に負荷の分散を可能にするために、いくつかのロギングスレッドを提供することが可能である。
【0031】
1つの実施の形態によれば、ロギングスレッドが起動されると、それは以下を形成する:
−アプリケーションスレッドF
1、F
2、言いかえれば、メインアプリケーションスレッドからの、およびそれが続いて形成するかもしれない任意の潜在的なスレッドからの第1のロギング情報の受信を可能にする通信インターフェイスI
C;
−第2のロギング情報が処理要素に発行されることを可能にする発行インターフェイスI
P。
【0032】
ここで、「処理要素」はスレッドおよびプロセスを指す。
図1において、後で理解されるように、ロギングプロセスP
Jおよび出力スレッドF
Sはロギング情報を受信することができるような処理要素を形成する。
【0033】
本発明の1つの実施の形態によれば、これらのインターフェイスは「ソケット」タイプである。「ソケット」は、「Unix(登録商標)」タイプのオペレーティングシステム上で開発された当業者に周知の通信機構であるが、今日では大多数のオペレーティングシステムの下で存在する。
【0034】
それらはたとえばZeroMQに従ってもよい。ZeroMQは、オペレーティングシステムに依存しないさらなるインフラストラクチャサービスを提供するために基底のオペレーティングシステムとアプリケーションとの間に挿入される「ミドルウェア」タイプのプラットフォームである。CORBA(コモンオブジェクトリクエストブローカーアーキテクチャ)などの並行プラットフォームに関しては、たとえば、ZeroMQは、優れた使用環境および優れたパフォーマンス特性を提供する。コードはアプリケーションスレッドにとって非常に短いため、処理のオーバーロードがほとんどなく、ZeroMQライブラリ自体内の処理も非常に高速である。したがって、ZeroMQは本発明の要件に準拠し、所望のサービスが不利益かもしれないいかなる付加的処理もなしに満たされることを可能にする。
【0035】
ZeroMQが提供する機構は、ライブラリを通して、C言語におけるアプリケーションコードを使用してアクセス可能である。したがって、本発明の機構および利点はC言語において開発されたプロセスに関してアクセス可能である。
【0036】
1つの実施の形態によれば、通信インターフェイスI
Cは非同期インターフェイスであり:それは、アプリケーションスレッドがロギング情報を送信し、次いでその処理を続けることを、ロギングスレッドF
Jからの肯定応答を待つことなく可能にする。
【0037】
ZeroMQを用いる実現例の枠組では、この通信インターフェイスI
Cはプッシュ/プル型であってもよい。この場合、起動で、ロギングスレッドは、「プル」タイプのソケットを形成する。アプリケーションスレッドF
1、F
2は、次いで、ロギングスレッドF
Jの「プル」ソケットに接続された「プッシュ」タイプのソケットを介してロギング情報を送信してもよい。
【0038】
通信インターフェイスI
Cを形成する2つのタイプのソケット間において、「inproc(インプロセス)」プロトコルなどのようなスレッド間およびプロセス内トランスポートプロトコルが確立されてもよい。このプロトコルは同じプロセス内でスレッド間のメッセージの送信を可能にし:情報は、プロセスと関連付けられるコンテキストに属するメモリによって直接送信される。したがって、この機構はいかなる入力/出力も生成せず、したがって本発明に従う方法の高性能に寄与する。
【0039】
発行インターフェイスI
Pは、ロギングスレッドF
J内に形成される「pub(発行)」タイプのソケットを含んでもよい。処理要素(プロセスまたはスレッド)P
J、F
Sは、ロギングスレッドP
Jの「pub」ソケットにサブスクライブするために「sub()」タイプのソケットを形成することができる。したがって、ZeroMQによって管理される「発行・サブスクライブ」モデルは、メッセージが、既にサブスクライブされたすべての処理要素に送信されることを可能にする。
【0040】
本発明の1つの実施の形態によれば、プロセス(P
1)の開始において、アプリケーションスレッドは、その実行を続ける前に、このロギングスレッド(F
J)の初期設定を待つ。
【0041】
それがロギングスレッドF
Jの実行を開始すると、プロセスP
1の(メイン)スレッドは、ロギング情報を受信しなければならないある数の処理要素を示すことができる。それは、このサブスクライブされた処理要素の数が到達されたとき、ロギングスレッドF
Jから肯定応答を受信するにすぎないことになる。一旦、肯定応答が受信されると、次いで、スレッドはその実行を続けることができる。
【0042】
同様に、ロギングスレッドF
Jは、それを、ロギング情報を受信しなければならない数の処理要素と同期させることによって、初期化される。
【0043】
この目的のため、ロギングスレッドF
Jは同期情報を発行することができる。この情報の受信で、それを受信した処理要素は、ロギングスレッドに肯定応答を送信することになる。後者は、受信された肯定応答をカウントし、規定数がいつ到達されるかを容易に判断することができる。
【0044】
この同期段階では、ロギング情報が失われないことが保証され:実際、ロギングスレッドF
Jと処理要素との間の接続の確立は、ある時間を取り得る。さらに、処理要素それら自体も初期化のプロセスにあり得る。この時間中において、ロギングスレッドF
Jがロギング情報を直ちに送信し始めた場合、後者は、受信処理要素によって発行されるロギング情報の送信における肯定応答がないために、失われるであろう。このように肯定応答がないことは、十分な性能特性が達成されることを可能にする。
【0045】
しかしながら、ある状況では、いかなるロギング情報も失わないことは重要または重大にさえなり得る。
【0046】
この実現例によれば、したがって、この同期機構によってすべての同期情報の受信を保証しなければならない処理要素の数を特定することができる。
【0047】
この数の要素は、サブスクライブされた処理要素の組のサブセットを決定し、なぜならば一旦初期化段階が終わると、他の処理要素がロギングスレッドF
Jの発行にサブスクライブすることが完全に可能であるからである。しかしながら、後者はロギングスレッドF
Jの第1の発行を逃すかもしれない。
【0048】
本発明に従うロギング方法は、プロセスP
1の実行のためのステップを備える。先に記載されたように、この実行は、少なくとも1つのアプリケーションスレッドF
1、および1つのロギングスレッドF
Jの実行を必要を伴う。C言語で書かれたプロセスの場合、このアプリケーションスレッドF
1は関数のmain()の実行に対応してもよい。
【0049】
一旦初期化段階が終わると、アプリケーションスレッドはソフトウェアアプリケーションのコードを実行する。
【0050】
方法は、アプリケーションスレッド内にロギングイベントを検出すること、および第1のロギング情報e1、e2をロギングスレッドF
Jに直ちに送信することにある。
【0051】
ロギングイベントの検出はそれ自体公知の技術であり、それは、ある条件が満たされるとロギングイベントをトリガするために「ロガー」をコードに挿入することにある。これらの条件は、非常に単純に、(コードの動作の順序を守るために)コード内の正確なポイントを通過すること、またはそうでなければエラーの状況などであってもよい。
【0052】
アプリケーションスレッドF
1、F
2によって生成されたこのロギング情報は、それを、ロギングスレッドF
Jによって発行される第2のロギング情報と区別するために、ここでは「第1のロギング情報」と呼ばれる。
【0053】
この情報は名称およびレベルのみを含んでもよい。1つの実施の形態によれば、この第1の情報はこの名称およびこのレベルのみを含む。
【0054】
名称は、アプリケーションコード内でロガーを識別する一続きの文字であってもよい。
レベルは、一般的に、イベントの重大性の度合を識別する整数である。このレベルは先に規定されたリストに属してもよく、それは以下を含んでもよい:
−「重大」:一般に、プロセスの終了に至る重大なエラーを示す。
【0055】
−「エラー」:通常のエラーを示す。
−「警告」:重要でないエラーを示す。
【0056】
−「出力」:通常のメッセージ(エラーに関連付けられない)を示す。
−「情報」:アプリケーションの(開発者および試験者だけでなく)ユーザの注意を喚起するメッセージを示す。
【0057】
−「デバッグ」:アプリケーションの試験者(または「デバッガー」)に向けた、より詳細なメッセージを示す。
【0058】
−「トレース」:最も詳細なレベルに関連付けられるメッセージを示す。その使用は、明らかにアプリケーションの開発段階のために意図される。
【0059】
このリストは当然のことながら非網羅的である。多くの他のレベルがアプリケーションの開発者によって規定されてもよい。
【0060】
本発明の機構によって考慮されるためには、開発者または試験者に対して意図されるすべての出力がこの形式に適合することが重要である。したがって、開発者にとっては、特にC言語のprintf()関数による直接出力を避けることが重要である。それらは、たとえば「出力」レベルと置換されてもよい。
【0061】
この第1の情報はさらに以下のものを含んでもよい:
−ロギングイベントの発生のタイムスタンプ;
−プロセスP
1の識別子;
−実行コンテキストについての他の情報:カーネルのスレッドに対する識別子、ソフトウェアアプリケーション名、ファイル名、アプリケーションコードの行番号、実行中の関数の名称など。
【0062】
本発明によれば、アプリケーションスレッドは、この第1のロギング情報を通信インターフェイスI
Cを介してロギングスレッドF
Jに直ちに送信する。先に理解されたように、このインターフェイスは非同期であり、いかなる肯定応答も必要としない。また、一旦送信が(ロギングスレッドによる受信について心配することなく)実行されると、アプリケーションスレッドF
1、F
2は、直ちにアプリケーション処理を続けることができるような態様で、どのようなロックもインストールされない。
【0063】
1つの実施の形態によれば、どのような他の処理も、ロギングイベントの検出と第1のロギング情報の生成との間には適用されない。
【0064】
1つの実施の形態によれば、フォーマット化処理動作のみが適用される。
いずれの場合も、本発明によれば、アプリケーションスレッドは入力/出力機構を設定せず:これらの機構はロギングスレッドF
Jによって実現され、したがってアプリケーションスレッドF
1、F
2の外部に転送される。
【0065】
その結果、アプリケーションスレッドについて、追加費用は最小限に減じられる。
本発明の1つの実施の形態によれば、アプリケーションコードはモジュールに分割される。各モジュールは名称または識別子と関連付けられ、それはロガーの名称に組入れられてもよい。
【0066】
たとえば、モジュール「Module1」では、ロガーの名称は、「Module1.logger1」、「Module1.logger2」などである。
【0067】
この機構は、さまざまなロギングイベントがより明瞭に名付けられることを可能にし:チェーンの終わりで、イベントが発生したコード内の位置は、したがって、その名称に含まれるモジュール名の関数として直接的に決定されてもよい。
【0068】
ロギングスレッドF
Jは、アプリケーションスレッドF
1、F
2によって生成された第1のロギング情報を非同期態様で受信する。そのとき、その役割は、アプリケーションスレッドから受信された第1のロギング情報およびおそらくは相補的な情報から開始する第2のロギング情報を生成することである。この相補的な情報は、プロセスのアプリケーションスレッドのすべてに共通の情報であってもよい。
【0069】
ロギングスレッドF
Jによって実現される処理は、この第2のロギング情報の生成に制限されてもよい。生成は、一方では、潜在的な相補的情報の追加を含んでもよいが、処理要素によるその利用を可能にする所定のフォーマットに従って、条件付けも含むことができる。
【0070】
このフォーマット化は、非常に単純であってもよく、第2の情報が、用いられるコンピュータプログラミング言語から独立したフォーマットにあるように、もっぱらあるフォーマット化からなってもよい。
【0071】
この第2の情報は、その後発行インターフェイスI
Pを介してロギングスレッドF
Jによって発行される。次いで、それは、先に記載されたように、ロギングスレッドに既に登録されている1つ以上の処理要素F
s、P
J)によって受信されることができる。
【0072】
これらの処理要素は、プロセスP1に属する出力スレッドF
sを含んでもよい。この出力スレッドは、表示端末(画面等)上、メモリ、特に大容量メモリなどに保存されたファイル内、などに、第2のロギング情報の出力を形成するよう設計されてもよい。
【0073】
これらの出力機構は、ハードウェアとの必要とされる対話のため、および一般に肯定応答の必要性(スレッドは、情報が実際にハードディスクなどに保存されたことを確認する必要がある)のため、処理時間において高くつく。
【0074】
本発明により、これらの機構は、ロギングスレッドの動作シーケンスと並行する態様でその動作シーケンスに従うアプリケーションスレッドに影響を与えない。
【0075】
処理要素は、さらに、前記プロセス(P
1)とは異なるロギングプロセス(P
J)を含んでもよい。
【0076】
このプロセスは、さらに、出力スレッドF
Sと同じ態様で出力機構を実現してもよい。
さらに、それは、ロギング情報の利用のためのより複雑な機構:フィルタ処理などを実現してもよい。
【0077】
本発明の1つの実施の形態によれば、プロセスP
1が複製されると、ロギングスレッドF
Jおよび潜在的な出力スレッドF
Sは終了され、次いで、最初の親プロセスP
1内で再起動される。娘プロセス内において、これらの2つのスレッドは再起動されない(以下に記載されるように、それらは「ファイナライズ済み」状態に入る)。実際、非常に頻繁に、娘プロセスは、娘プロセスの内容を新しいプログラムによって置き換えて「潰す」関数「exec()」の実行をトリガし:したがって、ロギングスレッドおよび出力スレッドの自動再起動をトリガする必要はなく、それは逆効果でさえあるかもしれない。
【0078】
複製はまたは「fork」は、「Unix(登録商標)」タイプのオペレーティングシステムで動作するソフトウェアアプリケーションまたはPosix規格に準拠したソフトウェアアプリケーションで新しいプロセスを作成するための機構である。
【0079】
いくつかのスレッドを含むプロセス(「マルチスレッドプロセス」)の複製は重大な問題を提起する。この問題は、特にPosix規格、IEEE1003.1、特に「Rationales」の部分に記載されている。
【0080】
本発明によって実現される機構は、それが回避されることを可能にする。
さらに、複製「fork()」を最良に管理するために、状態機械の管理を設定してもよい。
【0081】
図2は、ロギングスレッドF
Jのそのような状態機械を示す。スレッドF
Jは5つの主な状態であり得ることが考えられる。これらの状態は従来、
−「未設定」:「開始されていない」状態に対応し、これは、スレッドが、アプリケーションスレッドがその初期化をトリガする前であってもよい状態に対応する。
【0082】
−「初期化中」:スレッドの初期化状態に対応し、その間に前述の同期化ステップが特に行われる。
【0083】
−「初期化済」:ロギングスレッドの通常動作に対応する。
−「ファイナライズ中」:ロギングスレッドの終了に対応する。
【0084】
−「ファイナライズ済み」:スレッドが終わった状態に対応する。
ある状態では、本発明のこの実施の形態によれば、複製は禁じられる。これは、「初期化中」状態および「ファイナライズ中」状態に対する場合であり:矢印「fork()」は「不正な」状態に至る。
【0085】
特定の状態「未設定」および「ファイナライズ済み」では、複製が許可されてもよく、特定の処理動作を発生させなくてもよい。矢印「fork()」は現在の状態にループして戻る。
【0086】
「初期化済」状態では、複製は、ロギングスレッドを終了させるために遷移を状態「ファイナライズ中」に移行する。
【0087】
潜在的な出力スレッドF
Sについて同じことが言える。
一旦スレッドが終わると、プロセスを複製することができる。
【0088】
一旦、複製が実行されると、スレッドF
JおよびF
Sは再起動されてもよい。親プロセス(言いかえれば初期プロセスP
1)では、スレッドは、それらが複製前であった状態、言いかえれば「初期化済」状態で再起動される。娘プロセスでは、スレッドは「未設定」状態で開始し:次いで、娘プロセスのアプリケーションスレッドはそれに状態を変更させるためにその初期設定を起動しなければならない。
【0089】
さらに、PosixまたはUnix(登録商標)タイプのシステムの下で動作するプロセスP
1は、信号を受信することができる。これらの信号は、信号SIGINT、SIGTERM、SIGQUIT、SIGSEGV、SIGBUSなどのような、プロセスを終了させるために与えられてもよい。
【0090】
このような信号がロギングスレッドF
Jによって受信されると、後者はそれらをそれらの性質に応じて処理するかどうかを選択してもよい。たとえば、信号SIGINT、SIGTERMおよびSIGQUITは、アプリケーションスレッドによって処理される必要があると考慮されてもよく、したがって、ロギングスレッドによって考慮されなくてもよい。それは、他方、SIGSEGVおよびSIGBUSなどの他のタイプの信号を考慮してもよい。
【0091】
そのような信号の受信と同時に、ロギングスレッドF
Jは、これはロギングイベントを構成すると考慮し、次いで、この信号と関連付けて、ロギング情報を発行してもよい。
【0092】
続いて、それはもう一度この信号およびその「通常の」処理をトリガしてもよい。信号の通常の処理は、典型的には「ハンドラ」と呼ばれ、この信号と関連付けられる処理コードによって提供される。この信号SIGSEGVまたはSIGBUSの通常の処理はプロセスの終了に至る。
【0093】
したがって、この機構によって、プロセスは、終わることにある、期待される挙動を採用するが、このイベントの受信にリンクされるロギングも確実に行われ:さらに、処理要素がロギングスレッドにサブスクライブされる場合には、それにプロセスP
1の終了の原因が通知される。
【0094】
信号がアプリケーションスレッドによって受信される場合には、後者はそれがロギングイベントを構成すると判断してもよい。この目的のため、ある特定のコードが「ハンドラ」として信号に関連付けられてもよく:所与の信号の受信で、この特定のコードがオペレーティングシステムによってトリガされる。
【0095】
この特定のコードは通信インターフェイスI
Cを介してロギングスレッドに(第1の)ロギング情報の即時送信を可能にする。
【0096】
このコードは、さらにロギングスレッドがこの第1のロギング情報から開始する第2のロギング情報を生成し、発行インターフェイスを介してそれを発行することを可能にする待ち時間を含んでもよい。
【0097】
そのときのみ、特定のコードは、プロセスの終了を実現するかまたはプロセスそれ自体を終了するために、通常の処理コードを呼出すことができる。
【0098】
したがって、サブスクライブされた処理要素は、プロセスの終了の原因を通知されることができる。
【0099】
言うまでもなく、本発明は、説明され図示された例および実施の形態に限定されず、当業者がアクセス可能な多数の変形例が可能である。