(57)【特許請求の範囲】
【請求項１】
スレッドがスリープする際に当該スレッドに係る情報を表現するパターン、スレッドを実行する際のスタックポインタ及びスレッドのコンテクストを格納する格納領域と、スタック領域とをスレッド毎に生成し、
上記スレッドを当該スレッドのスタック領域を用いて並行実行し、スリープ状態のスレッドを起床させる実行コードを実行する際、当該実行コードの関数の引数のパターンとスリープ状態のスレッドの格納領域に格納されたパターンとを照合し、当該パターンが一致した場合、当該パターンが格納領域に格納されたスリープ状態のスレッドを起床させ、スレッド間の同期を取る
ことを特徴とする情報処理方法。
【請求項２】
上記パターンは整数型の語長からなり、このパターンのビット情報により照合を行うことを特徴とする請求項１記載の情報処理方法。
【請求項３】
上記スレッド間の同期は、１対１のみならず１対多のスレッド間にて取ることを特徴とする請求項１記載の情報処理方法。
【請求項４】
スレッドがスリープする際に当該スレッドに係る情報を表現するパターン、スレッドを実行する際のスタックポインタ及びスレッドのコンテクストを格納する格納領域と、スタック領域とをスレッド毎に生成し、
上記スレッドを当該スレッドのスタック領域を用いて並行実行し、スリープ状態のスレッドを起床させる実行コードを実行する際、当該実行コードの関数の引数のパターンとスリープ状態のスレッドの格納領域に格納されたパターンとを照合し、当該パターンが一致した場合、当該パターンが格納領域に格納されたスリープ状態のスレッドを起床させ、スレッド間の同期を取るオペレーティングシステムのプログラムが記録されたこと
を特徴とする記録媒体。
【請求項５】
上記パターンは整数型の語長からなり、このパターンのビット情報により照合を行うことを特徴とする請求項４記載の記録媒体。
【請求項６】
上記スレッド間の同期は１対１のみならず１対多のスレッド間にて取ることを特徴とする請求項４記載の記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
この発明は、カーネルスレッドにて並列処理を行うオペレーティングシステムを用いる情報処理方法並びにこのオペレーティングシステムのプログラムが記録された記録媒体に関する。
【０００２】
【従来の技術】
従来、マルチタスクの基本ソフトウェアであるオペレーティングシステム（Operating System; OS）上においては、処理の単位であるタスクを見かけ上並行して実行する並列処理が行われている。たとえば、クライアントサーバ型のマルチタスクＯＳであるＵＮＩＸ（ＵＮＩＸはＡＴ＆Ｔの商標）の処理実行単位はプロセスであるが、一のプロセスの実行中にコマンド“ｆｏｒｋ”により他のプロセスを生成して複数のプロセスを並列に処理することができる。
【０００３】
このように、タスクレベルで並行して処理をするために親プロセスから子プロセスを生成すると、子プロセスの起動／終了にオーバヘッドを要し、また、親プロセスと子プロセス間でメモリの共有がそのままではできないというデメリットがある。
【０００４】
一方、プロセスより軽いＣＰＵ割り当ての単位であるスレッド（thread）を単位として並列処理が行われることがある。このスレッドは、プロセス中に複数存在することができる。さらに、複数のスレッドを起動して単一プロセスの中にアドレス領域を共有させ、かつパフォーマンスを向上させるようないわゆるマルチスレッドが利用されている。
【０００５】
【発明が解決しようとする課題】
ところで、ＯＳ上における同期化は、アプリケーションであるタスクレベルで実現されている。このため、タスクレベルでの同期化により、上述のデメリットを招来することになる。
【０００６】
すなわち、同期化がタスクとして実装された場合には、タスク切り換えに伴うカーネルのスケジューラの起動とコンテクストの切り換えが頻繁に発生し、実行効率の低下を招くことになる。
【０００７】
一方、通常のカーネルスレッドとしての処理を実装した場合には、条件付きスレッドのイベント起床や、マルチキャストに代表されるような１対多のような同期関係を実現することができない。
【０００８】
この発明は、上述の実情に鑑みてなされるものであって、スレッド間で同期関係を取り、条件付きの起床や、１対多の通信をすることができるような情報処理方法及び記録媒体を提供することを目的とする。
【０００９】
【課題を解決するための手段】
上述の課題を解決するために、この発明に係る情報処理方法は、スレッドがスリープする際に当該スレッドに係る情報を表現するパターン、スレッドを実行する際のスタックポインタ及びスレッドのコンテクストを格納する格納領域と、スタック領域とをスレッド毎に生成し、上記スレッドを当該スレッドのスタック領域を用いて並行実行し、スリープ状態のスレッドを起床させる実行コードを実行する際、当該実行コードの関数の引数のパターンとスリープ状態のスレッドの格納領域に格納されたパターンとを照合し、当該パターンが一致した場合、当該パターンが格納領域に格納されたスリープ状態のスレッドを起床させ、スレッド間の同期を取るものである。
【００１０】
また、この発明に係る記録媒体は、スレッドがスリープする際に当該スレッドに係る情報を表現するパターン、スレッドを実行する際のスタックポインタ及びスレッドのコンテクストを格納する格納領域と、スタック領域とをスレッド毎に生成し、上記スレッドを当該スレッドのスタック領域を用いて並行実行し、スリープ状態のスレッドを起床させる実行コードを実行する際、当該実行コードの関数の引数のパターンとスリープ状態のスレッドの格納領域に格納されたパターンとを照合し、当該パターンが一致した場合、当該パターンが格納領域に格納されたスリープ状態のスレッドを起床させ、スレッド間の同期を取るオペレーティングシステムのプログラムが記録されたものである。
【００１１】
【発明の実施の形態】
以下、この発明に係る情報処理方法及び記録媒体について、図面を参照して説明する。
【００１２】
ここでは、情報処理方法及び記録媒体の実施の形態として、カーネルスレッド（kernel thread ）Ａ、カーネルスレッドＢ及びカーネルスレッドＣを例に取り、これらのカーネルスレッド間での同期方式について説明する。
【００１３】
ここで、カーネル（kernel）とはオペレーティングシステム（operating system; OS）の中核部分である。スレッド（thread）とはプロセスよりも軽い処理実行単位である。
【００１４】
まず、カーネルスレッド間の相互の関係について、図１を参照して説明する。図は、カーネルスレッドＡ及びカーネルスレッドＣの２つのカーネルスレッドが並行して実行されている状態を示している。
【００１５】
カーネルスレッドＡにおいて、パターンＰＡを引数としたイベント待ちインターフェース関数“drv_sleep() ”が実行されると、このカーネルスレッドＡはイベント待ちのためにスリープする。スリープとは、イベント待ちのために実行を一時的に中断し、再実行を待つ状態である。
【００１６】
ここで、スレッドを特定するためにパターンが利用されている。パターンとは整数型の語長を持ち、ビット位置によりスレッドの識別を行うものである。
【００１７】
一方、カーネルスレッドＣにおいて、パターンＰＣを引数とするイベント起床関数“drv_wakeup()”が実行されると、カーネルスレッドＣがイベント起床を行う。起床とは、スリープ状態にあったスレッドが、イベントが発生したために実行を再開することである。
【００１８】
なお、パターンＰＡがパターンＰＣに一致する場合には、スリープしているカーネルスレッドＡを再実行させる。
【００１９】
次に、カーネルスレッドのデータ構造について、図２を参照して説明する。
カーネルスレッドＡのデータ構造１０は、図中のＡに示すように、スレッドＡがスリープするときにパターンを格納するエリア１１、スレッドＡを実行する際のスタックポインタを格納するエリア１２、レジスタを格納するコンテクスト（context ）のエリア１３を備えている。
【００２０】
カーネルスレッドＢのデータ構造２０は、カーネルスレッドＡのデータ構造と同様に、図中のＢに示すように、パターンを格納するエリア２１、スレッドＢを実行する際のスタックポインタを格納するエリア２２、コンテクストのエリア２３を備えている。
【００２１】
カーネルスレッドＣのデータ構造３０は、カーネルスレッドＡ及びカーネルスレッドＢのデータ構造と同様に、図中のＣに示すように、パターンを格納するエリア３１、スレッドＣを実行する際のスタックポインタを格納するエリア３２、コンテクストエリア３３を備えている。
【００２２】
次に、スタックのデータ構造について、図３を参照して説明する。
カーネルの管理するスタック４０は、カーネルのスケジューラが使用するスタック４１、カーネルスレッドＡが使用するスタック４２、カーネルスレッドＢが使用するスタック４３、カーネルスレッドＣが使用するスタック４４を備えている。
【００２３】
次に、カーネルスレッドの実行コードについて、図４を参照して説明する。
図中のＡには、カーネルスレッドＡの実行コード５０として、イベント待ちインターフェース関数“drv_sleep()”前の実行コード５１、イベント待ちインターフェース関数“drv_sleep()”５２、イベント待ちインターフェース関数“drv_sleep()”後の実行コード５３が示されている。
【００２４】
図中のＢには、カーネルスレッドＢの実行コード６０として、イベント待ちインターフェース関数“drv_sleep()”前の実行コード６１、イベント待ちインターフェース関数“drv_sleep()”６２、イベント待ちインターフェース関数“drv_sleep()”後の実行コード６３が示されている。
【００２５】
図中のＣには、カーネルスレッドＣの実行コード７０として、イベント待ちインターフェース関数“drv_sleep()”前の実行コード７１、イベント待ちインターフェース関数“drv_sleep()”７２、イベント待ちインターフェース関数“drv_sleep()”後の実行コード７３が示されている。
【００２６】
これらの実行コードにおいては、実行コードは図中の上方から下方に矢印の方向に順に実行され、イベント待ちインターフェース関数“drv_sleep() ”に達すると、パターンが一致するカーネルスレッドがイベント待ちのためにスリープする。
【００２７】
次に、イベント待ちのためにスリープしたカーネルスレッドを起床させる際にスレッドの指定がある場合の一連の工程を、図５に示すフローチャートを参照して説明する。
【００２８】
最初のステップＳ１１においては、図４中のＡに示したスレッドＡの実行コードの内で、パターンＰＡを引数とするイベント待ちインターフェース関数“drv_slreep(・・・PA)”５２前の実行コード５１の実行に引き続き、このイベント待ちインターフェース関数“drv_sleep(・・・PA)”を実行する。そして、次のステップＳ１２に進む。
【００２９】
ステップＳ１２においては上記図２中のＡに示したカーネルスレッドＡのデータ構造を用い、カーネルスレッドＡのスタックポインタをエリア１２に、レジスタ含むコンテクストをエリア１３に、パターンＰＡをエリア１１にそれぞれ保存する。そして、これに続くステップＳ１３においては、カーネルスレッドＡはイベント待ちのためにスリープし、カーネルの実行はカーネルスレッドＣに移る。そして、次のステップＳ１４に進む。
【００３０】
ステップＳ１４においては、上記図４中のＣに示したカーネルスレッドＣの実行コード７０において、パターンＰＣを引数にするイベント起床インターフェース関数“drv_wakeup(・・・PC)”７２の前のコード７１の実行に引き続き、イベント起床関数“drv_wakeup(・・・PC)”７２を、起床させる対象がカーネルスレッドＡと指定して実行する。そして、これに続くステップＳ１５に進む。
【００３１】
ステップＳ１５においては、カーネルスレッドＡがイベント待ちのためにスリープしているかどうかを確認し、カーネルスレッドＡがスリープしていれば上記図２中のＡに示したカーネルスレッドＡに用いるデータ構造のエリア１１に格納されているパターンＰＡとパターンＰＣを比較する。そして、パターンＰＡとパターンＰＣが一致する場合にはカーネルスレッドＡをイベント起床させて“ＹＥＳ”としてステップＳ１６に進む。一致しない場合には“ＮＯ”としてこの一連の工程を終了する。
【００３２】
ステップＳ１６においては、カーネルスレッドＡ用のデータ構造において、カーネルは、コンテクストをエリア１３から、スタックポインタをエリア１２からそれぞれ読み出す。そして、次のステップＳ１７に進む。
【００３３】
ステップＳ１７においては、カーネルスレッドＡは、上記図４中のＡに示したカーネルスレッドＡの実行コード５０において、イベント起床インターフェース関数“drv_wakeup(・・・PA) ”５２後の実行コード５３の実行を再開する。そして、この一連の工程を終了する。
【００３４】
このように、引数にてパターンを指定してイベント待ちインターフェース関数“drv_sleep()”及びイベント起床インターフェース関数“drv_wakeup() ”を実行することにより、パターンが一致するスレッドのスリープ及び起床の同期を制御することができる。
【００３５】
次に、スリープしたスレッドを起床させる際にスレッドの指定が複数にわたる場合について、図６に示すフローチャートを参照して説明する。
【００３６】
最初のステップＳ２１においては、カーネルスレッドＡは、上記図４中のＡに示したカーネルスレッドＡの実行コード５０において、引数としてパターンＰＡを有するイベント待ちインターフェース関数“drv_sleep(・・・PA)”５２前の実行コード５１の実行に引き続き、このイベント待ちインターフェース関数“drv_sleep(・・・PA)”関数５２を実行する。そして次のステップＳ２２に進む。
【００３７】
ステップＳ２２においては、上記図１中のＡに示したカーネルスレッドＡに用いるデータ構造において、スタックポインタをエリア１２に、コンテクストをエリア１３に、パターンＰＡをエリア１１にそれぞれ書き込む。そして、これに続くステップＳ２３においては、カーネルスレッドＡはイベント待ちのためにスリープし、カーネル実行はカーネルスレッドＢに移る。そして、ステップＳ２４に進む。
【００３８】
ステップＳ２４においては、カーネルスレッドＢは、上記図４中のＢに示したカーネルスレッドＢの実行コード６０において、引数としてパターンＰＢを有するイベント待ちインターフェース関数“drv_sleep(・・・PB)”６２前の実行コード部分６１の実行に引き続き、このイベント待ちインターフェース関数“drv_sleep(・・・PB)”６２をで実行する。そして、次のステップＳ２５に進む。
【００３９】
ステップＳ２５においては、上記図２中のＢに示したカーネルスレッドＢに用いるデータ構造において、カーネルスレッドＢのスタックポインタをエリア２２に、コンテクストをエリア２３に、パターンＰＢをエリア２１にそれぞれ書き込んで保存する。これに続くステップＳ２６においては、カーネルスレッドＢはイベント待ちのためにスリープし、カーネル実行はカーネルスレッドＣに移る。そして、次のステップＳ２７に進む。
【００４０】
ステップＳ２７においては、カーネルスレッドＣが、上記図４中のＣに示したカーネルスレッドＣ用の実行コード７０において、引数としてパターンＰＣを有するイベント起床インターフェース関数“drv_wakeup(・・・PC) ”７２前の実行コード７１の実行に引き続き、イベント起床インターフェース関数“drv_wakeup(・・・PC) ”７２を実行する。この際、イベント起床させる対象としてカーネルスレッドＡ及びカーネルスレッドＢを指定する。そして、次のステップＳ２８に進む。
【００４１】
ステップＳ２８においては、カーネルスレッドＡがスリープしているかどうかを検査し、スリープしていれば上記図２中のＡに示したカーネルスレッドＡに用いるデータ構造１０のエリア１１に格納されているパターンＰＡ及びパターンＰＣを比較する。そして、パターンＰＡとパターンＰＣが同一であればカーネルスレッドＡを起床させて“ＹＥＳ”としてステップＳ２９に進み、同一でない場合には“ＮＯ”としてこの一連の工程を終了する。
【００４２】
ステップＳ２９においては、スレッドＢがスリープしているかどうかを検査し、スリープしていれば、上記図２中のＢに示したカーネルスレッドＢのデータ構造におけるエリア２１に格納されているパターンＰＢとパターンＰＣを比較する。もし、ＰＢとＰＣが同一であればスレッドＢを起床させる。以下、パターンＰＡ、パターンＰＢ及びパターンＰＣが同一の場合を想定する。
【００４３】
そして、カーネルが、上記図２中のＡにおいて、コンテクストをエリア１３から、スタックポインタをエリア１２から戻す。その後、これに続くステップＳ３０に進む。
【００４４】
ステップＳ３０においては、カーネルスレッドＡが、上記図４中のＡに示したカーネルスレッドＡの実行コード５０におけるイベント待ちインターフェース関数“drv_sleep(・・・PA)”５２に続く実行コード５３の実行を再開する。また、同図中のＢに示したカーネルスレッドＢの実行コード６０において、カーネルスレッドＢが再度スリープ後、カーネルは上記図２中のＢに示したカーネルスレッドＢのデータ構造において、コンテクストをエリア２３から、スタックポインタをエリア２２からそれぞれ戻す。そして、次のステップＳ３０に進む。
【００４５】
ステップＳ３０においては、カーネルスレッドＢは、上記図４中のＢに示したカーネルスレッドＢの実行コード６０において、イベント起床インターフェース関数“drv_wakeup(・・・PC)”６２に続く実行コード６３の実行を再開する。そして、この一連の工程を終了する。
【００４６】
このように、イベントフラグに類似するパターン照合により、複数のカーネルスレッドに対して１対多の同期を取ることができ、マルチキャストを行うことができる。
【００４７】
次に、上述のインターフェース関数を用いて記述したマクロの具体例について、図７を参照して説明する。
【００４８】
この具体例においては、カーネルスレッドＡの実行コード中のマクロ“WAITFOR”に含まれるイベント待ちインターフェース関数“drv_sleep()”を用いてスレッド間の同期を取っている。このマクロ“WAITFOR()”は、括弧内に記述される条件が満足するまで待機するものである。
【００４９】
すなわち、マクロ“WAITFOR()”が条件“condition”、制限時間“timeout ”その他を引数として実行されると、図中“WAITFOR Macro ”に記述されている関数が順に実行される。この“WAITFOR Macro ”の関数“while() ”の実行部分には、制限時間“timeout”及びパターン“pattern”を引数に含むイベント待ちインターフェース関数“drv_sleep(・・・,timeout,pattern)”及び条件付分岐関数“if(timeout occers)”が含まれている。
【００５０】
この“WAITFOR Macro”に含まれる関数は、関数“while()”の括弧内に記述される条件が満たされない限り繰り返し実行される。そして、制限時間“timeout”及びパターン“pattern”を引数としてイベント待ちインターフェース関数“drv_sleep(・・,timeout,pattern) ”が実行されると、引数“pattern”がカーネルスレッドのパターンと一致する場合には、制限時間“timeout ”にわたってイベント待ちのためにスリープする。
【００５１】
また、制限時間“timeout ”を経過すると、条件付分岐関数“if()”における“break ”が実行されて、関数“while() ”から脱出し、このマクロ“WAITFOR()”を終了する。
【００５２】
次に、コンテクストの保存及び復元について、図８を参照して説明する。
図中のＡは、カーネルスタックエリアであり、ローカルスタックポインタ（Local Stack Pointer; LSP）の位置が矢印にて示されている。図中のＢは、カーネルスレッドＡの実行コードであり、イベント待ちインターフェース関数“drv_sleep()”が含まれている。
【００５３】
このカーネルスレッドＡの実行コードの実行がイベント待ちインターフェース関数“drv_sleep() ”に達すると、カーネルスレッドＡのＬＳＰも含むコンテクストが、矢印（ａ）に示すように、図中のＣに示すコンテクストエリアに保存（save）される。
【００５４】
一方、図中のＤに示すカーネルスレッドＢの実行コードの実行がイベント起床インターフェース関数“drv_wakeup()”に達すると、このイベント起床インターフェース関数“drv_wakeup()”の引数のパターンが上記カーネルスレッドＡのパターンと一致する場合には、矢印（ｂ）に示すように、カーネルスレッドＡのコンテクストが復元（restore ）される。そして、矢印（ｃ）に示すように、カーネルスレッドＡは上記イベント待ちインターフェース関数“drv_sleep() ”によりイベント待ちのスリープ状態になって実行が中断された箇所から実行が再開される。
【００５５】
次に、記録媒体について説明する。
この記録媒体には、スレッドが並行して実行されるカーネルを有し、上記スレッド間の同期をパターン照合にて取るオペレーティングシステムのプログラムが記録されている。上記パターンは整数型であり、ビット位置によりスレッドの識別を行う。また、上記スレッド間の同期は１対１のみならず１対多のスレッド間にて取ることができる。
【００５６】
このようなオペレーティングシステムは、たとえばいわゆるＣＤ−ＲＯＭのような媒体に記録されて提供される。また、このオペレーティングシステムは、通信回線等を介して提供されることもある。
【００５７】
上述のように、この発明に係る情報処理方法及び記録媒体においては、イベントフラグに類似するパターン照合にて、１対１の同期のみならず、１対他のスレッド間の同報通信、いわゆるマルチキャストの同期を取るものである。
【００５８】
また、カーネルスレッドのパターンとインターフェース関数の引数のパターンの照合によってスレッドとのインターフェースを取ることにより、要因別のイベント起床をすることが可能となる。このことは、ソースコード上でイベント起床すべき相手が明示されていない場合、たとえば起床すべき相手を特定することができないＡＲＰの応答パケットが到着した場合には有益である。
【００５９】
また、同一のパターンの複数のスレッドがイベント待ちのためにスリープしている場合に、同時にイベント起床させることも可能である。
【００６０】
なお、以上の記述したスレッドのデータ構造およびコードはメモリ中に存在し、操作の実行はＣＰＵが行うものである。
【００６１】
【発明の効果】
この発明に係る情報処理方法及び記録媒体は、スレッド間でパターン照合によって同期を取ることにより実効効率を向上させる。また、タスクベースでの実装が前提となるアプリケーションに対して適用することにより、スレッドベースによる移植をすることができるようになった。
【図面の簡単な説明】
【図１】カーネルスレッドの相関を示す図である。
【図２】カーネルスレッドのデータ構造を示す図である。
【図３】スタックのデータ構造を示す図である。
【図４】スレッドの実行コードを示す図である。
【図５】スリープしたカーネルスレッドを起床させる際に、カーネルスレッドの指定がある場合の一連の工程を示す図である。
【図６】スリープしたカーネルスレッドを起床させる際に、カーネルスレッドの指定が複数にわたる場合の一連の工程を示す図である。
【図７】インターフェース関数の具体例を示す図である。
【図８】コンテクストの保存及び復元の具体例を示す図である。
【符号の説明】
１０  カーネルスレッドＡに用いられるのデータ構造、２０カーネルスレッドＢに用いられるデータ構造、３０  カーネルスレッドＣに用いられるデータ構造、４０  カーネルの管理するデータ構造、５０  カーネルスレッドＡの実行コード、６０  カーネルスレッドＣの実行コード、７０  カーネルスレッドＢの実行コード
【図１】
0003900621.tif 000002
【図２】
0003900621.tif 000003
【図３】
0003900621.tif 000004
【図４】
0003900621.tif 000005
【図５】
0003900621.tif 000006
【図６】
0003900621.tif 000007
【図７】
0003900621.tif 000008
【図８】
0003900621.tif 000009