(57)【特許請求の範囲】
【請求項１】
実行するスレッドの切り替えを行うコンテキストスイッチが生じたときに、当該コンテキストスイッチの履歴を記録しておき、
スレッドの実行順序を制御するスケジューラが呼び出されたときに、当該スケジューラが管理する待ち行列を上記履歴を辿り、実際のオブジェクトの状態と、スケジューラの側の状態との整合性をとって更新すること
を特徴とするデータ処理方法。
【請求項２】
上記更新を行うときに、上記待ち行列の順序を設定し直す必要があるコンテキストスイッチを生じさせるスレッドに対して所定のフラグを設定しておき、
コンテキストスイッチが生じたときに、当該コンテキストスイッチを生じさせたスレッドに上記フラグが設定されている場合には、スケジューラを呼び出して待ち行列の順序を設定し直すこと
を特徴とする請求項１記載のデータ処理方法。
【請求項３】
上記スケジューラの呼び出され方によって、上記フラグが設定されるスレッドが異なること
を特徴とする請求項２記載のデータ処理方法。
【請求項４】
スレッドの実行順序を制御するスケジューラを有するオペレーティングシステムが記録されたコンピュータ読み取り可能な記録媒体であって、
上記オペレーティングシステムは、実行するスレッドの切り替えを行うコンテキストスイッチが生じたときに、当該コンテキストスイッチの履歴を記録しておき、スケジューラが呼び出されたときに、当該スケジューラが管理する待ち行列を上記履歴を辿り、実際のオブジェクトの状態と、スケジューラの側の状態との整合性をとって更新すること
を特徴とする記録媒体。
【請求項５】
上記オペレーティングシステムは、上記更新を行うときに、上記待ち行列の順序を設定し直す必要があるコンテキストスイッチを生じさせるスレッドに対して所定のフラグを設定しておき、コンテキストスイッチが生じたときに、当該コンテキストスイッチを生じさせたスレッドに上記フラグが設定されている場合には、スケジューラを呼び出して待ち行列の順序を設定し直すこと
を特徴とする請求項４記載の記録媒体。
【請求項６】
上記スケジューラの呼び出され方によって、上記フラグが設定されるスレッドが異なること
を特徴とする請求項５記載の記録媒体。
【請求項７】
スレッドの実行順序を制御するスケジューラを有するオペレーティングシステムが記録されたコンピュータ読み取り可能な記録媒体を備えたデータ処理装置であって、
上記オペレーティングシステムは、実行するスレッドの切り替えを行うコンテキストスイッチが生じたときに、当該コンテキストスイッチの履歴を記録しておき、スケジューラが呼び出されたときに、当該スケジューラが管理する待ち行列を上記履歴を辿り、実際のオブジェクトの状態と、スケジューラの側の状態との整合性をとって更新すること
を特徴とするデータ処理装置。
【請求項８】
上記オペレーティングシステムは、上記更新を行うときに、上記待ち行列の順序を設定し直す必要があるコンテキストスイッチを生じさせるスレッドに対して所定のフラグを設定しておき、コンテキストスイッチが生じたときに、当該コンテキストスイッチを生じさせたスレッドに上記フラグが設定されている場合には、スケジューラを呼び出して待ち行列の順序を設定し直すこと
を特徴とする請求項７記載のデータ処理装置。
【請求項９】
上記スケジューラの呼び出され方によって、上記フラグが設定されるスレッドが異なること
を特徴とする請求項８記載のデータ処理装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、データ処理方法に関し、特に、オペレーティングシステムによるスケジュール管理機構に関する。また、本発明は、スケジュール管理機構を備えたオペレーティングシステムが記録された記録媒体、並びにそのような記録媒体を備えたデータ処理装置に関する。
【０００２】
【従来の技術】
オペレーティングシステムには、いわゆるファットカーネル（Fat Kernel）を採用したオペレーティングシステムと、いわゆるマイクロカーネル（Micro Kernel）を採用したオペレーティングシステムと、いわゆるナノカーネル（Nano Kernel）を採用したオペレーティングシステムとがある。
【０００３】
ファットカーネルを採用したオペレーティングシステムでは、オペレーティングシステムの機能が全てカーネル内に実装される。したがって、例えば、アプリケーションプログラムが、スレッドの状態変化を伴うオペレーティングシステムのサービスを要求する場合には、図１２に示すように、先ず、ファットカーネル内の対応したモジュール（例えば図１２における「Mailer」や「Syncronization」）がシステムコール（system call）によって呼び出される。その後、各モジュールからスレッドの状態を遷移させるために、スレッドの実行順序を制御してそれらのスケジュール管理を行うスケジューラ（Scheduler）が、いわゆる関数呼び出し（function call）によって呼び出され、これにより、スレッドの状態変化を伴う処理が行われる。
【０００４】
このように、ファットカーネルを採用したオペレーティングシステムでは、オペレーティングシステムの機能が全てカーネル内に実装される。このため、様々な機能をオペレーティングシステムに実装させるには、カーネル内の知識が必要であり、また、それらの変更も容易ではない。すなわち、ファットカーネルを採用したオペレーティングシステムは、柔軟性に欠けるという問題点を持つ。
【０００５】
一方、マイクロカーネルを採用したオペレーティングシステムでは、カーネル内に実装する機能をハードウェア制御等のような基本的な機能だけとする。すなわち、マイクロカーネルを採用したオペレーティングシステムでは、ハードウェア制御等のような基本的な機能がマイクロカーネルに実装され、その他のオペレーティングシステムとしての機能については、マイクロカーネル外で実現される。
【０００６】
このようなマイクロカーネルを採用したオペレーティングシステムでは、カーネルに実装される機能を限定することにより、柔軟性が欠けるというファットカーネルにおける問題を解決することができる。
【０００７】
マイクロカーネルを採用したオペレーティングシステムでは、図１３に示すように、アプリケーションプログラムのみならず、オペレーティングシステムとしての機能を提供するモジュール（例えば図１３における「Syncronization」，「Mailer」，「Scheduler」）も、マイクロカーネル上で動作する。したがって、オペレーティングシステムの機能を提供するモジュール自身も、マイクロカーネル内に実装されたスケジューラ（Scheduler）によって、スケジュール管理がなされる。
【０００８】
このようなマイクロカーネルを採用したオペレーティングシステムにおいて、アプリケーションプログラムと、オペレーティングシステムの機能を提供するモジュールとの間の呼び出しは、マイクロカーネルによって提供される通信機構（Mailer）を用いて行う。また、オペレーティングシステムの機能を提供するモジュールは、マイクロカーネルによって提供されるインターフェースを用いて、マイクロカーネル内に実装されたスケジューラ（Scheduler）を間接的に呼び出すことで、アプリケーションプログラムの実行を制御する。
【０００９】
また、ナノカーネルを採用したオペレーティングシステムでは、図１４に示すように、マイクロカーネルの中から更に、コンテキストの切り替え（いわゆるコンテキストスイッチ）を担うコンテキストスイッチ機構のみをナノカーネルとして取り出す。
【００１０】
すなわち、ナノカーネルを採用したオペレーティングシステムでは、ＣＰＵ等の機種に依存する部分であるコンテキストスイッチ機構を取り出して抽象化する。これにより、カーネルの移植性やプログラミング容易性を更に向上することができる。
【００１１】
【発明が解決しようとする課題】
上述したように、オペレーティングシステムの柔軟性を高めて、移植性やプログラミング容易性等の向上を図るという観点からは、ファットカーネルよりもマイクロカーネルを採用した方が好ましく、更にはナノカーネルを採用した方がより好ましい。
【００１２】
しかしながら、マイクロカーネルやナノカーネルを採用したときには、全ての実行実体（例えば、オペレーティングシステム上で動作するアプリケーションプログラムや、オペレーティングシステムとしての機能を提供するオブジェクト等）が動作する度に、マイクロカーネルの通信機構やスケジューラを呼び出すこととなるため、多数のコンテキストスイッチが必要となる。このため、マイクロカーネルやナノカーネルを採用したオペレーティングシステムでは、ファットカーネルを採用したオペレーティングシステムよりも、システム全体としての性能が低下してしまうという問題が生じる。
【００１３】
また、ナノカーネルを採用したオペレーティングシステムでは、通信機構やスケジューラ等を呼び出すときにも、コンテキストスイッチを必要とする。このため、ナノカーネルを採用したオペレーティングシステムでは、コンテキストスイッチの増加に伴うオーバーヘッドが、マイクロカーネルを採用したオペレーティングシステムよりも、更に増加してしまうという問題がある。
【００１４】
このように、ナノカーネルを採用すると、コンテキストスイッチが増加してしまい、システム全体の性能が低下する。このような性能低下を避けるための手段としては、例えば、コンテキストスイッチ時におけるスケジューラの呼び出しを削減することが考えられる。しかしながら、単にスケジューラの呼び出しを行わないようにしたのでは、スケジュール管理が適切になされなくなってしまい、システム動作に不都合が生じる。
【００１５】
すなわち、スケジューラの呼び出しを省略してしまうと、スケジュール管理に必要な情報がスケジューラに渡されなくなってしまい、実際のシステムの状態と、スケジューラの側で把握している状態とが相違してしまう。このため、スケジューラによるスケジュール管理が、正しく行われなくなってしまう。また、スケジューラは、スケジュール管理の対象となっているスレッドの待ち行列を変更した場合には、通常、優先度の高い処理が先に行われるように再スケジューリングを行うが、スケジューラの呼び出しを省略してしまうと、再スケジューリングが行われないため、優先度の高い処理が待たされてしまう等の不都合が生じる。
【００１６】
本発明は、以上のような従来の実情に鑑みて提案されたものであり、ナノカーネルを採用しつつ、スケジューラの呼び出しを最小限に押さえて、且つ、システム全体を正しく動作させることが可能なデータ処理方法を提供することを目的としている。また、そのようなデータ処理方法を実現するプログラムが記録された記録媒体、並びにそのような記録媒体を備えたデータ処理装置を提供することも目的としている。
【００１７】
【課題を解決するための手段】
本発明に係るデータ処理方法では、実行するスレッドの切り替えを行うコンテキストスイッチが生じたときに、当該コンテキストスイッチの履歴を記録しておく。そして、スレッドの実行順序を制御するスケジューラが呼び出されたときに、当該スケジューラが管理する待ち行列を上記履歴を辿り、実際のオブジェクトの状態と、スケジューラの側の状態との整合性をとって更新する。
【００１８】
このような本発明に係るデータ処理法では、スケジューラが呼び出されたときに、コンテキストスイッチの履歴を辿り、実際のオブジェクトの状態と、スケジューラの側の状態との整合性をとって待ち行列を更新するようにしているので、スケジューラの呼び出しを省略してコンテキストスイッチがなされていたとしても、スケジューラによるスケジュール管理を正しく行うことができる。
【００１９】
なお、上記更新を行うときに、上記待ち行列の順序を設定し直す必要があるコンテキストスイッチを生じさせるスレッドに対して所定のフラグを設定しておき、コンテキストスイッチが生じたときに、当該コンテキストスイッチを生じさせたスレッドに上記フラグが設定されている場合には、スケジューラを呼び出して待ち行列の順序を設定し直すようにしてもよい。このようにしておけば、常に適切なときに待ち行列の順序の再設定がなされることとなるため、例えば、優先度の高い処理が待たされてしまう等の不都合を回避できる。
【００２０】
また、フラグを設定するようにしたときには、上記スケジューラの呼び出され方によって、上記フラグが設定されるスレッドが異なるようにしてもよい。このようにしておけば、より適切なときに待ち行列の順序の再設定がなされるようにすることが可能となる。
【００２１】
また、本発明に係る記録媒体は、スレッドの実行順序を制御するスケジューラを有するオペレーティングシステムが記録されたコンピュータ読み取り可能な記録媒体である。そして、上記オペレーティングシステムは、実行するスレッドの切り替えを行うコンテキストスイッチが生じたときに、当該コンテキストスイッチの履歴を記録しておき、スケジューラが呼び出されたときに、当該スケジューラが管理する待ち行列を上記履歴を辿り、実際のオブジェクトの状態と、スケジューラの側の状態との整合性をとって更新する。
【００２２】
このような本発明に係る記録媒体に記録されたオペレーティングシステムでは、スケジューラが呼び出されたときに、コンテキストスイッチの履歴を辿り、実際のオブジェクトの状態と、スケジューラの側の状態との整合性をとって待ち行列を更新するようにしているので、スケジューラの呼び出しを省略してコンテキストスイッチがなされていたとしても、スケジューラによるスケジュール管理を正しく行うことができる。
【００２３】
なお、上記更新を行うときに、上記待ち行列の順序を設定し直す必要があるコンテキストスイッチを生じさせるスレッドに対して所定のフラグを設定しておき、コンテキストスイッチが生じたときに、当該コンテキストスイッチを生じさせたスレッドに上記フラグが設定されている場合には、スケジューラを呼び出して待ち行列の順序を設定し直すようにしてもよい。このようにしておけば、常に適切なときに待ち行列の順序の再設定がなされることとなるため、例えば、優先度の高い処理が待たされてしまう等の不都合を回避できる。
【００２４】
また、フラグを設定するようにしたときには、上記スケジューラの呼び出され方によって、上記フラグが設定されるスレッドが異なるようにしてもよい。このようにしておけば、より適切なときに待ち行列の順序の再設定がなされるようにすることが可能となる。
【００２５】
本発明に係るデータ処理装置は、スレッドの実行順序を制御するスケジューラを有するオペレーティングシステムが記録されたコンピュータ読み取り可能な記録媒体を備えたデータ処理装置である。そして、上記オペレーティングシステムは、実行するスレッドの切り替えを行うコンテキストスイッチが生じたときに、当該コンテキストスイッチの履歴を記録しておき、スケジューラが呼び出されたときに、当該スケジューラが管理する待ち行列を上記履歴を辿り、実際のオブジェクトの状態と、スケジューラの側の状態との整合性をとって更新する。
【００２６】
このような本発明に係るデータ処理装置に備えられた記録媒体に記録されたオペレーティングシステムでは、スケジューラが呼び出されたときに、コンテキストスイッチの履歴を辿り、実際のオブジェクトの状態と、スケジューラの側の状態との整合性をとって待ち行列を更新するようにしているので、スケジューラの呼び出しを省略してコンテキストスイッチがなされていたとしても、スケジューラによるスケジュール管理を正しく行うことができる。
【００２７】
なお、上記更新を行うときに、上記待ち行列の順序を設定し直す必要があるコンテキストスイッチを生じさせるスレッドに対して所定のフラグを設定しておき、コンテキストスイッチが生じたときに、当該コンテキストスイッチを生じさせたスレッドに上記フラグが設定されている場合には、スケジューラを呼び出して待ち行列の順序を設定し直すようにしてもよい。このようにしておけば、常に適切なときに待ち行列の順序の再設定がなされることとなるため、例えば、優先度の高い処理が待たされてしまう等の不都合を回避できる。
【００２８】
また、フラグを設定するようにしたときには、上記スケジューラの呼び出され方によって、上記フラグが設定されるスレッドが異なるようにしてもよい。このようにしておけば、より適切なときに待ち行列の順序の再設定がなされるようにすることが可能となる。
【００２９】
【発明の実施の形態】
以下、本発明の実施の形態について、図面を参照しながら詳細に説明する。
【００３０】
１．ハードウェア環境
まず、本発明が適用されるハードウェア構成の一例について、図１を参照して説明する。なお、ここでは、本発明の実施の形態の一例として、テレビ装置に本発明を適用した例を挙げるが、当然の事ながら、本発明は、その他のデータ処理装置にも適用可能である。すなわち、本発明は、オペレーティングシステムが動作するデータ処理装置に広く適用可能であり、例えば、テレビ装置以外のオーディオ・ビジュアル機器（いわゆるＡＶ機器）や、各種の事務機器や、一般のコンピュータ装置等にも適用可能である。
【００３１】
本発明が適用されたデータ処理装置である図１に示すテレビ装置は、アンテナ又はケーブル等によって放送局からの信号を受信し、当該信号に基づいて、ブラウン管又は液晶等の画像表示装置に映像を表示すると共にスピーカから音声を出力する。
【００３２】
このテレビ装置は、通常のテレビ機能を備えているだけでなく、外部からプログラムやデータを受けとることが可能となっており、図１に示すように、バス／ＩＯブリッジ１を介してバス２に接続されたテレビ機能部３と、バス／メモリブリッジ４を介してバス２に接続されたプロセッサ５と、バス／メモリブリッジ４を介してプロセッサ５に接続されたＲＯＭ（Read Only Memory）６及びＲＡＭ（Random Access Memory）７と、バス２に接続された操作パネル８、外部記憶装置９及び通信装置１０とを備えている。
【００３３】
テレビ機能部３は、アンテナ又はケーブル等によって受信した信号に基づいて、映像や音声を再生する機能を備えている。このテレビ機能部３は、バス／ＩＯブリッジ１を介してバス２に接続されており、これにより、他の部分との信号のやり取りが可能となっている。
【００３４】
プロセッサ５は、このテレビ装置の各部の制御を行うものであり、バス／メモリブリッジ４を介してバス２に接続されている。また、プロセッサ５には、バス／メモリブリッジ４を介してＲＯＭ６及びＲＡＭ７が接続されている。
【００３５】
ＲＯＭ６は、プロセッサ５による制御を行うためのオペレーティングシステムやアプリケーションプログラム等を記憶している。ここで、オペレーティングシステムは、ナノカーネルを採用したオペレーティングシステムである。また、このオペレーティングシステムは、オブジェクト指向が適用されてなるオブジェクト指向型オペレーティングシステムでもある。
【００３６】
ＲＡＭ７は、プロセッサ５のワークエリアとして使われる。すなわち、プロセッサ５は、ＲＯＭ６に記憶されているオペレーティングシステムやアプリケーションプログラム等を、ＲＡＭ７をワークエリアとして使用して実行することにより、このテレビ装置を構成する各部を制御する。
【００３７】
操作パネル８は、ユーザからの操作入力を受け付けるための入力装置であり、この操作パネル８から、例えば、テレビのチャンネルやボリューム等の切り換えを指示する信号が入力される。この操作パネル８は、具体的には、各種信号を入力するための複数のボタンを備えた入力装置や、いわゆるマウスと称されるようなポインティングデバイス等からなる。この操作パネル８によって入力された信号は、バス２及びバス／メモリブリッジ４を介してプロセッサ５に入力される。そして、プロセッサ５は、操作パネル８によって入力された信号に基づいて、所定の演算処理を行って各部を制御する。
【００３８】
外部記憶装置９は、例えばハードディスク装置からなり、画像データ、制御データ、又は外部から通信装置１０を介してダウンロードされたアプリケーションプログラム等を記録するのに使われる。また、通信装置１０は、外部との間でデータ通信を行うための入出力部であり、例えばモデムやターミナルアダプター等からなる。
【００３９】
このテレビ装置は、テレビ機能部３によって提供される通常のテレビ機能を備えているだけでなく、通信装置１０を介して、外部からプログラムやデータを受け取ることが可能となっている。すなわち、このテレビ装置では、例えば、外部のネットワークから通信装置１０を介して新規ソフトウェアモジュールを受け取ることにより、オペレーティングシステムやアプリケーションプログラムのバージョンアップを行うことが可能となっている。
【００４０】
また、このテレビ装置では、プロセッサ５によって、ＲＯＭ６に記憶されているオペレーティングシステムを実行するとともに、オペレーティングシステム上で、ＲＯＭ６や外部記憶装置９に記憶されているアプリケーションプログラムを実行することにより、各部の制御を行う。すなわち、このテレビ装置は、オペレーティングシステムが記録されたコンピュータ読み取り可能な記録媒体として、ＲＯＭ６を備えている。なお、オペレーティングシステムは、ＲＡＭ７や外部記憶装置９に記録しておくようにしてもよい。特に、オペレーティングシステムの書き換えを行えるようにしたい場合には、ＲＡＭ７や外部記憶装置９に記録しておくようにする。
【００４１】
２．ソフトウェア環境
つぎに、上記テレビ装置におけるソフトウェア環境について説明する。
【００４２】
２−１  オペレーティングシステムの概略構成
上記テレビ装置で使用されるオペレーティングシステムは、ナノカーネルを採用したオペレーティングシステムであり、図２に示すように、コンテキストスイッチを司るナノカーネルに相当する部分としてメタコア（MetaCore）を備えている。
【００４３】
また、このオペレーティングシステムは、オブジェクト指向を採用している。換言すれば、このオペレーティングシステムにおいて、ナノカーネルに相当するメタコア上で動作する実行実体はオブジェクトであり、オブジェクト間のやり取りはメッセージ通信によってなされる。
【００４４】
また、このオペレーティングシステムは、複数のプログラム実行環境を同時に提供することが可能となっている。以下の説明では、このオペレーティングシステムによって提供されるプログラム実行環境のことをメタスペースと呼ぶ。具体的には、このオペレーティングシステムは、メタスペースとして、図２に示すように、mCOOPメタスペースと、mDriveメタスペースと、mCoreメタスペースとを提供する。これらのメタスペースは、複数のオブジェクトで構成される。なお、以下の説明では、メタスペースを構成するオブジェクトのことをメタオブジェクトと称する。
【００４５】
mCOOPメタスペースは、オブジェクト指向型のアプリケーションプログラム（例えば、操作パネル８を制御するためのグラフィカル・ユーザ・インターフェースを実現するアプリケーションプログラム）を動作させるためのメタスペースである。なお、mCOOPメタスペースの「ｍ」はメタスペースである旨を示しており、「ＣＯＯＰ」は、Concurrent Object Oriented Programmingの略である。
【００４６】
mDriveメタスペースは、ハードウェアの制御を担うデバイスドライバを動作させるためのメタスペースである。なお、mDriveメタスペースの「ｍ」はメタスペースである旨を示しており、「Drive」は、デバイスドライバ（Device Driver）を動作させるメタスペースである旨を示している。
【００４７】
また、mCoreメタスペースは、mCOOPメタスペース及びmDriveメタスペースを構成するメタオブジェクトを動作させるためのメタスペースであり、マイクロカーネルに相当する。なお、mCoreメタスペースの「ｍ」はメタスペースである旨を示しており、「Core」は、オペレーティングシステムの核となる部分であることを示している。
【００４８】
すなわち、このオペレーティングシステムでは、図２に示すように、ＣＰＵ等のハードウェアの上でmCoreメタスペースが動作し、mCoreメタスペースの上でmCOOPメタスペース及びmDriveメタスペースが動作し、mCOOPメタスペースの上でオブジェクト指向型のアプリケーションプログラムが動作し、mDriveメタスペースの上でデバイスドライバが動作する。そして、これらの間のコンテキストスイッチがメタコアによって制御される。
【００４９】
なお、このオペレーティングシステムは、mCoreメタスペースの上で動作するメタスペースとして、mCOOPメタスペースやmDriveメタスペース以外にも、例えば、手続き型のアプリケーションプログラム（例えば、テレビ機能部３に動画像を表示するためのアプリケーションプログラム）を動作させるためのメタスペース等も提供可能とされている。ただし、mCoreメタスペース上で動作するメタスペースが異なっていても、本発明はそれらのメタスペースに対して同様に適用可能であるので、以下の説明では、mCOOPメタスペースやmDriveメタスペースだけを例に挙げ、他のメタスペースについては説明を省略する。
【００５０】
２−２  メタオブジェクト
mCOOPメタスペースを構成するメタオブジェクトには、図２に示すように、オブジェクト「mCOOPScheduler」と、オブジェクト「mCOOPMailer」と、オブジェクト「mCOOPFaultHandler」とがある。ここで、オブジェクト「mCOOPScheduler」は、いわゆるスケジューラであり、mCOOPメタスペース上で動作するアプリケーションプログラムのスケジュール管理等を担うメタオブジェクトである。オブジェクト「mCOOPMailer」は、mCOOPメタスペース上で動作するアプリケーションプログラム間のメッセージ通信等を担うメタオブジェクトである。オブジェクト「mCOOPFaultHandler」は、例外処理を担うメタオブジェクトである。なお、mCOOPメタスペースは、実際にはこれらのメタオブジェクトの他、様々なメタオブジェクトによって構成される。
【００５１】
mDriveメタスペースを構成するメタオブジェクトには、図２に示すように、オブジェクト「mDriveScheduler」と、オブジェクト「mDriveMailer」と、オブジェクト「mDriveFaultHandler」とがある。ここで、オブジェクト「mDriveScheduler」は、いわゆるスケジューラであり、mDriveメタスペース上で動作するデバイスドライバのスケジュール管理等を担うメタオブジェクトである。オブジェクト「mDriveMailer」は、mDriveメタスペース上で動作するデバイスドライバ間のメッセージ通信等を担うメタオブジェクトである。オブジェクト「mDriveFaultHandler」は、例外処理を担うメタオブジェクトである。なお、mDriveメタスペースも、実際にはこれらのメタオブジェクトの他、様々なメタオブジェクトによって構成される。
【００５２】
mCoreメタスペースを構成するメタオブジェクトには、図２に示すように、オブジェクト「mCoreScheduler」と、オブジェクト「mCoreMailer」とがある。ここで、オブジェクト「mCoreScheduler」は、いわゆるスケジューラであり、mCoreメタスペース上で動作するオブジェクトのスケジュール管理等を担うメタオブジェクトである。オブジェクト「mCoreMailer」は、mCoreメタスペース上で動作するメタオブジェクト間のメッセージ通信等を担うメタオブジェクトである。なお、mCoreメタスペースも、実際にはこれらのメタオブジェクトの他、様々なメタオブジェクトによって構成される。
【００５３】
なお、本例では、スケジュール管理を担うメタオブジェクトを、それぞれのメタスペース毎に別々のメタオブジェクトとしたが、スケジュール管理を担うメタオブジェクトを全メタスペースで共有するようにしてもよい。すなわち、スケジュール管理を担うメタオブジェクトを、mCOOPメタスペースで使用するときにはmCOOPメタスペースのメタオブジェクトとして振る舞い、mDriveメタスペースで使用するときにはmDriveメタスペースのメタオブジェクトとして振る舞い、mCoreメタスペースで使用するときにはmCoreメタスペースのメタオブジェクトとして振る舞うようにすることにより、全メタスペースで共有することも可能である。
【００５４】
なお、以下の説明では、メタスペース上で動くオブジェクトのことをベースオブジェクトと称し、ベースオブジェクトがメタオブジェクトによって提供されるサービスを受けるために行うメタオブジェクト呼び出しのことをメタコール（meta-call）と称する。なお、メタコールは、ファットカーネルにおけるシステムコールに相当する。そして、ベースオブジェクトとメタオブジェクトとの間のコンテキストスイッチは、ナノカーネルに相当するメタコアによって行われる。
【００５５】
また、以下の説明において、「スケジューラ」とは、スケジュール管理を担うメタオブジェクトであるオブジェクト「mCOOPScheduler」、オブジェクト「mDriveScheduler」及びオブジェクト「mCoreScheduler」のことをまとめて指すものとする。
【００５６】
２−３  従来のスケジュール管理機構
本発明の実施の形態の説明に先立って、従来、ナノカーネルを採用したオペレーティングシステムで、スケジュール管理がどのようになされていたかについて説明する。
【００５７】
なお、ここでは、mCOOPメタスペース上で動作するアプリケーションプログラムであるオブジェクトＡから、同様にmCOOPメタスペース上で動作するアプリケーションプログラムであるオブジェクトＢへ、メッセージを送信する場合を例に挙げ、図３及び図４を参照して説明する。ここで、図３は、オブジェクトＡからオブジェクトＢへメッセージを送信する際の手順をオペレーティングシステムの階層構造とともに示した図である。なお、図３では、mDriveメタスペースについては、図示を省略している。一方、図４は、オブジェクトＡからオブジェクトＢへメッセージを送信する際の各オブジェクト間のやり取りをタイムチャートとして示した図である。
【００５８】
このときの手順は以下の通りである。
【００５９】
（１）meta-call to mCOOPMailer
先ず、オブジェクトＡが、mCOOPメタスペースのオブジェクト「mCOOPMailer」をメタコールによって呼び出す。すなわち、オブジェクトＡからオブジェクトＢへメッセージを送信するために、先ず、mCOOPメタスペース上で動作するオブジェクト間のメッセージ通信を担うメタオブジェクトであるオブジェクト「mCOOPMailer」を呼び出す。
【００６０】
このときは、具体的には、先ず、矢印Ａ１に示すように、オブジェクトＡのメタコールを処理するオブジェクト「mCOOPMailer」を呼び出すために、オブジェクト「mCOOPMailer」が動作するmCoreメタスペースのオブジェクト「mCoreSchduler」を呼び出す。そして、このオブジェクト「mCoreScheduler」によって、mCoreメタスペース上で動作するオブジェクトのスケジュール管理を行った上で、矢印Ａ２に示すように、mCOOPメタスペースのオブジェクト「mCOOPMailer」を呼び出す。
【００６１】
（２）send to mCOOPScheduler
次に、オブジェクト「mCOOPMailer」は、オブジェクトＢを起こすために、mCOOPメタスペースのオブジェクト「mCOOPScheduler」にメッセージを送信する。すなわち、オブジェクトＢを起こすためには、mCOOPメタスペース上で動作するオブジェクトのスケジュール管理を行う必要があり、そのために、mCOOPメタスペース上で動作するオブジェクトのスケジュール管理を担うメタオブジェクトであるオブジェクト「mCOOPScheduler」に、オブジェクトＢを起こすのに必要なメッセージを送信する。
【００６２】
このときは、具体的には、先ず、オブジェクト「mCOOPMailer」からオブジェクト「mCOOPScheduler」へのメッセージ送信を行うために、矢印Ａ３に示すように、mCoreメタスペース上で動作するオブジェクト間のメッセージ通信を担うメタオブジェクトであるオブジェクト「mCoreMailer」を呼び出す。次に、メッセージの送り先であるオブジェクト「mCOOPScheduler」がmCoreメタスペース上で動作するため、矢印Ａ４に示すように、mCoreメタスペース上で動作するオブジェクトのスケジュール管理を担うメタオブジェクトであるオブジェクト「mCoreScheduler」を呼び出す。そして、このオブジェクト「mCoreScheduler」によって、mCoreメタスペース上で動作するオブジェクトのスケジュール管理を行った上で、矢印Ａ５に示すようにオブジェクト「mCOOPScheduler」を起こし、このオブジェクト「mCOOPScheduler」へオブジェクトＢを起こすのに必要なメッセージを送信する。
【００６３】
（３）reply to mCOOPMailer
次に、オブジェクト「mCOOPScheduler」は、上述のように受け取ったメッセージに基づいてオブジェクトＢの状態を変更し、その後、当該メッセージに対する返答をオブジェクト「mCOOPMailer」へ送信する。
【００６４】
このときは、具体的には、先ず、オブジェクト「mCOOPScheduler」からオブジェクト「mCOOPMailer」へ返答を送信するために、矢印Ａ６に示すように、mCoreメタスペース上で動作するオブジェクト間のメッセージ通信を担うメタオブジェクトであるオブジェクト「mCoreMailer」を呼び出す。次に、返答の送り先であるオブジェクト「mCOOPMailer」がmCoreメタスペース上で動作するため、矢印Ａ７に示すように、mCoreメタスペース上で動作するオブジェクトのスケジュール管理を担うメタオブジェクトであるオブジェクト「mCoreScheduler」を呼び出す。そして、このオブジェクト「mCoreScheduler」によって、mCoreメタスペース上で動作するオブジェクトのスケジュール管理を行った上で、矢印Ａ８に示すようにオブジェクト「mCOOPMailer」を起こし、このオブジェクト「mCOOPMailer」へオブジェクト「mCOOPScheduler」からの返答を送信する。
【００６５】
（４）resume base object
その後、オブジェクト「mCOOPMailer」による処理が終了したら、オブジェクトＡやオブジェクトＢの処理を開始する。
【００６６】
このときは、具体的には、先ず、矢印Ａ９に示すように、オブジェクト「mCoreScheduler」を呼び出す。そして、このオブジェクト「mCoreScheduler」により、再スケジューリング等の処理を行った上で、矢印Ａ１０に示すように、ベースオブジェクトであるオブジェクトＢを呼び出して処理を開始する。なお、このときに、オブジェクトＢでの処理よりもオブジェクトＡでの処理の方が優先順位が高い場合には、オブジェクトＢではなく、オブジェクトＡを呼び出して処理を開始する。
【００６７】
従来のスケジュール管理機構では、オブジェクトＡからオブジェクトＢへのメッセージ送信は、以上のような手順により行われるが、このような従来のスケジュール管理機構では、実行するオブジェクトの切り替え、すなわちコンテキストスイッチが非常に多く発生する。このコンテキストスイッチは、ナノカーネル、すなわち本例ではメタコアによって制御され実行されるが、上述したように、コンテキストスイッチの回数が多いとシステム全体の性能が低下してしまう。すなわち、従来のスケジュール管理機構では、多数のコンテキストスイッチを必要としており、システム全体としての性能を高めることが難しいという問題があった。
【００６８】
２−４  本発明を適用したスケジュール管理機構
つぎに、本発明を適用したスケジュール管理機構について説明する。
【００６９】
通常、オブジェクト間の処理には依存関係がある。このため、スケジュール管理の有無にかかわらず、オブジェクト間の実行遷移の順序関係が変わらないような場合がある。そこで、そのような場合にはスケジュール管理を省略して、スケジューラの呼び出しを行わないようにする。すなわち、オブジェクトの実行遷移の遂次性を利用して、スケジューラの呼び出しを削減する。これにより、コンテキストスイッチの回数を削減でき、システム全体としての性能を高めることが可能となる。
【００７０】
２−４−１  スケジュール管理の手順
以下、このような本発明を適用したスケジュール管理の手順について、具体的な例を挙げ、図５及び図６を参照して説明する。なお、ここでは、上述した従来のスケジュール管理と比較するために、上述した従来のスケジュール管理の説明で挙げた例と同様に、mCOOPメタスペース上で動作するアプリケーションプログラムであるオブジェクトＡから、mCOOPメタスペース上で動作するアプリケーションプログラムであるオブジェクトＢへ、メッセージを送信する場合を例に挙げる。なお、図５は、図３と同様に、オブジェクトＡからオブジェクトＢへメッセージを送信する際の手順をオペレーティングシステムの階層構造とともに示した図である。また、図６は、図４と同様に、オブジェクトＡからオブジェクトＢへメッセージを送信する際の各オブジェクト間のやり取りをタイムチャートとして示した図である。
【００７１】
このときの手順は以下の通りである。
【００７２】
（１）meta-call to mCOOPMailer
先ず、オブジェクトＡが、mCOOPメタスペースのオブジェクト「mCOOPMailer」をメタコールによって呼び出す。すなわち、オブジェクトＡからオブジェクトＢへメッセージを送信するために、先ず、mCOOPメタスペース上で動作するオブジェクト間のメッセージ通信を担うメタオブジェクトであるオブジェクト「mCOOPMailer」を呼び出す。
【００７３】
このときは、矢印Ｂ１に示すように、オブジェクトＡからのメタコールによって、オブジェクト「mCOOPMailer」を直接呼び出す。すなわち、オブジェクトＡはオブジェクト「mCOOPMailer」の処理の終了を待つ必要があり、オブジェクトＡからオブジェクト「mCOOPMailer」への実行遷移には逐次性があるので、オブジェクト「mCoreScheduler」を呼び出してスケジュール管理を行わせるようなことなく、オブジェクト「mCOOPMailer」を直接呼び出す。
【００７４】
（２）send to mCOOPScheduler
次に、オブジェクト「mCOOPMailer」は、オブジェクトＢを起こすために、mCOOPメタスペースのオブジェクト「mCOOPScheduler」にメッセージを送信する。すなわち、オブジェクトＢを起こすためには、mCOOPメタスペース上で動作するオブジェクトのスケジュール管理を行う必要があり、そのために、mCOOPメタスペース上で動作するオブジェクトのスケジュール管理を担うメタオブジェクトであるオブジェクト「mCOOPScheduler」に、オブジェクトＢを起こすのに必要なメッセージを送信する。
【００７５】
このときは、具体的には、先ず、オブジェクト「mCOOPMailer」からオブジェクト「mCOOPScheduler」へのメッセージ送信を行うために、矢印Ｂ２に示すように、mCoreメタスペース上で動作するオブジェクト間のメッセージ通信を担うメタオブジェクトであるオブジェクト「mCoreMailer」を呼び出す。次に、矢印Ｂ３に示すようにオブジェクト「mCOOPScheduler」を直接呼び出して、このオブジェクト「mCOOPScheduler」へオブジェクトＢを起こすのに必要なメッセージを送信する。
【００７６】
ここで、オブジェクト「mCOOPMailer」はオブジェクト「mCOOPScheduler」の処理の終了を待つ必要があり、オブジェクト「mCOOPMailer」からオブジェクト「mCOOPScheduler」への実行遷移には逐次性があるので、オブジェクト「mCoreScheduler」を呼び出してスケジュール管理を行わせるようなことなく、オブジェクト「mCOOPScheduler」を直接呼び出す。なお、以下の説明では、このように、同じメタスペースのオブジェクト間で、スケジューラの呼び出しを省略して行うメッセージ送信のことを、「FastSend」と称する。
【００７７】
（３）reply to mCOOPMailer
次に、オブジェクト「mCOOPScheduler」は、上述のように受け取ったメッセージに基づいてオブジェクトＢの状態を変更し、その後、当該メッセージに対する返答をオブジェクト「mCOOPMailer」へFastSendにより送信する。
【００７８】
このときは、具体的には、先ず、オブジェクト「mCOOPScheduler」からオブジェクト「mCOOPMailer」へ返答を送信するために、矢印Ｂ４に示すように、mCoreメタスペース上で動作するオブジェクト間のメッセージ通信を担うメタオブジェクトであるオブジェクト「mCoreMailer」を呼び出す。次に、矢印Ｂ５に示すようにオブジェクト「mCOOPMailer」を直接呼び出して、このオブジェクト「mCOOPMailer」へオブジェクト「mCOOPScheduler」からの返答を送信する。ここで、オブジェクト「mCOOPScheduler」からオブジェクト「mCOOPMailer」への実行遷移には逐次性があるので、オブジェクト「mCoreScheduler」を呼び出してスケジュール管理を行わせるようなことなく、オブジェクト「mCOOPMailer」への返答を直ぐに行う。
【００７９】
（４）resume base object
その後、オブジェクト「mCOOPMailer」による処理が終了したら、オブジェクトＡやオブジェクトＢの処理を開始する。
【００８０】
このときは、具体的には、先ず、矢印Ｂ６に示すように、オブジェクト「mCoreScheduler」を呼び出す。そして、このオブジェクト「mCoreScheduler」により、再スケジューリング等の処理を行った上で、矢印Ｂ７に示すように、ベースオブジェクトであるオブジェクトＢを呼び出して処理を開始する。なお、このときに、オブジェクトＢでの処理よりもオブジェクトＡでの処理の方が優先順位が高い場合には、オブジェクトＢではなく、オブジェクトＡを呼び出して処理を開始する。
【００８１】
以上のように、メタコールの際に直接メタオブジェクトを呼び出す機構や「FastSend」を用いてスケジューラの呼び出しを省略することにより、従来のスケジュール管理機構に比べて、コンテキストスイッチの回数を削減することができ、これにより、システム全体の性能向上を図ることが可能となる。
【００８２】
なお、ここではメッセージ送信を例に挙げてスケジューラの呼び出しを省略する手順を説明したが、スケジューラの呼び出しの省略は、その他の処理を行うような場合にも適用可能である。特に、割り込み処理時にスケジューラの呼び出しを省略するようにした場合には、スケジューラの呼び出しに要する時間が省かれるので、割り込み時の遅延時間を短縮することが可能となる。すなわち、スケジューラ呼び出しの省略は、割り込み処理のように即応答性が要求される処理に対しても好適である。
【００８３】
２−４−２  Delayed Queuing機構
しかしながら、以上のようにスケジューラの呼び出しを省略しただけでは、実際のオブジェクトの状態と、スケジューラの側で把握している状態とが異なるものとなり、システム動作に不都合が生じる恐れがある。そこで、本発明では、これらの整合性を取るための機構を設ける。なお、本例では、この機構のことを、Delayed Queuing機構と称している。
【００８４】
まず、Delayed Queuing機構の説明に先立って、各オブジェクトのスレッドの状態について、図７を参照して説明する。
【００８５】
各オブジェクトには、一つのスレッドが割り当てられる。そして、スケジューラは、スレッド単位で状態を管理して、スケジューリングを行う。ここで、スレッドの状態としては、図７に示すように、DORMANT（休眠状態）と、WAITING（待ち状態）と、RUNNING（処理中）との３つの状態を取りうるものとする。DORMANTは、オブジェクトが何も実行するものがなく、スレッドが停止している状態を表す。WAITINGは、オブジェクトが何らかのイベントを待っていて、スレッドが停止している状態を表す。RUNNINGは、オブジェクトが実行中であることを表す。換言すれば、RUNNINGは、スレッドが動いている状態か、或いは、スレッドがスケジューラによって管理される待ち行列内にいてＣＰＵ処理時間を割り当てられるのを待っている状態を表す。そして、スケジューラは、他のオブジェクトからの要求に従ってスレッドの状態を変更するとともに、スレッドの待ち行列を更新する。
【００８６】
つぎに、Delayed Queuing機構について説明する。
【００８７】
Delayed Queuing機構を適用するにあたっては、まず、各スレッドに構造体を割り当てておき、コンテキストスイッチにより、あるスレッド（ソーススレッドと称する。）から他のスレッド（ターゲットスレッドと称する。）に実行遷移したときに、コンテキストスイッチの履歴を上記構造体に記録しておく。ここで、コンテキストスイッチの履歴とは、各スレッドがどのスレッドからどの実行遷移で起こされたかの履歴のことであり、具体的には、直前に実行されていたスレッド（すなわちソーススレッド）がどのスレッドかを示す情報や、何によって（例えばメタコールやFastSendによって）ターゲットスレッドが起こされたかを示す情報等である。
【００８８】
そして、Delayed Queuing機構では、スケジューラが呼び出されたときに、上記構造体に記録されている履歴をたどり、実際のオブジェクトの状態と、スケジューラの側の状態との整合性をとる。すなわち、スケジューラが呼び出されたときに、Delayed Queuing機構を実行して、当該スケジューラが前回呼び出された以降に行われたコンテキストスイッチの履歴を、上記構造体に記録されている情報を参照して辿っていく。そして、この履歴に基づいて、実際のオブジェクトの状態に適合するように、スケジューラが管理する状態を変更するとともに、スレッドの待ち行列を更新する。これにより、実際のオブジェクトの状態と、スケジューラの側の状態との整合性がとられることとなる。
【００８９】
ここで、Delayed Queuing機構の対象となるスレッドは、スケジューラを呼び出さずに起こされたスレッド群である。具体的には、スケジューラが呼び出される直前に動いていたスレッド(currentThread)から、スケジューラが前回に起こしたスレッド(activeThread)までである。なお、スケジューラが前回に起こしたスレッド(activeThread)とは、換言すれば、スケジューラの側が、現在動いているスレッドであると認識しているスレッドということになる。
【００９０】
このようなDelayed Queuing機構では、スケジューラの側で管理しているスレッドの状態についての情報を、表１に示す規則に従って変更する。
【００９１】
【表１】
0003823475.tif 000002
【００９２】
すなわち、メタコールによりコンテキストスイッチが生じてターゲットスレッドが起こされていた場合には、当該コンテキストスイッチ後のソーススレッドの状態をWAITINGとし、ターゲットスレッドの状態をRUNNINGとする。また、FastSendによりコンテキストスイッチが生じてターゲットスレッドが起こされていた場合には、当該コンテキストスイッチ後のソーススレッドの状態をRUNNINGとし、ターゲットスレッドの状態をRUNNINGとする。なお、メタコールによりコンテキストスイッチが生じた場合も、FastSendによりコンテキストスイッチが生じた場合も、当該コンテキストスイッチ前のソーススレッドの状態は必ずRUNNINGであり、当該コンテキストスイッチ前のターゲットスレッドの状態は必ずDORMANTである。
【００９３】
つぎに、以上のようなDelayed Queuing機構のアルゴリズムについて、図８に示すフローチャートを参照して詳細に説明する。なお、図８のフローチャート、並びに後掲する図９のフローチャートでは、オブジェクト指向型のプログラミング言語Ｃ＋＋に準じた表記にて各ステップでの処理を記載している。
【００９４】
Delayed Queuing機構は、スケジューラ内に記述されたメソッド「Scheduler::DelayedQueuing()」によって実現される。換言すれば、スケジューラが呼び出されたときには、先ず、このメソッド「Scheduler::DelayedQueuing()」を実行して、Delayed Queuing機構を動作させる。
【００９５】
そして、このメソッド「Scheduler::DelayedQueuing()」では、先ず、ステップＳ１に示すように、pThreadにcurrentThreadを代入する。ここで、pThreadは、Delayed Queuing機構で使用される変数である。また、currentThreadは、スケジューラが呼び出される直前に動いていたスレッドを示している。したがって、ステップＳ１により、pThreadは、スケジューラが呼び出される直前に動いていたスレッドを示すこととなる。
【００９６】
次に、ステップＳ２に示すように、pThreadとactiveThreadとを比較する。ここで、activeThreadは、スケジューラが前回に起こしたスレッド、換言すれば、現在動いているスレッドであるとスケジューラが認識しているスレッドを示している。そして、pThreadとactiveThreadとが等しくなければ、すなわち、pThreadが、スケジューラが前回に起こしたスレッドを示していないならば、ステップＳ３へ進む。一方、pThreadとactiveThreadとが等しければ、すなわち、pThreadが、スケジューラが前回に起こしたスレッドを示しているならば、ステップＳ１０へ進む。
【００９７】
ステップＳ３では、pThreadが示すスレッドが、メタコールによって呼び出されたものであるか否かを判別する。そして、メタコールによって呼び出されたものである場合にはステップＳ４へ進み、メタコールによって呼び出されたものではない場合にはステップＳ７へ進む。なお、本例において、ステップＳ７へ進むのは、pThreadが示すスレッドが、FastSendによって呼び出された場合である。
【００９８】
ステップＳ４では、pThreadが示すスレッドが、ベースオブジェクトからメタオブジェクトへのコンテキストスイッチを生じさせたソーススレッド（つまり、後にベースオブジェクトからメタオブジェクトへのコンテキストスイッチを引き起こすソーススレッド）であるため、当該スレッドに対して待ち行列変更フラグを設定する。なお、図８では、待ち行列変更フラグのことを「Hook flag」として表記している。この待ち行列変更フラグは、後述する非同期スケジューラ機構で使用される。そして、ステップＳ４での処理の後、ステップＳ５へ進む。
【００９９】
ステップＳ５では、pThreadが示すスレッドの一つ前に実行されていたスレッドの状態をWAITINGとする。すなわち、ステップＳ５へ進むのは、pThreadが示すスレッドがメタコールで呼び出されたものであるので、表１に示した規則に従って、ステップＳ５では、pThreadが示すスレッドの一つ前に実行されていたスレッドの状態をWAITINGとする。そして、ステップＳ５での処理の後、ステップＳ６へ進む。
【０１００】
ステップＳ６では、コンテキストスイッチの履歴を辿っていくために、pThreadを、それまでpThreadが示していたスレッドの一つ前に実行されていたスレッドを示すように変更する。その後、ステップＳ２へ戻って処理を繰り返す。
【０１０１】
一方、ステップＳ７では、ステップＳ４と同様に、pThreadが示すスレッドに対して待ち行列変更フラグを設定する。そして、ステップＳ７での処理の後、ステップＳ８へ進む。
【０１０２】
ステップＳ８では、pThreadが示すスレッドの一つ前に実行されていたスレッドの状態をRUNNINGとする。すなわち、ステップＳ８へ進むのは、pThreadが示すスレッドがFastSendで呼び出されたものであるので、表１に示した規則に従って、ステップＳ８では、pThreadが示すスレッドの一つ前に実行されていたスレッドの状態をRUNNINGとする。そして、ステップＳ８での処理の後、ステップＳ９へ進む。
【０１０３】
ステップＳ９では、pThreadが示すスレッドの一つ前に実行されていたスレッド、すなわち、ステップＳ８で状態がRUNNINGとされたスレッドを、スケジューラが管理しているスレッドの待ち行列に加える。そして、ステップＳ９での処理の後、ステップＳ６へ進む。
【０１０４】
ステップＳ６では、上述したように、コンテキストスイッチの履歴を辿っていくために、pThreadを、それまでpThreadが示していたスレッドの一つ前に実行されていたスレッドを示すように変更し、その後、ステップＳ２へ戻って処理を繰り返す。
【０１０５】
そして、上述したように、ステップＳ２において、スケジューラが前回に起こしたスレッドをpThreadが示していると判断されたならば、ステップＳ１０へ進む。このステップＳ１０では、activeThreadにcurrentThreadを代入する。ここで、activeThreadは、現在動いているスレッドであるとスケジューラの側が認識しているスレッドを示しており、currentThreadは、スケジューラが呼び出される直前に動いていたスレッドを示している。したがって、このステップＳ１０での処理により、現在動いているスレッドであるとスケジューラの側が認識しているスレッドと、スケジューラが呼び出される直前に動いていたスレッドとが同じものとなる。
【０１０６】
なお、ステップＳ３乃至ステップＳ９の処理を行うことなく、ステップＳ１及びステップ２の処理の後に直ぐにステップＳ１０に進むのは、currentThreadとactiveThreadとが最初から等しい場合、すなわち、スケジューラを今回呼び起こしたスレッドと、スケジューラが前回呼び起こしたスレッドとが最初から同じ場合である。
【０１０７】
そして、スケジューラの呼び出しを省略して行ったコンテキストスイッチがない場合には、スケジューラを今回呼び起こしたスレッドと、スケジューラが前回呼び起こしたスレッドとが同じものとなり、一方、スケジューラの呼び出しを省略して行ったコンテキストスイッチがある場合には、スケジューラを今回呼び起こしたスレッドと、スケジューラが前回呼び起こしたスレッドとが異なるものとなる。
【０１０８】
したがって、スケジューラの呼び出しを省略して行ったコンテキストスイッチがない場合には、currentThreadとactiveThreadとが最初から等しくなり、この場合は、ステップＳ３〜ステップＳ９の処理を行うことなく、ステップＳ１及びステップ２の処理の後に直ぐにステップＳ１０に進むこととなる。この場合には、activeThreadとcurrentThreadとがもともと等しいので、ステップＳ１０では実質的には何も行わない。一方、スケジューラの呼び出しを省略して行ったコンテキストスイッチがある場合には、currentThreadとactiveThreadとが異なるため、ステップＳ３以降の処理へと進み、スケジューラの呼び出しを省略して行われたコンテキストスイッチの履歴を辿ることとなる。
【０１０９】
以上の処理により、コンテキストスイッチ時に省略されていた、スレッドの状態変更や待ち行列の更新は全て完了し、実際のオブジェクトの状態と、スケジューラの側の状態との整合性が取られることとなる。
【０１１０】
なお、以上のようなDelayed Queuing機構は、メッセージ送信時にスケジューラの呼び出しを省略したようなときだけでなく、割り込み処理のように即応答性を要求される処理を行う際にスケジューラの呼び出しを省略したようなときにも、同様に適用可能であることは言うまでもない。
【０１１１】
ところで、Delayed Queuing機構によるオブジェクトの状態変更が、スケジューラと同一のメタスペースを構成するメタオブジェクト間のコンテキストスイッチの逐次性に対して影響を与えないときには、メソッド「Scheduler::DelayedQueuing()」による処理を行う前に、図９に示すようなフローチャートに従って処理を行うメソッド「Scheduler::CheckInvoke()」によって、currentThreadを設定するようにしてもよい。
【０１１２】
このメソッド「Scheduler::CheckInvoke()」では、先ず、ステップＳ２１において、pThreadにschedulerThreadを代入する。ここで、schedulerThreadは、スケジューラのスレッドを示している。したがって、ステップＳ２１により、pThreadは、スケジューラのスレッドを示すこととなる。
【０１１３】
次に、ステップＳ２２において、pThreadが示すスレッドがFastSendによって呼び出されたものであるか否かを判別する。そして、pThreadが示すスレッドがFastSendによって呼び出されたものであるときにはステップＳ２３へ進む。
【０１１４】
ここで、pThreadが示すスレッドがFastSendによって呼び出されるのは、当該スレッド及びそのスレッドの直前のスレッドが、スケジューラと同一のメタスペースのメタオブジェクトのスレッドのときである。すなわち、ステップＳ２３へ進むのは、pThreadが示すスレッド及びそのスレッドの直前のスレッドが、スケジューラと同一のメタスペースのメタオブジェクトのスレッドのときである。したがって、このときには、Delayed Queuing機構を動作させる元となるcurrentThreadが示すスレッドを、更に前のスレッドにまで遡ることができる。そこで、ステップＳ２３では、pThreadを、それまでpThreadが示していたスレッドの一つ前に実行されていたスレッドを示すように変更し、その後、ステップＳ２２へ戻って処理を繰り返す。
【０１１５】
一方、ステップＳ２２において、pThreadが示すスレッドがFastSendによって呼び出されたものでないと判別されたときには、ステップＳ２５へ進む。このときは、pThreadが示すスレッドの直前のスレッドが、スケジューラと同一のメタスペースのメタオブジェクトのスレッドではないときである。
【０１１６】
そこで、ステップＳ２５では、currentThreadにpThreadを代入して、このときのpThreadが示すスレッドを、currentThreadが示すスレッドに設定する。このステップＳ２５により、currentThreadが示すスレッドは、当該スレッドの直前のスレッドがスケジューラと同一のメタスペースのメタオブジェクトのスレッドではないようなスレッドとされる。
【０１１７】
そして、ステップＳ２５により、currentThreadの設定が完了したら、メソッド「Scheduler::CheckInvoke()」の処理を終了して、上記メソッド「Scheduler::DelayedQueuing()」へ処理を移行する。
【０１１８】
以上のように、currentThreadの設定を行った上で、メソッド「Scheduler::DelayedQueuing()」の処理を行うようにすれば、コンテキストスイッチの履歴を辿ってスケジューラの持つ状態を変更する処理を削減でき、処理の効率化を図ることができる。
【０１１９】
２−４−３  非同期スケジューラ呼び出し機構
Delayed Queuing機構により待ち行列を変更するときに待ち行列変更フラグを設定しておき、この待ち行列変更フラグに基づいて、非同期にスケジューラを呼び出して再スケジューリングを行う。すなわち、Delayed Queuing機構を動作させたときに、再スケジューリングが必要なコンテキストスイッチを起こすソーススレッドに対して待ち行列変更フラグを設定しておき、そのコンテキストスイッチが起きたときに、スケジューラを呼び出して再スケジューリングを行う。この機構のことを非同期スケジューラ呼び出し機構と称する。
【０１２０】
非同期スケジューラ呼び出し機構の手順は以下の通りである。
【０１２１】
（１）Delayed Queuing機構により待ち行列を変更したときに、メタオブジェクトからベースオブジェクトへのコンテキストスイッチを起こすソーススレッドに、待ち行列変更フラグを設定する。なお、この待ち行列フラグの設定は、上述したステップＳ４，Ｓ７で行われる。
【０１２２】
（２）メタオブジェクトからベースオブジェクトへのコンテキストスイッチが生じたときに、ターゲットスレッド（ベースオブジェクトのスレッド）を起こす前に、ソーススレッド（メタオブジェクトのスレッド）に待ち行列変更フラグが設定されているか否かを調べる。そして、ソーススレッドに待ち行列変更フラグが設定されている場合には、ターゲットスレッドを起こす代わりにスケジューラを呼び出す。そして、メタオブジェクトからベースオブジェクトへのコンテキストスイッチを行う前に、再スケジューリングを行う。
【０１２３】
なお、待ち行列変更フラグは、スケジューラが待ち行列を変更した状況に応じて、具体的には下記のように設定される。
【０１２４】
（１）オブジェクト「mCoreScheduler」によってDelayed Queuing機構が実行されたとき（或いは、スケジューラを全メタスペースで共有するようにしている場合には、当該スケジューラがmCoreメタスペースのメタオブジェクトとして動作して、Delayed Queuing機構が実行されたとき）には、mCoreメタスペースを構成するメタオブジェクトからmCoreメタスペース上で動作するオブジェクトへのコンテキストスイッチを生じさせるスレッドに、待ち行列変更フラグを設定する。
【０１２５】
（２）mCoreメタスペースのメタオブジェクトによって呼び出されたオブジェクト「mCOOPScheduler」によって、Delayed Queuing機構が実行されたとき（或いは、スケジューラを全メタスペースで共有するようにしている場合には、当該スケジューラがmCOOPメタスペースのメタオブジェクトとして動作して、Delayed Queuing機構が実行されたとき）には、mCOOPメタスペースを構成するメタオブジェクトからmCOOPメタスペース上で動作するオブジェクトへのコンテキストスイッチを生じさせるスレッドに、待ち行列変更フラグを設定する。これは、具体的には、図９に示したメソッド「Scheduler::CheckInvoke()」を用いて、Delayed Queuing機構を開始するスレッドを変更することで行う。
【０１２６】
このような待ち行列変更フラグを用いて行われる非同期スケジューラ呼び出し機構について、mCOOPメタスペース上で動作するオブジェクトＡがmDriveメタスペース上で動作するオブジェクトＣへメッセージを送信する場合を例に挙げて説明する。なお、ここでは、スケジューラを全メタスペースで共有するものとする。すなわち、どのメタスペースにおいても、共通のオブジェクト「Scheduler」がスケジュール管理を担うものとする。
【０１２７】
また、このときの手順を図１０及び図１１に示す。図１０は、図３や図５と同様に、オブジェクトＡからオブジェクトＣへメッセージを送信する際の手順をオペレーティングシステムの階層構造とともに示した図である。また、図１１は、図４や図６と同様に、オブジェクトＡからオブジェクトＣへメッセージを送信する際の各オブジェクト間のやり取りをタイムチャートとして示した図である。
【０１２８】
このときの手順は以下の通りである。
【０１２９】
（１）meta-call to mCOOPMailer
先ず、オブジェクトＡが、mCOOPメタスペースのオブジェクト「mCOOPMailer」をメタコールによって呼び出す。すなわち、オブジェクトＡからオブジェクトＣへメッセージを送信するために、先ず、mCOOPメタスペース上で動作するオブジェクトによるメッセージ通信を担うメタオブジェクトであるオブジェクト「mCOOPMailer」を呼び出す。
【０１３０】
このときは、矢印Ｃ１に示すように、オブジェクトＡからのメタコールによって、オブジェクト「mCOOPMailer」を直接呼び出す。すなわち、オブジェクトＡからオブジェクト「mCOOPMailer」への実行遷移には逐次性があるので、オブジェクト「Scheduler」を呼び出してスケジュール管理を行わせるようなことなく、オブジェクト「mCOOPMailer」を直接呼び出す。
【０１３１】
（２）send to mDriveMailer
次に、オブジェクト「mCOOPMailer」は、メッセージ送信先のオブジェクトＣがmDriveメタスペース上にあるため、オブジェクトＣへのメッセージ送信を要求するメッセージを、mDriveメタスペース上で動作するオブジェクトによるメッセージ通信を担うメタオブジェクトであるオブジェクト「mDriveMailer」に送信する。
【０１３２】
このときは、具体的には、先ず、オブジェクト「mCOOPMailer」からオブジェクト「mDriveMailer」へのメッセージ送信を行うために、矢印Ｃ２に示すように、mCoreメタスペース上で動作するオブジェクト間のメッセージ通信を担うメタオブジェクトであるオブジェクト「mCoreMailer」を呼び出す。次に、矢印Ｃ３に示すようにオブジェクト「mDriveMailer」を直接呼び出す。ここで、オブジェクト「mCOOPMailer」からオブジェクト「mDriveMailer」への実行遷移には逐次性があるので、オブジェクト「Scheduler」を呼び出してスケジュール管理を行わせるようなことなく、オブジェクト「mDriveMailer」を直接呼び出す。すなわち、ここでのオブジェクト「mCOOPMailer」からオブジェクト「mDriveMailer」へのメッセージ送信は、FastSendによって行われる。
【０１３３】
（３）send to Scheduler
次に、オブジェクト「mDriveMailer」は、オブジェクトＣを起こすために、オブジェクト「Scheduler」にメッセージを送信する。すなわち、オブジェクトＣを起こすためにはスケジュール管理を行う必要があり、そのために、スケジュール管理を担うメタオブジェクトであるオブジェクト「Scheduler」に、オブジェクトＣを起こすのに必要なメッセージを送信する。
【０１３４】
このときは、具体的には、先ず、オブジェクト「mDriveMailer」からオブジェクト「Scheduler」へのメッセージ送信を行うために、矢印Ｃ４に示すように、mCoreメタスペース上で動作するオブジェクト間のメッセージ通信を担うメタオブジェクトであるオブジェクト「mCoreMailer」を呼び出す。次に、矢印Ｃ５に示すようにオブジェクト「Scheduler」を直接呼び出して、このオブジェクト「Scheduler」へオブジェクトＣを起こすのに必要なメッセージを送信する。ここで、オブジェクト「mCOOPMailer」からオブジェクト「Scheduler」への実行遷移には逐次性があるので、スケジューリングを行うことなく、オブジェクト「Scheduler」を直接呼び出す。すなわち、ここでのオブジェクト「mDriveMailer」からオブジェクト「Scheduler」へのメッセージ送信は、FastSendによって行われる。
【０１３５】
（４）update scheduling queue
次に、オブジェクト「Scheduler」は、上述のように受け取ったメッセージに基づいてオブジェクトＣの状態を変更するとともに、Delayed Queuing機構によって待ち行列を変更する。
【０１３６】
ここで、オブジェクト「Scheduler」は、オブジェクトＣの状態を変更するために呼び起こされたものであり、mDriveメタスペースのメタオブジェクトとして動作している。そこで、このとき、オブジェクト「Scheduler」は、mDriveメタスペース上で動作するオブジェクトの実行を再開するコンテキストスイッチ、又は、mDriveメタスペースと同一階層のメタスペースであるmCOOPメタスペース上で動作するオブジェクトの実行を再開するコンテキストスイッチを起こすスレッドに対して、待ち行列変更フラグを設定する。具体的には、オブジェクト「Scheduler」は、オブジェクト「mCOOPMailer」のスレッドに対して、待ち行列変更フラグを設定する。
【０１３７】
これは、具体的には、メソッド「Scheduler::CheckInvoke()」のアルゴリズムを用い、オブジェクト「Scheduler」→オブジェクト「mCoreMailer(1)」→オブジェクト「mDriveMailer」→オブジェクト「mCoreMailer(2)」→オブジェクト「mCOOPMailer」→オブジェクトＡというように、オブジェクト間の遷移を辿ってから、オブジェクト「mCoreMailer(2)」を起点にしてDelayed Queuing機構を実行することで実現される。なお、オブジェクト「mCoreMailer(1)」及びオブジェクト「mCoreMailer(2)」は、同じオブジェクト「mCoreMailer」であるが、呼び出されたタイミングの違いを示すために、(1)(2)を付記している。
【０１３８】
（５）reply to mDriveMailer
次に、オブジェクト「Scheduler」は、FastSendによってオブジェクト「mDriveMailer」から受け取ったメッセージに対する返答をオブジェクト「mDriveMailer」へ送信する。このときは、具体的には、先ず、オブジェクト「Scheduler」からオブジェクト「mDriveMailer」へ返答を送信するために、矢印Ｃ６に示すように、mCoreメタスペース上で動作するオブジェクト間のメッセージ通信を担うメタオブジェクトであるオブジェクト「mCoreMailer」を呼び出す。次に、矢印Ｃ７に示すようにオブジェクト「mDriveMailer」を直接呼び出して、このオブジェクト「mDriveMailer」へオブジェクト「Scheduler」からの返答を送信する。ここで、オブジェクト「Scheduler」からオブジェクト「mDriveMailer」への実行遷移には逐次性があるので、スケジューリングを行うことなく、オブジェクト「mDriveMailer」への返答を送信する。そして、これにより、オブジェクト「mDriveMailer」の実行が再開される。
【０１３９】
（６）reply to mCOOPMailer
次に、オブジェクト「mDriveMailer」は、FastSendによってオブジェクト「mCOOPMailer」から受け取ったメッセージに対する返答をオブジェクト「mCOOPMailer」へ送信する。このときは、具体的には、先ず、オブジェクト「mDriveMailer」からオブジェクト「mCOOPMailer」へ返答を送信するために、矢印Ｃ８に示すように、mCoreメタスペース上で動作するオブジェクト間のメッセージ通信を担うメタオブジェクトであるオブジェクト「mCoreMailer」を呼び出す。次に、矢印Ｃ９に示すようにオブジェクト「mCOOPMailer」を直接呼び出して、このオブジェクト「mCOOPMailer」へオブジェクト「mDriveMailer」からの返答を送信する。ここで、オブジェクト「mDriveMailer」からオブジェクト「mCOOPMailer」への実行遷移には逐次性があるので、スケジューリングを行うことなく、オブジェクト「mCOOPMailer」への返答を送信する。そして、これにより、オブジェクト「mCOOPMailer」の実行が再開される。
【０１４０】
（７）resume base object
その後、オブジェクト「mCOOPMailer」による処理が終了したら、オブジェクトＡを再開させるために、オブジェクトＡのスレッドへのコンテキストスイッチの処理を行う。しかしながら、このコンテキストスイッチにおけるソーススレッドであるオブジェクト「mCOOPMailer」のスレッドには、待ち行列変更フラグが設定されている。そこで、オブジェクトＡのスレッドへコンテキストスイッチするのではなく、非同期スケジューラ呼び出し機構を動作させる。すなわち、オブジェクトＡを再開させるのではなく、矢印Ｃ１０に示すように、オブジェクト「Scheduler」を呼び出す。
【０１４１】
（８）reschedule
そして、オブジェクト「Scheduler」によって再スケジューリングを行う。ここでは、この再スケジューリングにより、オブジェクトＡよりもオブジェクトＣを先に実行するように、待ち行列のスケジュールが変更されたとする。そして、オブジェクト「Scheduler」によって再スケジューリングを行った後、この再スケジューリングにより、次に実行するオブジェクトとして設定されたオブジェクトＣを、矢印Ｃ１１に示すように呼び出して実行する。
【０１４２】
以上のように、非同期スケジューラ呼び出し機構を採用して、オブジェクトＡからオブジェクトＣへのメッセージの送信を行うことにより、スケジューラ（すなわちオブジェクト「Scheduler」）の呼び出しの回数が削減される。すなわち、上記の例では、mCOOPメタスペースやmDriveメタスペース上で動作するオブジェクトのスケジューリングを遅らせ、オブジェクトＡのスレッドを再開させようとするコンテキストスイッチが生じたときに、非同期的にスケジューラを呼び出すようにしており、これにより、FastSendに対する返答のためのコンテキストスイッチを行う毎にスケジューラを呼び出すような場合に比べて、スケジューラの呼び出し回数が２回少なくなっている。
【０１４３】
なお、上記の例において、スケジューラによって管理される待ち行列は、mCOOPメタスペースやmDriveメタスペース上で動作するオブジェクトに関して変更しているだけで、この変更は、mCoreメタスペース上で動作するオブジェクトに対しては影響しない。したがって、mCOOPメタスペースやmDriveメタスペース上で動作するオブジェクトのスケジューリングを遅らせて、スケジューラの呼び出し回数を削減したとしても、システムの動作に影響を与えることはない。
【０１４４】
【発明の効果】
以上の説明から明らかなように、本発明によれば、スケジューラの呼び出しを最小限に押さえて、且つ、システム全体を正しく動作させることが可能となる。したがって、本発明によれば、ナノカーネルを採用しつつ、システム全体の性能向上を図ることが可能となる。
【図面の簡単な説明】
【図１】本発明を適用したテレビ装置の一例について、その概略構成を示す図である。
【図２】本発明を適用したオペレーティングシステムの階層構造を示す図である。
【図３】従来のスケジューリング管理機構を説明するための図であり、オブジェクトＡからオブジェクトＢへメッセージを送信する際の手順をオペレーティングシステムの階層構造とともに示した図である。
【図４】従来のスケジューリング管理機構を説明するための図であり、オブジェクトＡからオブジェクトＢへメッセージを送信する際の各オブジェクト間のやり取りをタイムチャートとして示した図である。
【図５】本発明を適用したスケジューリング管理機構を説明するための図であり、オブジェクトＡからオブジェクトＢへメッセージを送信する際の手順をオペレーティングシステムの階層構造とともに示した図である。
【図６】本発明を適用したスケジューリング管理機構を説明するための図であり、オブジェクトＡからオブジェクトＢへメッセージを送信する際の各オブジェクト間のやり取りをタイムチャートとして示した図である。
【図７】スレッドの状態遷移を示す図である。
【図８】  Delayed Queuing機構のアルゴリズムを説明するためのフローチャートである。
【図９】  Delayed Queuing機構におけるcurrentThread設定のアルゴリズムを説明するためのフローチャートである。
【図１０】非同期スケジューラ呼び出し機構を用いて、オブジェクトＡからオブジェクトＣへメッセージを送信する際の手順をオペレーティングシステムの階層構造とともに示した図である。
【図１１】非同期スケジューラ呼び出し機構を用いて、オブジェクトＡからオブジェクトＣへメッセージを送信する際の各オブジェクト間のやり取りをタイムチャートとして示した図である。
【図１２】ファットカーネルを採用したオペレーティングシステムを示す図である。
【図１３】マイクロカーネルを採用したオペレーティングシステムを示す図である。
【図１４】ナノカーネルを採用したオペレーティングシステムを示す図である。
【符号の説明】
１  バス／ＩＯブリッジ、  ２  バス、  ３  テレビ機能部、  ４  バス／メモリブリッジ、  ５  プロセッサ、  ６  ＲＯＭ、  ７  ＲＡＭ、  ８  操作パネル、  ９  外部記憶装置、  １０  通信装置
【図１】
0003823475.tif 000003
【図２】
0003823475.tif 000004
【図３】
0003823475.tif 000005
【図４】
0003823475.tif 000006
【図５】
0003823475.tif 000007
【図６】
0003823475.tif 000008
【図７】
0003823475.tif 000009
【図８】
0003823475.tif 000010
【図９】
0003823475.tif 000011
【図１０】
0003823475.tif 000012
【図１１】
0003823475.tif 000013
【図１２】
0003823475.tif 000014
【図１３】
0003823475.tif 000015
【図１４】
0003823475.tif 000016