(57)【特許請求の範囲】
【請求項１】
プロセッサに、現在のアクティブなスレッドによって同時に設定される少なくとも２つのイベントの存在を決定させ、前記少なくとも２つのイベントは第１のイベント及び第２のイベントを含み、ペンディングスレッドは、スケジュールされた場合に、前記第１のイベントにより設定を実行しなければならず、少なくとも１つの他のペンディングスレッドは、スケジュールされた場合に、前記第２のイベントにより設定を実行しなければならず、
現在のアクティブなスレッドによって同時に設定される前記少なくとも２つのイベントが存在すると決定された場合に、前記プロセッサに、一時的にハードウェアタイマ割り込み及び前記ペンディングスレッド及び前記少なくとも１つの他のペンディングスレッドのスケジューリングを前記現在のアクティブなスレッドによって前記第１及び第２のイベントが設定されるまで禁止させるためのプログラム。
【請求項２】
前記プロセッサに、前記現在のアクティブなスレッドの優先レベルに一時的に影響を及ぼすことにより、前記ペンディングスレッド及び前記少なくとも１つの他のペンディングスレッドのスケジューリングを一時的に禁止させる請求項１記載のプログラム。
【請求項３】
前記現在のアクティブなスレッドは、少なくとも部分的に、前記少なくとも２つのイベントのうちの少なくとも１つを設定するための関数を呼び出すことにより、前記少なくとも２つのイベントを設定する請求項１記載のプログラム。
【請求項４】
前記現在のアクティブなスレッドは、少なくとも部分的に、前記少なくとも２つのイベントのそれぞれを個々に設定するオペレーティングシステムにおける関数を呼び出すことにより、前記少なくとも２つのイベントを設定する請求項１記載のプログラム。
【請求項５】
少なくとも部分的に、前記プロセッサに、前記優先レベルを最も高い可能な優先レベルに設定することにより、前記優先レベルに一時的に影響を及ぼさせる請求項２記載のプログラム。
【請求項６】
前記プロセッサに、前記プロセッサによる処理のためのタスクのスケジューラを一時的に不能にすることによって、前記ペンディングスレッド及び前記少なくとも１つの他のペンディングスレッドのスケジューリングを一時的に禁止させる請求項１記載のプログラム。
【請求項７】
前記プロセッサに、タイムベースメカニズム及び／又はフラグ設定メカニズムのうちの少なくとも１つを使用するタスクの前記スケジューラを一時的に不能にさせる請求項６記載のプログラム。
【請求項８】
プロセッサによって、
現在のアクティブなスレッドによって同時に設定される少なくとも２つのイベントの存在を決定し、前記少なくとも２つのイベントは第１のイベント及び第２のイベントを含み、ペンディングスレッドは、スケジュールされた場合に、前記第１のイベントにより設定を実行しなければならず、少なくとも１つの他のペンディングスレッドは、スケジュールされた場合に、前記第２のイベントにより設定を実行しなければならず、
現在のアクティブなスレッドによって同時に設定される前記少なくとも２つのイベントが存在すると決定した場合に、一時的にハードウェアタイマ割り込み及び前記ペンディングスレッド及び前記少なくとも１つの他のペンディングスレッドのスケジューリングを前記現在のアクティブなスレッドによって前記少なくとも２つの第１及び第２のイベントが設定されるまで禁止するマルチスレッドシステムにおけるイベントの設定方法。
【請求項９】
前記ペンディングスレッド及び前記少なくとも１つの他のペンディングスレッドのスケジューリングを一時的に禁止することは、前記現在のアクティブなスレッドの優先レベルに一時的に影響を及ぼすことをさらに含む請求項８記載の方法。
【請求項１０】
前記優先レベルに一時的に影響を及ぼすことは、前記優先レベルを最も高い可能な優先レベルに設定することを含む請求項９記載の方法。
【請求項１１】
前記少なくとも２つのイベントのうちの前記少なくとも１つはスレッドの状況又はステータスのうちの少なくとも１つを定義する請求項８記載の方法。
【請求項１２】
前記少なくとも２つのイベントのうちの前記少なくとも１つのイベントは書き込み完了イベントを含む請求項８記載の方法。
【請求項１３】
前記少なくとも２つのイベントのうちの前記少なくとも１つのイベントはメモリドライバ利用可能イベントを含む請求項８記載の方法。
【請求項１４】
一時的に前記ペンディングスレッド及び前記少なくとも１つの他のペンディングスレッドのスケジューリングを前記現在のアクティブなスレッドによって前記少なくとも２つの第１及び第２のイベントが設定されるまで禁止することは、前記プロセッサによる処理のためのタスクのスケジューラを一時的に不能にすることを含む請求項８記載の方法。
【請求項１５】
前記タスクのスケジューラを一時的に不能にすることは、タイムベースメカニズム及び／又はフラグ設定メカニズムのうちの少なくとも１つを使用するタスクの前記スケジューラを一時的に不能にすることを含む請求項１４記載の方法。
【請求項１６】
現在のアクティブなスレッドにおけるタスクを処理する手段と、
現在のアクティブなスレッドによって同時に設定される少なくとも２つのイベントの存在を決定する手段と、前記少なくとも２つのイベントは第１のイベント及び第２のイベントを含み、ペンディングスレッドは、スケジュールされた場合に、前記第１のイベントにより設定を実行しなければならず、少なくとも１つの他のペンディングスレッドは、スケジュールされた場合に、前記第２のイベントにより設定を実行しなければならず、
現在のアクティブなスレッドによって同時に設定される前記少なくとも２つのイベントが存在すると決定した場合に、一時的にハードウェアタイマ割り込み及び前記ペンディングスレッド及び前記少なくとも１つの他のペンディングスレッドのスケジューリングを前記現在のアクティブなスレッドによって前記第１及び第２のイベントが設定されるまで禁止する手段とを具備する装置。
【請求項１７】
前記スケジューリングを一時的に禁止する手段は、前記現在のアクティブなスレッドの優先レベルに一時的に影響を及ぼす手段を備える請求項１６記載の装置。
【請求項１８】
前記優先レベルに一時的に影響を及ぼす手段は、前記優先レベルを最も高い可能な優先レベルに設定する手段を含む請求項１７記載の装置。
【請求項１９】
一時的に前記ペンディングスレッド及び前記少なくとも１つの他のペンディングスレッドのスケジューリングを前記現在のアクティブなスレッドによって前記第１及び第２のイベントが設定されるまで禁止する手段は、前記タスクを処理する手段のためにタスクのスケジューリングする手段を一時的に不能にする手段を備える請求項１６記載の装置。
【請求項２０】
前記タスクをスケジューリングする手段を一時的に不能にする手段は、タイムベースメカニズム及び／又はフラグ設定メカニズムのうちの少なくとも１つを使用するタスクのスケジューリングをする手段を一時的に不能にする手段を含む請求項１９記載の装置。
【請求項２１】
現在のアクティブなスレッドに関連するタスクを実行し、前記現在のアクティブなスレッドはスケジューラによって識別され、
現在のアクティブなスレッドによって同時に設定される少なくとも２つのイベントの存在を決定し、前記少なくとも２つのイベントは第１のイベント及び第２のイベントを含み、ペンディングスレッドは、前記スケジューラによってスケジュールされた場合に、前記第１のイベントにより設定を実行しなければならず、少なくとも１つの他のペンディングスレッドは、前記スケジューラによってスケジュールされた場合に、前記第２のイベントにより設定を実行しなければならず、
前記現在のアクティブなスレッドが、現在のアクティブなスレッドによって同時に設定される前記少なくとも２つのイベントが存在すると決定した場合に、一時的にハードウェアタイマ割り込み及び前記ペンディングスレッド及び前記少なくとも１つの他のペンディングスレッドのスケジューリングを前記現在のアクティブなスレッドによって前記第１及び第２のイベントが設定されるまで禁止するプロセッサを具備する装置。
【請求項２２】
前記プロセッサが、前記現在のアクティブなスレッドの優先レベルに一時的に影響を及ぼすことにより、一時的に前記スケジューラが前記ペンディングスレッド及び前記少なくとも１つの他のペンディングスレッドのスケジューリングを禁止する請求項２１記載の装置。
【請求項２３】
前記プロセッサは、前記優先レベルを最も高い可能な優先レベルに設定する請求項２２記載の装置。
【請求項２４】
前記プロセッサは、タスクのスケジューラを一時的に不能にすることにより、前記ペンディングスレッド及び前記少なくとも１つの他のペンディングスレッドのスケジューリングを一時的に禁止する請求項２１記載の装置。
【請求項２５】
前記プロセッサは、タイムベースメカニズム及び／又はフラグ設定メカニズムのうちの少なくとも１つを使用するタスクの前記スケジューラを一時的に不能にする請求項２４記載の装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は一般にコンピュータ処理に関し、より詳細には、マルチスレッドシステムの中でイベントを設定するための技術に関する。
【背景技術】
【０００２】
オペレーティングシステムは、１つの一般的な種類のマルチスレッドシステムである。オペレーティングシステムは様々なシステムリソース（例えばハードウェア装置、記憶装置、インタフェースなど）を管理し、システムリソースにアクセスするためにアプリケーションがオペレーティングシステム上でランすることを可能にするサービスを提供する。典型的にオペレーティングシステムは、適切に起動、スケジュールおよび処理されるスレッドを介して、これらのサービスを提供する。スレッドは、実行されるべきタスクとして考えられてもよい。
【０００３】
リアルタイムオペレーティングシステムはオペレーティングシステムの１つのクラスであり、一般に無線装置（例えば携帯電話）、携帯情報端末（ＰＤＡ）などの多くの電子装置のために使用される。リアルタイムオペレーティングシステムの主要な属性は、割り込み優先権に基づくスケジューリングである。この種類のスケジューリングは、実行のために準備ができているすべてのスレッドの中で、最も高い優先権を備えたスレッドが最初に処理されるように、スレッドをスケジュールしようとする。各スレッドは特定の優先権、および場合によっては、スレッドが処理されることが可能となる前に設定されなければならないイベントに関連している。イベントが設定されるたびに、オペレーティングシステムは、どのスレッドが実行のために準備ができているのか（すなわち任意のイベント上で待機中ではないか、または設定済みのイベント上で待機中であるか）を判定し、準備ができている最も高い優先権のスレッドをスケジュールする。現在処理されているスレッドは、より高い優先権を有し、実行のために準備ができている別のスレッドによって割り込まれてもよい。
【０００４】
リアルタイムオペレーティングシステムによって、アクティブスレッドは１回につき単一のイベントを設定することができてもよい。しかしながら、アクティブスレッドは設定される複数のイベントを有している場合があり、以下で説明されるように、アクティブスレッドがこれらのイベントを設定する順序が、スレッドがスケジュールされる順序に影響を及ぼす場合がある。イベントが設定される順序のせいで、スレッドが望ましくない順序でスケジュールされる場合、システムの処理能力は低下する場合がある。
【発明の概要】
【０００５】
したがって当技術分野では、マルチスレッドシステムの中でイベントを設定するための技術が必要とされている。
【０００６】
本明細書では、マルチスレッドシステム（例えばリアルタイムオペレーティングシステム）の中で、スケジューラによるスレッドの中間スケジューリングを伴わずにイベントを設定するための技術が説明される。マルチスレッドシステムの中で１つまたは複数のイベントを設定するために、最初にスケジューラは本質的に無効にされる。次いで、例えば単一のイベントを設定するために関数を繰り返し呼び出すことによって、イベントが設定される。この関数は、設定されるべき各イベントについて１回呼び出されてもよい。スケジューラはその後、その通常の効果に回復される。
【０００７】
１つの実施形態で、処理されている現在のスレッドの優先権を、例えばシステム中で最も高い可能な優先レベルなどの高い優先レベルに人為的に設定することによって、スケジューラは無効にされる。このことは、イベントが設定される時間に、別のスレッドがスケジュールされること、および現在のスレッドが別のスレッドによって割り込まれることを回避する。すべてのイベントが設定された後、現在のスレッドの優先権は本来の優先レベルに回復される。ここで現在のスレッドはより高い優先権を備えた別のスレッドによって割り込まれることが可能であるので、このことはその後スケジューラをその通常の効果に回復する。
【０００８】
本明細書で説明されるイベント設定技術はソフトウェアシステム、ハードウェアシステム、またはハードウェアとソフトウェアの両方を備えたシステムのために使用されてもよい。例えば、中間スケジューリングを伴わずにイベントを設定するためのコードは、スレッドによって呼び出されてもよいソフトウェア関数として実装されてもよい。この関数はその後、１回につき単一のイベントを設定するために、（例えばオペレーティングシステムによって提供される）別のソフトウェア関数を呼び出してもよい。
【０００９】
本発明の様々な態様および実施形態は、以下でより詳細に説明される。
【００１０】
本発明の機能および性質は、全体を通じて同じ参照符号が対応して識別を行う図面と合わせて考慮する場合に、以下で言及される詳細な説明から、より明らかとなろう。
【図面の簡単な説明】
【００１１】
【図１】例示的なマルチスレッドシステムを示す図である。
【図２Ａ】図２Ｂとは異なる順序で設定される、２つのイベント上で待機中の２つのスレッドのスケジューリングを示す図である。
【図２Ｂ】図２Ａとは異なる順序で設定される、２つのイベント上で待機中の２つのスレッドのスケジューリングを示す図である。
【図２Ｃ】中間スケジューリングを伴わずに設定される、２つのイベント上で待機中の２つのスレッドのスケジューリングを示す図である。
【図３】中間スケジューリングを伴わずにイベントを設定するためのプロセスを示す図である。
【図４】優先権を操作することによって、中間スケジューリングを伴わずにイベントを設定するためのプロセスを示す図である。
【図５】図４のプロセスの実施を示す図である。
【図６】別のマルチスレッドシステムを示す図である。
【図７】無線装置のブロック図である。
【図８】記憶システムのブロック図である。
【発明を実施するための形態】
【００１２】
本明細書では「例示的」という語は、「例、実例、または具体例としての役割を果たす」ということを意味するために使用される。本明細書で「例示的」として説明される任意の実施形態または設計は、必ずしもその他の実施形態もしくは設計よりも好ましいか、または有利なものとして解釈されるわけではない。
【００１３】
図１は、本明細書で説明されるイベント設定技術が用いられてもよい例示的なマルチスレッドシステム１００の図を示す。スレッド１１０ｘ、１１０ｙおよび１１０ｚはアプリケーション（図１に不図示）によって起動されてもよく、スケジュールかつ実行されるべきものである。スレッドとは、これもまたスレッドであってよい主体によって実行されるべきタスクのことである。スレッドは、（１）タスクのために実行されるべきソフトウェアコード、および（２）例えばレジスタ、スタック、変数などのタスクについての状態情報に関連していてもよい。スレッドは、任意の所与の時点での複数の可能な状態（例えば「保留」、「準備済み」および「アクティブ」）のうちの１つであってよい。本明細書で使用される際、「保留」スレッドとは、スケジュールされることが可能になる前のイベントで待機中のスレッドのことであり、「準備済み」スレッドとは、実行のために準備ができていて（すなわち任意のイベント上で待機中ではない）、スケジュールされてもよいスレッドのことであり、「アクティブ」スレッドとは、スケジュールが完了していて、現在ラン中のスレッドのことである。
【００１４】
各スレッド１１０は、スレッドの重要性を示す優先レベル／値と関連している。各スレッドの優先権は、例えばスレッドを起動するアプリケーションに割り当てられた優先権によって決定されてもよい。優先値の値域はシステムのために使用されてもよく、より高い優先値はより大きな重要度に対応してもよい。次いで、各スレッドについての優先値は、そのスレッドの相対的重要度に基づいて可能な優先値の値域から選択される。各スレッド１１０はさらに、ゼロ、１つまたは複数の保留イベントに関連している。イベントは、スレッドの状態または状況を示している。オペレーティングシステムのコンテキストでは、イベントは信号、フラグ、メッセージ、またはその他の用語とも呼ばれる。保留イベントとは、スレッドがスケジュールされることが可能になる前に、少なくとも１つのスレッドが待機しているイベントのことである。
【００１５】
スケジューラ１２０はスレッド１１０を受信し、実行のためにこれらのスレッドをスケジュールする。典型的に、任意の所与の時点で１つだけのスレッド１１０がスケジュールされ、スケジュールされたスレッドはアクティブスレッドとなり、実行する。スケジューラ１２０は、（１）これらのスレッドについての優先値および保留イベント、ならびに（２）現在ラン中であるアクティブスレッド１３０により設定されたイベントに基づいて、スレッド１１０をスケジュールする。スケジューラ１２０はさらに、任意の所与の時点で最も高い優先権を備え、実行のための準備ができているスレッドがランするように、スレッドをスケジュールする。
【００１６】
アクティブスレッド１３０は、スケジューラ１２０によってスケジュールされ、現在ラン中であるスレッドである。アクティブスレッド１３０はまた、アクティブスレッドのために適用可能であり、別の保留スレッド１１０をスケジュールするためにスケジューラ１２０によって使用されてもよいイベントを設定する。アクティブスレッド１３０は、関連した状態または状況が生じるたびに、各イベントを設定してもよい。
【００１７】
マルチスレッドシステム１００はソフトウェアシステム、ハードウェアシステム、またはソフトウェアとハードウェアの両方を備えたシステムであってよい。明快であるために、以下の説明のうちのある部分は、スケジューラ１２０がオペレーティングシステム（例えばリアルタイムオペレーティングシステム）の一部である、特定のマルチスレッドシステムについてのものである。
【００１８】
オペレーティングシステムによって、スレッド（例えばアクティブスレッド１３０）は１回につき単一のイベントを設定することができる。イベントが設定されるたびに、オペレーティングシステムは、ちょうど設定されたイベントに適した動作を実行する。例えばオペレーティングシステムは、アクティブスレッド１３０によって設定されたイベントに基づいて、保留スレッドをスケジュールしてもよい。イベントが設定されるたびに、オペレーティングシステムは、ちょうど設定されたイベント上で待機中の保留スレッドおよび現在処理されているスレッドを含む、実行のために準備ができているすべてのスレッドを識別する。次いでオペレーティングシステムは、最も高い優先権を備えた準備済みスレッドを実行のためにスケジュールする。
【００１９】
アクティブスレッド１３０はイベントが生じるときにそれらを設定してもよく、オペレーティングシステムによって必要とされる場合には、１回につき単一のイベントを設定してもよい。一般にアクティブスレッド１３０は、アクティブスレッドの状態に応じて、現在のスレッドの処理の間に任意の数のイベントおよび任意の特定のイベントを設定してもよい。アクティブスレッド１３０は、（１）スケジュールされることを待機している保留スレッド、または（２）これらの保留スレッドが待機しているイベントを認識しなくてもよい。結果的に、アクティブスレッド１３０は、保留スレッドおよびそれらの保留イベントに基づいて決定された優先順位で、イベントを設定しようとすることはない。
【００２０】
アクティブスレッド１３０は、現在のスレッドの処理を完了する間に、またはそれを完了した上で、複数のイベントを設定してもよい。さらに、スケジューラ１２０はイベントが設定されるたびに、スレッド１１０をスケジュールしてもよい。この場合スレッド１１０は、以下で示されるように、イベントが設定される順序に応じて、異なる順序でスケジュールされてもよい。
【００２１】
図２Ａは、２つのイベント上で待機中の２つの保留スレッドのためのスケジューリング例を示す。この例で、はじめにアクティブスレッド１３０は、低い優先権１０を有するスレッドＷである。スレッドＸは高い優先権３０を有し、イベントＡ上で待機中であり、スレッドＹは中間の優先権２０を有し、イベントＢ上で待機中である。スレッドＸとＹとは両方とも、アクティブスレッド１３０がメモリへの書き込みを完了するのを待機していてもよいので、スレッドＸとＹとはそれら自体のメモリへの書き込みを実行することができる。イベントＡは「書き込み完了」イベントであってもよく、イベントＢは「メモリドライバ利用可能」イベントであってもよい。この場合、アクティブスレッド１３０は現在の書き込みを終了したときに、両方のイベントを設定してよい。しかしながら、スレッド１３０はオペレーティングシステムによる強制を受けてもよく、１回につき１つのイベントだけを設定することができてもよい。アクティブスレッド１３０は、これらの２つのイベント上で待機中の保留スレッドＸおよびＹの優先権についての情報を持たない。アクティブスレッド１３０は、任意の順序で、１回につき１つのイベントで、これらの２つのイベントを設定してもよい。
【００２２】
図２Ａに示されている実施例では、アクティブスレッド１３０は最初にイベントＡを設定し、次いでイベントＢを後で設定する。イベントＡを設定する指示を受信すると、スレッドＸが現時点で実行の準備ができており、現在のスレッドＷよりも高い優先権を有していることから、スケジューラ１２０はスレッドＸをスケジュールする。スレッドＸは現在のスレッドＷに割り込み、アクティブスレッド１３０として実行する。その後スレッドＷは準備済み状態に移り、イベントＢを設定する機会を得ることはない。スレッドＸが完了され、保留状態に戻った後で、スケジューラ１２０は準備ができている唯一のスレッドであるスレッドＷをスケジュールする。スレッドＷは再びアクティブとなり、イベントＢを設定する。イベントＢを設定する指示を受信すると、スレッドＹが現時点で実行の準備ができており、スレッドＷよりも高い優先権を有していることから、スケジューラ１２０はスレッドＹをスケジュールする。スレッドＹはスレッドＷに割り込み、アクティブスレッド１３０として実行する。この例の中で、スレッドＸがスレッドＹよりも高い優先権を有しており、スレッドＹの前にスケジュールされるので、スレッドＸとＹとは望ましい順序でスケジュールされる。
【００２３】
図２Ｂは、２つのイベントが異なる順序で設定されることによる、２つの保留スレッドＸとＹとの異なる順序でのスケジューリングを示す。この例の中で、アクティブスレッド１３０は最初にイベントＢを設定し、次いでイベントＡを後で設定する。イベントＢを設定する指示を受信すると、スケジューラ１２０はスレッドＹが現時点で実行のために準備ができていることを判定し、スレッドＹが現在のスレッドＷよりも高い優先権を有していることから、スレッドＹをスケジュールする。スレッドＹはスレッドＷに割り込み、アクティブスレッド１３０として実行する。スレッドＹが完了され、保留状態に戻った後で、スケジューラ１２０は、再びアクティブになり、イベントＢを設定するスレッドＷをスケジュールする。イベントＡを設定する指示を受信すると、スケジューラ１２０はスレッドＸが現時点で実行のために準備ができていることを判定し、スレッドＸがスレッドＷよりも高い優先権を有していることから、スレッドＸをスケジュールする。この例の中で、スレッドＸとスレッドＹとは望ましくない順序でスケジュールされる。スレッドＸまたはＹのいずれかは、スレッドＷがイベントを設定した後でスケジュールされてもよいが、２つのイベントは、この実施例についての誤りである、誤った順序で設定されるため、より低い優先権を備えたスレッドＹがスレッドＸよりも先にスケジュールされる。
【００２４】
図２Ａおよび２Ｂに示されているように、保留スレッドはイベントが設定される順序に応じて、異なる順序で（かつ時には望ましくない順序で）スケジュールされる場合がある。スケジューラが、各イベントが設定された後で中間スケジューリングを実行しないような方法でイベントを設定することによって、改善された処理能力が達成されることができる。
【００２５】
図３は、スケジューラ１２０によるスレッドの中間スケジューリングを伴わずに、任意の数のイベントを設定するためのプロセス３００を示す。プロセス３００は、アクティブスレッド１３０によって実行されてもよい。
【００２６】
最初に、設定される任意のイベントが存在するかどうかについての判定が行われる（ブロック３１２）。答えが「いいえ」である場合、プロセス３００はブロック３１２へ戻り、待機する。一方、１つまたは複数のイベントが設定されることになっており、ブロック３１２について答えが「はい」である場合、スケジューラは、イベントが設定される期間、本質的に無効にされる（ブロック３１４）。スケジューラは、例えば（１）以下で説明されるように、現在のスレッドの優先権を操作することによるもの、（２）ハードウェアタイマの中断を介して時間を刻むタイマに基づいたスケジューリングを妨げる中断（例えばタイムチック中断）をロックすることによるもの、または（３）適切なフラグを設定して、このフラグが設定されている間はスレッドをスケジュールしないようにスケジューラに指示することによるものなどの様々なメカニズムを使用して、無効にされてもよい。その後すべてのイベントは、例えばシステムに必要とされるのであれば、１回に１つのイベントで、設定される（ブロック３１６）。すべてのイベントが設定された後、スケジューラはその通常の効果に回復される（ブロック３１８）。このとき、スケジューラは設定されたすべてのイベントに基づいた適切な順序で、スレッドをスケジュールすることができる。
【００２７】
イベントを設定する目的でスケジューラを無効にするための特定の実施形態は、以下で説明される。この実施形態は、スケジューラを本質的に無効にするために、現在のスレッドの優先権を操作する。
【００２８】
図４は、優先権を操作することによって、スケジューラ１２０によるスレッドの中間スケジューリングを伴わずに任意の数のイベントを設定するためのプロセス４００を示す。プロセス４００は、設定される１つまたは複数のイベントが存在するときにはいつでも、アクティブスレッド１３０によって実行されてもよい。プロセス４００は、図３のプロセス３００のブロック３１４、３１６および３１８のために使用されてもよい。プロセス４００はまた、イベントを設定するためにアクティブスレッド１３０によって呼び出される関数（例えばイベント設定関数）として実施されてもよい。
【００２９】
最初に、図２Ａおよび２Ｂの例についてはスレッドＷである現在のスレッドの優先レベルは、一時的ロケーションに保存される（ブロック４１２）。次いで、現在のスレッドの優先権は、例えばシステム中で最も高い可能な優先レベルなどの高い優先レベルに、人為的に設定される（ブロック４１４）。現在のスレッドよりも高い優先権を備えた保留スレッドは特定のイベント上で待機していてもよいということが考えられる。割り込み優先権に基づくスケジューリングを用いるリアルタイムオペレーティングシステムでは、この特定のイベントが設定される場合には、保留スレッドがスケジュールされ、現在のスレッドに割り込みをする。イベントが設定される間の別のスレッドによる現在のスレッドへの割り込みを回避するために、現在のスレッドの優先権は最も高い可能な優先レベルに一時的に高められてもよい。
【００３０】
次いで、例えば単一のイベントを設定するための関数（例えばイベント設定関数）を呼び出すことによって、イベントが設定される（ブロック４１６）。このイベントの設定によって、スケジューラはスケジューリングアルゴリズムを実行し、実行のために準備ができている、すべてのスレッドの中で最も高い優先権を備えたスレッドをスケジュールしてもよい。しかしながら、現在のスレッドの優先権は最も高い可能なレベルにまで高められているので、別のスレッドがスケジュールされることはなく、現在のスレッドは処理され続けることになる。次いで、別のイベントが設定されることを必要としているかどうかについての判定が行われる（ブロック４１８）。答えが「はい」であれば、プロセス４００は、例えば単一のイベントを設定するためのイベント設定関数を再度呼び出すことによって、別のイベントを設定するためにブロック４１６へ戻る。一方、設定される別のイベントが存在せず、ブロック４１８についての答えが「いいえ」である場合、現在のスレッドの優先権は本来の優先レベルに回復される（ブロック４２０）。
【００３１】
現在のスレッドの優先権は、適切な関数（例えばスレッド優先権設定関数）を呼び出すことによって変更されてもよい。典型的に、この関数を呼び出すことはスケジューラを起動させ、スケジューラはその後適切にスレッドをスケジュールする。ブロック４１４で現在のスレッドが最も高い可能な優先レベルに設定されると、現在のスレッドが最も高いレベルにあることから、別のスレッドがスケジュールされることはない。ブロック４２０で現在のスレッドが本来の優先レベルに回復されると、スケジューラは通常のスケジューリングを実行し、現在のスレッドは、準備ができており、より高い優先権を有する別のスレッドによって割り込まれてもよい。
【００３２】
図２Ｃは、本明細書で説明される技術を使用する、「同時」に設定されている２つのイベントを用いる２つの保留スレッドＸおよびＹのスケジューリングを示す。この例の中で、スケジューラ１２０は、例えばスレッドＷを本来の優先レベルに維持しておくことによって、アクティブスレッド１３０が実行している間、有効である。イベントＡおよびＢを設定する前に、アクティブスレッド１３０は、例えばスレッドＷの優先権を最も高い可能なレベルにまで高めることによって、スケジューラ１２０を本質的に無効にする。次いでアクティブスレッド１３０は、たとえスレッドＹが準備ができていても、スレッドＹのスケジューリングを起動することのないイベントＢを設定する。次いでアクティブスレッド１３０は、たとえスレッドＸまたはＹが準備ができていても、これらのスレッドのスケジューリングを起動することのないイベントＡを設定する。次いでアクティブスレッド１３０は、例えばスレッドＷの優先権を本来のレベルに回復することによって、スケジューラ１２０をその通常の効果に回復する。次いでスケジューラ１２０は、２つのスレッドＸおよびＹのうちでより高い優先レベルを有し、準備ができているスレッドＸをスケジュールする。スレッドＸが完了されると、スケジューラはスレッドＹをスケジュールする。
【００３３】
図５は、オペレーティングシステムのコンテキストでの図４のプロセス４００の例示的な実施を示す。オペレーティングシステムは、基本サービスを提供するために呼び出されてもよい様々なソフトウェア関数を備えたカーネルを含む。そのようなソフトウェア関数の１つは、スレッドが単一のイベントを設定することを可能にするイベント設定関数であってよい。オペレーティングシステムは規格品のオペレーティングシステムであってもよく、カーネルの中のソフトウェア関数を変更することができないか、または簡単には変更することができてなくてもよい。
【００３４】
さらなる機能を提供するため、かつ／またはカスタマイゼーションのために、抽象層がカーネルの上部に実装されてもよい。この抽象層は、スレッドが任意の数のイベントを設定することを可能にするイベント設定関数などの、さらなるソフトウェア関数を含んでもよい。この抽象層の上のアプリケーション層でランするスレッドは、抽象層の中のソフトウェア関数を呼び出してもよく、この関数は、その後カーネルの中のソフトウェア関数を呼び出してもよい。プロセス４００は抽象層の中のイベント設定関数によって実施されてもよく、この関数はその後設定されるべき各イベントについて１回、カーネルの中のイベント設定関数を呼び出してもよい。
【００３５】
図５は、図４のプロセス４００の特定の実施態様を示す。その他の実施態様も可能であり、これも本発明の範囲内にある。
【００３６】
プロセス３００および４００によって、スレッドは、スケジューラによる中間スケジューリングを伴わずに、同時にすべてのイベントを設定することができる。スケジューラは、各イベントが設定された後でスレッドのスケジュールを試みることがあるが、スケジューラは基本的に無効にされ、別のスレッドがスケジュールされることはない。プロセス４００は、現在のスレッドの優先権を変更することによってスケジューラを無効にするので、イベントの設定の間にこのスレッドが割り込みされることはない。
【００３７】
スケジューラを無効にするためのその他のメカニズムもまた使用されてよい。例えば、非同期化されたイベントが再スケジュールを引き起こすことを回避する時間に基づくメカニズムを用いて、スケジューラは無効にされてもよい。例として、ユーザインタフェース（ＵＩ）スレッドは、状態インジケータを１秒ごとにフラッシュすることを求めてもよい。その後オペレーティングシステムは、１秒ごとにアイコンをフラッシュするためにＵＩスレッドを起動する。ＵＩスレッドがスレッドＸ、ＹおよびＷよりも高い優先権を有する場合、これらのスレッドは、ＵＩが起動されている場合ＵＩによって割り込まれる。タイマ中断が一定方向に向けられることができず、したがってＵＩスレッドは起動されることがないので、中断をロックすることはＵＩスレッドのスケジューリングを回避することができる。スケジューラを無効にするためのその他のメカニズムは、スケジュールを求めるたびにスケジューラがチェックするフラグ（例えばスケジュール不可フラグ）を設定することによるものである。スケジューラはこのフラグが設定されている場合にはスケジューリングを止め、このフラグが設定解除／クリアされている場合にはスケジューリングを続行する。アクティブスレッドは、スケジューラを無効にしたいときにはいつでもこのフラグを設定してよく、その後スケジューラを再び使用可能にするためにフラグを設定解除してもよい。スケジューラが無効にされている間、複数のイベントは中間スケジューリングを伴わずに設定されることができる。
【００３８】
明快であるために、イベント設定技術はオペレーティングシステムのコンテキストで説明されてきた。一般に、これらの技術は、タスクが優先権およびイベントに基づいてスケジュールされる任意のマルチスレッドシステムのために使用されてよい。マルチスレッドシステムはソフトウェアシステム、ハードウェアシステム、またはハードウェアとソフトウェアの両方を備えたシステムであってよい。
【００３９】
図６は、イベント設定技術が用いられてもよいマルチスレッドシステム６００の図を示す。タスク６１０ｘ、６１０ｙおよび６１０ｚは、図６に示されていない１つまたは複数の主体から受信され、スケジュールされて実行されることになる。タスク６１０はスレッド、プロセスなどであってよい。タスク６１０はまた、１つまたは複数のプロセッサまたはアプリケーションによって生成されてもよく、かつ／あるいは１つまたは複数のインタフェースを介して受信されてもよい。
【００４０】
スケジューラ６２０はタスク６１０を受信し、処理モジュール６３０による処理のために、これらのタスクをスケジュールする。スケジューラ６２０は（１）これらのタスクについての優先値および保留イベント、ならびに（２）処理モジュール６３０によって設定されるイベントに基づいて、タスク６１０をスケジュールしてもよい。スケジューラ６２０はさらに、任意の時点で、実行のために準備ができているすべてのタスクの中で最も高い優先権を備えたタスクが処理モジュール６３０によって処理されるように、タスク６１０をスケジュールしてもよい。処理モジュール６３０は、スケジューラ６２０によってスケジュールされた各タスク６１０を処理する。処理モジュール６３０はまた、イベントを適切に設定する。
【００４１】
スケジューラ６２０は様々な方法で実装されてもよい。例えば、スケジューラ６２０はコンピューティング装置またはパーソナル電子装置のために使用されるオペレーティングシステムの一部であってもよい。スケジューラ６２０はまた、処理モジュール６３０のためにタスク６１０をスケジュールするように設計されたコントローラであってもよい。したがってスケジューラ６２０はハードウェア、ソフトウェア、またはそれらの組合せの中で実装されてもよい。
【００４２】
処理モジュール６３０も、ハードウェア、ソフトウェアまたはそれらの組合せの中で実装されてもよい。処理モジュール６３０は、スケジュールされたタスクのための任意の種類の処理を実行してもよい。例えば、処理モジュール６３０は記憶装置コントローラ、メモリドライバ、バスドライバ、直接メモリアクセス（ＤＭＡ）コントローラ、デジタル信号プロセッサ（ＤＳＰ）、縮小命令セットコンピュータ（ＲＩＳＣ）（ｒｅｄｕｃｅｄ  ｉｎｓｔｒｕｃｔｉｏｎ  ｓｅｔ  ｃｏｍｐｕｔｅｒ）、マイクロプロセッサなどであってもよい。
【００４３】
本明細書で説明されるイベント設定技術およびマルチスレッドシステムは、様々な電子装置の中で用いられてもよい。例えば、これらの技術およびマルチスレッドシステムは、コンピュータシステム、パーソナル電子装置などの中で使用されてもよい。パーソナル電子装置は無線装置、ＰＤＡなどであってもよい。
【００４４】
図７は、イベント設定技術が用いられてもよい無線装置７００のブロック図である。無線装置７００は携帯電話、端末、ハンドセットまたは何らかのその他の装置であってよい。無線装置７００は符号分割多重アクセス（ＣＤＭＡ）システム、移動通信のための世界システム（ＧＳＭ（登録商標））のシステムなどと通信することができてもよい。
【００４５】
無線装置７００は、受信経路と送信経路とを経由する双方向通信を提供する。受信経路については、基地局によって送信される順方向リンク信号はアンテナ７１２によって受信され、デュプレクサ（Ｄ）７１４を通じて発送され、受信装置（ＲＣＶＲ）７１６に与えられる。受信装置７１６は受信された信号を調整かつデジタル化し、さらなる処理のためにデジタル部分７２０に入力サンプルを与える。送信経路については、送信装置（ＴＭＴＲ）７１８は送信されるべきデータをデジタル部分７２０から受信して、そのデータを処理かつ調整し、デュプレクサ７１４を通じて発送され、アンテナ７１２を介して基地局に送信される逆方向リンク信号を生成する。
【００４６】
デジタル部分７２０は、例えばモデムプロセッサ７２２、ビデオ／グラフィックプロセッサ７２４、アプリケーションプロセッサ７２６、コントローラ／マイクロプロセッサ７３０、外部バスインタフェース（ＥＢＩ）７４０および７４２、ならびに入力／出力（Ｉ／Ｏ）装置７４４などの、様々な処理装置およびインタフェース装置を含む。モデムプロセッサ７２２は、データの送信および受信のための処理（例えば符号化、変調、復調、復号など）を実行する。ビデオ／グラフィックプロセッサ７２４は、静止画像、動画、動くテキスト、ビデオゲームのためのグラフィック、３次元アバターなどに対する処理を実行する。アプリケーションプロセッサ７２６は、多元呼び出し、ウェブ閲覧、メディアプレーヤ、ユーザインタフェースなどのアプリケーションのための処理を実行する。ＥＢＩ７４０はデジタル部分７２０と、ＲＡＭ、ＳＲＡＭ、ＤＲＡＭ、ＳＤＲＡＭなどであってもよい揮発性メインメモリ７５０との間のデータの転送を促進する。ＥＢＩ７４２はデジタル部分７２０と、フラッシュメモリまたはＲＯＭであってもよい不揮発性メモリ７５２との間のデータの転送を促進する。Ｉ／Ｏ装置７４４はＬＣＤ装置、キーパッド、スピーカ、マイクロフォンなどの外部Ｉ／Ｏ装置（図７に不図示）とインタフェースする。デジタル部分７２０内の様々な装置は、１つまたは複数のバス７３２を介して互いに通信してもよい。
【００４７】
デジタル部分７２０は、１つまたは複数のＤＳＰ、マイクロプロセッサ、ＲＩＳＣなどとともに実装されてもよい。デジタル部分７２０はまた、１つまたは複数の特定用途向け集積回路（ＡＳＩＣ）または何らかのその他の種類の集積回路（ＩＣ）上で作られてもよい。マルチスレッドシステム１００および／または６００は、デジタル部分７２０内で実装されてもよい。マルチスレッドシステム１００の例として、マイクロプロセッサ７３０がリアルタイムオペレーティングシステムでランしていてもよく、デジタル部分７２０内の様々なプロセッサによってスレッド１１０が起動されてもよい。マルチスレッドシステム６００のその他の例として、マイクロプロセッサ７３０がスケジューラ６２０を実装し、ＥＢＩ７４０が処理モジュール６３０を実装し、デジタル部分７２０内の様々なプロセッサによってタスク６１０が生成されてもよい。
【００４８】
図８は、ここでもまたイベント設定技術が用いられてもよい記憶システム８００のブロック図を示す。記憶システム８００はマスタコントローラ８１０と複数の記憶装置８２０とを含む。マスタコントローラ８１０は独立型のコンピューティング装置、コンピューティング装置の一部、およびその他であってもよい。メモリ装置８１２は、マスタコントローラ８１０によって使用されるデータおよびコードを記憶する。
【００４９】
マスタコントローラ８１０は、１つまたは複数の外部インタフェース８１４を介して外部装置（図８に不図示）と通信する。マスタコントローラ８１０はさらに、１つまたは複数の内部インタフェース８１６を介して記憶装置８２０に結合している。各インタフェースはまた、バスまたは何らかのその他の通信リンクであってよい。各記憶装置８２０は直接マスタコントローラ８１０に結合するか、またはその他の記憶装置を介してマスタコントローラ８１０に結合してもよい。
【００５０】
マスタコントローラ８１０は、記憶装置８２０へのアクセスのスケジューリングに対して責任を負うスケジューラを実装してもよい。マスタコントローラ８１０は、外部インタフェース８１４を介してタスクを受信してもよい。これらのタスクは、記憶装置８２０のアクセスを要求する外部プロセッサおよび／またはアプリケーションからのものであってもよい。マスタコントローラ８１０は次いで、タスクについての優先権および保留イベント、記憶装置の利用率、これらの記憶装置のために設定されたイベント、およびその他に基づいてタスクをスケジュールする。マスタコントローラ８１０は、準備ができている最も高い優先権が各記憶装置にアクセスするように、タスクのスケジュールを試みてもよい。
【００５１】
１つの実施形態で、独立の処理モジュールは各記憶装置８２０のアクセスを管理する。各記憶装置のための処理モジュールは、記憶装置へのデータの書き込みと記憶装置からのデータの読み取りに対して責任を負うドライバであってもよい。処理モジュールは、処理モジュールおよび／または関連した記憶装置の状態に基づいて、イベントを設定してもよい。各記憶装置８２０について、マスタコントローラ８１０は、その装置のためにイベントが設定されるたびに、記憶装置８２０へアクセスするために最も高い優先権の準備のできているタスクをスケジュールしてもよい。各記憶装置のための処理モジュールは、スケジューラによる中間スケジューリングを伴わずにイベントを設定する目的で、（例えば現在のタスクの優先権を操作することによって）マスタコントローラ８１０内のスケジューラを無効にするために、プロセス３００または４００を実施してもよい。
【００５２】
別の実施形態で、記憶装置８２０はマスタコントローラ８１０によってスケジュールされたタスクを表す。例えば、複数の記憶装置は所与の外部インタフェースへのアクセスを必要としてもよい。その後マスタコントローラ８１０は、記憶装置の優先権、外部インタフェースのために設定されたイベントなどに基づいて、この外部インタフェースを使用するためにこれらの記憶装置をスケジュールしてもよい。
【００５３】
本明細書で説明された技術は、上で説明されたように、イベントを設定するために使用されてよい。これらの技術はまた、中断を設定するため、信号またはメッセージを送信するため、フラグを設定するため、およびその他のために使用されてもよい。
【００５４】
本明細書で説明される技術は、様々な方法で実装されてもよい。例えば、これらの技術はソフトウェア、ハードウェアまたはそれらの組合せの中で実装されてもよい。ソフトウェア実装のために、この技術は本明細書で説明される動作を実行するモジュール（例えば関数、手順など）を用いて実装されてもよい。ソフトウェアコードはメモリ装置（例えば図７のメモリ７５０、または図８のメモリ８１２）の中に記憶され、プロセッサ（例えば図７のマイクロプロセッサ７３０、または図８のコントローラ８１０）によって実行されてもよい。メモリ装置は、プロセッサ内か、またはプロセッサの外部に実装されてもよい。
【００５５】
ハードウェア実装のために、イベントを設定するモジュールまたは関数は、１つまたは複数のＡＳＩＣ、ＤＳＰ、デジタル信号処理装置（ＤＳＰＤ）、プログラム可能論理装置（ＰＬＤ）、フィールドプログラム可能ゲートアレー（ＦＰＧＡ）、プロセッサ、コントローラ、マイクロコントローラ、マイクロプロセッサ、電子装置、本明細書で説明される機能を実行するように設計されたその他の電子装置、またはそれらの組合せの中で実装されてもよい。
【００５６】
先の開示される実施形態の説明は、任意の当業者が本発明を作成または使用することができるように提供される。これらの実施形態に対する様々な変更は、当業者には容易に理解されることと思われ、本明細書で定義される一般的な原理は、本発明の精神または範囲から逸脱することなく、別の実施形態に適用されてもよい。したがって、本発明は本明細書で示される実施形態に限定されることが意図されているわけではなく、本明細書で開示される原理および新しい機能に矛盾しない最も広い範囲に一致する。
以下に、出願当初の特許請求の範囲に記載された発明を付記する。
［Ｃ１］
現在のスレッドの優先権を高い優先レベルに設定するためのコードと、
少なくとも１つのイベントを設定するためのコードと、
前記現在のスレッドの前記優先権を本来の優先レベルに回復するためのコードとを記憶するためのプロセッサ可読媒体。
［Ｃ２］
前記現在のスレッドの前記優先権を前記高い優先レベルに設定する前に、前記本来の優先レベルを保存するためのコードをさらに記憶するためのＣ１に記載のプロセッサ可読媒体。
［Ｃ３］
少なくとも１つのイベントを設定するための前記コードが、
１回につき１つのイベントで、少なくとも１つのイベントを設定するためのコードを含むＣ１に記載のプロセッサ可読媒体。
［Ｃ４］
少なくとも１つのイベントを設定するための前記コードが、
前記少なくとも１つのイベントの各々につき１回、単一のイベントを設定するために関数を呼び出すためのコードを含むＣ１に記載のプロセッサ可読媒体。
［Ｃ５］
少なくとも１つのイベントを設定するための前記コードが、
前記少なくとも１つのイベントの各々を個々に設定するために、オペレーティングシステムの中で関数を呼び出すためのコードを含むＣ１に記載のプロセッサ可読媒体。
［Ｃ６］
前記現在のスレッドの前記優先権を設定するための前記コードが、
前記現在のスレッドの前記優先権を最も高い可能な優先レベルに設定するためのコードを含むＣ１に記載のプロセッサ可読媒体。
［Ｃ７］
前記現在のスレッドの前記優先権を設定するための前記コード、前記少なくとも１つのイベントを設定するための前記コード、および前記現在のスレッドの前記優先権を回復するための前記コードが、１つまたは複数のイベントを設定するためにスレッドによって呼び出されることが可能な関数の一部であるＣ１に記載のプロセッサ可読媒体。
［Ｃ８］
前記関数が、オペレーティングシステムのためのカーネルの上の抽象層に存在するＣ７に記載のプロセッサ可読媒体。
［Ｃ９］
現在のタスクの優先権を高い優先レベルに設定することと、
少なくとも１つのイベントを設定することと、
前記現在のタスクの前記優先権を本来の優先レベルに回復することとを含むイベントを設定するための方法。
［Ｃ１０］
前記現在のタスクの前記優先権を前記高い優先レベルに設定する前に、前記本来の優先レベルを保存することをさらに含むＣ９に記載の方法。
［Ｃ１１］
前記少なくとも１つのイベントを設定することが、１回につき１つのイベントで、前記少なくとも１つのイベントを設定することを含むＣ９に記載の方法。
［Ｃ１２］
前記現在のタスクの前記優先権を前記高い優先レベルに設定することが、前記現在のタスクの前記優先権を最も高い可能な優先レベルに設定することを含むＣ９に記載の方法。
［Ｃ１３］
現在のタスクの優先権を高い優先レベルに設定するための手段と、
少なくとも１つのイベントを設定するための手段と、
前記現在のタスクの前記優先権を本来の優先レベルに回復するための手段とを含む装置。
［Ｃ１４］
前記現在のスレッドの前記優先権を前記高い優先レベルに設定する前に、前記本来の優先レベルを保存するための手段をさらに含むＣ１３に記載の装置。
［Ｃ１５］
もしあれば、設定されている前記少なくとも１つのイベントに基づいて、実行のために準備ができているタスクを識別するための手段と、
実行のために準備ができている前記タスクの中で、最も高い優先権を有するタスクをスケジュールするための手段とをさらに含むＣ１３に記載の装置。
［Ｃ１６］
スケジューラを一時的に無効にすることと、
少なくとも１つのイベントを設定することと、
前記スケジューラを通常の効果に回復することとを含むイベントを設定する方法。
［Ｃ１７］
前記スケジューラを一時的に無効にすることが、現在のタスクの優先権を高い優先レベルに設定することを含むＣ１６に記載の方法。
［Ｃ１８］
前記スケジューラを通常の効果に回復することが、前記現在のタスクの前記優先権を本来の優先レベルに回復することを含むＣ１７に記載の方法。
［Ｃ１９］
前記少なくとも１つのイベントを設定することが、１回につき１つのイベントで、前記少なくとも１つのイベントを設定することを含むＣ１６に記載の方法。
［Ｃ２０］
タスクをスケジュールするために動作可能なスケジューラと、
前記スケジューラを一時的に無効にし、少なくとも１つのイベントを設定するため、かつ前記スケジューラを通常の効果に回復するために動作可能な処理モジュールとを含み、前記スケジューラが、設定される前記少なくとも１つのイベントにしたがって前記タスクをスケジュールするために動作可能である装置。
［Ｃ２１］
前記処理モジュールが、現在のタスクの優先権を高い優先レベルに設定して、前記スケジューラを無効にするために動作可能であるＣ２０に記載の装置。
［Ｃ２２］
前記処理モジュールが、前記現在のタスクの前記優先権を本来の優先レベルに回復して、前記スケジューラを通常の効果に回復するために動作可能であるＣ２１に記載の装置。
［Ｃ２３］
前記処理モジュールが、１回につき１つのイベントで、前記少なくとも１つのイベントを設定するために動作可能であるＣ２０に記載の装置。
［Ｃ２４］
前記スケジューラが、もしあれば、設定される前記少なくとも１つのイベントに基づいて、実行のために準備ができているタスクを識別するため、かつ実行のために準備ができている前記タスクの中で最も高い優先権を有するタスクをスケジュールするために動作可能であるＣ２０に記載の装置。
【図１】
0006009529.tif 000002
【図２Ａ】
0006009529.tif 000003
【図２Ｂ】
0006009529.tif 000004
【図２Ｃ】
0006009529.tif 000005
【図３】
0006009529.tif 000006
【図４】
0006009529.tif 000007
【図５】
0006009529.tif 000008
【図６】
0006009529.tif 000009
【図７】
0006009529.tif 000010
【図８】
0006009529.tif 000011