(57)【特許請求の範囲】
【請求項１】
複数の実行主体を時分割処理することが可能なオペレーティングシステムのスケジューリング装置において、
各実行主体毎に、スケジューリングの対象として割り当てられたタイムスロットデータを記憶する手段と、
タイムスロットデータに処理時間を割り当て、時分割スケジューリングを行うスケジューラと、
処理時間が割り当てられたタイムスロットデータに対応する実行主体を実行する手段と、優先度の高い第一の実行主体が、優先度の低い第二の実行主体の処理を待つ必要があるときには、当該第一の実行主体に対応するタイムスロットデータを当該第二の実行主体に割り当てる手段と、当該第二の実行主体の処理が終了したときに、当該第一の実行主体から割り当てられたタイムスロットデータを、当該第一の実行主体に再度割り当てる手段と、
を具備することを特徴とするスケジューリング装置。
【請求項２】
前記タイムスロットデータは、各タイムスロットデータの対応する実行主体を指し示すリンクデータを格納するデータ領域を具備し、前記スケジューリング装置は、
優先度の高い実行主体に対応していたタイムスロットデータを、優先度の低い実行主体に対応したタイムスロットデータとして扱うようにするときには、当該タイムスロットデータのリンクデータが指し示す実行主体を、優先度の高い実行主体から優先度の低い実行主体に変更する手段を具備する、
ことを特徴とする請求項１記載のスケジューリング装置。
【請求項３】
複数の実行主体を時分割処理することが可能なオペレーティングシステムのスケジューリング方法において、
各実行主体毎に、スケジューリングの対象として割り当てられたタイムスロットデータに処理時間を割り当て、時分割スケジューリングを行うステップと、
処理時間が割り当てられたタイムスロットデータに対応する実行主体を実行するステップと、
優先度の高い第一の実行主体が、優先度の低い第二の実行主体の処理を待つ必要があるときには、当該第一の実行主体に対応するタイムスロットデータを当該第二の実行主体に割り当てるステップと、当該第二の実行主体の処理が終了したときに、当該第一の実行主体から割り当てられたタイムスロットデータを、当該第一の実行主体に再度割り当てるステップと、
を具備することを特徴とするスケジューリング方法。
【請求項４】
前記タイムスロットデータ毎に、対応する実行主体を指し示すリンクデータが格納されるデータ領域を確保しておき、優先度の高い実行主体に対応していたタイムスロットデータを、優先度の低い実行主体に対応したタイムスロットデータとして扱うようにするときには、当該タイムスロットデータに対応したリンクデータが指し示す実行主体を、優先度の高い実行主体から優先度の低い実行主体に変更する、
ことを特徴とする請求項３記載のスケジューリング方法。
【請求項５】
複数の実行主体を時分割処理することが可能なオペレーティングシステムのデータ処理プログラムが記録された記録媒体であって、
各実行主体毎に、スケジューリングの対象として割り当てられたタイムスロットデータに処理時間を割り当て、時分割スケジューリングを行うステップと、処理時間が割り当てられたタイムスロットデータに対応する実行主体を実行するステップと、
優先度の高い第一の実行主体が、優先度の低い第二の実行主体の処理を待つ必要があるときには、当該第一の実行主体に対応するタイムスロットデータを当該第二の実行主体に割り当てるステップと、
当該第二の実行主体の処理が終了したときに、当該第一の実行主体から割り当てられたタイムスロットデータを、当該第一の実行主体に再度割り当てるステップと、
をコンピュータに実行させるためのデータ処理プログラムが記録された記録媒体。
【請求項６】
上記データ処理プログラムは、前記タイムスロットデータ毎に、対応する実行主体を指し示すリンクデータが格納されるデータ領域を確保しておき、優先度の高い実行主体に対応していたタイムスロットデータを、優先度の低い実行主体に対応したタイムスロットデータとして扱うようにするときには、当該タイムスロットデータに対応したリンクデータが指し示す実行主体を、優先度の高い実行主体から優先度の低い実行主体に変更する、
ことをコンピュータに実行させることを特徴とする請求項５記載の記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、複数の実行主体を時分割処理することが可能なオペレーティングシステムにおけるスケジューリング装置及びスケジューリング方法、並びに、複数の実行主体を時分割処理することが可能なオペレーティングシステムが記録された記録媒体に関する。
【０００２】
【従来の技術】
オペレーティングシステム、並びにオペレーティングシステム上で動作するアプリケーションプログラム等における実行実体を、時分割にて並行して動作させることが可能なシステムにおいて、実行主体は、実行主体毎に設定された優先度に基づいてスケジューリングされる。具体的には、通常、各実行主体は、優先度の高い実行主体ほど早く実行されるように、優先度に基づいて待ち行列に入れられ、待ち行列に入っている実行主体が、当該待ち行列の順番に従ってＣＰＵ（Central Processing Unit）によって順次実行される。ここで、実行主体は、プロセス、タスク、スレッドなどと一般に呼ばれるものであり、本明細書では以後、代表してスレッドと称する。また、スレッドが実行主体であるシステムのことをマルチスレッドシステムと称する。
【０００３】
すなわち、マルチスレッドシステムにおいて、全スレッドは、基本的には各スレッドの生成時等に設定された優先度に基づいて、それらの順序関係が定義される。なお、この順序関係は必ずしも実行順序の関係だけを示すものとは限らず、例えば、いわゆるタイムスライススケジューリングでは、ある時間内に各スレッドに割り当てられるＣＰＵの処理時間の割合として、優先度に基づく順序関係が定義される。また、場合によっては、システムの時間経過や各スレッドの処理時間等に応じて動的に、各スレッドの優先度に重み付けをすることもある。
【０００４】
ところで、優先度に基づくスケジューリングのアルゴリズムでは、共有資源に対するアクセスの排他制御において、優先度逆転と呼ばれる問題が生じる場合がある。以下、この優先度逆転について、図２６を参照して説明する。
【０００５】
図２６は、優先度逆転について、その典型的な状況を示す図であり、優先度の高いスレッドＡがクリティカルセクションＣＳ１に入ろうとした場合に起こりうる状況を示している。なお、クリティカルセクションＣＳ１は、スレッドＡとスレッドＣが共通に使用する資源を含んでいるものとする。
【０００６】
図２６に示すように、先ず、スレッドＣがクリティカルセクションＣＳ１に入った後に、より高い優先度を持つスレッドＡが動作可能状態になったとする。すると、スレッドＣの実行が中断され、スレッドＡの実行が開始される。しかし、このとき既にスレッドＣがクリティカルセクションＣＳ１に入っているため、スレッドＣがクリティカルセクションＣＳ１を抜けるまで、スレッドＡは処理を待たねばならない。そこで、スレッドＡは待ち状態となり、再びスレッドＣの実行が開始される。
【０００７】
そして、このような状況のときに、スレッドＣがクリティカルセクションＡを抜ける前に、スレッドＡとスレッドＣのそれぞれの優先度の中間の優先度を持つスレッドＢが動作可能状態となった場合に、優先度逆転が生じる。すなわち、より優先度の高いスレッドＡが待ち状態であるにも関わらずに、より優先度の低いスレッドＢの実行が開始されるという状況が生じる。優先度が中間のスレッドＢが動作可能状態になると、優先度に従って、スレッドＣの実行が中断され、スレッドＢの実行が開始される。このとき、スレッドＡは中断したままである。しかも、スレッドＡとスレッドＢの関係は優先度以外には定義されていないので、このような状況になると、スレッドＡは、自分がどの程度の時間、処理が中断されるかを見積もることも不可能となる。
【０００８】
このように、優先度に基づくスケジューリングのアルゴリズムでは、より高い優先度のスレッドが、より低い優先度のスレッドの実行を待つような優先度逆転と呼ばれる問題が生じる可能性がある。しかも、上述したように、優先度逆転が生じると、より高い優先度のスレッドの中断時間を予測することが不可能となる。このように、高い優先度のスレッドの中断時間が予測不可能に陥ってしまうのは、特に実時間システム（各処理がある一定時間内に終わらなければシステムが成り立たないようなシステム）において、致命的な問題である。
【０００９】
そこで、従来、このような優先度逆転の問題を回避する必要がある場合には、優先度継承機構を導入するようにしている。(Lui Sha,Ragunathan Rajkumar,and John P.Lehoczky. Priority Inheritance Protocols: An Approach to Real-Time Synchronization. Technical report, Computer Science Department, Carnegie Mellon University. November 1987. Tech.Report CMU-CS-87-181.) 優先度継承機構とは、高い優先度を持つスレッドが、低い優先度を持つスレッドのために待ち状態になった場合に、高い優先度を持つスレッドの優先度を、低い優先度を持つスレッドに継承する機構である。
【００１０】
図２６と同様な状況において、優先度継承機構を導入した場合のシナリオを図２７に示す。優先度継承機構を導入した場合には、スレッドＡが待ち状態となって再びスレッドＣの実行が開始されるときに、スレッドＣの優先度が、スレッドＡと同じレベルの優先度に設定される。この結果、スレッドＣがクリティカルセクションＣＳ１から抜けるまでは、スレッドＡより優先度が低いスレッド（例えば図中のスレッドＢ）によって、スレッドＣの実行が中断されてしまうようなことはなくなる。
【００１１】
このように優先度継承機構を導入した場合、スレッドＣは、クリティカルセクションＣＳ１を抜けるまで、スレッドＡの優先度でスケジューリングされる。したがって、スレッドＡがクリティカルセクションＣＳ１にアクセスするために待たされる時間は、スレッドＣがクリティカルセクションＣＳ１を必要とする時間以内に制限されることとなり、優先度の高いスレッドであるスレッドＡの中断時間の予測が可能となる。
【００１２】
ところで、以上のような優先度継承機構を実際に実現するには、具体的には下記のような処理が行われる。なお、ここでは、上述したように、優先度が低いスレッドＣがクリティカルセクションＣＳ１を抜けるまで、優先度が高いスレッドＡが処理を待たねばならないような場合を例に挙げる。
【００１３】
先ず、スレッドＣがクリティカルセクションＣＳ１を抜けるまでスレッドＡが処理を待たねばならないと判断されると、スレッドＡの状態が待ち状態とされ、当該スレッドＡが待ち行列から取り除かれる。次に、スレッドＣの優先度が一時的にスレッドＡの優先度に変更され、変更された優先度に基づいて、スレッドＣが待ち行列に入れ直される。そして、待ち行列に入っているスレッドはＣＰＵによって順次実行されていき、スレッドＣが選択された時点で当該スレッドＣが実行される。なお、スレッドＣの実行中に、スレッドＣに割り当てられていた一定の処理時間を使い切った場合、当該スレッドＣは、変更された優先度（すなわちスレッドＡの優先度）に基づいて再び待ち行列に入れられる。
【００１４】
その後、スレッドＡの待ち事象が解決した時点（すなわち、スレッドＣがクリティカルセクションＣＳ１を抜けた時点）で、スレッドＣの優先度が元に戻され、元に戻された優先度に基づいて、スレッドＣが待ち行列に入れ直されるとともに、スレッドＡの状態が実行可能状態とされ、当該スレッドＡが待ち行列に入れられる。
【００１５】
以上の処理により、図２７に示したような優先度継承機構が実現され、スレッドＣがクリティカルセクションＣＳ１から抜けるまでは、スレッドＡより優先度が低いスレッド（例えば図中のスレッドＢ）によって、スレッドＣの実行が中断されてしまうようなことはなくなる。
【００１６】
【発明が解決しようとする課題】
ところで、従来のスケジューリング機構では、各スレッドが持つその時点の優先度に応じて、スレッドの待ち行列に入る位置を決定している。そして、上述のような優先度継承機構では、優先度が動的に頻繁に変更されるため、待ち行列の変更を頻繁に行う必要が生じる。そのため、上述のような優先度継承機構を導入すると、優先度の動的な変更に伴う待ち行列のリスケジューリングによるオーバーヘッドが大幅に増加してしまう。
【００１７】
すなわち、上述のような優先度継承機構は、優先度逆転の問題を回避するためには有効であるが、当該優先度継承機構を導入すると、優先度が頻繁に動的に変更されるため、スケジューリングによるオーバーヘッドが大幅に増加し、システム全体の性能が低下してしまうという問題が生じる。
【００１８】
また、優先度がスレッドの単なる実行順序を示すのではなくＣＰＵの処理時間の割合を示すような場合、すなわち時分割スケジューリングを採用しているような場合には、待ち状態の原因となっているスレッド（上記の例ではスレッドＣ）の優先度を、待ち状態にあるスレッド（上記の例ではスレッドＡ）と同じレベルの優先度に設定するだけでは、これらのスレッドに割り当てられている処理時間を有効に利用することができない。
【００１９】
すなわち、例えば、上記の例のように、スレッドＣの優先度を、スレッドＡと同じレベルの優先度に設定した場合、スレッドＣはスレッドＡの優先度にて実行されるため、スレッドＡに割り当てられていたＣＰＵの処理時間は使用されるが、スレッドＣに割り当てられていたＣＰＵの処理時間が使用されなくなる。そして、このような状態を回避して、ＣＰＵの処理時間を有効に使用するためには、待ち状態にあるスレッドＡに割り当てられていた処理時間と、待ち状態の原因となっているスレッドＣに割り当てられていた処理時間との合計を求めて、その処理時間をスレッドＣに改めて割り当てるようにする必要がある。換言すれば、時分割スケジューリングを採用しているような場合には、スレッドＡに割り当てられていた処理時間と、スレッドＣに割り当てられていた処理時間との合計の処理時間が与えられる優先度を求めて、当該優先度をスレッドＣに割り当てるようにすべきである。
【００２０】
しかしながら、このようにスレッドに割り当てられる処理時間を計算し直して、スケジューリングし直すようにすると、当該処理に伴うオーバーヘッドが大幅に増大してしまう。そのため、従来の優先度継承機構では、各スレッドに割り当てられたＣＰＵの処理時間を有効に利用することができなかった。
【００２１】
本発明は、以上のような従来の実情に鑑みて提案されたものであり、優先度逆転問題を回避することが可能なスケジューリング装置及び方法を提供することを目的としている。本発明にあるようなスケジューリング装置及び方法を用いることにより、オーバヘッドの増加の原因となる待ち行列の変更が少なくて済み、しかも、割り当てられたＣＰＵの処理時間を有効に利用することが可能になる。また、本発明は、複数の実行主体を時分割処理することが可能なオペレーティングシステムのデータ処理プログラムが記録された記録媒体を提供することも目的としている。
【００２２】
【課題を解決するための手段】
本発明に係るスケジューリング装置は、複数の実行主体を時分割処理することが可能なオペレーティングシステムのスケジューリング装置であり、各実行主体毎に、スケジューリングの対象として割り当てられたタイムスロットデータを記憶する手段と、タイムスロットデータに処理時間を割り当て、時分割スケジューリングを行うスケジューラと、処理時間が割り当てられたタイムスロットデータに対応する実行主体を実行する手段と、優先度の高い第一の実行主体が、優先度の低い第二の実行主体の処理を待つ必要があるときには、当該第一の実行主体に対応するタイムスロットデータを当該第二の実行主体に割り当てる手段と、当該第二の実行主体の処理が終了したときに、当該第一の実行主体から割り当てられたタイムスロットデータを、当該第一の実行主体に再度割り当てる手段とを具備することを特徴とする。
【００２３】
以上のような本発明に係るスケジューリング装置では、実行主体から独立したタイムスロットデータをスケジューリングの対象とすることにより、優先度の高い実行主体が、優先度の低い実行主体の処理を待つ必要のあるときには、タイムスロットデータを受け渡すという低コストな処理によって優先度継承を行うことができる。
【００２６】
また、本発明に係るスケジューリング方法は、複数の実行主体を時分割処理することが可能なオペレーティングシステムのスケジューリング方法であり、各実行主体毎に、スケジューリングの対象として割り当てられたタイムスロットデータに処理時間を割り当て、時分割スケジューリングを行うステップと、処理時間が割り当てられたタイムスロットデータに対応する実行主体を実行するステップと、優先度の高い第一の実行主体が、優先度の低い第二の実行主体の処理を待つ必要があるときには、当該第一の実行主体に対応するタイムスロットデータを当該第二の実行主体に割り当てるステップと、当該第二の実行主体の処理が終了したときに、当該第一の実行主体から割り当てられたタイムスロットデータを、当該第一の実行主体に再度割り当てるステップとを具備することを特徴とする。
【００２７】
以上のような本発明に係るスケジューリング方法では、実行主体から独立したタイムスロットデータをスケジューリングの対象とすることにより、優先度の高い実行主体が、優先度の低い実行主体の処理を待つ必要のあるときには、タイムスロットデータを受け渡すという低コストな処理によって優先度継承を行うことができる。
【００３０】
また、本発明に係る記録媒体は、複数の実行主体を時分割処理することが可能なオペレーティングシステムのデータ処理プログラムが記録された記録媒体であって、各実行主体毎に、スケジューリングの対象として割り当てられたタイムスロットデータに処理時間を割り当て、時分割スケジューリングを行うステップと、処理時間が割り当てられたタイムスロットデータに対応する実行主体を実行するステップと、優先度の高い第一の実行主体が、優先度の低い第二の実行主体の処理を待つ必要があるときには、当該第一の実行主体に対応するタイムスロットデータを当該第二の実行主体に割り当てるステップと、当該第二の実行主体の処理が終了したときに、当該第一の実行主体から割り当てられたタイムスロットデータを、当該第一の実行主体に再度割り当てるステップとをコンピュータに実行させるためのデータ処理プログラムが記録されてなる。
【００３２】
【発明の実施の形態】
以下、本発明の実施の形態について、図面を参照しながら詳細に説明する。
【００３３】
本発明では、複数の実行主体を時分割処理することが可能なオペレーティングシステムにおいて、各スレッドに対応するようにタイムスロットを割り当てて、各スレッドに割り当てられたタイムスロットデータを単位としてスケジューリングを行う。すなわち、本発明では、スレッド自体をスケジューリングの対象とするのではなく、各スレッドにタイムスロットデータを割り当てて、それらのタイムスロットデータをスケジューリングの対象とする。そして、タイムスロットデータに処理時間が割り当てられたら、当該タイムスロットデータに対応したスレッドを実行するようにする。
【００３４】
ここで、タイムスロットデータとは、各スレッドに割り当てられている優先度を間接的に表現したものである。各タイムスロットデータは、当該タイムスロットデータにＣＰＵの処理時間が与えられたときに実行すべきスレッドへのリンク情報を保持する。そして、オペレーティングシステムは、スレッドを単位としてスケジューリングを行うのではなく、タイムスロットデータを単位としてスケジューリングを行い、タイムスロットデータにＣＰＵの処理時間が割り当てられたら、その時点において当該タイムスロットデータに対応しているスレッドを実行する。
【００３５】
そして、本発明では、タイムスロットデータとスレッドとの対応関係を動的に変更することで、優先度の継承を実現する。すなわち、優先度の高いスレッドが、優先度の低いスレッドの処理を待つ必要がある場合には、当該処理が完了するまでの間、優先度の高いスレッドに対応していたタイムスロットデータを、優先度の低いスレッドに対応したタイムスロットデータとして扱い、当該タイムスロットデータに処理時間が割り当てられたら、優先度の低いスレッドを実行する。
【００３６】
なお、本発明は、共有資源に対するアクセスの排他制御だけでなく、オブジェクト指向オペレーティングシステムにおける同期ベースのメッセージ通信や、何らかのイベント待ちなど、複数のスレッド間で依存関係を持つ待ち事象一般に適用することが可能である。
【００３７】
以下、このような本発明について、本発明を適用したスケジューリング方法の具体的な例を挙げて詳細に説明する。なお、以下に説明するスケジューリング方法は、例えば、複数のスレッドを時分割処理することが可能なオペレーティングシステムにおけるスケジューリング装置において実行される。そして、このようなオペレーティングシステムが記録された記録媒体が、本発明に係る記録媒体に該当する。
【００３８】
１．スケジューリングに使用するデータ
まず、以下に説明するスケジューリング方法において使用されるデータについて説明する。
【００３９】
以下に示すスケジューリング方法では、各スレッドに対応するようにタイムスロットデータを割り当てて、各スレッドに割り当てられたタイムスロットデータを単位としてスケジューリングを行う。すなわち、スレッドが生成される毎に、当該スレッドに対応したタイムスロットデータが生成される。そして、このときに、各スレッド毎に、当該スレッドについてのデータ（以下、スレッドデータと称する。）が格納されるデータ領域が、例えば、図２４における外部記憶装置１０上に確保され、当該データ領域にスレッドデータが格納される。また、タイムスロットデータが格納されるデータ領域が、同じく例えば、図２４における外部記憶装置１０上に確保される。
【００４０】
【表１】
0004048638.tif 000002
【００４１】
スレッドデータには、表１に示すように、スレッドの状態を示すためのデータ型である「ThreadState」型の変数「state」と、スレッドデータを特定するためのデータ型である「Thread*」型の変数「depend」と、スレッドデータリストへのエントリを示すデータ型である「ThreadList」型の変数「inherit」と、タイムスロットを特定するためのデータ型である「TimeSlot*」型の変数「timeSlot」とが含まれる。
【００４２】
変数「state」には、スレッドの状態を示す値が設定される。スレッドは、スレッドが停止している状態（以下、「休止状態」と称する。）と、スレッドが何らかの事象を待って中断している状態（以下、「待ち状態」と称する。）と、スレッドが実行可能な状態（以下、「実行可能状態」と称する。）との３つの状態をとりうる。そして、変数「state」は、スレッドがこれらの状態のうちのいずれの状態であるかを示す。なお、スレッドが実行されるのは、スレッドが実行可能状態のときだけである。換言すれば、スケジューリングにおいて、タイムスロットに対してＣＰＵの処理時間が与えられるのは、当該タイムスロットに対応するスレッドが実行可能状態のときだけである。
【００４３】
変数「depend」には、スレッドが他のスレッドが起こす事象を待って待ち状態になっている場合に、待ち状態の原因となっているスレッドを指し示す値が設定される。なお、その他の場合、変数「depend」には、ＮＵＬＬ値が設定される。
【００４４】
変数「inherit」には、スレッドが他のスレッドから優先度を継承している場合に、優先度の継承元のスレッドを指し示す値が設定される。換言すれば、変数「inherit」には、このスレッドが起こす事象を待って待ち状態となっているスレッドを指し示す値が設定される。なお、優先度を継承していない場合、変数「inherit」には、ＮＵＬＬ値が設定される。
【００４５】
なお、スレッドが起こす事象を待って待ち状態となっているスレッドは、複数ある場合があり、それらのスレッドはスレッドリストに登録される。そして、変数「inherit」は、そのようなスレッドリストへのエントリとなっている。すなわち、変数「inherit」には、優先度の継承元のスレッド自体を指し示す値が設定されるのではなく、そのようなスレッドが登録されたスレッドリストを指し示す値が設定される。
【００４６】
変数「timeSlot」には、スレッドに対して、スレッド初期化時から割り当てられているタイムスロットデータを指し示す値が設定される。換言すれば、変数「timeSlot」は、スレッドに割り当てられたタイムスロットデータを指し示すリンクデータである。
【００４７】
以上のようなスレッドデータにおいて、変数「depend」及び「inherit」は、優先度継承関係のリンク情報となる。すなわち、例えば、スレッドＡが、スレッドＢが起こす事象を待って待ち状態となっている場合には、スレッドＡのスレッドデータの変数「depend」と、スレッドＢのスレッドデータの変数「inherit」とが、対になって双方向リンクを形成することとなる。なお、以下の説明においては、スレッドのスレッドデータの変数のことを、単にスレッドの変数と呼ぶことにする。また、スレッドデータのことを単にスレッドと呼ぶことにする。
【００４８】
【表２】
0004048638.tif 000003
【００４９】
タイムスロットデータには、表２に示すように、スレッドを特定するためのデータ型である「Thread*」型の変数「owner」と、優先度を特定するためのデータ型である「Priority」型の変数「prio」と、タイムスロットデータを特定するためのデータ型である「TimeSlot*」型の変数「next」とが含まれる。
【００５０】
変数「owner」には、タイムスロットデータにＣＰＵの処理時間が割り当てられたときに実行すべきスレッドを指し示す値が設定される。換言すれば、変数「owner」は、タイムスロットデータに対応したスレッドを指し示すリンクデータである。
【００５１】
なお、以下に説明するスケジューリング方法では、変数「owner」が指し示すスレッドを変更することにより、ＣＰＵの処理時間が割り当てられるスレッドを変更し、これにより、実質的に優先度の継承を行う。すなわち、タイムスロットデータにＣＰＵの処理時間が割り当てられたら、当該タイムスロットデータの変数「owner」によって示されるスレッドを実行するようにする。そして、優先度の継承は、待ち行列の変更を行うのではなく、変数「owner」を変更することで行う。
【００５２】
変数「prio」には、優先度を示す値が設定される。以下に説明するスケジューリング方法では、この変数「prio」に基づいて、各タイムスロットデータに割り当てられるＣＰＵの処理時間が決定される。なお、変数「prio」は、変数「owner」が指し示すスレッドが変更となった場合にも変更されない。すなわち、変数「prio」は、変数「owner」が指し示すスレッドが変更されても、タイムスロットデータにもともと対応していたスレッドの優先度を示す値がそのまま保持される。
【００５３】
変数「next」には、次にＣＰＵの処理時間が割り当てられるタイムスロットデータを指し示す値が設定される。すなわち、あるタイムスロットデータに割り当てられていたＣＰＵの処理時間を使い切ったら、その後、当該タイムスロットデータの変数「next」が指し示すタイムスロットデータにＣＰＵの処理時間が割り当てられる。
【００５４】
２．スレッドが待ち状態となる場合の処理
つぎに、優先度の高いスレッドが、優先度の低いスレッドが起こす事象を待って待ち状態となる場合に行われる処理の流れについて説明する。
【００５５】
優先度の高いスレッドが、優先度の低いスレッドが起こす事象を待って待ち状態となる場合には、関数「makeWait（Thread* target, Thread* depend）」が呼ばれる。ここで、関数「makeWait（Thread* target, Thread* depend）」の第１の引数「target」は、「Thread*」型の引数であり、この引数「target」には、優先度の低いスレッドが起こす事象を待って待ち状態となるスレッドを指し示す値が設定される。また、第２の引数「depend」は、「Thread*」型の引数であり、この引数「depend」には、優先度の高いスレッドの待ち状態の原因となった優先度の低いスレッドを指し示す値が設定される。
【００５６】
以下、関数「makeWait（Thread* target, Thread* depend）」が呼ばれた場合の処理について、図１のフローチャートを参照しながら説明する。なお、図１のフローチャートでは、各ステップでの処理をＣ言語での表記に準じた表現で示している。
【００５７】
関数「makeWait（Thread* target, Thread* depend）」が呼ばれた場合には、先ず、ステップＳＴ１−１において、「TimeSlot*」型の変数「timeSlot」に、引数「target」が指し示すスレッドの変数「timeSlot」の値を設定する。
【００５８】
次に、ステップＳＴ１−２において、引数「target」が指し示すスレッドの変数「state」に、当該スレッドが待ち状態であることを示す値「WAIT」を設定する。
【００５９】
次に、ステップＳＴ１−３において、引数「target」が指し示すスレッドの変数「depend」に、引数「depend」の値を設定する。すなわち、優先度の高いスレッドの待ち状態の原因となったスレッドを、変数「depend」によって参照できるようにする。
【００６０】
次に、ステップＳＴ１−４において、引数「depend」が指し示すスレッドの変数「inherit」が指し示すスレッドリストの末尾に、引数「target」が指し示すスレッドを追加する。なお、図１中の「AddLast(target)」は、スレッドリストの末尾にスレッドを追加する処理を行う関数を示している。すなわち、タイムスロットデータの継承元である優先度の高いスレッドのリストをスレッドの変数「inherit」によって参照可能にする。
【００６１】
次に、ステップＳＴ１−５において、引数「target」に、それまで引数「target」が指し示していたスレッドの変数「depend」の値を設定する。すなわち、実行対象となる可能性のあるスレッドを引数「target」によって参照できるようにする。
【００６２】
次に、ステップＳＴ１−６において、引数「target」が指し示すスレッドのスレッドデータの変数「state」に、当該スレッドが待ち状態であることを示す値「WAIT」が設定されているか否かを判別する。そして、スレッドが待ち状態であることを示す値「WAIT」が設定されている場合は、ステップＳＴ１−５へ戻って処理を繰り返し、設定されていない場合は、ステップＳＴ１−７へ進む。すなわち、待ち状態でないスレッドが見つかるまでステップＳＴ１−５とＳＴ１−６の操作を繰り返す。
【００６３】
ステップＳＴ１−７では、変数「timeSlot」が指し示すタイムスロットの変数「owner」に、現在の引数「target」の値を設定する。すなわち、この処理によって、タイムスロットデータによって間接的に表現された優先度が、優先度の高いスレッドから優先度の低いスレッドへと継承される。
【００６４】
そして、最後にステップＳＴ１−８において、現在の引数「target」が指し示すスレッドの実行を開始する。
【００６５】
以上の処理により、優先度の高いスレッドが待ち状態とされ、優先度の低いスレッドが実行される。このとき、優先度の高いスレッドの変数「depend」と、優先度の低いスレッドの変数「inherit」とによって、実行待ち関係の相互リンクが形成される。
【００６６】
なお、優先度の高いスレッドの待ち状態の原因となった優先度の低いスレッドが、更に優先度の低いスレッドが起こす事象を待って待ち状態となっていたときには、ステップＳＴ１−５及びステップＳＴ１−６の処理の繰り返しにより、引数「target」に更に優先度の低いスレッドを指し示す値が設定され、その結果、更に優先度の低いスレッドが実行されることとなる。換言すれば、関数「makeWait（Thread* target, Thread* depend）」を実行することにより、優先度の高いスレッドに割り当てられていたタイムスロットデータの変数「owner」は、唯一実行可能なスレッドに対応するように変更される。
【００６７】
そして、本例に係るスケジューリング方法では、タイムスロットデータにＣＰＵの処理時間が割り当てられたら、当該タイムスロットデータの変数「owner」によって示されるスレッドを実行するようにする。したがって、以上のような処理によって変数「owner」を変更することにより、優先度の高いスレッドにタイムスロットデータの変数「prio」に応じて割り当てられていたＣＰＵの処理時間が、先に実行すべき優先度の低いスレッドに割り当てられることとなる。この結果、優先度の高いスレッドから優先度の低いスレッドへ、優先度が実質的に継承されることとなる。
【００６８】
３．スレッドの待ち状態が解消された場合の処理
つぎに、優先度の高いスレッドが、優先度の低いスレッドが起こす事象を待って待ち状態となっていたときに、優先度の低いスレッドでの処理が完了して、優先度の高いスレッドの待ち状態が解消された場合の処理について説明する。
【００６９】
優先度の高いスレッドが、優先度の低いスレッドが起こす事象を待って待ち状態となっていたときに、優先度の低いスレッドでの処理が完了して、優先度の高いスレッドの待ち状態が解消された場合には、関数「makeReady（Thread* target）」が呼ばれる。ここで、関数「makeReady（Thread* target）」の引数「target」は、「Thread*」型の引数であり、この引数「target」には、待ち状態が解消されたスレッドを指し示す値が設定される。
【００７０】
以下、関数「makeReady（Thread* target）」が呼ばれた場合の処理について、図２のフローチャートを参照しながら説明する。なお、図２のフローチャートでは、各ステップでの処理をＣ言語での表記に準じた表現で示している。
【００７１】
関数「makeReady（Thread* target）」が呼ばれた場合には、先ず、ステップＳＴ２−１において、引数「target」が指し示すスレッドの変数「state」に、当該スレッドが実行可能状態であることを示す値「RUNNING」を設定する。
【００７２】
次に、ステップＳＴ２−２において、引数「target」が指し示すスレッドのタイムスロットデータを継承しているスレッドの変数「inherit」に繋がれた継承元スレッドへのリストから、関数「Remove(target)」によって、引数「target」で示されるスレッドへのリンクを削除する。すなわち、これによって継承先のスレッドに対して、タイムスロットデータ返還の手続きを遂行する。
【００７３】
次に、ステップＳＴ２−３において、引数「target」が指し示すスレッドの変数「depend」に、ＮＵＬＬ値を設定する。すなわち、当該スレッドの待ち状態の原因となっていたスレッドの処理が終了することにより、もはや待ち合わせが必要なくなったことを確かにする。
【００７４】
次に、ステップＳＴ２−４において、関数「makeReady（Thread* target）」に受け渡されている引数「target」の値を第１の引数及び第２の引数の両方に設定して、関数「changeOwner（Thread* target, Thread* depend）」を呼び出す。すなわち、当該スレッドに元来割り当てられているタイムスロットデータを継承先のスレッドから当該スレッドへと移動する処理を行う。これにより、当該スレッドが当該タイムスロットデータを利用できるようにする。なお、関数「changeOwner（Thread* target, Thread* depend）」では、タイムスロットデータの変数「owner」を変更する処理が行われるが、この処理については後で詳細に説明する。そして、関数「changeOwner（Thread* target, Thread* depend）」での処理が完了したら、ステップＳＴ２−５へ進む。
【００７５】
そして、最後にステップＳＴ２−５において、引数「target」が指し示すスレッドの実行を開始する。
【００７６】
以上のような関数「makeReady（Thread* target）」での処理により、優先度の高いスレッドが待ち状態から実行可能状態に戻され、優先度の高いスレッドが実行される。
【００７７】
つぎに、関数「changeOwner（Thread* target, Thread* depend）」が呼ばれた場合の処理について、図３のフローチャートを参照しながら説明する。なお、図３のフローチャートでは、各ステップでの処理をＣ言語での表記に準じた表現で示している。
【００７８】
なお、関数「changeOwner（Thread* target, Thread* depend）」の第１の引数「target」及び第２の引数「depend」は、「Thread*」型の引数であり、関数「changeOwner（Thread* target, Thread* depend）」は、引数「target」のタイムスロットデータの変数「owner」を引数「depend」の値に変更する。
【００７９】
関数「changeOwner（Thread* target, Thread* depend）」が呼ばれた場合には、先ず、ステップＳＴ３−１において、「TimeSlot*」型の変数「timeSlot」に、引数「target」が指し示すスレッドの変数「timeSlot」の値を設定する。
【００８０】
次に、ステップＳＴ３−２において、変数「timeSlot」が指し示すタイムスロットの変数「owner」に、引数「depend」の値を設定する。すなわち、これにより当該タイムスロットの所有権を引数「depend」で示されるスレッドに継承する。
【００８１】
次に、ステップＳＴ３−３において、引数「target」が指し示すスレッドの変数「inherit」が指し示すスレッドリストの先頭のスレッドを指し示す値を、「Thread*」型の変数「inherit」に設定する。なお、スレッドリストが空の場合、変数「inherit」にはＮＵＬＬ値を設定する。
【００８２】
なお、図３中の「Snoop()」は、スレッドリストの先頭のスレッドを取り出す処理を行う関数を示している。そして、この関数「Snoop()」は、先頭のスレッドを指し示す値を戻り値として返す。
【００８３】
次に、ステップＳＴ３−４において、変数「inherit」にＮＵＬＬ値が設定されているか否かを判別する。そして、変数「inherit」にＮＵＬＬ値が設定されている場合は、この関数「changeOwner（Thread* target, Thread* depend）」の処理を終了する。また、変数「inherit」にＮＵＬＬ値が設定されていない場合は、ステップＳＴ３−５へ進む。
【００８４】
ステップＳＴ３−５では、現在の変数「inherit」の値を第１の引数に設定するとともに、現在の引数「depend」の値を第２の引数に設定して、改めて関数「changeOwner（Thread* inherit, Thread* depend）」を呼び出す。そして、関数「changeOwner（Thread* inherit, Thread* depend）」での処理が完了したら、ステップＳＴ３−６へ進む。
【００８５】
ステップＳＴ３−６では、引数「inherit」が指し示す次のスレッドを指し示す値を、変数「inherit」に設定する。なお、次のスレッドが無い場合、変数「inherit」にはＮＵＬＬ値を設定する。そして、ステップＳＴ３−６での処理が完了したら、ステップＳＴ３−４へ戻って処理を繰り返す。
【００８６】
以上のような関数「changeOwner（Thread* target, Thread* depend）」での処理により、タイムスロットデータの変数「owner」が変更されるとともに、優先度の高いスレッドの変数「depend」と、優先度の低いスレッドの変数「inherit」とによって形成されていた実行待ち関係のリンクが解消される。
【００８７】
なお、優先度の低いスレッドが起こす事象を待って待ち状態となっているスレッドは複数ある場合があり、それらのスレッドはスレッドリストに登録されている。そこで、関数「changeOwner（Thread* target, Thread* depend）」では、ステップＳＴ３−４乃至ステップＳＴ３−６の処理を繰り返すことより、スレッドリストに登録されている全てのスレッドについて、それらのスレッドに対応するタイムスロットデータの変数「owner」の変更を行うようにしている。
【００８８】
４．スケジューリングの具体例
つぎに、スケジューリングの具体例を、図４乃至図２３を参照して説明する。
【００８９】
なお、以下に説明する例では、いわゆるタイムスライススケジューリングを適用しており、スレッドの優先度が、各スレッドに割り当てられるＣＰＵの処理時間の割合を示すようにしている。そして、以下に示す例では、優先度によって重み付けされたラウンド・ロビン・スケジューリング・アルゴリズム（Round Robin Scheduling Algorithm）を基本としている。
【００９０】
以下に説明するスケジューリングを行うにあたっては、先ず、各スレッドに対して、優先度に応じたタイムスロットデータが割り当てられる。なお、本例において、優先度は１５〜０の値をとるものとする。すなわち、各タイムスロットデータの変数「prio」には、当該タイムスロットに対応しているスレッドの優先度に応じて、１５〜０のうちのいずれかの値が設定される。ここで、１５〜０の値は、それぞれＣＰＵの使用率の比１：１／２：１／３：・・・・・：１／１６に対応する。
【００９１】
そして、各スレッドに対応した各タイムスロットデータは、全部で１７列の待ち行列からなるリングバッファに入れられ、各待ち行列毎に順にタイムスロットデータが選択される。そして、選択されたタイムスロットデータに対してＣＰＵの処理時間が割り当てられ、当該タイムスロットデータに対応したスレッドが実行される。
【００９２】
ＣＰＵの処理時間が割り当てられたタイムスロットデータは、対応するスレッドが、当該タイムスロットに割り当てられた処理時間を使い切った時点で、当該タイムスロットデータの変数「prio」に設定された優先度に従って、何番目か先の待ち行列に繋がれる。ここで、当該タイムスロットデータが次に繋がれるリングバッファ中の待ち行列を、優先度によって調整することにより、優先度に応じたＣＰＵ使用率の割り当てが実現される。
【００９３】
なお、ここではラウンド・ロビン・スケジューリング・アルゴリズムを基本としたスケジューリング方法を例に挙げるが、本発明はこれに限られるものではない。すなわち、本発明は、例えば、優先度に基づいてＦＣＦＳ（First Come First Serve）を行うようなスケジューリング方法等にも適用可能である。ここで、優先度に基づいてＦＣＦＳを行うようなスケジューリング方法としては、例えば、実時間システムにおいてよく用いられる「Rate Monotonic」（John Lehoczky,Lui Sha,and Ye Ding. The Rate Monotonic Scheduling Algorithm. Exact Characterization And Average Case Behavior. Thchnical report,Department Of Statistics,Carnegie Mellon University,1987）や「Earliest Deadline First」などのアルゴリズムを適用したスケジューリング方法が挙げられる。
【００９４】
４−１  優先度の継承が行われないとき
優先度が１５のスレッドＡと、優先度が１３のスレッドＢと、優先度３のスレッドＣとを時分割処理するような場合であって、優先度の継承が行われない場合について、図４乃至図１３を参照して説明する。なお、図４乃至図１３並びに後掲する図１４乃至図２３において、１から１７までの数字は、待ち行列の番号を示している。そして、これらの番号に付けられた丸印は、当該番号の待ち行列が現在処理の対象となっていることを示している。
【００９５】
スレッドＡ，Ｂ，Ｃを時分割処理する際は、先ず、図４に示すように、１番目の待ち行列にタイムスロットデータＡ，Ｂ，Ｃが並べられる。すなわち、タイムスロットデータＡの変数「next」がタイムスロットデータＢを指し、タイムスロットデータＢの変数「next」がタイムスロットデータＣを指している。なお、ここでは、スレッドＡに割り当てられたタイムスロットデータをタイムスロットデータＡ、スレッドＢに割り当てられたタイムスロットデータをタイムスロットデータＢ、スレッドＣに割り当てられたタイムスロットデータをタイムスロットデータＣとしている。
【００９６】
そして、先ず、１番目の待ち行列の先頭のタイムスロットデータであるタイムスロットデータＡにＣＰＵの処理時間が割り当てられ、タイムスロットデータＡに対応したスレッドであるスレッドＡが実行される。なお、タイムスロットデータＡに対応したスレッドとは、タイムスロットデータＡの変数「owner」が指し示すスレッドのことである。
【００９７】
そして、当該タイムスロットデータＡに割り当てられていた処理時間を、スレッドＡが使い切ったら、タイムスロットデータＡは、リングバッファ中で、優先度に対応した分だけ先の待ち行列に繋がれる。具体的には、スレッドＡの優先度が１５なので、図５に示すように、タイムスロットデータＡは、（１６−１５）＝１の分だけ先の待ち行列、すなわち２番目の待ち行列に繋がれる。
【００９８】
次に、１番目の待ち行列の次のタイムスロットデータであるタイムスロットデータＢにＣＰＵの処理時間が割り当てられ、タイムスロットデータＢに対応したスレッドであるスレッドＢが実行される。なお、タイムスロットデータＢに対応したスレッドとは、タイムスロットデータＢの変数「owner」が指し示すスレッドのことである。
【００９９】
そして、当該タイムスロットデータＢに割り当てられていた処理時間を、スレッドＢが使い切ったら、タイムスロットデータＢは、リングバッファ中で、優先度に対応した分だけ先の待ち行列に繋がれる。具体的には、スレッドＢの優先度が１３なので、図６に示すように、タイムスロットデータＢは、（１６−１３）＝３の分だけ先の待ち行列、すなわち４番目の待ち行列に繋がれる。
【０１００】
次に、１番目の待ち行列の次のタイムスロットデータであるタイムスロットデータＣにＣＰＵの処理時間が割り当てられ、タイムスロットデータＣに対応したスレッドであるスレッドＣが実行される。なお、タイムスロットデータＣに対応したスレッドとは、タイムスロットデータＣの変数「owner」が指し示すスレッドのことである。
【０１０１】
そして、当該タイムスロットデータＣに割り当てられていたタイムスライスを使い切ったら、タイムスロットデータＣは、リングバッファ中で、優先度に対応した分だけ先の待ち行列に繋がれる。具体的には、スレッドＣの優先度が３なので、図７に示すように、タイムスロットデータＣは、（１６−３）＝１３の分だけ先の待ち行列、すなわち１４番目の待ち行列に繋がれる。
【０１０２】
以上で１番目の待ち行列に並んでいたタイムスロットデータの処理が終了し、次に、２番目の待ち行列に並んでいるタイムスロットデータの処理が行われる。このとき、２番目の待ち行列の先頭は、タイムスロットデータＡとなっているので、当該タイムスロットデータＡにＣＰＵの処理時間が割り当てられ、タイムスロットデータＡに対応したスレッドであるスレッドＡが実行される。そして、当該タイムスロットデータＡに割り当てられていた処理時間を使い切ったら、タイムスロットデータＡは、優先度に対応した分だけ先の待ち行列に繋がれる。具体的には、スレッドＡの優先度が１５なので、図８に示すように、タイムスロットデータＡは、（１６−１５）＝１の分だけ先の待ち行列、すなわち３番目の待ち行列に繋がれる。
【０１０３】
以上で２番目の待ち行列に並んでいたタイムスロットデータの処理が終了し、次に、３番目の待ち行列に並んでいるタイムスロットデータの処理が行われる。このとき、３番目の待ち行列の先頭は、タイムスロットデータＡとなっているので、当該タイムスロットデータＡにＣＰＵの処理時間が割り当てられ、タイムスロットデータＡに対応したスレッドであるスレッドＡが実行される。そして、当該タイムスロットデータＡに割り当てられていた処理時間を使い切ったら、タイムスロットデータＡは、優先度に対応した分だけ先の待ち行列に繋がれる。具体的には、スレッドＡの優先度が１５なので、図９に示すように、タイムスロットデータＡは、（１６−１５）＝１の分だけ先の待ち行列、すなわち４番目の待ち行列に繋がれる。ここで、４番目の待ち行列には、既にタイムスロットデータＢが並んでいるので、タイムスロットデータＡは、タイムスロットデータＢの後ろに繋がれる。
【０１０４】
以上で３番目の待ち行列に並んでいたタイムスロットデータの処理が終了し、次に、４番目の待ち行列に並んでいるタイムスロットデータの処理が行われる。このとき、４番目の待ち行列の先頭は、タイムスロットデータＢとなっているので、先ず、当該タイムスロットデータＢにＣＰＵの処理時間が割り当てられ、タイムスロットデータＢに対応したスレッドであるスレッドＢが実行される。そして、当該タイムスロットデータＢに割り当てられていた処理時間を使い切ったら、タイムスロットデータＢは、優先度に対応した分だけ先の待ち行列に繋がれる。具体的には、スレッドＢの優先度が１３なので、図１０に示すように、タイムスロットデータＢは、（１６−１３）＝３の分だけ先の待ち行列、すなわち７番目の待ち行列に繋がれる。
【０１０５】
次に、４番目の待ち行列の次のタイムスロットデータであるタイムスロットデータＡにＣＰＵの処理時間が割り当てられ、タイムスロットデータＡに対応したスレッドであるスレッドＡが実行される。そして、当該タイムスロットデータＡに割り当てられていた処理時間を使い切ったら、タイムスロットデータＡは、優先度に対応した分だけ先の待ち行列に繋がれる。具体的には、スレッドＡの優先度が１５なので、図１１に示すように、タイムスロットデータＡは、（１６−１５）＝１の分だけ先の待ち行列、すなわち５番目の待ち行列に繋がれる。
【０１０６】
以下同様に、待ち行列毎にタイムスロットデータに対してＣＰＵの処理時間を割り当てて、当該タイムスロットデータに対応したスレッドの実行を行うとともに、処理時間を使い切ったタイムスロットデータを優先度に対応した分だけ先の待ち行列に繋ぐ処理を行っていく。なお、以上のように処理を進めていくことにより、待ち行列が１７番目にまで達した場合、その後は１番目の待ち行列に戻るものとする。
【０１０７】
例えば、図１２に示すように、１７番目の待ち行列にタイムスロットデータＡが繋がれており、当該タイムスロットデータＡにＣＰＵの処理時間が割り当てられ、タイムスロットデータＡに対応したスレッドであるスレッドＡが実行された場合、当該タイムスロットデータＡに割り当てられていた処理時間を使い切ったら、タイムスロットデータＡは、優先度に対応した分だけ先の待ち行列に繋がれる。具体的には、スレッドＡの優先度が１５なので、（１６−１５）＝１の分だけ先の待ち行列に繋がれる。そして、このとき現在の待ち行列は１７番目なので、（１６−１５）＝１の分だけ先の待ち行列は、１番目の待ち行列である。すなわち、タイムスロットデータＡは、図１３に示すように、１番目の待ち行列に繋がれる。
【０１０８】
以上のような処理を順次行っていくことにより、スレッドＡのＣＰＵ使用率と、スレッドＢのＣＰＵ使用率と、スレッドＣのＣＰＵ使用率との比が、１：１／３：１／１３となる。すなわち、スレッドの対応するタイムスロットデータの優先度に応じて、それぞれのスレッドにＣＰＵの処理時間が割り当てられ、複数のスレッドの時分割処理が実行されることとなる。
【０１０９】
ところで、従来の多くのタイムスライススケジューリングでは、ＣＰＵ使用率の割合に応じて待ち行列のソートを行うなどの処理が必要であった。これに対して、上記の方法では、単にタイムスロットデータの繋ぎ換えを行うだけで、タイムスライススケジューリングを実現することができる。すなわち、上記の方法を用いることで、非常に少ない計算量にて、タイムスライススケジューリングを実現することができる。
【０１１０】
なお、各処理がある一定時間内に終わらなければシステムが成り立たないような実時間システムに上記の方法を適用するような場合には、スケジューリング待ち行列に入れるタイムスロットデータの量を制限するようにすればよい。スケジューリング待ち行列に入れるタイムスロットデータの量を制限することで、ＣＰＵの使用率を保証することが可能となり、これにより、実時間システムへの適用が可能となる。
【０１１１】
例えば、スレッドＡが最も優先順位の高いスレッドだと仮定する。ここでスレッドＡの実行終了には、ＣＰＵ処理時間を２単位必要とするとする。また、スレッドＡは、５ＣＰＵ単位処理時間以内に終了しなければならないとする。この場合、スレッドＡが図８の状態にあって、スレッドＡが実行終了までにあと１ＣＰＵ単位処理時間となった状態で図９のような状態になるとする。このとき、少なくとも次にスレッドＡに処理時間が割り当てられるまでには１ＣＰＵ単位処理時間待たなければならない（すなわちスレッドＢが実行する処理時間）が、次のサイクルでスレッドＡは無事に実行を終了することができる。ところが、仮に、図８の状態で現在スレッドＢが繋がれている待ち行列に５個のスレッドが繋がっていると考えると、スレッドＡに次に処理時間が回ってくるまでには、５ＣＰＵ単位処理時間待つことになる。この場合、これだけでスレッドＡの実行制限時間を超えてしまう。このようなときに、例えば、一つの待ち行列に繋ぐことのできるスレッドの数を、待ち行列理論などによりスレッドＡが制限時間を超えることのないことが示されるような数以内に制限することが考えられる。
【０１１２】
４−２  優先度の継承が行われるとき
優先度が１５のスレッドＡと、優先度が１３のスレッドＢと、優先度３のスレッドＣとを時分割処理するような場合であって、優先度の継承が行われる場合について、図１４乃至図２３を参照して説明する。
【０１１３】
なお、図１４乃至図２３において、括弧内の符号は、タイムスロットデータの変数「owner」が指し示しているスレッドを表している。すなわち、例えば、Ａ（Ａ）は、タイムスロットデータＡの変数「owner」がスレッドＡを指し示しているということを表しており、また、例えば、Ａ（Ｂ）は、タイムスロットデータＡの変数「owner」がスレッドＢを指し示しているということを表している。
【０１１４】
本例においても、図４乃至図１３に示した例と同様、先ず、図１４に示すように、１番目の待ち行列にタイムスロットデータＡ，Ｂ，Ｃが並べられる。そして、先ず、１番目の待ち行列の先頭のタイムスロットデータであるタイムスロットデータＡにＣＰＵの処理時間が割り当てられ、タイムスロットデータＡに対応したスレッドであるスレッドＡが実行されるが、本例では、このときに、スレッドＡが、スレッドＢが起こす事象を待たねばならないとする。すると、ここではスレッドＡは実行されずに、図１に示したフローチャートに従って処理が行われる。その結果、スレッドＡが待ち状態とされるとともに、図１５に示すように、タイムスロットデータＡの変数「owner」がスレッドＢを指し示すように変更され、スレッドＢが実行される。すなわち、タイムスロットデータＡからのリンクが、スレッドＡからスレッドＢに変更され、もともとスレッドＡに対して割り当てられていたＣＰＵの処理時間が、スレッドＢに割り当てられることとなる。
【０１１５】
そして、当該タイムスロットデータＡに割り当てられていた処理時間を使い切ったら、タイムスロットデータＡは、優先度に対応した分だけ先の待ち行列に繋がれる。具体的には、スレッドＡの優先度が１５なので、図１６に示すように、タイムスロットデータＡは、（１６−１５）＝１の分だけ先の待ち行列、すなわち２番目の待ち行列に繋がれる。
【０１１６】
次に、１番目の待ち行列の次のタイムスロットデータであるタイムスロットデータＢにＣＰＵの処理時間が割り当てられ、タイムスロットデータＢに対応したスレッドであるスレッドＢが実行される。なお、タイムスロットデータＢに対応したスレッドとは、タイムスロットデータＢの変数「owner」が指し示すスレッドのことであり、ここではスレッドＢである。
【０１１７】
そして、当該タイムスロットデータＢに割り当てられていた処理時間を使い切ったら、タイムスロットデータＢは、優先度に対応した分だけ先の待ち行列に繋がれる。具体的には、スレッドＢの優先度が１３なので、図１７に示すように、タイムスロットデータＢは、（１６−１３）＝３の分だけ先の待ち行列、すなわち４番目の待ち行列に繋がれる。
【０１１８】
次に、１番目の待ち行列の次のタイムスロットデータであるタイムスロットデータＣにＣＰＵの処理時間が割り当てられ、タイムスロットデータＣに対応したスレッドであるスレッドＣが実行される。なお、タイムスロットデータＣに対応したスレッドとは、タイムスロットデータＣの変数「owner」が指し示すスレッドのことであり、ここではスレッドＣである。
【０１１９】
そして、当該タイムスロットデータＣに割り当てられていた処理時間を使い切ったら、タイムスロットデータＣは、優先度に対応した分だけ先の待ち行列に繋がれる。具体的には、スレッドＣの優先度が３なので、図１８に示すように、タイムスロットデータＣは、（１６−３）＝３の分だけ先の待ち行列、すなわち１４番目の待ち行列に繋がれる。
【０１２０】
以上で１番目の待ち行列に並んでいたタイムスロットデータの処理が終了し、次に、２番目の待ち行列に並んでいるタイムスロットデータの処理が行われる。このとき、２番目の待ち行列の先頭は、タイムスロットデータＡとなっているので、当該タイムスロットデータＡの変数「owner」が指し示すスレッド、すなわちスレッドＢが実行される。そして、当該タイムスロットデータＡに割り当てられていた処理時間を使い切ったら、タイムスロットデータＡは、優先度に対応した分だけ先の待ち行列に繋がれる。具体的には、スレッドＡの優先度が１５なので、図１９に示すように、タイムスロットデータＡは、（１６−１５）＝１の分だけ先の待ち行列、すなわち３番目の待ち行列に繋がれる。
【０１２１】
以上で２番目の待ち行列に並んでいたタイムスロットデータの処理が終了し、次に、３番目の待ち行列に並んでいるタイムスロットデータの処理が行われる。このとき、３番目の待ち行列の先頭は、タイムスロットデータＡとなっているので、当該タイムスロットデータＡの変数「owner」が指し示すスレッド、すなわちスレッドＢが実行される。そして、当該タイムスロットデータＡに割り当てられていた処理時間を使い切ったら、タイムスロットデータＡは、優先度に対応した分だけ先の待ち行列に繋がれる。具体的には、スレッドＡの優先度が１５なので、図２０に示すように、タイムスロットデータＡは、（１６−１５）＝１の分だけ先の待ち行列、すなわち４番目の待ち行列に繋がれる。ここで、４番目の待ち行列には、既にタイムスロットデータＢが並んでいるので、タイムスロットデータＡは、タイムスロットデータＢの後ろに繋がれる。
【０１２２】
以上で３番目の待ち行列に並んでいたタイムスロットデータの処理が終了し、次に、４番目の待ち行列に並んでいるタイムスロットデータの処理が行われる。このとき、４番目の待ち行列の先頭は、タイムスロットデータＢとなっているので、先ず、当該タイムスロットデータＢの変数「owner」が指し示すスレッド、すなわちスレッドＢが実行される。
【０１２３】
このときに、スレッドＢの実行により、スレッドＡの待ち状態の原因が解消されたとする。すると、図２及び図３に示したフローチャートに従って処理が行われ、その結果、スレッドＡが実行可能状態にされるとともに、図２１に示すように、タイムスロットデータＡの変数「owner」がスレッドＡを指し示すように変更される。すなわち、タイムスロットデータＡからのリンクが、スレッドＡに戻される。
【０１２４】
その後、タイムスロットデータＢに割り当てられていた処理時間を使い切ったら、タイムスロットデータＢは、優先度に対応した分だけ先の待ち行列に繋がれる。具体的には、スレッドＢの優先度が１３なので、図２２に示すように、タイムスロットデータＢは、（１６−１３）＝３の分だけ先の待ち行列、すなわち７番目の待ち行列に繋がれる。
【０１２５】
次に、４番目の待ち行列の次のタイムスロットデータであるタイムスロットデータＡにＣＰＵの処理時間が割り当てられ、タイムスロットデータＡに対応したスレッドであるスレッドＡが実行される。なお、タイムスロットデータＡに対応したスレッドとは、タイムスロットデータＡの変数「owner」が指し示すスレッドのことであり、ここではスレッドＡとなっている。
【０１２６】
そして、当該タイムスロットデータＡに割り当てられていた処理時間を使い切ったら、タイムスロットデータＡは、優先度に対応した分だけ先の待ち行列に繋がれる。具体的には、スレッドＡの優先度が１５なので、図２３に示すように、タイムスロットデータＡは、（１６−１５）＝１の分だけ先の待ち行列、すなわち５番目の待ち行列に繋がれる。
【０１２７】
以下同様に、待ち行列毎にタイムスロットデータの実行を行うとともに、処理時間を使い切ったタイムスロットデータを優先度に対応した分だけ先の待ち行列に繋ぐ処理を行っていく。
【０１２８】
５．まとめ
上記スケジューリング方法では、優先度の高いスレッドが優先度の低いスレッドの処理を待つ必要があるときに、優先度の高いスレッドの状態を待ち状態にするとともに、優先度の高いスレッドに割り当てられていたタイムスロットデータの変数「owner」が指し示すスレッドを、優先度の高いスレッドから優先度の低いスレッドに変更するようにしている。すなわち、優先度の高いスレッドに割り当てられていたタイムスロットデータからスレッドへのリンクを、一時的に優先度の低いスレッドに切り換えるようにしている。
【０１２９】
換言すれば、上記スケジューリング方法では、優先度の高いスレッドが優先度の低いスレッドの処理を待つ必要があるときに、優先度の低いスレッドの優先度を上げることにより優先度逆転問題を回避するのではなく、優先度の高いスレッドの代わりに優先度の低いスレッドを動かすようにすることで優先度逆転問題を回避している。
【０１３０】
このようなスケジューリング方法によれば、優先度の高いスレッドが優先度の低いスレッドの処理を待つ必要があるときに、優先度継承のために待ち行列を変更するような処理や優先度を再計算するような処理等を一切行わずに、優先度の高いスレッドから優先度の低いスレッドに優先度を継承したのと同一の結果を得ることができる。したがって、上記スケジューリング方法によれば、特に実時間システムにおいては致命的な問題となる優先度逆転問題を回避することができる。しかも、上記スケジューリング方法では、優先度継承のために待ち行列を変更するような処理や優先度を再計算するような処理等を一切行う必要がないので、スケジューリングコストを増大させることなく、優先度逆転問題を回避することができる。さらに、上記スケジューリング方法では、待ち状態となるスレッドに割り当てられていたＣＰＵの処理時間は、待ち状態の原因となっているスレッドに割り当てられることとなるので、ＣＰＵの処理時間は無駄なく有効に利用される。
【０１３１】
なお、上記スケジューリング方法では、待ち事象が連結するような場合（例えば、スレッドＡがスレッドＢを待ち、スレッドＢがスレッドＣを待つような場合）にも、全タイムスロットデータが連結の先端のスレッドにリンクされることとなる。したがって、ＣＰＵの処理時間が全て有効に使用される。すなわち、上記スケジューリング方法では、従来の優先度継承方法では不可能であった、いわゆる複数スレッド待ちが可能となっている。
【０１３２】
最後に、本発明が適用されるハードウェア構成及びオペレーティングシステム構成の一例について、図２４及び図２５を参照しながら説明する。なお、図２４においては、本発明を適用したテレビジョン受信装置１を例に挙げるが、本発明は他の各種情報処理装置に対して適用することができることは言うまでもない。すなわち、本発明は、時分割処理するマルチスレッドシステムが採用されるオペレーティングシステム（以下、ＯＳという）が搭載される情報処理装置に対して広く適用可能であり、例えば、各種のオーディオ・ビジュアル機器（いわゆるＡＶ機器）、事務用情報処理機器、コンピュータ機器等の情報処理装置に対して適用可能である。
【０１３３】
図２４において、テレビジョン受信装置１は、アンテナ又はケーブル等によって放送局から送信された信号を受信し、受信した信号に基づいて、画像表示装置に映像を表示するとともに、スピーカから音声を出力する装置である。
【０１３４】
テレビジョン受信装置１は、一般的なテレビジョン受信機能を備えているだけではなく、外部からプログラムやデータ等を受け取ることが可能とされており、図２４に示すように、バス／ＩＯブリッジ２を介してバス３に接続されたテレビ機能部４と、バス／メモリブリッジ５を介してバス３に接続されたプロセッサ６と、バス／メモリブリッジ５を介してバス３に接続されたＲＯＭ（Read Only Memory）７及びＲＡＭ（Random Access Memory）８と、バス３に接続された操作パネル９、外部記憶装置１０及び通信装置１１とを備えている。
【０１３５】
テレビ機能部４は、アンテナ又はケーブル等によって受信した信号に基づいて、映像や音声を再生する機能を備えている。このテレビ機能部４は、バス／ＩＯブリッジ２を介してバス３に接続されており、これにより、他の各部と信号のやりとりが可能とされている。
【０１３６】
プロセッサ６は、このテレビジョン受信装置１の各部の制御を行うものであり、バス／メモリブリッジ５を介してバス３に接続されている。また、プロセッサ６には、バス／メモリブリッジ５を介してＲＯＭ７及びＲＡＭ８が接続されている。ＲＯＭ７は、例えば、テレビジョン受信装置１に関する不変の情報を保持している。ＲＡＭ８は、プロセッサ６のワークエリアとして使われるメモリ空間を提供する。すなわち、プロセッサ６は、後述するように外部記憶装置１０に記録されているＯＳ（本発明のスケジューリング装置、方法を含む）やアプリケーションプログラムを、ＲＡＭ８をワークエリアとして使用しながら実行することにより、このテレビジョン受信装置１を構成する各部を制御する。
【０１３７】
操作パネル９は、ユーザからの操作入力を受け付けるための入力装置である。テレビジョン受信装置１は、この操作パネル９から、例えば、チャンネルやボリューム等の切り替えを指示する信号が入力される。この操作パネル９は、具体的には、各種信号を入力するための複数のボタンを備えた入力装置や、いわゆるマウスに代表されるようなポインティングデバイス等によって構成される。この操作パネル９によって入力された信号は、バス３及びバス／メモリブリッジ５を介してプロセッサ６に入力される。そして、プロセッサ６は、操作パネル９から入力された信号に基づいて、所定の演算処理を行い、テレビジョン受信装置１を構成する各部を制御する。
【０１３８】
外部記憶装置１０は、例えばハードディスク装置等の記憶装置から構成され、プロセッサ６による各種制御を行うためのＯＳ（本発明のスケジューリング装置、方法を含む）やアプリケーションプログラム等を記録している。また、外部記憶装置１０は、画像データ及び制御データや、外部から通信装置１１を介してダウンロードされたプログラム等が記録される。また、通信装置１１は、外部との間でデータ通信を行うための入出力部であり、例えばモデムやターミナルアダプター等の通信装置によって構成される。
【０１３９】
また、テレビジョン受信装置１は、外部記憶装置１０に記憶されているＯＳをプロセッサ６によって実行し、このＯＳ上で、ＲＯＭ７に記録されている制御情報等を用いて、外部記憶装置１０に記録されたアプリケーションプログラムを実行することにより、各部の制御を行う。すなわち、このテレビジョン受信装置１は、ＯＳを構成する各種データ処理プログラム（本発明のスケジューリング装置、方法を含む）を提供するプログラム提供媒体として、外部記憶装置１０を備えている。
【０１４０】
なお、本発明のスケジューリング装置、方法を含むＯＳは、ＲＯＭ７やＲＡＭ８に記録しておくとしてもよい。この場合には、ＲＯＭ７やＲＡＭ８がプログラム提供媒体となる。ただし、バージョンアップを行う等のようなＯＳの書き換え操作を行うためには、書き換え可能な記録媒体に本発明のスケジューリング装置、方法を含むＯＳを備えることが望ましい。また、プログラム提供媒体としては、例えば、このテレビジョン受信装置１に対して着脱自在に用いられる磁気記録媒体や光記録媒体等であってもよいし、このテレビジョン受信装置１と他の各種情報処理装置とを接続するネットワーク回線等であってもよい。
【０１４１】
テレビジョン受信装置１に搭載されるＯＳは、純オブジェクト指向ＯＳである。そして、このＯＳ上で、例えば、テレビ機能部４に動画像を表示するためにアプリケーションプログラムや、操作パネル９を制御するためのグラフィカル・ユーザ・インタフェース（ＧＵＩ）を実現するアプリケーションプログラムが実行される。
【０１４２】
次に、図２５を用いてＯＳの一例について説明する。このＯＳは、基本部分であるメタコア（MetaCore）２０と、その他のオブジェクト群とから構成される。ここで、メタコア２０は、オブジェクトとしては定義できない部分であり、オブジェクト間の実行制御の切り替えをする処理部、すなわち本発明に係る処理時間を割り当てられたスレッドを実行する処理部などを含んでいる。
【０１４３】
このＯＳは、純オブジェクト指向ＯＳであり、ＯＳ上で実行されるアプリケーションプログラムを構成するオブジェクトと、ＯＳを構成するオブジェクトとが、同様な実行機構を有するＯＳである。このＯＳでは、全てのオブジェクトは、各々一つずつのスレッドを持ち、互いに並行に動作することが可能である。各オブジェクトはメッセージを送信することにより互いに通信することができる。ただし、システムオブジェクトと呼ばれる特定のオブジェクトだけは、メッセージを介することなく通信することができ、さらには本発明にあるようなスケジューリングの対象外にあって動作することが保証されている。また、システムオブジェクトは、特定のデータ構造に対して直接操作することを許可されている。このような特定のデータ構造としては、本発明にあるようなスレッドデータやタイムスロットデータ等が含まれる。
【０１４４】
図２５においては、メタコア２０以外に、システムオブジェクトであるタイマオブジェクト２１とスケジューラ２２、及びそれ以外のオブジェクト群として第一のメッセージハンドラ２３、第二のメッセージハンドラ２４、第一の実行環境マネージャ２５、第二の実行環境マネージャ２６を示す。なお、図２５には実際のシステムに含まれるが省略されている多くのオブジェクト（システムオブジェクトを含む）があることは言うまでもない。
【０１４５】
本ＯＳにおいては、各アプリケーションを異なる実行環境の上で動作させることが可能である。本実施例においては、２つのアプリケーションがそれぞれ異なる実行環境を利用している例が示されている。具体的には、第一のアプリケーション３２は、第一の実行環境３０の上で動作し、第一の実行環境３０は、タイマオブジェクト２１、スケジューラ２２、第一のメッセージハンドラ２３、第一の実行環境マネージャ２５を含んでいる。また、第二のアプリケーション３３は、第二の実行環境３１の上で動作し、第二の実行環境３１は、タイマオブジェクト２１、スケジューラ２２、第二のメッセージハンドラ２４、第二の実行環境マネージャ２６を含んでいる。また、第一のアプリケーション３２及び第二のアプリケーション３３も、各々オブジェクト群によって構成されている。さらに、第一のアプリケーションは、第一のオブジェクト３４と第二のオブジェクト３５を含んでおり、第一のオブジェクト３４の優先度は第二のオブジェクト３５の優先度より低いと仮定する。
【０１４６】
まず、本発明においてスレッドの切り替えがなされる手順について説明する。第一のアプリケーション３２を構成する第一のオブジェクト３４が、第二のオブジェクト３５に対して処理要求メッセージを送ったとする。この場合、メッセージは、第一のメッセージハンドラ２３を経由して、第二のオブジェクト３５に送られることになる。このとき、第一のメッセージハンドラ２３は、送り手である第一のオブジェクト３４の優先度と、受け手である第二のオブジェクト３５の優先度を比較することにより、優先度逆転が発生することを検出する。この検出を受けて、第一のメッセージハンドラ２３は、関数「makeWait（Thread* target, Thread* depend）」を呼び出す。ここで、引数「target」は第一のオブジェクト３４のスレッドを示し、引数「depend」は第二のオブジェクト３５のスレッドを示す。これによって、第二のオブジェクト３５のスレッドに対して、第一のオブジェクト３４のスレッドに対応するタイムスロットデータが継承される。
【０１４７】
次に第二のオブジェクト３５が第一のオブジェクト３４からの処理要求メッセージによって要求された処理を終了して、第一のオブジェクト３４に対して返答メッセージを返すことになる。この返答メッセージは再び第一のメッセージハンドラ２３を経由して送られる。このとき、第一のメッセージハンドラ２３は、第一のオブジェクト３４が第二のオブジェクト３５に依存して待ち状態になっていることを検出する。この検出を受けて、第一のメッセージハンドラ２３は、関数「makeReady（Thread* target）」を呼び出す。ここで、引数「target」は第一のオブジェクト３４のスレッドである。これによって、第二のオブジェクト３５のスレッドに対して継承されていたタイムスロットデータが、第一のオブジェクト３４のスレッドに対して返還される。
【０１４８】
次に時分割スケジューリングについて説明する。時分割スケジューリングにおいては、タイマオブジェクト２１が一定時間ごとにタイマ割り込みを起こし、スケジューラ２２を呼び出す。スケジューラ２２は、既に説明されたような方法で、次に実行されるスレッドのタイムスロットデータを選択し、当該選択されたオブジェクトのスレッドを起動する。
【０１４９】
【発明の効果】
以上詳細に説明したように、本発明では、優先度の高いスレッドに対応していたタイムスロットデータを、優先度の低いスレッドに対応したタイムスロットデータとして扱うようにすることで、優先度の高いスレッドから優先度が低いスレッドへの優先度の継承を実現している。したがって、本発明によれば、優先度逆転の問題を回避することができる。
【０１５０】
しかも、本発明では、優先度の高いスレッドに対応していたタイムスロットデータを優先度の低いスレッドに対応したタイムスロットデータとして扱うようにすることだけで、優先度の継承が実現されるので、優先度の継承を行うにあたって、待ち行列の変更を頻繁に行うような必要はない。したがって、本発明によれば、オーバーヘッドの増加の原因となる待ち行列の変更を頻繁に行うようなことなく、優先度の継承を実現することができる。
【０１５１】
さらに、本発明では、優先度の高いスレッドから優先度の低いスレッドに優先度の継承が行われた場合、優先度の低いスレッドは、優先度の高いスレッドに割り当てられていた処理時間と、優先度の低いスレッドにもともと割り当てられていた処理時間との両方を使うこととなる。したがって、本発明によれば、各スレッドに割り当てられた処理時間を有効に利用することが可能となる。
【図面の簡単な説明】
【図１】スレッドが待ち状態となる場合に呼び出される関数「makeWait（Thread* target, Thread* depend）」の処理の流れを示すフローチャートである。
【図２】スレッドの待ち状態が解消された場合に呼び出される関数「makeReady（Thread* target）」の処理の流れを示すフローチャートである。
【図３】関数「makeReady（Thread* target）」の中で呼ばれる関数「changeOwner（Thread* target, Thread* depend)」の処理の流れを示すフローチャートである。
【図４】図４乃至図１１は優先度の継承が行われない場合の待ち行列の遷移を順に示す図であり、図４は１番目の待ち行列にタイムスロットデータＡ，Ｂ，Ｃが並んでいる状態を示す図である。
【図５】タイムスロットデータＡ，Ｂ，Ｃの待ち行列について、図４の次の状態を示す図である。
【図６】タイムスロットデータＡ，Ｂ，Ｃの待ち行列について、図５の次の状態を示す図である。
【図７】タイムスロットデータＡ，Ｂ，Ｃの待ち行列について、図６の次の状態を示す図である。
【図８】タイムスロットデータＡ，Ｂ，Ｃの待ち行列について、図７の次の状態を示す図である。
【図９】タイムスロットデータＡ，Ｂ，Ｃの待ち行列について、図８の次の状態を示す図である。
【図１０】タイムスロットデータＡ，Ｂ，Ｃの待ち行列について、図９の次の状態を示す図である。
【図１１】タイムスロットデータＡ，Ｂ，Ｃの待ち行列について、図１０の次の状態を示す図である。
【図１２】図１２及び図１３は、待ち行列が１７番目にまで達した場合の待ち行列の遷移を順に示す図であり、図１２は１７番目に待ち行列にタイムスロットデータＡが並んでいる状態を示す図である。
【図１３】タイムスロットデータＡ，Ｂ，Ｃの待ち行列について、図１２の次の状態を示す図である。
【図１４】図１４乃至図２３は優先度の継承が行われる場合の待ち行列の遷移を順に示す図であり、図１４は１番目の待ち行列にタイムスロットデータＡ，Ｂ，Ｃが並んでいる状態を示す図である。
【図１５】タイムスロットデータＡ，Ｂ，Ｃの待ち行列について、図１４の次の状態を示す図である。
【図１６】タイムスロットデータＡ，Ｂ，Ｃの待ち行列について、図１５の次の状態を示す図である。
【図１７】タイムスロットデータＡ，Ｂ，Ｃの待ち行列について、図１６の次の状態を示す図である。
【図１８】タイムスロットデータＡ，Ｂ，Ｃの待ち行列について、図１７の次の状態を示す図である。
【図１９】タイムスロットデータＡ，Ｂ，Ｃの待ち行列について、図１８の次の状態を示す図である。
【図２０】タイムスロットデータＡ，Ｂ，Ｃの待ち行列について、図１９の次の状態を示す図である。
【図２１】タイムスロットデータＡ，Ｂ，Ｃの待ち行列について、図２０の次の状態を示す図である。
【図２２】タイムスロットデータＡ，Ｂ，Ｃの待ち行列について、図２１の次の状態を示す図である。
【図２３】タイムスロットデータＡ，Ｂ，Ｃの待ち行列について、図２２の次の状態を示す図である。
【図２４】本発明に係る実施例として示すテレビジョン受信装置の概略構成図である。
【図２５】本発明に係るオペレーティングシステムの概略を説明するための図である。
【図２６】優先度逆転の問題を説明するための図である。
【図２７】従来の優先度継承機構を説明するための図である。
【符号の説明】
１  テレビジョン受信装置、  ２  バス／ＩＯブリッジ、  ３  バス、  ４  テレビ機能部、  ５  バス／メモリブリッジ、  ６  プロセッサ、  ７  ＲＯＭ（Read Only Memory）、  ８  ＲＡＭ（Random Access Memory）、  ９  操作パネル、  １０  外部記憶装置、  １１  通信装置
【図１】
0004048638.tif 000004
【図２】
0004048638.tif 000005
【図３】
0004048638.tif 000006
【図４】
0004048638.tif 000007
【図５】
0004048638.tif 000008
【図６】
0004048638.tif 000009
【図７】
0004048638.tif 000010
【図８】
0004048638.tif 000011
【図９】
0004048638.tif 000012
【図１０】
0004048638.tif 000013
【図１１】
0004048638.tif 000014
【図１２】
0004048638.tif 000015
【図１３】
0004048638.tif 000016
【図１４】
0004048638.tif 000017
【図１５】
0004048638.tif 000018
【図１６】
0004048638.tif 000019
【図１７】
0004048638.tif 000020
【図１８】
0004048638.tif 000021
【図１９】
0004048638.tif 000022
【図２０】
0004048638.tif 000023
【図２１】
0004048638.tif 000024
【図２２】
0004048638.tif 000025
【図２３】
0004048638.tif 000026
【図２４】
0004048638.tif 000027
【図２５】
0004048638.tif 000028
【図２６】
0004048638.tif 000029
【図２７】
0004048638.tif 000030