(57)【要約】【解決手段】コンピューターの動作において、複数のバイトコードまたは翻訳用語命令（少なくともいくつかの翻訳用語命令は複数の機械コード命令を有している）がコンピューターメモリーに記憶される。コンピューターにより行われる各タスクまたはジョブについて、実行コンテキストデータの各仮想スレッドが自動的に生成される。各仮想スレッドは（ａ）各タスクまたはジョブを行うのに際して実行される次の翻訳用語命令の記憶場所、（ｂ）各タスクまたはジョブを行うのに必要とされる局所変数の値を、含んでいる。複数の機械語命令を含んだ少なくともいくつかのタスクまたはジョブは各翻訳用語命令の実行を誘発する。各仮想スレッドの制御の下に各タスクまたはジョブは各タイムスライスまたは処理スロット中で処理されて、異なる仮想スレッド間のコンテキストスイッチにおいて該コンテキストスイッチは、ひとつの翻訳用語命令の現行実行の終了後のみ、開始される。
2004522234.tif 000002
【特許請求の範囲】
【請求項１】
コンピューターのメモリーに複数の翻訳用語命令を記憶し、コンピューターにより行われる複数のタスクまたはジョブのそれぞれについて実行コンテキストデータの各仮想スレッドを自動的に生成し、各仮想スレッドの制御の下に各一連のタイムスライスまたは処理スロット中の各タスクまたはジョブを処理し、異なる仮想スレッド間のコンテキストスイッチにおいて現在実行しているいずれかの翻訳用語命令の完全な実行の後でのみそのようなコンテキストスイッチを開始するステップを有してなり、翻訳用語命令の少なくともいくつかは複数の機械コード命令を有しており、コンテキストデータは（ａ）各タスクまたはジョブを行う際に実行される次のいずれかの翻訳用語命令の記憶場所と、（ｂ）各タスクまたはジョブを実行するのに必要な局所変数の値とを有しており、複数のタスクまたはジョブのそれぞれは複数の機械語命令を含んだ各翻訳用語命令の実行を引き起こすことを特徴とするコンピューターの操作方法。
【請求項２】
仮想スレッドが仮想スレッドの各リンクリストの一部であって、各仮想スレッドがさらに各リンクリスト中の次の仮想スレッドへのポインターを有しており、さらに異なる仮想スレッド間のコンテキストスイッチについて現行実行仮想スレッドのポインターを参照して実行されるべき次の仮想スレッドの識別を決定するステップを有していることを特徴とする請求項１に記載の方法。
【請求項３】
各リンクリストが仮想スレッドの複数のリンクリストのひとつであり、いずれかのリンクリストが休止仮想スレッドのリストであり、他のリンクリストが稼動仮想スレッドのリストであり、さらに他のリンクリストが待機列中に入っている仮想スレッドのリストであり、さらに少なくとも１個の仮想スレッドを待機列中に入っている仮想スレッドのリストから稼動仮想スレッドのリストに周期的に動かすステップを有していることを特徴とする請求項２に記載の方法。
【請求項４】
待機列中に入っている仮想スレッドのリストから稼動仮想スレッドのリストへ仮想スレッドを動かすに際して、ミューテックスをセットして待機列中に入っている仮想スレッドのリストをロックし、続いて（ｉ）動かされた仮想スレッド中、（ｉｉ）当初から稼動仮想スレッドのリスト中にある少なくとも１個の仮想スレッド中、および（ｉｉｉ）待機列中に入っている仮想スレッドのリスト中に残っている少なくとも１個の仮想スレッド中のポインターを変更し、その後ミューテックスをリセットまたはリリースして待機列中に入っている仮想スレッドのリストへのアクセスを可能とすることを特徴とする請求項３に記載の方法。
【請求項５】
各仮想スレッドがさらにミューテックスを有しており、さらに選択された１個の仮想スレッドのミューテックスをセットし、続いて選択された１個の仮想スレッド中のデータを変更し、その後ミューテックスをリセットまたはリリースして選択された１個の仮想スレッドへのアクセスを可能とするステップを有していることを特徴とする請求項１に記載の方法。
【請求項６】
選択された１個の仮想スレッドのミューテックスのセットと、データの変更と、選択された１個の仮想スレッドのミューテックスのリセットまたはリリースとがさらに他の仮想スレッドからのメッセージに反応して行われることを特徴とする請求項５に記載の方法。
【請求項７】
各仮想スレッドが仮想スレッドの各リンクリストの一部であり、各仮想スレッドがさらに各リンクリスト中の次の仮想スレッドへのポインターを有しており、データを変更するに際して選択された１個の仮想スレッドのポインターを変更することを特徴とする請求項５に記載の方法。
【請求項８】
各仮想スレッドがメッセージ列を割り当てられ、さらに他の１個の仮想スレッドに続いて、タスクまたはジョブの実行中に選択された１個の仮想スレッドのメッセージ列中にメッセージを入れるステップを有していることを特徴とする請求項１に記載の方法。
【請求項９】
選択された１個の仮想スレッドと他の仮想スレッドとが異なるアプリケーションプログラムから引き出された各タスクまたはジョブに対応し、選択された１個の仮想スレッドのメッセージ列中のメッセージが異なるアプリケーションプログラム間のデータ移送を実行することを特徴とする請求項８に記載の方法。
【請求項１０】
選択された１個の仮想スレッドと他の仮想スレッドとが異なるコンピューター上のプロキシまたはインターフェイススレッドであり、メッセージ列へメッセージを入れるに際して、コンピューター間の通信リンク上でメッセージを送信することを特徴とする請求項８に記載の方法。
【請求項１１】
各タイムスライスまたは処理スロットにおけるタスクまたはジョブの処理およびコンテキストスイッチの開始が全て翻訳プログラムでのコンピューターの操作を含んでいることを特徴とする請求項１に記載の方法。
【請求項１２】
さらにコンピューター上でネイティブスレッドに対応する翻訳プログラムの複数のインスタンスをランさせ、各ネイティブスレッド、実行コンテキストデータの仮想スレッドの各セットを生成し、各仮想スレッドの制御の下に各タイムスライスまたは処理スロット中の複数のタスクまたはジョブを処理し、異なる仮想スレッド間の各コンテキストスイッチにおいて現在実行中の翻訳用語命令の完全な実行の後でのみそのようなコンテキストスイッチを開始するステップを有していることを特徴とする請求項１１に記載の方法。
【請求項１３】
さらに平均より重いロードを有した第１のネイティブスレッドから平均より軽いロードを有した第２のネイティブスレッドへ仮想スレッドを移すステップを有していることを特徴とする請求項１２に記載の方法。
【請求項１４】
仮想スレッドを移すに際して、ネイティブスレッドについてスレッドロード値を合計してスレッドの数により割り算して全てのネイティブスレッドに亘って平均ロードを決定し、各ネイティブスレッドについて各スレッドロード値を平均ロードと比較して相対ロードを決定することを特徴とする請求項１３に記載の方法。
【請求項１５】
仮想スレッドが他のコンピューター上の第２のプロキシスレッドとコンピューターネットワークリンクを介して通信するための第１のプロキシスレッドを有しており、他のコンピューターとの通信処理に際して第１のプロキシスレッドの制御の下に標準ネットワークプロトコルを使用することを特徴とする請求項１に記載の方法。
【請求項１６】
第１のプロキシスレッドを含んだ各仮想スレッドがそれぞれのメッセージ列を割り当てられ、さらに第１のプロキシスレッドのメッセージ列中にメッセージを入れて、コンピューターネットワークリンクを介しての他のコンピューターへのデータ移送を実行することを特徴とする請求項１５に記載の方法。
【請求項１７】
選択された１個の仮想スレッドが休止状態であって、さらにコンピューター外のソースからの入力に反応してメッセージを発生し、選択された１個の仮想スレッドについてメッセージ列に該メッセージを入れ、選択された１個の仮想スレッドを休止状態から稼動状態に変え、メッセージの挿入と状態の変更の後、該メッセージ列にアクセスして、選択された１個の仮想スレッドに割り当てられたタイムスライスまたは処理スロット中にメッセージを得ることを特徴とする請求項１に記載の方法。
【請求項１８】
各仮想スレッドがスレッド優先順位を有しており、さらに複数の仮想スレッド中のスレッド優先順位を自動的に参照して相対優先順位を決定し、決定された相対優先順位に応じてスレッドの順位を変えることを特徴とする請求項１に記載の方法。
【請求項１９】
各仮想スレッドの制御の下に各タイムスライスまたは処理スロット中で処理されるタスクまたはジョブが、コンピューターディスプレー上の各仮想スレッドに割り当てられた別個のタスクまたはジョブを構成するオブジェクトイメージを制御し、コンピューターキーボード上の各仮想スレッドに割り当てられた別個のタスクまたはジョブを構成するキーをモニターすることを特徴とする請求項１に記載の方法。
【請求項２０】
タイムスロットまたは処理スロットが連続して実行される翻訳用語命令を計数することにより測定され、さらに各複数のタイムスライスまたは処理スロットについて所定数の連続実行翻訳用語命令を計数したら各タイムスロットまたは処理スロットを終了させることを特徴とする請求項１に記載の方法。
【請求項２１】
メモリーと、ディスプレーと、入力周辺機器と、メモリーに動作上接続された少なくとも１個のプロセッサーとを有してなり、該ディスプレーと入力周辺機器とプロセッサーとが、オペレーターが入れたソースコード命令をバイトコードまたは翻訳用語命令に変更するコンパイラーと、バイトコードまたは翻訳用語命令を実行するインタープリターとを有しており、上記コンパイラーはメモリーに動作上接続されてその中へのバイトコードまたは翻訳用語命令の記憶を可能ならしめ、上記メモリーは休止仮想スレッドの第１のリンクリストと稼動仮想スレッドの第２のリンクリストと待機列中に入っているまたは待機している仮想スレッドの第３のリンクリストとを記憶し、各スレッドはコンテキストまたは状態データとミューテックスと各リスト中の次のスレッドへのポインターとを有しており、インタープリターは入力周辺機器に動作上接続されて入力周辺機器により発生されるイベントを認識し、インタープリターは動作上メモリーに接続されて、（ａ）少なくとも１個の休止仮想スレッドを第１のリンクリストから第３のリンクリストへと移し、（ｂ）待機列中に入っているまたは待機している仮想スレッドを第３のリンクリストから第２のリンクリストへと移し、（ｃ）所定の優先順位スケジュールに従って連続するタイムスライスまたは処理スロット中において第２のリンクリスト中の異なる仮想スレッドのコンテキストおよび状態データに応じて命令を実行し、インタープリターが動作上ディスプレーに部分的に接続されて第２のリンクリスト中の各稼動仮想スレッドによって特定される命令に反応してディスプレー上のオブジェクトを変更することを特徴とする多重タスクコンピューター。
【請求項２２】
メモリーがネイティブスレッドの第４のリンクリストを記憶し、インタープリターが共通インタープリターの複数のインスタンスのひとつであり、共通インタープリターの各インスタンスが各ネイティブスレッドに対応し、第２のリンクリストが複数のリンクされた稼動スレッドリストのひとつであり、各ネイティブスレッドが各ポインターによりいずれかのリンクされた稼動スレッドリストにリンクされており、第３のリンクリストが複数のリンクされた待機列中に入っているスレッドリストのひとつであり、各ネイティブスレッドが各ポインターによりいずれかの待機列中に入っているスレッドリストにリンクされていることを特徴とする請求項２１に記載のコンピューター。
【請求項２３】
各稼動スレッドがあるネイティブスレッドによる各スレッドのロックを可能とするミューテックスを有していて、他のネイティブスレッドによる各スレッドへのアクセスを防止することを特徴とする請求項２２に記載のコンピューター。
【請求項２４】
インタープリターが平均より重いロードを有した第１のネイティブスレッドから平均より軽いロードを有した第２のネイティブスレッドへ仮想スレッドを移す手段を有していることを特徴とする請求項２２に記載のコンピューター。
【請求項２５】
休止仮想スレッドのリストが各キーの起動を処理するためにキーボードの各キーに割り当てられた複数のスレッドを有していることを特徴とする請求項２１に記載のコンピューター。
【請求項２６】
休止スレッドのリストが各オブジェクトの外観変化を処理するためのディスプレーイメージ上の各オブジェクトに割り当てられた複数のスレッドを有していることを特徴とする請求項２１に記載のコンピューター。
【請求項２７】
インタープリターがコンテキストスイッチモジュールと命令カウンターとを有しており、該コンテキストスイッチモジュールがメモリーと命令カウンターとに動作上接続されて、現行実行稼動スレッドに従っての所定数のバイトコードまたは翻訳用語命令が実行されると、第２のリンクリスト中の現行実行稼動スレッドから第２のリンクリスト中の次の稼動スレッドへコンテキストスイッチを齎すことを特徴とする請求項２１に記載のコンピューター。
【請求項２８】
各仮想スレッドが各スレッド中で実行する次の命令の記憶場所と、各スレッドについてのいずれかの局所変数値と、各スレッドについての実行優先順位とを有していることを特徴とする請求項２１に記載のコンピューター。
【請求項２９】
メモリーが各スレッドに割り当てられた複数のメッセージ列を記憶していることを特徴とする請求項２１に記載のコンピューター。
【請求項３０】
メモリーが通信リンクを介して遠隔コンピューターとの通信を行う実行コンテキストを具えた少なくとも１個のプロキシまたはインターフェイススレッドを記憶し、該プロキシまたはインターフェイススレッドがネットワークプロトコルルーチンへと導くメモリーアドレスを含むことを特徴とする請求項２１に記載のコンピューター。
【請求項３１】
それぞれが多数の機械コードステップを有した一連のバイトコード命令を実行するインタープリターを有したコンピューターにおける多重タスク方法であって、コンピューターにより行われる各タスクについてインタープリターを用いて各仮想スレッドを定め、連続するタイムスライスのそれぞれの間仮想スレッド間から選択された各現行スレッドのバイトコード命令を実行し、あるバイトコード命令の実行後においてのみコンテキストスイッチをある仮想スレッドから他の仮想スレッドに実行することを特徴とする多重タスク方法。
【請求項３２】
各仮想スレッドが仮想スレッドの各リンクリストの一部であって、各仮想スレッドが各リンクリスト中の次の仮想スレッドへのポインターを有しており、さらに異なる仮想スレッド間の各コンテキストスイッチについて、現行実行仮想スレッドのポインターを参照して実行されるべき次の仮想スレッドの識別を決定することを特徴とする請求項３１に記載の方法。
【請求項３３】
各リンクリストが仮想スレッドの複数のリンクリストのひとつであり、あるリンクリストは休止仮想スレッドのリストであり、他のリンクリストは稼動仮想スレッドのリストであり、さらに他のリンクリストは待機列中に入っている仮想スレッドのリストであり、さらに少なくとも１個の仮想スレッドを待機列中に入っている仮想スレッドのリストから稼動仮想スレッドのリストに周期的に動かすことを特徴とする請求項３２に記載の方法。
【請求項３４】
待機列中に入っている仮想スレッドのリストから稼動仮想スレッドのリストへ仮想スレッドを動かすに際して、ミューテックスをセットして待機列中に入っている仮想スレッドのリストをロックし、ついで（ｉ）動かされた仮想スレッド、（ｉｉ）当初稼動仮想スレッドのリスト中にある少なくとも１個の仮想スレッドおよび（ｉｉｉ）待機列中に入っている仮想スレッドのリスト中に残っている少なくとも１個の仮想スレッド中のポインターを変更し、その後ミューテックスをリセットまたはリリースして待機列中に入っている仮想スレッドのリストへのアクセスを可能とすることを特徴とする請求項３３に記載の方法。
【請求項３５】
各仮想スレッドがミューテックスを有しており、さらに選択された１個の仮想スレッドのミューテックスをセットし、ついで選択された仮想スレッド中のデータを変更し、その後ミューテックスをリセットまたはリリースして選択された仮想スレッドへのアクセスを可能とすることを特徴とする請求項３１に記載の方法。
【請求項３６】
ミューテックスのセットと、データの変更と、ミューテックスのリセットまたはリリースとがいずれかの仮想スレッドからのメッセージに反応して行われることを特徴とする請求項３５に記載の方法。
【請求項３７】
各仮想スレッドがメッセージ列を割り当てられ、さらにいずれかの仮想スレッドに従ってタスクまたはジョブの実行間に選択された１個の仮想スレッドのメッセージ列中のメッセージに入ることを特徴とする請求項３１に記載の方法。
【請求項３８】
仮想スレッドが通信リンクを介しての他のコンピューター上の第２のプロキシスレッドとの通信のための第１のプロキシスレッドを有しており、さらに第１のプロキシスレッドに応じてバイトコード命令を処理して、通信リンクを介して第２のプロキシスレッドにメッセージを送ることを特徴とする請求項３１に記載の方法。
【請求項３９】
各仮想スレッドがスレッド優先順位を有しており、さらに複数の仮想スレッド中のスレッド優先順位を自動的に参照して相対優先順位を決定し、決定された相対優先順位に応じてスレッドの順序を変えることを特徴とする請求項３１に記載の方法。
【請求項４０】
タイムスロットまたは処理スロットが連続的に実行された翻訳用語命令を計数することにより測定され、さらに各タイムスライスまたは処理スロットについて、所定数の連続実行翻訳用語命令を計数したら、各タイムスロットまたは処理スロットを終了することを特徴とする請求項３１に記載の方法。
【請求項４１】
多重スレッドまたはタスクの状態とコンテキストデータとを記憶するメモリーと、それぞれが多数の機械コードステップから構成される一連のバイトコード命令を実行するインタープリターとを有してなり、インタープリターが、コンピューターにより行われる各タスクについて各仮想スレッドを定め、一連の連続したタイムスライスの各タイムスライスの間仮想スレッドから選択された各現行のスレッドのバイトコード命令を実行し、あるバイトコード命令の実行後にのみある仮想スレッドから他の仮想スレッドへのコンテキストスイッチを実行するべくプログラムされていることを特徴とする多重タスクコンピューター。
【請求項４２】
各仮想スレッドが仮想スレッドの各リンクリストの一部であり、各仮想スレッドが各リンクリスト中の次の仮想スレッドへのポインターを有しており、インタープリターが、異なる仮想スレッド間の各コンテキストスイッチについて、現行実行仮想スレッドのポインターを参照して実行されるべき次の仮想スレッドの識別を決定するようにプログラムされていることを特徴とする請求項４１に記載のコンピューター。
【請求項４３】
各リンクリストが仮想スレッドの複数のリンクリストのひとつであり、あるリンクリストは休止仮想スレッドのリストであり、他のリンクリストは稼動仮想スレッドのリストであり、さらに他のリンクリストは待機列中に入っている仮想スレッドのリストであり、インタープリターが少なくとも１個の仮想スレッドを待機列中に入っている仮想スレッドのリストから稼動仮想スレッドのリストへ周期的に動かすようにプログラムされていることを特徴とする請求項４２に記載のコンピューター。
【請求項４４】
コンピューターのタイマーをランさせて一連のタイムスライスまたは処理スロットを発生させ、入力ユーザーソースコードをそれぞれが複数の機械コード命令に対応するバイトまたは翻訳用語命令にコンパイルし、コンピューターのインタープリターを操作して計算タスクを各仮想スレッドに割り当てしかもその際に各計算タスクについて状態とコンテキストデータとを識別記憶し、各タイムスライスにおいて、インタープリターを操作して現行の仮想スレッドの状態とコンテキストデータとに従って選択された１個のバイトまたは翻訳用語命令を実行し、各選択されたバイトまたは翻訳用語命令の実行後においてのみ、インタープリターを操作していずれかの仮想スレッドに従っての命令実行の開始からの所定の間隔が経過したか否かをチェックし、所定間隔の経過の決定後、インタープリターを操作してコンテキストスイッチを行うことを特徴とするコンピューター方法。
【請求項４５】
各仮想プログラムスレッドに割り当てられたタスクが（ａ）ディスプレースクリーン上のイメージに現れたオブジェクトを制御し、（ｂ）オペレーター入力をモニターし、（ｃ）アプリケーションプログラムのルーチンを実行し、（ｄ）コンピューター保守ルーチンをランさせ、（ｅ）コンピューターネットワークを介して遠隔コンピューターとの通信を行いおよび（ｆ）局所変数を計算することを含んでいることを特徴とする請求項４４に記載の方法。
【発明の詳細な説明】
【０００１】
【発明の背景】
この発明はコンピューター上において多重タスクを同時に行う方法と装置に関するものである。
【０００２】
最近のほとんどのＯＳ（オペレーティングシステム）はネイティブ多重タスクまたは多重スレッド能力、つまり内蔵の多重スレッド能力を有している。注目すべき例外はＯＳＸ以前のマッキントッシュＯＳ（ＭａｃＯＳ）であって、多重スレッド能力は全然またはごく少ししか持っていない。残念なことに用意された多重タスク能力はＯＳとハードウエアプラットフォームによって異なる。多くのプラットフォ−ムは同時に存在できるスレッドの数を制約し、あるプラットフォームは多重スレッドを全くできない。
【０００３】
ソフトウエアでスレッドすることにより招来される問題とその解決方法を理解するには、多重スレッドへの一般的なアプローチとほとんどのプラットフォームネイティブスレッドシステムにより使用される特殊なアプローチを理解する必要がある。
【０００４】
一度に多重処理タスクを行うには、コンピューターシステム中に多数の処理回路を設けるのが明白な解決法である。しかし一般のデスクトップコンピューターは１個のプロセッサーのみを有しており、高級ワークステーションであっても１〜４個のプロセッサーを有するのみである。
【０００５】
ソフトウエアに基づいた解決法としてはタイムスライスがある。すなわちプロセッサーの時間を小さなスライスに分割するのであって、各スライスを異なるタスクまたはスレッドに用いるのである。一般には各スレッドはＯＳによっては３〜３０メッセージの間でランすることができる。この時間にあってそのスレッドは一時停止しており、他のスレッドはランすることができる。
【０００６】
通常ＯＳはプロセッサーの時間割込みを用いて周期的に現行実行スレッドを割込みしてＯＳのスレッドスケジューラーを起こす。これは小さなソフトウエアであって、現行スレッドの状態または実行コンテキストをセーブし、ランする新たなスレッドを選択し、新たなスレッドのセーブされた実行コンテキストを再記憶し、プロセッサーをして正常な実行に復帰させる。この処理はコンテキストスイッチとして知られている。
【０００７】
タイミングスライスが経過したときに起動するのに加えて、コンテキストスイッチはスレッドが待機状態、つまり特定のイベントが起きるまでスレッドがなにもすることがない状態に入ったときにも起動する。スレッドがそのような状態に入ると、スレッドスケジューラーが起動されてコンテキストスイッチが起動し、他のスレッドが残ったタイムスライスを使うことができる。
【０００８】
一般にスレッドを待機状態に入らせるイベントは、スレッドがデイスクにページングされたメモリーにアクセスしようとするときに、起きる。ＯＳは、メモリーシステムがメモリー中でページングする機会を得るまで、スレッドを一時停止する。他にもスレッドを待機状態に入らせるイベントとしては、スレッドがユーザー入力をチェックしたりスレッドがデイスクから読出しをしようとする場合がある。
【０００９】
後者の場合には、ＯＳはデイスク読出しが完了するまでスレッドを停止状態にする。そして他のスレッドは、第１のスレッドがデイスクから読み出されるデータを待っている間、処理タスクを行うことができる。さらにスレッドを待機状態に入らせるイベントしては、スレッドがそのタイムスライスの残りを特に放棄した場合がある。これは例えばスレッドが暫くの間やることがなにもない場合に起きるものである。
【００１０】
非常な頻度をもってコンテキストスイッチは起動することができるので、コンテキストスイッチは極端に高速で動作することが重要である。多くのＯＳはシステム中に存在できるスレッドの数を制限している。Ｗｉｎｄｏｗｓ（登録商標）９５は不能になるまでの最大数が約１５０〜２００スレッドであり、ＢｅＯＳはプロセッサー当り最大４０９６スレッドを有している。そのようなスレッド個数の制限は、挙動上の理由からの、システムがブーツしたときのスレッドテーブルの固定サイズメモリー塊のＯＳ予備アロケーションの結果である。
【００１１】
標準非翻訳プログラム語は人間読出しソースコードを機械読出しコードまたはプロセッサーによる直接読出し機械語にコンパイルする。
【００１２】
他方翻訳された言語は人間読出しソースコードをインタープリター読出しコードまたはバイトコードにコンパイルする。インタープリターと呼ばれるソフトウエアプログラムは機械語で書かれており、バイトコードを読んでプロセッサーに適宜な動作をするように命令する。
【００１３】
翻訳された言語の有利な点は、機械依存状にバイトコードを設計でき、言語で書かれてバイトコードにコンパイルされたプログラムをしてインタープリターが書かれたいかなるＯＳおよびハードウエアプラットフォーム上でランさせることができること、にある。
【００１４】
プラットフォーム上で全く同じにランさせなければならない翻訳語を作成するには、プラットフォームのネイティブ多重スレッドに頼るのは最善でも問題がある。クロスプラットフォーム翻訳プログラム言語の最終目的はひとつのプラットフォーム上の言語中でプログラムを開発し、それをその言語で支持されたいかなる他のプラットフォーム上でも変更なくプログラムをランできることである。Ｊａｖａ（登録商標）はそのような言語を形成するひとつの試みである。
【００１５】
残念なことにそのようなアプリケーションが多重スレッドでなければならないならば、ネイティブ多重スレッド能力の使用は即アプリケーションがランできるプラットフォームを制約する。アプリケーションプログラムは即ＭａｃＯＳ（スレッド能力を有していない）のほとんどのバージョン上でのランから締め出され、アプリケーションが必要とする同時実行スレッドの多さによっては、Ｗｉｎｄｏｗｓ（登録商標）９５（最大約１５０〜２００スレッド）、ＢｅＯＳ（最大プロセッサー当り４０９６スレッド）または他のプラットフォーム上でのランから締め出されることになる。
【００１６】
【発明の要約】
この発明は上記の諸問題を解決することを意図するものであり、異なるプラットフォームと異なるＯＳを有したコンピューターに多重タスク能力を付与せんとするものである。この発明によれば、プラットフォーム依存手段多重タスクはインタープリターにより達成される。これは翻訳されたプログラム言語を構成する命令を翻訳するソフトウエアプログラムである。このインタープリターは仮想スレッドに応じて生成し保持し処理することにより多重タスクを実行する。この解決法はプラットフォームネイティブスレッド能力に依存することをなくしかつ翻訳されたプログラム言語を用いて多重スレッドクロスプラットフォームの信頼できる手段を提供する。
【００１７】
一般的な翻訳されたプログラム言語においては、プログラム中の各命令はインタープリターにより読み出されてプロセッサーに送られなければならない。つまり翻訳されたプログラムは一般的に機械語プログラムより遅くランするであろう。従来の多重スレッドまたはタイムスライスにおいて行われるように、各機械コード命令においてタイマーまたはカウンターをチェックするインタープリターにコードを追加して、必要なときにはコンテキストスイッチを行うと、翻訳されたプログラムの挙動を厳しく衝撃することになろう。
【００１８】
したがってこの発明においては連続する翻訳用語間においてのみコンテキストスイッチの挙動を行い、翻訳用語命令の実行中には行わないのである。かくしてここに開示のコンピューター使用多重タスクまたは多重スレッドは、タイマーやカウンターのチェックをすることなしに、反復して多くの機械語の均等物を実行するのである。
【００１９】
この発明のコンピューターを操作する方法においては、コンピューターメモリーにそのいくつかが複数の機械コード命令を有する複数の翻訳用語命令を記憶し、コンピューターにより行われる複数のタスクまたはジョブのそれぞれについて、各実行コンテキストデータを自動的に生成する。該データは（ａ）各タスクまたはジョブを行う際に実行されるべき次の翻訳用語命令の記憶場所と（ｂ）各タスクまたはジョブを行うのに必要な局所変数の値を含んだものである。
【００２０】
複数のタスクまたはジョブはそれぞれ複数の機械語命令を有した翻訳用語命令のいずれかの実行を行わせる。さらにこの発明の方法においては、各仮想スレッドの制御の下に各タイムスライスまたは処理スロットにおいて各タスクまたはジョブを処理し、異なる仮想スレッド間の各コンテキストスイッチにおいて、いずれかの翻訳用語命令の現行実行の終了後にのみそのようなコンテキストスイッチを行う。
【００２１】
細かくされた機械語命令を真似た従来の「仮想マシン」アプローチ（Ｊａｖａ（登録商標）により使用されているアプローチ）を行うのに代えて、この発明の仮想スレッドは粗い命令の翻訳言語を用いる、つまり各命令が多くのより大きなタスクを達成するのである。
【００２２】
例えば、機械語（または機械語を真似た翻訳言語）においてボックスを描くことは数百または数千の命令からなり、各命令はボックス中の１個のピクセルの色をセットする。
【００２３】
仮想スレッドにあっては、ボックスを描くのに１個の命令が用いられ、インタープリターが機械語の残余を扱うのである。つまり、各命令の後に行われる潜在コンテキストスイッチのチェックが全体のボックス描写操作中に１回だけ行わればよく、各ピクセル後ではないのである。
【００２４】
この結果インタープリターは、厳しいネガティブ挙動衝突なしに、多重スレッドを扱うことができるのである。
【００２５】
この発明の他の特徴によれば、各仮想スレッドは仮想スレッドの各リンクリストの一部である。各仮想スレッドは各リンクリスト中の次の仮想スレッドのポインターを有している。またこの発明の方法においては、異なる仮想スレッド間の各コンテキストスイッチについて、現行実行仮想スレッドのポインターを参照して次に実行される仮想スレッドの識別を決定するのである。
【００２６】
プラットフォームネイティブスレッド実行に際しての共通の問題点はシステム中に同時に存在できるスレッド（稼動および休止）の個数への制約である。
【００２７】
例えばＷｉｎｄｏｗｓ（登録商標）９５／９８においては、全てのアプリケーションにおける総スレッド数が約１５０〜２００を過ぎると、システムは極度に不安定となる。この状態に遭遇したテストシステムにより呈された挙動は自発的なリブート、ランダムなキーボード入力、ランダムなマウスの動き、メモリーの不正動作およびランダムアプリケーションクラッシュなどを含むものである。
【００２８】
仮想スレッドにより用いられる粗い命令セットの結果としてはコンテキストスイッチ時間が厳正とならない点である。つまりリンクリストにスレッドを記憶するのに必要な超過時間を取ることが可能であり、その結果仮想スレッドにより非常に大きなスレッド数が可能となり、システム中で利用できる総メモリーのみによって制約される点である。
【００２９】
この発明の意図するところによれば、コンピューターによるタスクまたはジョブの実行を支配または仲介する仮想スレッドが複数のリンクリスト中に記憶されるのである。該リンクリストは休止仮想スレッドのリストと稼動仮想スレッドのリストと待機列中に入っている仮想スレッドのリストとを含んでいる。さらにこの発明の方法にあっては、少なくとも１個の仮想スレッドを待機列中に入っている仮想スレッドのリストから稼動仮想スレッドのリストへと周期的に動かすものである。
【００３０】
この仮想スレッドの動きは一般に（ａ）ミューテックスをセットして待機列中に入っている仮想スレッドのリストをロックすること、（ｂ）（ｉ）動かされた仮想スレッド中、（ｉｉ）当初稼動仮想スレッドのリスト中にあった少なくとも１個の仮想スレッドおよび（ｉｉｉ）待機列中に入っている仮想スレッドのリスト中に残っている少なくとも１個の仮想スレッド中のポインターを変更することおよび（ｃ）その後ミューテックスをリセットまたはリリースして待機列中に入っている仮想スレッドのリストへのアクセスを可能とすることを含んでいる。
【００３１】
この発明の他の特徴によれば、各仮想スレッドはミューテックスを有しており、選択された１個の仮想スレッドのミューテックスをセットして、その仮想スレッド中のデータを変更して、その後ミューテックスをリセットまたはリリースして選択された仮想スレッドへのアクセスを可能とするのである。選択されたスレッドのミューテックスのセッティング、データの変更およびミューテックスのリセットまたはリリースは他の仮想スレッドからのメッセージに反応して行われる。データの変更に際しては一般に選択された仮想スレッドのポインターの変更が行われる。
【００３２】
この発明の他の特徴によれば、各仮想スレッドはメッセージ列を割り当てられ、さらに他の仮想スレッドに従ってのタスクまたはジョブの実行間に選択された１個の仮想スレッドのメッセージ列中のメッセージに入る。これらのスレッドは異なるアプリケーションプログラムから引き出された各タスクまたはジョブに対応していてもよく、選択された１個の仮想スレッドのメッセージ列中のメッセージに入るに際しては異なるアプリケーションプログラム間でのデータ移送が実行される。
【００３３】
他のスレッド間メッセージにおいては選択されたスレッドと他のスレッドは異なるコンピューター上でのプロキシまたはインターフェイススレッドである。この場合メッセージ列中のメッセージに入るに際しては、コンピューター間の通信リンクを介してのメッセージ送信が行われる。この通信リンクは例えば個人コンピューターネットワーク、インターネットとして知られている世界規模コンピューターネットワークである。
【００３４】
上記に示唆されたように、仮想スレッドの生成、各タイムスライスまたは処理スロットでのタスクまたはジョブの処理およびコンテキストスイッチの開始は全て翻訳プログラム下でのコンピューターの操作を含むものである。さらにこの発明によれば、コンピューター上で翻訳プログラムの複数のインスタンスがランされ、各インスタンスはネイティブスレッドに対応するものである。
【００３５】
各ネイティブスレッドは実行コンテキストデータの各仮想スレッドセットを生成し、各仮想スレッドの制御の下で各タイムスライスまたは処理スロットでの複数のタスクまたはジョブを処理し、異なる仮想スレッド間で、各コンテキストスイッチ中、いずれかの翻訳用語命令の現行実行の終了後にのみそのようなコンテキストスイッチを開始する。
【００３６】
多数のネイティブスレッドのランは単一のプロセッサー上では少数のスレッドに限られるのが望ましい。例えば１〜２スレッドである。プロセッサーが本来多重スレッド能力を具えている場合には、この制限により他のプラットフォーム基ネイティブスレッドが他のアップリケーションプログラムを扱うのが可能となる。
【００３７】
仮想スレッドによると無制限数のスレッドが生成できる、かつスレッドはオーバーヘッドが非常に低いので、仮想スレッドを用いた言語で書かれたプログラムは独特のプログラムアプローチの利点を活かせる。
【００３８】
このプログラムアプローチに際しては、多数のスレッドを使用するもので、各スレッドはスクリーン上の各ユーザーインターフェイス装置のためのものである。例えばボタンはそれ自身のスレッドを有している。スクロールバーは４個有しており、１個が各ボタンのため、１個がセンターバーのため、１個がマスタースレッドのためのものである。スレッドはユーザーインターフェイス装置に限定されるものではない。例えばサーバープログラムは各クライアント要求に奉仕する１個のスレッドを生成できる。
【００３９】
アップリケーションの性質に応じて一般的なアプリケーションは１００〜数千のスレッドを有している。システム上でランする多重アップリケーションでは、Ｗｉｎｄｏｗｓ（登録商標）９５（１５０〜２００スレッド）のネイティブスレッド能力を凌ぐもので、より大きなまたは制約なしのスレッド能力を具えたプラットフォーム上でさえもネガティブに挙動を衝撃するだろう。他方仮想スレッドはこれらの問題を扱うべく設計されており、挙動上の問題なしに１万個のスレッドを具えた多重アップリケーションをランすることを可能にする。
【００４０】
ユーザーインターフェイスコードが数百のユーザーインターフェイス装置のトラックを保つ必要がないので、つまり各スレッドはスレッドが責任を負う単一のユーザーインターフェイス装置のトラックのみを保つ単純なプログラムのみをランするので、スレッドのこのような多数使用は複雑なアップリケーションの生成を簡単にする。この結果生成がより簡単でデバッグと保守がより容易な小さなプログラムとなる。
【００４１】
この発明の他の特徴によれば、選択された１個の仮想スレッドが休止状態にあり（例えば休止スレッドのリンクリスト中で）、コンピューター外のソースからの入力に反応してメッセージを発生し、選択された仮想スレッドのためのメッセージ列中にメッセージを挿入し、選択されたスレッドを休止状態から稼動状態に変更し、その後メッセージ列にアクセスして、選択されたスレッドに割り当てられたタイムスライスまたは処理スロット間にメッセージを得る。この処理は各スレッドに関係あるイベントの発生に従って仮想スレッドを休止状態から稼動状態に移すものである。このイベントはコンピューター外のソースから発生される。例えばキーボードを起動するオペレーターまたは遠隔コンピューターからの通信による。
【００４２】
この発明によるインタープリター仲介仮想スレッドはいかなる手法によっても異なるタスクまたはジョブ間で優先順位をつけることができる。各仮想スレッドがスレッド優先順位を有している場合には、さらに複数の仮想スレッド中のスレッド優先順位を参照して相対優先順位を決定し、それに従ってスレッドの順位を変更する。ある優先順位をつける手法にあっては、第２のスレッドより大きな部分数である優先順位を有したあるスレッドはあるタイムスライスまたは処理スロットの数を与えられ、それは第２のスレッドに与えられたタイムスライスまたは処理スロットの数より大である。
【００４３】
仮想スレッドの優先順位付け（そしてそれに伴ってそれらのタスク）は異なるネイティブスレッド間での処理ロードの分配の機会を与え、１を越えるネイティブスレッドが使われる。スレッドはタスクの平均優先順位より多く有したネイティブスレッドからスレッドの平均優先順位より少なく有したネイティブスレッドへの仮想スレッド再分配のタスクを割り当てられる。一般にスレッドの変更は可動スレッドに限定される。
【００４４】
すでに論じられたように、仮想スレッドの制御の下に各タイムスライスまたは処理スロット中で処理されるタスクまたはジョブはコンピューターディスプレー上に映像されたオブジェクトの制御を含んでおり、各オブジェクトは１個の仮想スレッドを割り当てられた別個のタスクまたはジョブを構成する。この発明に従ってインタープリターにより各仮想スレッドに割り当てられた処理済みタスクまたはジョブはさらにコンピューターキーボード上のキーの起動をモニターすることを含んでいる。各キーは各仮想スレッドを割り当てられた別個のタスクまたはジョブを構成する。
【００４５】
タイムスロットまたは処理スロットは連続実行された翻訳用語命令を計数することにより測定するのが望ましい。さらにこの発明の方法においては、各タイムスライスまたは処理スロットについて、所定数の連続実行翻訳用語命令を計数すると各タイムスロットまたは処理スロットを終了する。
【００４６】
この発明の多重タスクコンピューターの一実施例はメモリーと、ディスプレーと、入力周辺機器と、メモリーに動作上接続された少なくとも１個のプロセッサーとを有している。ディスプレーと入力周辺機器とプロセッサーとはコンパイラーを有しており、これがオペレーター入力ソースコード命令をバイトコードまたは翻訳用語命令に変更する。またコンパイラーは動作上メモリーにリンクされて、バイトコードまたは翻訳用語命令の記憶を可能とする。
【００４７】
プロセッサーはまたバイトコードまたは翻訳用語命令を実行するインタープリターを有している。メモリーは休止仮想スレッドの第１のリンクリスト、稼動仮想スレッドの第２のリンクリストおよび待機列中に入っているまたは待機仮想スレッドの第３のリンクリストを記憶する。各スレッドはコンテキストまたは状態データ、ミューテックスおよび各リスト中の次のスレッドへのポインターを有している。インタープリターは入力周辺機器に動作上接続されていて、周辺機器により発生されたイベントを認識し、また動作上メモリーに接続されて、（ａ）少なくとも１個の休止仮想スレッドを第１のリンクリストから第３のリンクリストへ移し、（ｂ）待機列中に入っているまたは待機仮想スレッドを第３のリンクリストから第２のリンクリストへ移し、（ｃ）所定の優先順位スケジュールに従って連続するタイムスライスまたは処理スロットにおいてコンテキストおよび第２のリンクリスト中の異なる仮想スレッドの状態データに応じて命令を実行する。インタープリターは動作上ディスプレーに接続されて、第２のリンクリスト中の各稼動仮想スレッドにより特定される命令に反応してディスプレー上のオブジェクトを一部変更する。
【００４８】
メモリーはさらにネイティブスレッドの第４のリンクリストを記憶することもできる。この場合、インタープリターは共通インタープリターの複数のインスタンスのひとつであって、各インスタンスは各ネイティブスレッドに対応する。また第２のリンクリストは複数のリンクされた稼動スレッドリストのひとつであり、各ネイティブスレッドは各ポインターによりリンクされた稼動スレッドのリストにリンクされている。一方第３のリンクリストは複数の待機列中に入っているスレッドリストのひとつであり、各ネイティブスレッドは各ポインターによりリンクされた待機列中に入っているスレッドのリストにリンクされている。
【００４９】
この発明の他の特徴によれば、インタープリターはプログラムされた回路を有しており、この回路が仮想スレッドを平均より重いロードを有した第１のネイティブスレッドから平均より軽いロードを有した第２のネイティブスレッドへ切り替える。
【００５０】
休止仮想スレッドのリストまたはテーブルはキーボードの各キーに割り当てられた複数のスレッドを有していて、各キーの起動を処理するのが望ましい。休止スレッドのリストまたはテーブルはディスプレーイメージ中の各オブジェクトに割り当てられた複数のスレッドを有していてもよく、これにより各オブジェクトの出現の変化を処理する。
【００５１】
インタープリターがコンテキストスイッチモジュールと命令カウンターとを有している場合には、コンテキストスイッチモジュールはメモリーと命令カウンターとに動作上接続されており、現行実行稼動スレッドに従って所定数のバイトコードまたは翻訳用語命令が実行されると、第２のリンクリストの現行実行稼動スレッドから第２のリンクリストの次の稼動スレッドへのコンテキストスイッチを起動する。
【００５２】
各仮想スレッドは各スレッド中で実行する次の命令の記憶場所と、各スレッドについてのいずれかの局所変数と各スレッドについての実行優先順位とを有している。
【００５３】
この発明の他の特徴によれば、メモリーは各スレッドに割り当てられた複数のメッセージ列と少なくとも１個のプロキシまたはインターフェイススレッドとを有しており、該プロキシまたはインターフェイススレッドの実行コンテキストは通信リンクを介して遠隔コンピューターと通信を行う。通信リンクがインターネットのようなコンピューターネットワークである場合には、プロキシまたはインターフェイススレッドはネットワークプロトコルルーチンに至るメモリーアドレスを有している。
【００５４】
この発明の他の実施例のコンピューターは、状態と多重スレッドまたはタスクのコンテキストデータとを記憶するメモリーと、一連のバイトコード命令を実行するインタープリターとを有している。各バイトコード命令は多数の機械コードステップを構成している。インタープリターはコンピューターにより行われる各タスクについての各仮想スレッドを定めるようにプログラムされており、一連の連続タイムスライスの各タイムスライス間に仮想スレッドから選択された各現行スレッドのバイトコード命令を実行し、かついずれかのバイトコードの実行後のみ、ある仮想スレッドから他の仮想スレッドへのコンテキストスイッチを実行する。以下この発明による種々の効果を記載する。
【００５５】
【定義】
用語「多重タスク」とはコンピューターによる同時多重タスクを行うことを言う。
【００５６】
用語「翻訳用語」とはインタープリターによる実行のためにコンパイルされたコンピューター命令を言う。インタープリターとはプログラムであって、機械語プログラムに翻訳し、翻訳されると表示された動作を行うものである。この「翻訳用語」は特定のコンピューターのハードウエアには関係なく、プログラムが使用される前にコンピューターにより使用されるコードへの変換を必要とする。多くの翻訳用語命令は多数の機械語命令の実行を引き起こす。翻訳用語は「バイトコード」とも言われる。
【００５７】
用語「タスク」または「ジョブ」とはコンピューターにより行われるいかなる機能をも示すものである。タスクまたはジョブはプロセッサーレジスターのコンテキストの変更などの簡単な動作から多くの翻訳用語命令の実行を必要とする複雑で大きな動作まで変化する。
【００５８】
タスクまたはジョブの例としては、（ａ）キーボードやその個々のキーなどのユーザー入力周辺機器のモニター、（ｂ）メニューボタンやウインドーやスクロールバーやアイコンや背景パターンなどのモニターまたはディスプレー上のオブジェクトの発生と変更、（ｃ）ネットワークまたは他の通信リンクを介しての遠隔コンピューターとの通信、（ｄ）ワードプロセッサーやスプレッドシートやマルチメディアプレーヤーや計算機などのアプリケーションプログラムおよび（ｅ）編集や印刷やスペルチェックやその他のワードプロセッサーのアプリケーションプログラム機能の種々の構成要素などがある。
【００５９】
用語「タイムスライス」または「処理スロット」とはプロセッサー時間のセグメントを言う。従来の多重タスクコンピューターにあっては、全てのタイムスライスは期間が同じであり、時間ベースまたはタイマーインタラプトにより測定される。この発明の場合には、タイムスライスまたは処理スロットは従来の多重タスクコンピューターのようにタイマーまたは命令計数により測定される。後者の場合には、タイムスライスまたは処理スロットは全ての期間が同じである必要はない。
【００６０】
用語「スレッド」とはコンピューターによりタスクまたはジョブを実行または行うための実行コンテキストを言う。実行コンテキストは一連のタイムスライスまたは処理スロット中で使用される。用語「仮想スレッド」とはインタープリターにより生成され、記憶され、変更され、処理されかつ従われるスレッドを言う。用語「ネイティブスレッド」とは特定のコンピューターのＯＳに内蔵されたスレッドを言う。コンピューターのＯＳが多重ネイティブスレッド能力を具えている場合には、複数のネイティブスレッドを使用でき、各ネイティブスレッドはインタープリターの各インスタンスをランさせる。
【００６１】
用語「ミューテックス」とはロック可能なオブジェクトであって、一時に１個のスレッドによりセットまたはロックされて、他のスレッドのプログラムや仮想スレッドやメモリー領域やコンピューターシステムの他の構成要素へのアクセスを防止する。ミューテックスはネイティブスレッド実行により使用されて、スレッド間で分配されているデータへのアクセスを同時化する。ミューテックスを使用すると同時に同じデータを変更しようとしている多数のスレッド間での葛藤を防止できるので、その使用は重要である。ミューテックスを用いて分配データを代表し、スレッドはデータにアクセスする前にミューテックスをロックしなければならない。
【００６２】
用語「リンクリスト」とはリスト中の各エントリーがリスト中の次のエントリーのメモリーアドレスを含んでいるようなソフトウエア産業で一般に用いられる構造である。このリンキングは、リスト中の他のエントリーを動かすことなしに、エントリーをリスト中に挿入またはリストから削除することを可能とする。いずれかのアイテムの削除に際しては、単にアイテムのプロセッサーを変更して、プロセッサーがアイテムの後者のアドレスをポイントするようにする。これによりアイテムにより使用されるメモリーを自由にする。
【００６３】
用語「コンテキストスイッチ」とは現行実行スレッドが割込みされる処理を示す。そのスレッドの状態または実行コンテキストは記憶され、新たなスレッドが選択ランされ、新たなスレッドのセーブされた実行コンテキストが再記憶され、すぐ後続のコンピューター動作が続く。
【００６４】
【好ましき実施例】
図１に示すように、コンピューターシステムはプロセッサー１２、キーボード１４、ディスプレー１６およびメモリー１８を有している。プロセッサー１２はインターネット２２などのコンピューターネットワークを介して遠隔コンピューター２０に接続されている。
【００６５】
図２に示すように、プロセッサー１２はインタープリター２４を有しており、このインタープリターは一般には多重コンピューター機能を実施するようにプログラム変更された総デジタルコンピューター回路として実装されており、キーボード１４を介してユーザーにより入力される命令またはインターネット２２を介してコンピューター２０から受信された通信に反応して、キーボード起動の翻訳およびディスプレー１６の制御および特にディスプレー上のオブジェクトの姿態の制御を行う。またプロセッサー１２はコンパイラー２６（インタープリター２４の一部である）を有しており、これが人間によるソースコードをバイトコードまたはメモリー１８に記憶されている翻訳用語に変換する。
【００６６】
図３に示すように、インタープリター２４はコード実行ユニット２８を有しており、これが動作上メモリー１８に接続されて、バイトコードを読み出してバイトコードに応じた操作を行う。インタープリター２４はさらに実行ユニット２８に接続された命令カウンター３０を有しており、現行のタイムスライスまたは処理スロット中で処理されるバイトコード命令の数を追従する。
【００６７】
カウンター３０は動作上コンテキストスイッチモジュール３２に接続されており、該モジュールは実行ユニット２８に接続されて、ユニット２８が所定数のバイトコード命令を計数すると、インタープリター２４の実行コンテキスト中の変更を誘発する。事情によっては、例えば待機状態に入ったら、実行スイッチはより早く、つまり計数完了前に起きてもよい。
【００６８】
以下の記載の多くにおいて、インタープリター２４はコンパイルされたバイトコードのみを扱うものと仮定する。実際にはコンパイラー２６（インタープリターの構成要素または別個のプログラム）は人間読出し可能ソースコードをバイトコードに翻訳する必要がある。コンパイラーはソフトウエア産業における標準品であり（Ｃ、Ｃ＋＋、Ｂａｓｉｃ、Ｐａｓｃａｌ、Ｊａｖａ（登録商標）その他多くの言語はランする前にコンパイルされなければならない）コンパイラーを書く手法は多くのプログラマーにとって公知のものであるので、これ以上の説明は省略する。
【００６９】
インタープリター２４は、各仮想スレッドの制御に応じてまたは制御の下に、各タイムスライスまたは処理スロットにおいて、仮想スレッドの生成およびリンキングおよびタスクの実行を介して多重タスクを実施する。以下においてはインタープリター２４がスタック型インタープリターであると仮定する。実際には仮想スレッドはスタック型であろうとなかろうといかなる型式のインタープリターとも働くものである。
【００７０】
以下のバイトコードを考察する。これはディスプレー１６のスクリーン上に座標軸ｘ＝１０、ｙ＝１０およびｘ＝２０、ｙ＝２０間にボックス描くものである。
【００７１】
命令          パラメータ
整数押下      １０
整数押下      １０
整数押下      ２０
整数押下      ２０
ボックス描出
【００７２】
スタック型言語においては、最初の４個の命令が値１０、１０、２０、２０をスタック上に押下する。ボックス描出命令はスタックから上の４個の値を除いて、ボックス描出用の座標軸に用いる。
【００７３】
このバイトコード命令は以下のインタープリター２４と仮想スレッドの例示プログラムとして用いる。
【００７４】
【仮想スレッド】
仮想スレッドは基本的には実行コンテキスト以外のなにものでもない。実行コンテキストは（ａ）スレッド中で実行する次の命令の記憶場所、（ｂ）スレッドについてのいずれかの局所変数の値、（ｃ）スレッドについてのコールスタック、（ｄ）スレッドの優先順位と他の属性および（ｅ）プログラム言語がスレッド形式ごとで記憶しなければならない他のデータ（エラー状態データなど）からなるものである。バイトコードはスレッドの一部ではない。数個のスレッドが同じバイトコードを同時にランできる。スレッドは単に実行すべき次のバイトコード命令へのポインターをメモリー中に保持する。
【００７５】
スレッドは以下の４通りの状態のいずれかをとれる。（１）休止。休止仮想スレッドは一時的になにもすることがない。例えばタイマーの経過を待機しているスレッドのようにキー押下などのユーザー入力を待機しているスレッド。休止スレッドは稼動仮想スレッドとは分離したリストに記憶され、いかなる処理時間をも取らない。（２）待機列中に入っている。仮想スレッドは稼動になる準備が整っており、インタープリターをランしているいずれかのネイティブスレッドに割り当てられている。しかしネイティブスレッドは命令の実行で忙しく、命令が完了するまで、仮想スレッドをその稼動リスト中に動かすことができない。
【００７６】
（３）稼動。仮想スレッドはネイティブスレッドの稼動リスト中にあり、ネイティブスレッドからタイムスライスを収受する仮想スレッドのひとつである。（４）現行。現行仮想スレッドは常に稼動仮想スレッドでもある。現行仮想スレッドは現在実行している仮想スレッドであり、つまりネイティブスレッドはそれにタイムスライスを与えかつそれがタイムスライス中にある。
【００７７】
【リンクされたスレッドリスト】
図４に示すように、インタープリター２４はスレッド状態とコンテキストデータをリンクリストのセットとしてメモリー１８に記憶する。２個の主たるリンクリストがあり、休止スレッドテーブル３４とネイティブスレッドテーブル３６である。各リスト３４、３６の第１エントリーへのポインター３８、４０はインタープリター２４中の大域変数中に記憶される。
【００７８】
休止スレッドテーブル３４はシステム中の全休止仮想スレッド４２のリストを記憶する。スレッドを再起動する各イベントが起きるまで、これらのスレッド４２は休止テーブル３４中に残る。休止テーブル３４中の各エントリーまたは仮想スレッド４２はスレッドの状態とコンテキストデータ４４と、スレッドの状態とコンテキストデータへのアクセス制御に使われるミューテックス４６と、リスト中の次のエントリーのメモリーアドレスを有しているポインター４８とを有している。
【００７９】
ネイティブスレッドテーブル３６はインタープリター２４のインスタンスをランさせかつ実行のための仮想スレッドを収受することのできる各ネイティブスレッド５０のエントリーを有している。ＭａｃＯＳのあるバージョンのようなネイティブスレッド能力のないプラットフォーム上では、ネイティブスレッドテーブル３６中に１個のエントリーのみがある。ネイティブスレッドテーブル３６中の各エントリー５０は１個のミューテックス５２、稼動仮想スレッド５８のリンクリスト５６へのポインター５４と、待機列中に入っているまたは待機仮想スレッド６４のリンクリスト６２への他のポインター６０と、ネイティブスレッドリスト３６中の次のエントリーへのさらに他のポインター６６とを有している。
【００８０】
仮想スレッド５８、６４のリンクリスト５６、６２は休止仮想スレッド４２のリンクリスト３４と同じフォーマットを使うが、各稼動スレッド５８と各待機列中に入っているスレッド６４とは休止スレッド４２と同じ構造を有している。各ネイティブスレッド５０は待機列中に入っている仮想スレッド６４の各リンクリスト６２から稼動仮想スレッド５８の各リンクリスト５６へと周期的にスレッドを動かす。ネイティブスレッド５０はその待機列中に入っているスレッド６４を使用しないが、ネイティブスレッドは命令（実行ユニット２８を介して）を実行している。そこで各リンクリスト６２はロックされて、ネイティブスレッドの稼動リスト５６をロックすることなしに、スレッドは列中に配置される。かくして多重プロセッサーシステムの挙動を改善する。
【００８１】
ミューテックス５２は待機列中に入っている仮想スレッド６４の各リンクリスト６２へのアクセスを同期化するのに用いられる。ネイティブスレッド５０（オーナーまたは他のネイティブスレッドのいずれであっても）は、各列６２へのアクセスが得られる前に、各ミューテックス５２上へのロックを有さなければならない。図４に示す残りのスレッド構造はミューテックスを必要としない。なぜならアクセス能力を具えた唯一のスレッドは各ネイティブスレッドだからである。
【００８２】
インタープリター２４は図５Ａ、５Ｂに示すようなループ中でそのほとんどの時間（全てのインタープリターが行うように）を費やす。このループを使ってインタープリター２４は仮想スレッドを支持する多くの動作を行う。
【００８３】
【ＯＳ保守タスク】
インタープリター２４が周期的に行わなければならないタスクのひとつはＯＳ保守７０である。このタスクの詳細はプラットフォームに応じて変化する。一般的にはただ１個のネイティブスレッド５０が保守タスク７０を行う必要があり、他のネイティブスレッドは単にバイトコード命令を実行するのである。あるプラットフォームにあっては、完全に分離したネイティブスレッドが保守に使用でき、ネイティブスレッドテーブル３６中の全てのネイティブスレッド５０はバイトコード実行に奉仕できる。他方、ネイティブスレッド能力（つまりＯＳＸ以前のＭａｃＯＳバージョンなどの協調的な多重タスクシステム）を有さないプラットフォームは周期的にプラットフォーム保守タスクを行って、システム時間上の他のタスクをランさせねばならない。
【００８４】
保守タスク７０の一部として行われる一般的なタスクとしてはＯＳのイベントループ（ＭａｃＯＳプラットフォーム上のｃａｌｌｉｎｇＧｅｔＮｅｘｔＥｖｅｎｔ（）またはＷｉｎｄｏｗｓ（登録商標）プラットフォーム上のＰｅｅｋＭｅｓｓａｇｅ（）／ＧｅｔＭｅｓｓａｇｅ（）／ＴｒａｎｓｌａｔｅＭｅｓｓａｇｅ（）／ＤｉｓｐａｔｃｃｈＭｅｓｓａｇｅ（））の反復である。
【００８５】
【イベント処理】
保守タスク７０の実行後、インタープリター２４と特に命令実行ユニット２８は、ネイティブスレッド５０の稼動スレッドリスト５６中に仮想スレッドがあるか否かについての、質問７２をする。リスト５６中に少なくとも１個の稼動スレッド５８があれば、インタープリター２４はイベントについての稼動チェック７４を開始する。リスト５６中に稼動スレッド５８がない場合には、インタープリター２４は７６においてイベントを待機し、かくしてシステム上の他のアプリケーションにプロセッサー時間を放棄する。
【００８６】
イベントが起きると、該イベントがメッセージとして符号化されて、適宜な仮想スレッドのためのメッセージ列に入れられる。各仮想スレッドはそれ自身のメッセージ列を与えられている。関連する仮想スレッドが休止スレッド４２ならば、再起動されなければならない。これにはネイティブスレッド５０を発見して、これに休止スレッドが待機列中に入っているまたは待機スレッド６４として割り当てられる。
【００８７】
図５Ａに示すように、決定ジャンクション７８においてインタープリター２４により確認されるように、イベントチェック７４が検出されたイベントになると、インタープリター２４はステップ８０において受信者スレッドを識別し、ステップ８２において受信者スレッドのメッセージ列をロックする。ステップ７６においてイベントの報せを受信したときにもインタープリター２４によりこのロックが開始される。
【００８８】
爾後インタープリター２４は８４において、受信者スレッドが休止スレッドであるか否かを調べる。調査８４においてインタープリター２４により決定されるように、受信者スレッドが休止スレッド４２ならば、大域休止スレッドリスト３４がステップ８６においてロックされる（ミューテックスは図示せず）。受信者スレッドはついでステップ８８においてリンクリスト３４から削除される。この削除は一般に休止スレッドリスト３４中の受信者スレッドのすぐ前の仮想スレッドのポインター４８の変更を惹起する。これによりポインターは休止スレッドリスト３４中の受信者スレッドにすぐ続く仮想スレッドを識別する。
【００８９】
ステップ８８におけるリンク休止スレッドリスト３４からの受信者スレッドの削除後、インタープリター２４はステップ９０においてリスト３４をロックする。次のステップ９２において、インタープリター２４はネイティブスレッド５０のリンクリスト３６をスキャンまたはトラバースして、最軽ロードのネイティブスレッドを発見する。ネイティブスレッドロードはネイティブスレッドに割り当てられた仮想スレッドの数として計算される。しかし物理的スレッド（つまり物理的スレッドの稼動リストおよび列中の全ネイティブスレッド）に割り当てられた全ネイティブスレッドの優先順位を合計することによりより正確にロードを計算する方がよい。
【００９０】
最軽ロードを持っていると選択されたネイティブスレッド５０の列ミューテックス５２はステップ９４においてインタープリター２４によりロックされる。休止スレッドリスト３４から削除されたばかりの受信者仮想スレッドはついでステップ９６において選択されたネイティブスレッド５０の待機列中に入っているスレッドリスト６２に追加される。ついで各ミューテックス５２はステップ９８においてロック解除される。待機列中に入っているスレッドリスト５６への受信者仮想スレッドの追加は、受信者スレッドの挿入に際して、受信者スレッドの中の２個のポインターおよび待機列中に入っているスレッドリスト５６中の受信者スレッドの直ぐ前のスレッドの変更を誘発する。
【００９１】
調査８４においてインタープリター２４により決定されるように、受信者スレッドが非稼動または休止スレッド４２でない場合には、インタープリターはルーチン１００を開始し、待機列中に入っているスレッド６４をリンクリスト６２からリスト５６へと移す。ルーチン１００は受信者スレッドのリスト３４からリスト５６への移送に際してもインタープリター２４により開始される。ルーチン１００の第１のステップ１０２においては、インタープリター２４はミューテックス５２をロックする。ついでインタープリター２４は１０４において、リスト６２が少なくとも１個の仮想スレッド６４を含んでいるか否か、をチェックする。もしそうならば、列中の最初のスレッドがステップ１０６において列から削除され、ステップ１０８においてリスト５６に追加される。
【００９２】
この仮想スレッドのあるリストから他のリストへの移送は３個のポインターの変更を誘発する。つまり動かされたスレッドのポインターと２個のリスト中の直ぐ先行するスレッドのポインターである。スレッドの移送後、インタープリター２４はジャンクション１１０において、新たに移送された仮想スレッドが現行実行スレッドより高い優先順位グループ中にあるか否か、を決定する。もしそうならば、ステップ１１２においてコンテキストスイッチがインタープリター２４、特にモジュール３２（図３）により行われて、新たに移されたスレッドが現行実行スレッドとなる。ついでステップ１１４において列ミューテックス５２はロック解除される。
【００９３】
【タイマー処理】
タイマー処理は仮想スレッドの重要な部分ではないので、図５Ａ、５Ｂには含まれてない。しかし翻訳された言語は一般にタイマーをセットすることによりデベロッパーに提供される必要がある。
【００９４】
仮想スレッドをタイマーに具える最も効率的な方法はメモリー１８中に全てのタイマーの大域リストを保持することである。経過したタイマーが直ぐにリストの最初に現れるようにリストをソートすべきである。
【００９５】
通常イベント処理中に主インタープリターループ（図５Ａ、５Ｂ）が反復されるごとに、インタープリター２４はタイマーリストの最初のエントリーをチェックして、そのエントリーが経過したか（してなければ、リスト中の後のタイマーは最初のタイマーが経過した後で経過するので、他のタイマーは経過してない）否か、を見る。タイマーが経過していれば、それはリストから削除されイベントが発生される。該イベントは適宜な仮想スレッドの稼動を引き起こし（すでに稼動でなければ）、そのスレッドは、スレッドがその列をチェックしたときに、タイマー経過イベントを発見する。
【００９６】
ネイティブスレッドに割り当てられた仮想スレッドがなくネイティブスレッドがイベントをチェックする（ステップ７４）代わりにイベントを待機している（ステップ７６）場合には、インタープリター２４はイベント待機前にタイマーをチェックしなければならない。リスト中にタイマーがある場合には、インタープリターはＯＳタイマーをセットして、ＯＳがイベントを発生してタイマーが経過したときに待機をリリースするようにしなければならない。
【００９７】
異なるＯＳシステムはそのタイマーにおいて異なる程度の正確さを有していることを認識するのが重要である。リスト中の最初のタイマーの残り時間がＯＳタイマーの正確さより少ない場合には、インタープリター２４はメッセージを待機することなく、代わりにメッセージをチェックして、時間経過イベントが要求される正確さで発生されるようにしなければならない。
【００９８】
【スレッド間メッセージ】
一般に互いにデータを交換できるように、仮想スレッドはある通信手段を有していることが必要である。従来の多重タスクコンピューターシステム中のネイティブスレッドは通常メモリーにデータを配置することによりデータを分け合い、これによりデータは全てのスレッドにアクセス可能であり、メモリーへのアクセスをロックして、多数のスレッドがデータに同時にアクセスすることを防止する。ここに開示する仮想スレッドは異なるアプローチを使用するもので、スレッド間でメッセージを交換する。メッセージはメッセージ識別子から構成され、識別子はメッセージのタイプとデータのブロックを独自に識別する（例えばストリング「ｍｏｕｓｅ−ｍｏｖｅ」などがメッセージ識別子となり得る）。データのブロックはいかなるフォーマットでもよく、いかなるサイズ（挙動上の理由から数メガバイトサイズの大きなブロックは勧められないが、そのような場合には一連のより小さなメッセージが好ましい）でもよい。
【００９９】
メッセージはＯＳから収受された外部イベント（マウスの動きやキーの押下などのユーザー入力イベントも含む）または仮想スレッドバイトコード中の命令に反応して発生することもできる。
【０１００】
図５Ａのイベント処理部分には、イベントに反応していかにメッセージがスレッドメッセージ列に追加されるか、が示されている。この手法は、バイトコード命令に反応してメッセージをスレッドメッセージ列に追加するのにも使われる。スレッドがそれ自身のメッセージ列にメッセージを配置する場合には、バイトコード命令実行の一部としてすでにロックされているスレッドのコンテキストのロック部分を避けなければならない。両方の場所にロックしようとするとミューテックスのプラットフォーム実行によっては膠着状態を引き起こす。
【０１０１】
【稼動列から稼動リストへのスレッドの移動】
メッセージまたはイベントに反応して仮想スレッドが稼動されると、仮想スレッドは稼動スレッドリスト５６ではなくネイティブスレッド５０の待機列中に入っているスレッドリスト６２中に置かれる。リスト５６はネイティブスレッドそれ自身によってのみアクセスされるべきでリスト５６はロックされる必要がないので、上記のようになる。
【０１０２】
リスト５６をロックする必要を除きリスト６２のみをロックすることにより、ネイティブスレッド５０は命令を実行するのに忙しくかつ稼動（異なるプロセッサー上で異なるスレッドが同時にランすること）を行っているネイティブスレッドは命令実行の終了を待機する必要がないので、挙動が改善される。したがってネイティブスレッドはスレッドをその稼動列から稼動リストへと周期的に移動させる責任がある。
【０１０３】
【コンテキストスイッチ】
各ネイティブスレッド５０は現行実行仮想スレッドへのポインター（例えばポインター５４）をリスト３６中のネイティブスレッドエントリー中に記憶する。コンテキストスイッチはこのポインターをリスト５６中の異なる仮想スレッド５８へのポイントに変更するだけである。命令実行ユニット２８（図３）により行われた命令実行コードはポインターアドレスにおける仮想スレッドリストエントリー中のスレッドコンテキストを使い、したがってコンテキストスイッチについては他の行動は必要ない。つまりコンテキストスイッチの動作は非常に速いが、命令の実行はポインター遠回りの故に通常より若干遅い。
【０１０４】
【スレッド優先順位】
各仮想スレッド４２、５８、６４は割り当てられた優先順位を有している。多数のスレッドが同時に稼動である場合には、つまり稼動スレッドリスト５６が１個以上のスレッド５８を有している場合には、高位優先順位を有したスレッドがより多くのプロセッサー時間を収受する。
【０１０５】
スレッド優先順位の大事な使用のひとつはユーザー入力に応答したスレッドに優位を与えることである。この優位付与により例えばインタープリター２４は、オペレーターがキーボード１４のキーを起動するとすぐ、ディスプレー１６上のオブジェクトを変更する。かくしてオペレーターはコンピューターから即座にフィードバックを受けて、該フィードバックはその命令が収受されて処理されていることを示すものである。かくしてユーザーはキーボード１４とプロセッサー１２とが動作しており、フリーズまたは不動化されていないことを知るのである。
【０１０６】
例えばディスプレー１６上にオブジェクトとして示された「Ｐｒｉｎｔ」ボタンを有したアプリケーションを考えて見る。ユーザー入力装置であるボタンはそれ自身の仮想スレッド４２、５８、６４を割り当てられる。ボタンのスレッドはその時間のほとんどを休止スレッドリスト３４中で過ごす。ユーザーがボタン（マウスクリックはユーザー入力イベントである）をクリックすると、スレッドが起動される。スレッドはついでボタンを引き戻して、それが「ｐｒｅｓｓｅｄ  ｉｎ」と見えるようにしなければならない。その後スレッドはメッセージを他のスレッドに送って、他のスレッドにボタンが押下されたことを報せる。他のスレッドは書面の印刷など必要なことを行う。
【０１０７】
ボタンがアプリケーションの他のタスクの優先順位より高位の優先順位のスレッドを割り当てられることにより、ユーザーは、システムが他のタスクの扱いで忙しい場合でもボタンをクリックしたときに即座の可視応答（ボタンは「Ｐｒｅｓｓｅｄ  ｉｎ」に引き戻される）があること、を保証される。
【０１０８】
図５Ａ、５Ｂに示された簡単な優先順位システムは各スレッドにその優先順位のための数値を割り当てることで行われる。一般的にこの値は０〜１００の間にあり、大きな値が高位の優先順位を示している。しかしいかなる範囲の値を使用してもよい。この簡単な優先順位システムでは、各リスト５６中により高位の優先順位スレッドがあれば、与えられた稼動スレッド５８はいかなるプロセッサー時間をも割り当てられない。
【０１０９】
このシステムの各ネイティブスレッド５０はリスト５６中の高位優先順位仮想スレッド５８の優先順位レベルのトラックを保つ（この優先順位レベルは最高位稼動優先順位と呼ばれる）。ネイティブスレッド５０がコンテキストスイッチを行いかつ新たな仮想スレッド５８を選択して現行仮想スレッドとなるときには、ネイティブスレッド５０は常にリスト５６中の次の仮想スレッド（高位稼動優先順位において）を選択する。これにはネイティブスレッドがリストの終りに達したときリストの始めからスタートする。また各ネイティブスレッド５０は最高位稼動優先順位にある稼動仮想スレッド５８の数のトラックを保つ。
【０１１０】
この簡単な優先順位システムにあっては、ネイティブスレッド５０が仮想スレッドを各リスト６２から各リスト５６に移動させたときはいつでも、その仮想スレッドが最高位稼動優先順位より高位の優先順位ならば、最高位稼動優先順位は新たなスレッドの優先順位に調節され、最高位稼動優先順位におけるスレッドのカウントは１にセットされ、コンテキストスイッチが行われて、新たなスレッドを現行の仮想スレッドとする。新たな仮想スレッドが最高位稼動優先順位に等しい優先順位を有する場合には、最高位稼動優先順位におけるスレッドのカウントはインクレメントされるだけである。
【０１１１】
稼動仮想スレッド５８が終了または休止になったときはいつでも、各ネイティブスレッド５０は最高位稼動優先順位レベルにあるスレッドのカウントを低減する。カウントがゼロになったら、ネイティブスレッド５０はそのリスト５６をスキャンして、新たな最高位稼動優先順位とその優先順位のスレッドの新たなカウントを決定し、コンテキストスイッチを行って、適切なスレッドを新たな現行仮想スレッドとする。
【０１１２】
最後に稼動仮想スレッド５８の優先順位レベルが増加して新たな優先順位が現行最高位稼動優先順位より高位の場合には、各スレッドの割当てにより最高位優先順位はその優先順位についての数値でなければならない。一般にこの値は０〜１００の間であり、大きな値がより高い優先順位を示している。しかし範囲はこれに限定されない。この簡単な優先順位システムにあっては、与えられた稼動スレッド５８は、各リスト５６中により高い優先順位のスレッドがある場合には、いかなるプロセッサー時間をも割り当てられない。このシステムの各ネイティブスレッド５０は調節された優先順位のトラックを保っており、そのスレッドは新たな現行スレッドとなる。同様に稼動仮想スレッド５８の優先順位レベルが減少したら、もしその仮想スレッドが前に最高位優先順位レベルにあったのなら、各ネイティブスレッド５０はそのリスト５６をスキャンして新たな最高位稼動優先順位とその優先順位のスレッドの新たなカウントを決定し、ついでコンテキストスイッチを行って、適切なスレッドを新たな現行仮想スレッドとしなければならない。優先順位レベルはインタープリター２４により実行された命令の結果変化することができる。
【０１１３】
【進化したスレッド優先順位】
より進化したシステムをスレッド優先順位に使用できるが、仮想スレッドが必ずしも働く必要はない。より高位の優先順位スレッドが稼動であっても、このシステムはスレッド５８をしてプロセッサー時間を取得させ得るものである。これは優先順位グループを用いることにより行われる。
【０１１４】
一般的な実施においては、スレッドの優先順位は−９９９９と＋９９９９の間の値である。スレッドの優先順位グループはスレッドの優先順位を１００で除算したものに等しく、余りは切り捨てる。例えば
【０１１５】
2004522234.tif 000003
【０１１６】
前記の簡単なスレッド優先順位システムからの法則はまだ使用されているが、それらの法則は優先順位グループの代りに適用される。かくして、より高位の優先順位グループに稼動スレッドがある場合には、与えられた稼動スレッド５８はいかなるプロセッサー時間をも受け取らない。
【０１１７】
しかし同じ優先順位グループ中のスレッド５８はグループ中での優先順位に基づいてプロセッサー時間を受け取る。スレッド優先順位は相対的である。与えられた２個の優先順位ＰとＱとが優先順位Ｑのスレッドが受け取った各（Ｑ−Ｐ）＋１タイムスライスについて１個のタイムスライスを受け取る。したがって優先順位Ｎのスレッドは優先順位Ｎ＋３のスレッドが取得する各４個のタイムスライスについて１個のタイムスライスを取得する。例えば下記のスレッドセットを考察する。
【０１１８】
スレッドＩＤ    スレッド優先順位
Ａ                ５０
Ｂ              １２０
Ｃ              １２１
Ｄ              １２２
Ｅ              １２４
【０１１９】
それらのスレッドがすべて同時に稼動であると、スレッドＡは他のスレッドより低位優先順位グループ中にあるので、ランしない。残りのスレッドは以下のようなタイムスライスを割り当てられる。Ｂ  Ｃ  Ｄ  ＥＥＥ  Ｄ  ＥＥＥ  Ｃ  Ｄ  ＥＥＥ  Ｄ  ＥＥＥ  Ｂ  Ｃ  Ｄ  ＥＥＥ  Ｄ  ＥＥＥ  Ｃ  Ｄ  ＥＥＥ  Ｄ  ＥＥＥ。換言すると、各３８タイムスライスからスレッドＢは２タイムスライスを受け取り、スレッドＣは４、スレッドＤは８そしてスレッドＥは２４を受け取る。
【０１２０】
このタイムスライス分配は各稼動仮想スレッド５８について（図３）スキップカウンター１１６を保つことにより実施される。各カウンター１１６は初期値０を有している。コンテキストスイッチが起きて新たなスレッド５８が実行のために選択されなければならない時はいつでも、選択されたスレッドが最高位優先順位グループ中にある。しかし選択されたスレッドは稼動の最高位優先順位ではない。同じ優先順位グループ中に他のより高位の優先順位スレッドがある。したがってＨが最高位優先順位の稼動スレッド５８の優先順位であり、Ｐがコンテキストスイッチ動作のために新たな現行仮想スレッドとして選択された稼動スレッドの優先順位であり、Ｓが新たな現行仮想スレッドのためのスキップカウンター（初期値０）の値ならば、Ｓが（Ｈ−Ｐ）以上ならば、コンテキストスイッチが正常に起きる。でなければ各カウンター１１６はインクリメントされ、スレッドがスキップされ、異なる稼動仮想スレッド５８が選択されて現行スレッドとなる。
【０１２１】
この経過を図５Ａに示す。インタープリター２４はまず、稼動仮想スレッド５８の各リスト５６中に同じ優先順位グループのスレッドが現行スレッドとしてあるか否か、をチェック１１８する。結果がイエスであれば、インタープリター２４はステップ１２０において現行優先順位グループ中の次のスレッドを選択する。前記したように、インタープリター２４はステップ１２２において現行優先順位グループ中の最高位優先順位稼動仮想スレッドの優先順位Ｈ、選択されたスレッドの優先順位Ｐ、および選択されたスレッドのスキップカウントＳを決定する。
【０１２２】
続く決定ジャンクション１２４においてインタープリター２４は、スキップカウントＳが現行優先順位グループ中の最高位優先順位稼動仮想スレッドの優先順位Ｈと選択されたスレッドの優先順位Ｐとの間の差以上であるか否か、を質問する。スキップカウントＳが差（Ｈ−Ｐ）以上であると、ステップ１２６においてインタープリター２４は選択されたスレッドのスキップカウンター１１６をゼロにリセットし、ステップ１２８においてコンテキストスイッチを作成する。選択されたスレッドは現行実行スレッドとなる。スキップカウントＳが差（Ｈ−Ｐ）未満であると、インタープリター２４はステップ１３０において選択されたスレッドのスキップカウント１１６をインクリメントし、ステップ１２０に戻って、リスト５６の現行優先順位グループ中の他のスレッドを選択する。
【０１２３】
絶対優先順位ではなくスレッド５８の相対優先順位に全てを基づかせることにより、優先順位が１０と２０の１対のスレッドについて、優先順位が５１０と５２０の１対のスレッドのように、同じ数のスキップ動作が起きる。いずれの場合も、優先順位差は１０でありしたがって低位優先順位のスレッドは、高位優先順位スレッドが受ける１０個のタイムスライスについて１個のタイムスライスを受ける。
【０１２４】
【命令実行】
稼動仮想スレッド５８のタイムスライスの間、仮想スレッドが割り当てられたネイティブスレッド５０のインタープリター２４、特に命令実行ユニット２８は反復読み出して（ステップ１３２）仮想スレッドからの命令をなるべく速く実行（ステップ１３４）する。ステップ１３４において各命令を実行した後、ネイティブスレッド５０（すなわちインタープリター２４の各インスタンス）は一連のチェック１３６、１３８、１４０を行って、命令の結果、現行仮想スレッドが休止になっているか否か、現行スレッドが実行されたばかりの命令の結果終了しているか否か、または仮想スレッドタイムスライスが経過したか否か、を決定する。いずれかの状態が真ならば、ネイティブスレッド５０または各インタープリター２４は、スレッドが稼動になるか新たなタイムスライスに割り当てられるまで、その仮想スレッドからの命令実行を停止する。
【０１２５】
タイムスライスまたは処理スロットの測定に際してはタイマーまたは命令カウントを用いるが、後者は命令カウンター３０（図３）によりトラックされる。一般に、各命令におけるオーバーヘッドが非常に低いので、命令カウントを用いる方がよい。タイムスライスが経過したかをチェックするに際しては、カウンター変数をインクリメントするだけであり、爾後タイムスライスについての命令の最大数をカウンター変数が越えたか否かをチェックする。所定のカウント最大数と命令カウントとの比較はコンテキストスイッチモジュール３２（図３）で行うことができる。
【０１２６】
タイムスライスのために正しいサイズを選択するに当たっては、長いタイムスライスほどプロセッサー１２の使用をより効率的にする（これにより仕事は速く行われる）、しかし与えられた時間内に起きることのできるコンテキストスイッチの数は低減される。この結果ユーザーインターフェイスについての挙動が間違ったものとなることがある。基礎をなしているＯＳとハードウエアプラットフォームおよびアプリケーションの内容などによりタイムスライスのサイズは異なったものとするのがよい。
【０１２７】
一般にはタイムスライス当り２０〜２００個の命令がよい。タイムスライスが小さすぎると（１〜３命令）挙動が大きく損なわれ、タイムスライスが大きすぎると（１００万命令）多重スレッドの目的を損なうことになる。特にグラフ的なユーザーインターフェイスを持ったアプリケーションの場合がそうである。
【０１２８】
ネイティブスレッド５０つまりインタープリター２４の各インスタンスが、チェック１３６において、現行実行スレッドがその最後の実行命令の結果休止となったことを発見すると、そのスレッドはステップ１４２において各リスト５６から削除される。この削除に際してはリスト５６中で削除されたスレッドに直ぐ先行する稼動スレッドのポインターの調節を必要とする。各ネイティブスレッド５０の列ミューテックス５２はついでステップ１４４においてロックされ、新たな休止スレッドがステップ１４６において休止スレッドリスト３４に挿入され、ミューテックス５２はステップ１４８においてロック解除される。休止スレッドテーブル３４にスレッドが挿入されると挿入スレッドおよび休止スレッドリスト３４中で挿入スレッドにすぐ先行するスレッドのポインターの調節が行われる。
【０１２９】
ネイティブスレッド５０つまりインタープリター２４の各インスタンスが、チェック１３８において、現行実行スレッドが最後に実行された命令の結果そのタスクまたはジョブを終了したことを発見すると、ステップ１５０においてそのスレッドはリスト５６から削除される。また終了したスレッドにより使用されていたリソースは自由になる。
【０１３０】
ステップ１４２、１４４、１４６、１４８におけるリスト５６から休止リスト３４へのスレッドの移送後またはステップ１５０におけるリスト５６からの終了スレッドの削除の後、関連するネイティブスレッド５０のインタープリター２４は１５２において、現行スレッドと同じ優先順位グループのスレッドがリスト５６中に残っているか否か、をチェックする。もしそうならばインタープリター２４はステップ７０（図５Ａ）において保守タスクを行うことに戻る。もしそうでなければ、インタープリター２４またはネイティブスレッド５０はステップ１５４においてリスト５６を通過してリスト中の最高位優先順位スレッドの優先順位を決定する。次のステップ１５６と１５８において、最高位優先順位スレッドは現行スレッドとされ、リスト５６中で最高位優先順位レベルにあるスレッドの数が計数される。インタープリター２４はステップ７０において保守タスクを行うことに戻る。
【０１３１】
チェック１３６と１３８において、最後のバイトコード命令の実行後現行スレッドが休止になっていないかまたはそのタスクを終了していないか否かを、決定する。その後インタープリター２４は決定ジャンクション１６０において、実行されたばかりの命令の結果現行スレッドの優先順位グループが変化したか否か、質問する。もしそうでなかったらチェック１４０が開始されてタイムスライスが経過したか否かが決定される。
【０１３２】
もしそうならば、インタープリター２４は１６２において現行スレッドの優先順位グループが増減いずれをしたかを質問する。増加の場合には、最高位優先順位グループ中のスレッド数がステップ１６４において単一にリセットされる。もし減少ならば、最高位優先順位グループ中のスレッドのカウントがステップ１６６においてデクリメントされる。決定ジャンクション１６８においてインタープリター２４は最高位優先順位グループ中に稼動スレッドが残っているか否かを調べる。この結果が否定だとインタープリター２４はステップ１７０において稼動スレッドをスキャンして、新たな最高位優先順位グループを決定してそのグループ中のスレッドの数を計数する。インタープリター２４はついでステップ１７２においてコンテキストスイッチを開始し、最高位優先順位稼動スレッド５８が現行スレッドとなる。調べた結果が肯定ならば、決定ジャンクション１６８においてインタープリター２４は直接コンテキストスイッチステップ１７２に行って、ステップ１３２、１３４を読み出し実行する。
【０１３３】
【スレッドロードバランス】
前記したように、各ネイティブスレッド５０は稼動仮想スレッド５８のリスト５６からの命令を実行する。仮想スレッドが稼動になってネイティブスレッド５０に割り当てられると、システムはそれをより軽いロードを持ったネイティブスレッドに割り当てようとする。これにより仮想スレッドはネイティブスレッド間で等しくバランスされる。
【０１３４】
稼動スレッドが終了するか休止になると、それぞれ１０個の仮想スレッドを割り当てられた２個のネイティブスレッドを有したシステム上で該スレッドはそうする必要がなく、ひとつのネイティブスレッド中の６個の仮想スレッドについて全て終了するか休止となり、ひとつが４個の仮想スレッド、他が１０個の仮想スレッドを有した２個のネイティブスレッドが残る。
【０１３５】
ネイティブスレッド５０間ではアンバランスまたは等しくないロードを回避するのが望ましい。なぜならそのような事態は多重プロセッサー機械上ではプロセッサーの使用を効率的にしないからである。この問題を解決すべく、インタープリター２４により扱われる仮想スレッドはスレッドバランスと呼ばれる手法を用いる。スレッドバランスの基本原理は、インタープリター２４がランしている仮想スレッド５８のセットを周期的にチェックしてそれらを分配してネイティブスレッド５０間で仮想スレッドのバランス分布を保つこと、である。スレッドバランスは注意深く行って、ネイティブスレッド５０が停止してロックされたデータを利用できるのを待機することを回避する必要がある。
【０１３６】
いずれのネイティブスレッド５０でもスレッドバランスを行うことができる。各ネイティブスレッド５０はカウンター（図示せず）を保っており、スレッドがタイムスライスのセットを完全に実行する（つまりネイティブスレッド５０が稼動スレッド５８のリスト５６の最後に達して再び最初からスタートする）度毎に、ネイティブスレッドはインクリメントする。このカウンターがプラットフォームと予期されたアプリケーションセットおよびオペレーターの好みと一致するべく選択されたある値に達すると、カウンターはゼロにリセットされ、ネイティブスレッド５０はスレッドバランスを行おうとする。
【０１３７】
ネイティブスレッド５０がスレッドバランスを行うときになると、他のネイティブスレッドがすでにバランスを処理するプロセスに入っていれば、バランス動作をスキップする。数個のネイティブスレッド５０間のスレッドバランスの調整は大域ミューテックス（図示せず）を用いて達成される。ネイティブスレッド５０はミューテックス上にロックを有して、スレッドバランスを行わなければならない。ネイティブスレッド５０が大域ミューテックスにアクセスしてそれがロックされていることを発見すると、ネイティブスレッドはミューテックスがロック解除となるのを待機せず、代りにスレッドバランスをスキップする。
【０１３８】
一旦ネイティブスレッド５０がバランスミューテックス上にロックしてしまうと、ネイティブスレッドはネイティブスレッドテーブル３６上に２回反復しなければならない。各ネイティブスレッド５０はスレッドロード値（上記したように、一般的には全稼動スレッドの優先順位の和）を保つ。最初のスレッドテーブル３６通過の間、バランスを行っているスレッド５０は全てのネイティブスレッドのロード値を合計する。この和はついでネイティブスレッド５０の数で除算されて平均ロードを引き出す。
【０１３９】
ネイティブスレッドリストを２回目に通過する間、いずれかのネイティブスレッド５０が平均ロードより大なるロードを有している場合には、そのリスト５６がロックされて、仮想スレッドは稼動リストから削除される。これには低位の優先順位スレッドからスタートして、ネイティブスレッドのロードが平均ロード以下になるまで、高位の優先順位スレッドに向けて動く。これらの仮想スレッドは、あたかも稼動になったばかりの如く、ついでネイティブスレッドに割り当てられる。これには通常のアルゴリズム（最も軽いロードのネイティブスレッドを決定してそれに仮想スレッドを割り当てる）を用いる。
【０１４０】
【名称付けスレッド】
アプリケーションが新たなスレッドを生成する命令を実行すると、アプリケーションは一般に生成されたばかりの独特な識別子を受け取る。これらの識別子は一般に独特な数字コードであって、スレッドが生成されるとダイナミックに割り当てられる。識別子はスレッド間メッセージを送るときに目標アドレスを特定するのに使われる。
【０１４１】
しかしときにはひとつのアプリケーションがすでにランしている他のアプリケーションとメッセージを交換するのが望ましいことがある。この場合ダイナミックに割り当てられた目標スレッドの数字ＩＤはアプリケーションを送るのには用いることができない。
【０１４２】
したがって翻訳された言語がスレッドに名称を与える命令を提供するか、またはそのような機能を新たなスレッドを生成する命令の一部とすることが、望ましい。スレッド名称はスレッドを識別するのに使えるテキストのストリングである。一般にはアプリケーション開発者は彼等（開発パッケージのシリアルナンバーなど）に特有であってアプリケーションのための記載的な名称（Ｗｈｉｔｅｂｏａｒｄなど）と組み合わされた識別子を用いてそのアプリケーションに彼等が使える独特なスレッド名称を作る。
【０１４３】
アプリケーションが他のスレッドにメッセージを送る必要がある場合には、スレッドのダイナミックに割り当てられた独特な数字ＩＤによるか、またはもしすでに割り当てられているならスレッドの名称による。
【０１４４】
【スレッドメッセージとネットワーク】
スレッド間メッセージはアプリケーション構成要素、特にボタンやスクロールバーなどのユーザーインターフェイス構成要素間通信のための強力な手段であり、スレッド名称を用いて同じコンピューター上でランしているアプリケーション間通信のための強力なメカニズムを形成する。
【０１４５】
加えてスレッドメッセージは異なるコンピューター上のアプリケーション間通信の強力な手段をも形成する。該手段が適切に実施されるならば、スレッドメッセージが局所コンピューター上の名称を付けられたスレッドに送られているか否か、または遠隔コンピューター上の名称をつけられたスレッドメッセージを送るのに必要な命令に影響を及ぼさないか否か、がアプリケーションおよびその開発者達に明白になるだろう。
【０１４６】
異なるコンピューター上のアプリケーション間の通信はプロキシスレッド１７４、１７６（図６）を用いて達成される。局所コンピューター１８０上のスレッド１７８が遠隔コンピューター１８４上のスレッド１８２と通信する必要があるときには、スレッド１７８は遠隔スレッド１８２に接続する命令を実行しなければならない。命令が実行されると、新たな局所プロキシスレッド１７４が生成される。このスレッド１７４は遠隔コンピューター１８４へ接続するコードモジュールを実行する。遠隔コンピューター１８４は接続を受けてそれ自身のプロキシスレッド１７６を生成する。プロキシスレッド１７４、１７６はネットワーク１８６上で互いに通信する。この際にはＴＣＰ／ＩＰなどの標準ネットワークプロトコルを用いる。
【０１４７】
最初の接続命令を実行したスレッド１７８は今度はスレッド１７４のＩＤを受ける。スレッド１７８は、あたかも遠隔目標スレッド１８２のＩＤであるかのごとく、そのＩＤを使用できる。つまりスレッド１７８はスレッド１７４のＩＤをスレッド１８２で目標とされたスレッド間メッセージのためのアドレスとして使用できる。
【０１４８】
スレッド１７４は、メッセージを受け取るといつでも、そのメッセージの表現をバイナリーバッファー（図示せず）中に生成し、標準プロトコルを用いそのバッファーをネットワーク１８６を介して遠隔スレッド１７６に送る。スレッド１７６はついでバイナリーバッファー表現を標準メッセージに翻訳し戻して該メッセージをスレッド１８２に送る。
【０１４９】
メッセージを他の方向に送るのにも同じシステムが用いられる。もしスレッド１７６がメッセージを受け取ったら、そのメッセージは翻訳されてからネットワークを介してスレッド１７４に送られ、該スレッドはそれをスレッド１７８に送る。
【０１５０】
ここに開示したプロセッサーモジュールはハードワイヤー構成要素または表示された機能を行うべくプログラムにより変更された一般のコンピューター回路である。かくしてインタープリターは、ソフトウェアによりユーザーのソースコードを翻訳用語にコンパイルしかつタスクまたはジョブ、現行実行仮想スレッドに応じて選択された翻訳用語を処理することを行う仮想スレッドを生成する、デジタル回路として、得られる。
【０１５１】
インタープリター２４とその動作はランしているいかなるインタープリターのインスタンス、つまり異なるネイティブスレッド５０にも応用される。
【０１５２】
この発明は以上の記載例に限定されるものではない。
【図面の簡単な説明】
【図１】
この発明の仮想スレッド能力を有したコンピューターシステムのブロック線図である。
【図２】
図１中のプロセッサーの選択された構成要素の他の構成要素への接続を示すブロック線図である。
【図３】
図２のインタープリターの選択された構成要素のブロック線図である。
【図４】
メモリーに記憶されたスレッド状態データとそのリンクリスト構造のブロック線図である。
【図５Ａ】
図２のインタープリターにより行われる選択された動作の流れ線図である。
【図５Ｂ】
図２のインタープリターにより行われる選択された動作の流れ線図である。
【図５Ｃ】
図２のインタープリターにより行われる選択された動作の流れ線図である。
【図５Ｄ】
図２のインタープリターにより行われる選択された動作の流れ線図である。
【図５Ｅ】
図２のインタープリターにより行われる選択された動作の流れ線図である。
【図５Ｆ】
図２のインタープリターにより行われる選択された動作の流れ線図である。
【図６】
この発明の仮想スレッドを使用した２個のコンピューター間の通信のブロック線図である。
【図１】
2004522234.tif 000004
【図２】
2004522234.tif 000005
【図３】
2004522234.tif 000006
【図４】
2004522234.tif 000007
【図５Ａ】
2004522234.tif 000008
【図５Ｂ】
2004522234.tif 000009
【図５Ｃ】
2004522234.tif 000010
【図５Ｄ】
2004522234.tif 000011
【図５Ｅ】
2004522234.tif 000012
【図５Ｆ】
2004522234.tif 000013
【図６】
2004522234.tif 000014
【国際公開パンフレット】
2004522234.tif 000015
2004522234.tif 000016
2004522234.tif 000017
2004522234.tif 000018
2004522234.tif 000019
2004522234.tif 000020
2004522234.tif 000021
2004522234.tif 000022
2004522234.tif 000023
2004522234.tif 000024
2004522234.tif 000025
2004522234.tif 000026
2004522234.tif 000027
2004522234.tif 000028
2004522234.tif 000029
2004522234.tif 000030
2004522234.tif 000031
2004522234.tif 000032
2004522234.tif 000033
2004522234.tif 000034
2004522234.tif 000035
2004522234.tif 000036
2004522234.tif 000037
2004522234.tif 000038
2004522234.tif 000039
2004522234.tif 000040
2004522234.tif 000041
2004522234.tif 000042
2004522234.tif 000043
2004522234.tif 000044
2004522234.tif 000045
2004522234.tif 000046
2004522234.tif 000047
2004522234.tif 000048
2004522234.tif 000049
2004522234.tif 000050
2004522234.tif 000051
2004522234.tif 000052
2004522234.tif 000053
2004522234.tif 000054
2004522234.tif 000055
2004522234.tif 000056
2004522234.tif 000057
2004522234.tif 000058
2004522234.tif 000059
2004522234.tif 000060
2004522234.tif 000061
2004522234.tif 000062
2004522234.tif 000063
2004522234.tif 000064
2004522234.tif 000065
2004522234.tif 000066
2004522234.tif 000067
2004522234.tif 000068
2004522234.tif 000069
2004522234.tif 000070
2004522234.tif 000071
2004522234.tif 000072
2004522234.tif 000073
【国際公開パンフレット（コレクトバージョン）】
2004522234.tif 000074
【国際調査報告】
2004522234.tif 000075