(57)【特許請求の範囲】
【請求項１】
複数の並行に実行されるスレッドによりプログラムを実行する手段と、
あるスレッドの実行状態を取得または該スレッドの実行権限を変更または該スレッドの実行を停止・再開する操作をどのスレッドから実行できるかを示す権限情報を記憶する手段と、
あるスレッドが他のスレッドに操作を加えようとする際に、前記権限情報に基づいてこの操作を行う権限があるか否かを検証する手段と、
権限があると検証された場合に前記操作の実行を許可する手段とを具備したことを特徴とするプログラム実行管理装置。
【請求項２】
前記記憶する手段は、スレッドに対する操作の権限情報に加えて予め時刻間隔を示す情報を記憶し、前記検証する手段が検証するとき、この記憶した時刻間隔に基づいて前記権限情報が示す権限が検証されるようにすることを特徴とする請求項１記載のプログラム実行管理装置。
【請求項３】
複数の並行に実行されるスレッドにより、複数の領域に分割された論理アドレス空間に配置された各プログラムを実行する手段と、
あるスレッドの実行状態を取得または該スレッドの実行権限を変更または該スレッドの実行を停止・再開する操作をどのスレッドがどの領域に存在するときに実行できるかを示す権限情報を記憶する手段と、
あるスレッドがある領域から他のスレッドに操作を加えようとする際に、前記権限情報に基づいてこの操作を行う権限があるか否かを検証する手段と、
権限があると検証された場合に前記操作の実行を許可する手段とを具備したことを特徴とするプログラム実行管理装置。
【請求項４】
前記プログラム実行管理装置は、
複数の領域に分割された論理アドレス空間のうちのある領域をどのスレッドがアクセスできるかを示すメモリアクセス許否情報を記憶する手段と、
あるスレッドが他の領域にアクセスしようとする際に前記許否情報によりこのアクセスが許可されるか否かを検証する手段と、
許可されると検証された場合にアクセスしようとする論理アドレスを物理アドレスに変換する手段と
をさらに備え、
各スレッドに対応して確保された論理アドレス空間中の領域に各スレッドが使用する情報を記憶することにより、
前記許否情報により示される許否により、前記他のスレッドに確保された論理アドレス空間中の領域に前記操作を加えようとしたスレッドがアクセスする権限があるか否かを検証するようにしたことを特徴とする請求項１〜３に記載のプログラム実行管理装置。
【請求項５】
複数の並行に実行されるスレッドによりプログラムを実行する計算機において、
あるスレッドの実行状態を取得または該スレッドの実行権限を変更または該スレッドの実行を停止・再開する操作をどのスレッドから実行できるかを示す権限情報を記憶し、
あるスレッドが他のスレッドに操作を加えようとする場合、前記権限情報に基づいてこの操作を行う権限があるか否かを検証し、
権限があると検証された場合に前記操作の実行を許可する
ことを特徴とするプログラム実行管理方法。
【請求項６】
前記権限情報を記憶するとき、スレッドに対する操作の権限情報に加えて予め時刻間隔を示す情報を記憶し、前記検証の際、この記憶した時刻間隔に基づいて前記権限情報が示す権限が検証されることを特徴とする請求項５記載のプログラム実行管理方法。
【請求項７】
複数の並行に実行されるスレッドによりプログラムを実行する計算機において、
あるスレッドの実行状態を取得または該スレッドの実行権限を変更または該スレッドの実行を停止・再開する操作をどのスレッドがどの領域に存在するときに実行できるかを示す権限情報を記憶し、
あるスレッドがある領域から他のスレッドに操作を加えようとする場合、前記権限情報に基づいてこの操作を行う権限があるか否かを検証し、
権限があると検証された場合に前記操作の実行を許可する
ことを特徴とするプログラム実行管理方法。
【請求項８】
複数の領域に分割された論理アドレス空間のうちのある領域をどのスレッドがアクセスできるかを示すメモリアクセス許否情報を記憶し、
あるスレッドが他の領域にアクセスしようとする場合、前記許否情報によりこのアクセスが許可されるか否かを検証し、
許可されると検証された場合にアクセスしようとする論理アドレスを物理アドレスに変換するステップをさらに有し、
各スレッドに対応して確保された論理アドレス空間中の領域に各スレッドが使用する情報を記憶することにより、
前記許否情報により示される許否により、前記他のスレッドに確保された論理アドレス空間中の領域に前記操作を加えようとしたスレッドがアクセスする権限があるか否かを検証するようにしたことを特徴とする請求項５〜７に記載のプログラム実行管理方法。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は、計算機システム中でのプログラム実行スレッドの実行を管理する装置に関するものである。
【０００２】
【従来の技術】
近年マイクプロセッサの性能向上により複数の小型のコンピュータをネットワークでつないで使用することが通常のこととなった。
またマイクロプロセッサの使用範囲の拡大により、オペレーティングシステム（ＯＳ）はさまざまな適用範囲に対応することが必要であり、柔軟な構成をとることができることが求められている。このため、従来は、利用用途やハードウェアの種類により複数のＯＳを使いわけてきた。１つのＯＳで広い用途をカバーするためにマイクロカーネル化させたオペレーティングシステムの技術がある。これは、必要最小限の機能のみをこのマイクロカーネルにもたせ、それ以外の機能は、マイクロカーネル外のユーザプログラムとして提供するものである。こうすることで、従来の複数のＯＳ機能を１つのマイクロカーネル上にユーザプログラムの形で提供することが可能となり、柔軟な構成が実現できる。
【０００３】
このようなオペレーティングシステムでは、プログラム実行の制御対象としてプロセスまたはスレッドと呼ばれる制御単位が用いられる。個々のスレッドは独立にプロセッサのレジスタ値やスタックなどを持ち、オペレーティングシステムによりプロセッサを割り当てられた間だけプログラムを実行し、一定時間後またはハードウェア割り込みなどが発生したときにオペレーティングシステムはスレッドに対するプロセッサの割り当てを解除して他のスレッドへプロセッサを割り当てる。個々のスレッドは独立したレジスタ値を持っているため、仮想的に並列に動いているプロセッサであるとみなすことができる。
【０００４】
このようなオペレーティングシステム上でスレッド自体を操作したいとき、すなわちスレッドの実行を一時停止したり再開したりしたいときやスレッドを強制的に消滅させたいとき、またはスレッドの情報（レジスタ値やスタック等の内部状態）を調べたいときのため、オペレーティングシステムはスレッド操作命令群を備えており、あるスレッドから別のスレッドを操作することが可能である。このようなスレッド操作命令群は、ユーザプログラムからシステムコールとしてＯＳに指示し、利用できるようになっている。
【０００５】
このようなスレッド操作命令があるときに、どのスレッドからでもスレッド操作命令を発行できるようにすると、不当な操作もできることになってしまうので保護の機能が必要になる。たとえば、スレッドを強制的に消滅させるようなことは特定の権限を持つスレッドだけから行えるようにすることが必要になる。
【０００６】
さらに、仮想空間が複数あり、仮想空間ごとに１つのプログラムやデータが配置されており、スレッドもその空間内しか動きまわれないようなＭａｃｈ（参考文献：「分散オペレ−ティングシステム」前川守他編、共立出版）をはじめとするシステムの場合、同じ空間内に存在するスレッドの保護を同一とし、スレッドの保護をメモリ空間の保護に依存する方法をとっている。しかし、それらのスレッドを区別して保護することはできない。また、単一仮想空間のシステムのように、１つのアドレス空間内にすべてのプログラムが配置され、複数のスレッドが存在する場合、スレッドの保護はメモリ保護だけではなくオペレーティングシステムにより権限の設定が必要になる。
【０００７】
ひとつの方法は、スレッドの所有者を決めて、同一の所有者のスレッド間ではスレッドの操作を許す方式であり、Ｕｎｉｘオペレーティングシステムのｓｉｇｎａｌはこれに相当する。しかしこれでは同一の所有者のスレッド間の保護の柔軟性に欠け、さらに、操作権限を他の所有者のスレッドに渡すことができない。また、複数の所有者のスレッドからのスレッド操作を可能にしたりできないなど、柔軟にスレッドの操作ができるようなスレッド保護機能が不足していた。
【０００８】
【発明が解決しようとする課題】
このように、従来のスレッド実行管理メカニズムでは、操作権限の設定に柔軟性に欠けたか、または、同一の仮想アドレス空間を共有しているスレッド間では保護がなかったか、または制約が強かった。
【０００９】
以上のような状況に鑑み、本発明は別々の仮想空間にいるスレッド間はもとより、同一仮想アドレス空間を共有しているスレッド間でのスレッド操作命令において、同一の方法で柔軟性があり、かつ十分な保護を行うプログラム実行管理装置を提供することを目的とする。
【００１０】
【課題を解決するための手段】
本発明では個々のスレッドに対してどのスレッドから操作できるかという情報を登録したリストを設け、このリストにより許可されている場合に限り、操作を許可する。
また、メモリ保護機構を用いたスレッド保護方法により、スレッド保護のために新規のハードウェアを必要とせずに実現できるようになる。
【００１１】
【作用】
本発明によれば、スレッドごとにアクセス可否を示す情報があるので、不当な操作命令や誤った操作命令からスレッドを保護することができる。さらに、このような誤った操作命令を検出できるため、プログラムの誤り（バグ）の検出が容易になる。
【００１２】
また、複数のスレッドが同一の論理アドレス空間を共有し、当該論理アドレス空間が複数のセグメントに分割されていて各セグメントに対してアクセス制御リストを指定できるようなシステムにおいて、
各スレッドに対して一意に対応するセグメントを割り当て、そのセグメントのアクセス制御リストをスレッドのアクセス制御リストとして用いることにより、新たにスレッド操作の権限判定のための命令をプロセッサの命令セットに追加せずとも高速なスレッドアクセス権限管理が可能になる。
【００１３】
【実施例】
以下、図面を参照して本発明の一実施例について説明する。
（実施例１）
本装置は、オペレーティングシステム（ＯＳ）と呼ばれる計算機システム全体の実行制御を行うものの構成要素の一部である。ＯＳは計算機資源であるメモリ、プロセッサ、周辺機器を管理し、また、ユーザプログラムとよばれるユーザが指示した実務上の処理を行うプログラムの実行を制御する。一つの装置上には複数のユーザプログラムがのっており、ＯＳがそれらのプログラム間の制御も行う。
【００１４】
ユーザプグラムは、実行上に必要となる物理メモリなどの資源を確保したり、周辺機器にデータを入出力したり、他のユーザプログラムにデータを転送したり、処理を依頼したり、実行を制御するためにＯＳに対して指示を行うことが必要となる。このＯＳへ対する指示をシステムコールを呼ばれる特別な手段で行う。本実施例では、システムコールのうち、ユーザプログラムの制御に関して説明する。
【００１５】
図１は、本実施例の全体構成図である。
プログラム記憶部１には、計算機で処理する命令が記述されたユーザプログラムや処理する対象のデータ、計算機で処理途中の結果を一時的に記憶するスタックなどのデータがメモリ空間上に蓄えられている。メモリ空間は、複数の領域に区切られて管理され、それぞれの領域には、お互いを区別するための識別子がついており、メモリ領域ごとにプログラムやデータやスタックを配置している。
【００１６】
さらに、プログラム記憶部１に蓄えられているプログラムを解釈実行し、データを処理する実行主体であるプロセッサ２と、プロセッサ内の状態を管理するスレッド管理部３、プロセッサの実行状態の切り替え処理を行う実行状態切り替え部４がある。
【００１７】
プロセッサ２内には、命令の実行途中に一時的に利用するレジスタ類、現在実行している命令のプログラム記憶部での位置を示すためのプログラムカウンタ（ＰＣ）、スタックデータの先頭位置を示すスタックポインタ（ＳＰ）などが存在し、これら一連のデータを入れ替えることで、複数の別々のユーザプログラムの処理を時分割で並行して進めることが可能となる。
【００１８】
スレッドとは、上記プロセッサ内で使用する一連のデータのことを呼び、これを複数組用意し、このスレッドを切り替えてプロセッサにセットし実際に実行させることにより、時分割処理が可能となる。
【００１９】
メモリ領域ＩＤ記憶部５は、現在実行中のプログラムがプログラム記憶部１のどのメモリ領域に存在しているかを、そのメモリ領域のＩＤとして記憶しているものである。これは、プロセッサ内のＰＣの値を利用し、現在実行中のメモリ領域ＩＤを求めて、記憶している。このメモリ領域ＩＤは、現在実行中のプログラムＩＤとみなすこともできる。
【００２０】
スレッド管理部３の中にはスレッド管理テーブルと呼ぶ表があり、プロセッサにセットするレジスタの情報やその他の情報がスレッドごとに管理されている。スレッドには、お互いを区別するためにスレッド識別子（スレッドＩＤ）がついている。
【００２１】
実行状態切替部４は、現在プロセッサ上で実行しているスレッド（スレッドＩＤ＝１）を中断し、スレッド（スレッドＩＤ＝１）の状態をスレッド管理テーブルの所定の位置に退避し、別のスレッド（スレッドＩＤ＝２）を起動すべく、スレッド管理テーブルのスレッド（スレッドＩＤ＝２）の情報をプロセッサ１に再セットし、スレッド（スレッドＩＤ＝２）の実行を再開させる。また、実行状態切替部４は、現在実行中のスレッドＩＤをスレッドＩＤ記憶部６にセットする。実行状態切替部４には、さらに、どのスレッドをセットし退避するかを決定するスレッドスケジューリング機構と、いつスケジューリングするか指示するタイマ部が存在する（図示していない）。
【００２２】
スレッド操作権限記憶部７は、スレッド保護に関するテーブルを保持し、スレッドごとにスレッドに対する操作を実行する権限がどうなっているかを記憶するもので、操作権限判定部１２で使用される。
【００２３】
さて、システムコールとしてユーザプログラムを実行しているあるスレッドが他のスレッドに対して制御しようとする例として、Ｔｈｒｅａｄ＿Ｇｅｔ＿Ｓｔａｔｕｓシステムコールを発行する場合について説明する。
【００２４】
このシステムコールは、スレッドＩＤで指示されたスレッドの状態、つまりそのスレッドのレジスタ類の情報を、このシステムコ−ルの呼び出し元のユーザプログラムに通知するものである。  いま、スレッド１（スレッドＩＤ＝１）のスレッドがプログラムＡ（メモリ領域ＩＤ＝Ａ）を実行中、そこでスレッド２（スレッドＩＤ＝２）の情報をこのシステムコールで得ようとしたとする。Ｃ言語で記載されているプログラムＡでは、次のように記されている。
【００２５】
ｅｒｒ  ＝Ｔｈｒｅａｄ＿Ｇｅｔ  ＿Ｓｔａｔｕｓ（２，＆Ｔｈｒｅａｄ＿Ｓｔａｔｕｓ）；
ここで、関数Ｔｈｒｅａｄ＿Ｇｅｔ＿Ｓｔａｔｕｓがスレッドの情報を得るシステムコールであって、第１引数の２は、スレッドＩＤ＝２の情報を得ることを指示しており、第２引数の＆Ｔｈｒｅａｄ＿Ｓｔａｔｕｓはシステムコールの結果得られたスレッド２の情報を格納するメモリ領域の先頭位置を指示している。また、このシステムコールの実行が成功したかどうかは、この関数の返り値として変数ｅｒｒに入る。
【００２６】
この関数をプログラムＡのスレッド１が実行すると、スレッド１はシステムコールによりプロセッサの実行モードをユーザレベルから特権レベルに遷移させ、ＯＳを呼び出す。特権レベルとは、ＯＳが処理を行う専用レベルのことである。
【００２７】
呼び出されたＯＳでは、ＯＳ内のシステムコール受付部８に処理が移る。ここでは、このシステムコールを呼び出した元のユーザプログラムの中断処理を行い、要求されたシステムコールの種類と指示された引数を受取り、それぞれその情報を引数検出部９とシステムコールの種類判別部１０に送る。
【００２８】
本例では、指示されたシステムコールは、Ｔｈｒｅａｄ＿Ｇｅｔ＿Ｓｔａｔｕｓなので、システムコールの種類判定部１０で、次には、Ｔｈｒｅａｄ＿Ｇｅｔ＿Ｓｔａｔｕｓ実行部１１を呼び出す。
【００２９】
そこでの処理は、図２に示したスレッド操作権限記憶部７を使って行われる。この記憶部には、図に示したようなテーブルを保持している。テーブルには、操作スレッドＩＤ、対象スレッドＩＤ、操作スレッドが存在するメモリ領域ＩＤ、スレッド操作権限の各エリアを持っている。
【００３０】
操作スレッドＩＤとはスレッド操作のシステムコールを実行しようとしているスレッドのスレッドＩＤのことで、対象スレッドＩＤとはこのシステムコールの引数で指定された操作対象のスレッドＩＤを示す。また、操作スレッドが存在するメモリ領域ＩＤとは、この実行されようとしているシステムコールを含むプログラムの存在するメモリ領域のＩＤのことであり、スレッド操作権限とは、どういうスレッド操作が可能かを示すもので、スレッドの内部状態を読み出す権限、スレッドの内部状態を変更する権限、スレッドの実行を停止／再開する権限の３つの権限を独立に指定できる。
【００３１】
たとえば図の例では、スレッド１（スレッドＩＤ＝１）が発したシステムコールでは、スレッド２（スレッドＩＤ＝２）の内部状態の参照と変更は可能だが、スレッド２（スレッドＩＤ＝２）の実行の停止／再開はできないことを示している。また、スレッド１（スレッドＩＤ＝１）は、スレッド３（スレッドＩＤ＝３）に対しては実行の停止／再開はできるがそれ以外のスレッド操作はできない。さらに、スレッド１（スレッドＩＤ＝１）は、スレッド２（スレッドＩＤ＝２）とスレッド３（スレッドＩＤ＝３）以外のスレッドに対しては、何のスレッド操作も受け付けないことを示している。
【００３２】
スレッド１（スレッドＩＤ＝１）が対象スレッドの場合の例で、テーブル中の操作スレッドが存在するメモリ領域ＩＤの部分にａｌｌという情報が保持されているが、これは、このシステムコールがどのユーザプログラムから行われていても同等で、システムコ−ルを実行するスレッドＩＤのみに実効権限が依存することを示している。
【００３３】
メモリ領域ＩＤの欄がａｌｌでないときは、そのＩＤのメモリ領域に存在するプログラムからシステムコールが実行された時の操作権限を規定する。たとえば、スレッド３（スレッドＩＤ＝３）が、プログラムＡ（メモリ領域ＩＤ＝Ａ）の実行中、スレッド１（スレッドＩＤ＝１）に対しては、すべての操作が可能であるが、それ以外のときは、操作不可である。つまり、スレッド３（スレッドＩＤ＝３）がプログラムＢ（メモリ領域ＩＤ＝Ｂ）の実行中、スレッド１（スレッドＩＤ＝１）に対して同様なシステムコールを実行しても操作できないし、スレッド５（スレッドＩＤ＝５）がプログラムＡ（メモリ領域ＩＤ＝Ａ）においてスレッド１（スレッドＩＤ＝１）に対して同じシステムコールを実行しても操作できない。このテ−ブルに記載のないスレッド操作は一切できない。
【００３４】
Ｔｈｒｅａｄ＿Ｇｅｔ＿Ｓｔａｔｕｓ処理部では、図３に示すステップに従って処理する。
まず、ステップ１にて、このシステムコールを実行した操作スレッドＩＤ、メモリ領域ＩＤをそれぞれスレッドＩＤ記憶部６とメモリ領域ＩＤ記憶部５から情報を得る。上述したように、現在実行中のスレッドＩＤは、実行状態切替部４でセットされ、現在実行中のメモリ領域ＩＤは、プロセッサの内部にあるＰＣの情報からセットされている。さらに、システムコールの第一引数から対象スレッドＩＤ検出部１３が対象スレッドＩＤを得ている。第二引数からは、スレッド情報格納位置検出部１４が、このシステムコ−ルの実行結果を格納するユ−ザプログラムのメモリ位置を検出する。
【００３５】
次にステップ２にて、以上の３つの情報をもとにスレッド操作権限記憶部７のテーブルを引き、該当エントリをサーチする。もし、見つかれば、ステップ３に進み、なければステップ８を行うエラー処理部１５へ進む。
【００３６】
サーチは、テーブルの上から順に比較を行い、最初にマッチしたエントリの情報を次のステップ以降で利用する。テーブルのフィールドのａｌｌ部分は、すべてにマッチすることを意味する。もし、テーブルの最後のエントリまで比較し、マッチしなかったらサーチの失敗となる。
【００３７】
ステップ３では、見つかったエントリの操作権限を表す部分のうち、スレッド内部状態読出権限に該当する部分の情報を読み出し、許可か否かを判断する。この判定は操作権限判定部１２で行う。もし判定で許可されればステップ４へ進み、不許可になればステップ８のエラー処理へ移る。
【００３８】
次のステップ４では、対象スレッドに対して、許可されたスレッドの内部状態を読み出すためのスレッド管理テ−ブルの参照操作を実行する。この処理はスレッド状態参照実行部１６にて行う。ここでは、該当スレッドの内部状態であるスレッド情報を、スレッド情報格納位置検出部１４で指示されたメモリ中に格納する。
【００３９】
ステップ５にて、ステップ４での処理結果を判定する。処理が成功するとステップ６にて、成功を示すコードをシステムコール終了部１７へ伝える。失敗するとステップ７にて、失敗を示すコードをシステムコール終了部１７へ伝える。
【００４０】
ステップ８では、エラーコードをシステムコール終了部１７へ伝える。
Ｔｈｒｅａｄ＿Ｇｅｔ＿Ｓｔａｔｕｓ実行部１１での処理を終えると、最後にシステムコール終了部１７に処理が進む。このシステムコ−ルを実行したユ−ザプログラムに返す返値をシステムコールの返値として戻るように処理を行い、中断していた呼出元のユーザプログラムの実行ができるように復帰処理を行い、実行レベルを特権レベルからユーザレベルへ戻す処理を行う。
【００４１】
以下にはスレッドを操作する他のシステムコ−ルについて説明する。
Ｔｈｒｅａｄ＿Ｓｅｔ＿Ｓｔａｔｕｓ（スレッドＩＤ、スレッドステータス）なるシステムコールは、上記で説明した、Ｔｈｒｅａｄ＿Ｇｅｔ＿Ｓｔａｔｕｓの逆の操作で、第１引数に指定されたスレッドに引き数に指定されたスレッド情報をセットする。
【００４２】
ＯＳ内部の処理は、システムコール受付部８からシステムコールの種類判別部１０を経てＴｈｒｅａｄ＿Ｓｅｔ＿Ｓｔａｔｕｓ実行部に移る。Ｔｈｒｅａｄ＿Ｓｅｔ＿Ｓｔａｔｕｓ実行部は、Ｔｈｒｅａｄ＿Ｇｅｔ＿Ｓｔａｔｕｓ実行部１１のうちスレッド状態参照実行部１６をスレッド状態変更実行部に置き換えた構成を持つ。内部処理は、Ｔｈｒｅａｄ＿Ｇｅｔ＿Ｓｔａｔｕｓと同様であるが、スレッド操作権限記憶部７のテーブルをサーチする際、先ほどの例と違い、スレッドの内部状態を変更する権限をチェックして、権限があるかどうか判定する。そして、権限があるとスレッド状態変更実行部にて、変更処理する。変更処理は、第２引数で指定されたスレッド情報をスレッド管理部３の内部のスレッド管理テーブルの該当スレッドの該当部分に格納するものである。
【００４３】
Ｔｈｒｅａｄ＿Ｓｕｓｐｅｎｄ（スレッドＩＤ）なるシステムコールは、引き数で指定されたスレッドに対し実行の一時停止の処理を行うものである。この処理は、Ｔｈｒｅａｄ＿Ｇｅｔ＿Ｓｔａｔｕｓ実行部１１に代る、Ｔｈｒｅａｄ＿Ｓｕｓｐｅｎｄ実行部が行う。実行権があるかどうかの判定は、上記と同様で、スレッド操作権限のうちのスレッドの実行を停止／再開する権限で判定するところがちがう。そして権限がある場合には、Ｔｈｒｅａｄ＿Ｓｕｓｐｅｎｄ実行部の中のスレッド停止処理実行部が、対象スレッドの状態をスレッド管理部３内のスレッド管理テーブルから得る。管理テーブル内部には、ステータス情報を格納しているところがある。その情報が実行可能状態なら、停止状態へ変更する。また、停止状態なら、何もしない。また、対象スレッドがこのシステムコールを発したスレッド自身のときは、上記処理に続き、本システムコール終了時に実行状態切替部４に制御を移し、次に動作するスレッドを決定し起動してもらう。
【００４４】
別の実施例として、停止状態に複数の停止状態レベルをとることができる場合、実行可能状態のときにＴｈｒｅａｄ＿Ｓｕｓｐｅｎｄシステムコ−ルが発せられたら、停止状態レベルを０へ変更し、既に停止状態であったならば停止状態レベルを１つ上げる。このレベルは、停止状態が厳しくなかなか実行に移らない状態なほど大きな値が与えられるものである。
【００４５】
Ｔｈｒｅａｄ＿Ｒｅｓｕｍｅ（スレッドＩＤ）なるシステムコールは、引数で指定されたスレッドに対し実行再開の処理を行うものである。この処理は、Ｔｈｒｅａｄ＿Ｒｅｓｕｍｅ実行部が行い、実行権があるかどうかの判定は、Ｔｈｒｅａｄ＿Ｓｕｐｅｎｄ実行部におけるのと同様である。権限がある場合には、Ｔｈｒｅａｄ＿Ｒｅｓｕｍｅ実行部中のスレッド再開実行部が、対象スレッドの状態をスレッド管理部３内のスレッド管理テーブルから得る。管理テーブル内部には、ステータス情報を格納しているところがあり、その情報を停止状態なら、実行可能状態へ変更する。既に実行可能状態であったならば何もしない。
【００４６】
別の実施例として、停止状態に複数の停止状態レベルをとることができる場合、Ｔｈｒｅａｄ＿Ｒｅｓｕｍｅシステムコ−ルが発せられたら、停止状態なら停止状態レベルを１つ下げる。もし、既に停止状態レベルが０なら、実行可能状態へ変更し、既に実行可能状態なら何もしない。
【００４７】
本実施例では、スレッド実行／再開の権限を１つの権限にまとめているが、別々の権限にするために、実行停止の権限を、スレッドの内部状態を書き出す権限とスレッドの実行を停止／再開する権利の２つともある場合に可能とし、実行再開の権限を、スレッドの内部状態を読み出す権限とスレッドの実行を停止／再開する権利の２つともある場合に可能とする実施例も可能である。
【００４８】
なお、本実施例ではスレッドの内部状態を読み出す権限、変更する権限（消去する権限を含む）、スレッドの実行を停止／再開する権限の３種類を独立に指定できるようにしているが、これに限られるものではない。指定できる種類（スレッド操作権限記憶部の操作権限に含まれるフィールドの数）を増やし、停止権限、再開権限を別個に指定できるようにしても、スレッドを消去する権限をこれらとは別に設けてもよい。
【００４９】
また、上では各システムコールに対応する実行部について別々に説明したが、実際のシステムではこれら実行部を必要な分だけ並列に設けておく。その際、共通の機能である１３，１４，１５，７，１２についてはいずれのシステムコールについても同一のものあるいは共通のものを利用するようにし、各システムコールで実行する内容が異なる１６に相当するもののみを並列に設けて、操作権限判定と並行してあるいはその後に対応する実行部へ処理を振り分ければよい。
（実施例２）
次に、実施例１にスレッド制御に関して時間的制約を付加した例を説明する。これは、プラント制御のためのリアルタイム処理のように決められた時間内に処理を終わらさなければならない場合に必要な処理である。
【００５０】
実施例のプログラム構成を図４に示す。実際にプラント制御用のリアルタイム処理を行うプロセス制御プログラム（メモリ領域ＩＤ＝Ｂ）と、そのプログラムに常駐し、リアルタイム処理を実行するリアルタイムスレッド（スレッドＩＤ＝５）がある。
【００５１】
さらにそのプロセス制御プログラム、リアルタイムスレッドを制御する制御プログラム（メモリ領域ＩＤ＝Ｃ）、制御スレッド（スレッドＩＤ＝４）がある。その他、上記以外の一般のユ−ザプログラムやスレッドが同じシステム上に複数存在できる。その例として、上記のプログラムを保守するためのデバッグプログラム（メモリ領域ＩＤ＝Ｄ）とデバック処理をする任意のスレッド（スレッドＩＤ＝６）がある。なお、本例でのメモリ空間上でのプロクラム配置を図の（ｂ）に示す。
【００５２】
この例では、プラント制御の運用中でリアルタイム処理が必要な時間は、９：００から１７：００である。この間は、リアルタイムスレッドはその処理に専念するため、他のスレッドからの制御を受けない。例外は、制御スレッドからの制御である。つまり、制御プログラムを実行する制御スレッドのみが、たとえば、プラント異常動作時の停止等の処理のみが可能となる。
【００５３】
プラントの操業の終わる１７：００以降は、リアルタイム処理が必要ないので、上記のような制限はなくなり、一般のスレッドでも制御できる。これにより、デバッガーがプロセス制御プログラムをデバッグする際にリアルタイムレッドを制御可能になり、有効な措置である。
【００５４】
本実施例システムの全体構成は、実施例１の図１とほぼ等しい。付け加わった機能のみを図５を用いて説明する。
まず、スレッド操作権限記憶部７のテーブルの構成が図５のように変わる。新しくテーブルに有効期限を表すエントリが付加されている。ここには、設定されているスレッド操作の権限がどの時刻に有効かを示す情報が保持されている。
【００５５】
以上の設定を用いてプラント制御の例を実現するため、スレッド操作権限記憶部７のテーブルに図５に示すようにスレッド操作権限を設定する。なお、このテーブルへの新たな設定／削除／変更は、ユーザプログラムからそれぞれ専用のシステムコールで行う。その際に今までに設定されている権限と矛盾があるかどうかチェックも行われ、テーブルの設定の反映は、設定に矛盾のない形で行われる。
【００５６】
テーブルの（１）の設定により、運用時間の９：００から１７：００については、スレッドＩＤ＝４の制御スレッドは、メモリ領域ＩＤ＝Ｃの制御プログラムの実行中には、スレッドＩＤ＝５のリアルタイムスレッドに対して、すべてのスレッド操作ができる。また、（３）の設定により、１７：００以降も同様な操作が可能な設定となっている。
【００５７】
さて、スレッドＩＤ＝４の制御スレッド以外のスレッドは、（２）の設定により、スレットＩＤ＝５のリアルタイムスレッドに対して、９：００から１７：００までは、すべてのスレッド操作ができない。しかし、その時間帯をすぎると（３）の設定中で操作スレッドの欄がａｌｌなので、どのスレッドからでもすべての操作が可能となる。
【００５８】
以上の制御を実現するために、実施例１の構成に現在時刻記憶部１８を追加する。そして、実施例１における図３のステップ２にて、現在時刻情報を付加してテーブルを検索する。他は変わらない。
【００５９】
以下にはスレッド操作権限記憶部７のテーブルを図７のように変更した例を説明する。これは、従来のテーブルに新たに、対象スレッドが存在するメモリ領域ＩＤのフィールドを付加したものである。この場合、指定された操作メモリ領域のプログラムを実行中の指定された操作スレッドが、指定された対象メモリ領域にいる指定された対象スレッドに対するスレッド操作の権限を制限することになる。
【００６０】
これによれば、前例のようなプロセス制御リアルタイム処理を実現しようとする場合、メモリとスレッドの配置は図６のようにできる。この場合、前例と異なり、それぞれ制御プログラム実行用の専用の制御スレッド、プロセス制御用の専用リアルタイムスレッドは不要で任意のスレッドで実現できる。
【００６１】
つまり、複数のプログラム間に制御を移しながら一連の処理を行うようなスレッド構成でも実現できる。
この例でのスレッド操作権限記憶部７のテーブルの指定は、図７のようになる。つまり、テーブルの（１）の記述により、メモリ領域Ｃ（制御プログラム）を実行している任意のスレッドが、メモリ領域Ｂ（プロセス制御プログラム）を実行している任意のスレッドに対しては、９：００から１７：００間は、すべてのスレッド操作が可能になる。また、（３）の記述により、１７：００以降も同様にすべての操作が可能である。ところが、（２）の記述により、メモリ領域Ｃ以外のメモリ領域を実行している任意のスレッドからは、メモリ領域Ｂに存在するすべてのスレッドに対して９：００から１７：００の間はいっさいのスレッド操作ができない。しかし、１７：００以降は、（３）の記述によりすべてのスレッド操作が可能である。
【００６２】
スレッド操作権限記憶部７を含めた全体構成を図８に示す。新たにつけ加わったものは、対象メモリ領域ＩＤ検出部１９である。これは、システムコールで指定された対象スレッドＩＤから、現在そのスレッドが存在するメモリ領域ＩＤをスレッド管理テーブルを用いて検出するものである。その検出フローチャートを図９に示す。
【００６３】
そして、実施例１における図３のステップ２にて、現在時刻情報と対象メモリ領域ＩＤ情報を付加して検索する。他は変わらない。
（実施例３）
本実施例は、スレッド操作の許否の制御とメモリ管理とを連携させて行うものである。
【００６４】
図１０は、本実施例におけるメモリ管理の仕組みを示したものである。図に示すような論理アドレス空間は６４ビットの大きさを持っており、その中をいくつかの領域（セグメント）に分割されている。
【００６５】
ここでアドレス６４ビットを２つのフィールドに分割し、上位３２ビットをセグメント番号を示すものとし、下位３２ビットをそのセグメント内のオフセットを示すものとする。なお、１つのセグメントの大きさは可変である。
【００６６】
このセグメントは、それぞれがお互いに不正なアクセスをされないようにメモリ管理機構のメモリ保護機能により保護される。このメモリ保護機能はプロセッサがメモリアクセスを行う際に高速にそのアクセスが正当かどうかチェックするものであり、これはＯＳによって管理されている。
【００６７】
図１１は上記メモリ保護の機能を図示したもので、メモリ管理装置ＭＭＵ３０によって実現している。このＭＭＵには、現在実行しているスレッドの番号ＣＵＲＴＨを保持するレジスタであるスレッドＩＤ記憶部２５、プロセッサ２１内のプログラムカウンタ（ＰＣ）２２の値から現在実行しているプログラムの存在するセグメント番号を抽出するセグメント抽出部２６、これからアクセスしようとするアドレス（２３）のセグメント番号を抽出するセグメント抽出部２７、及びメモリ保護情報を高速に検索するためのキャッシュである連想メモリＴＬＢ２８を備えている。連想メモリＴＬＢの各エントリは、操作スレッドＩＤ、対象セグメントＩＤ、操作セグメントＩＤ（以上を「タグ」と言う）、メモリアクセス権限（読み出しＲ、書き込みＷ、実行Ｘ）のフィールドで構成される。
【００６８】
ここで、６４ビットの論理アドレスＡＤＤＲの上位３２ビットをセグメント番号ＭＳＩＤとし、下位３２ビットをセグメント内オフセットＯＦＳとして、このメモリ保護機構の動作について以下に説明する。ある論理アドレスＡＤＤＲのメモリをプロセッサがアクセスしようとするとき、ＭＭＵのセグメント抽出部２７セグメント抽出部２６はＡＤＤＲをセグメント番号ＭＳＩＤとセグメント内オフセットＯＦＳに分離する。また現在実行中のプログラムを示すプログラムカウンタＰＣの値から現在実行中のプログラムの存在するセグメント値ＰＣＭＳＩＤを抽出する。これらＭＳＩＤとＰＣＭＳＩＤ及び現在のスレッド番号を示すＣＵＲＴＨを連想メモリＴＬＢ２８に加える。ＴＬＢはこれら入力に適合するタグを持つエントリを探す。ただし全ビットが１であるようなフィールドがタグ中にある場合、それは任意の入力に適合する項目とみなされる。例えば、操作セグメントＩＤのフィールドが全ビット１であれば、操作スレッドかどのセグメントに存在する場合にも、そのタグは現在の状況に適合するものとしてこれをもつエントリが選択される。
【００６９】
そして、もし適合するエントリがあれば、ＴＬＢはそれに対するメモリアクセス権限のフィールドの内容ＰＥＲＭを出力する。アクセス権限判定部２９では、ＰＥＲＭの値を、これからしようとしているアクセスの種別記憶部２４の内容を表す信号ＡＣＣＥＳＳと比較し、このメモリアクセス要求が許可されているかどうかを判定する。許可されない場合はプロセッサ２１のエラー処理部３１に対してＦＡＵＬＴ信号を返す。また適合するタグがＴＬＢ２８中に見つからない場合も同様にプロセッサ２１に対してＦＡＵＬＴ信号を返す。もし許可される場合は、ＭＭＵ３０はここに図示しないアドレス変換機構によりプロセッサの出力する仮想アドレスを物理アドレスへ変換し、システムアドレスバスへと出力する。オペレーティングシステムはＴＬＢの内容を適切に更新することによりユーザ及びオペレーティングシステムの要求するメモリアクセス保護を実現する。
【００７０】
このようなメモリ管理機構を備えたシステムにおいて、図１２（ａ）のように各実行スレッドに対して固有のセグメントを割り付け、そのセグメント内にスレッド情報のうちユーザ書き換え可能な部分を置くことにより、スレッド操作の保護属性メモリ操作の保護に帰着させ、新たなハードウェアの追加をすることなく、メモリ保護のハードウェアを用いてスレッド操作のアクセス管理を行うことができる。
【００７１】
実施例１と同様に、プログラムセグメントＡ上のプログラムを実行しているスレッド１がスレッド２の制御情報にアクセスしようとする例で説明する。実施例１の場合と違って上記のメモリ管理機構を備えているため、同一論理アドレス空間内であっても異なるメモリセグメント上のプログラムでは異なるメモリ保護条件を設定することができる。そこで、オペレーティングシステムを構成するプログラムをあるセグメント中に置き、そのセグメント中のプログラムからは任意のメモリにアクセスできるようにメモリ保護条件を設定することにより、メモリアクセスに関しては特権レベルへの遷移と同等の効果を得ることができる。この場合、ＯＳに対するシステムコールは特別な命令ではなく、通常のセグメント間サブルーチン呼出し命令により行うことができる。
【００７２】
ここで、スレッド情報が図１３に示すようにスレッド１の情報がセグメント番号１０１に、スレッド２の情報がセグメント番号１０２にというように１対１に対応しているとする。オペレーティングシステムはこの対応関係を図１２（ａ）のようにスレッド管理テーブル中に記録している。
【００７３】
図１２（ｂ）は実施例１で示した動作例と同じように動作するようにＴＬＢ２８の内容を設定した例を示している。たとえばこの例においてスレッド１がセグメント９１中のプログラムを実行している時にスレッド２の内部情報を調べるためセグメント１０２内にあるメモリ内容を読み出す場合、ＭＭＵ３０はプロセッサがアクセスしたい仮想アドレスからセグメント番号１０２を抽出し、これとスレッド番号１とセグメント番号９１をキーとしてＴＬＢ２８を検索し、適合するエントリがあるのでそれに対するメモリ保護情報をアクセス権限判定部２９へ出力する。この例では読み出し権限（Ｒ）があるため、アクセスを許可する。
【００７４】
またもう１つの例として、図１２（ｂ）の状況でスレッド１がスレッド４の情報をアクセスしようとした場合はセグメント１０４内のメモリをアクセスするが、スレッド番号１とセグメント番号１０４をキーとしてＴＬＢを検索する。この場合は適合するエントリがないのでＴＬＢは不一致信号を出力し、ＭＭＵはアクセス不許可を示すＦＡＵＬＴ信号をプロセッサへ伝える。
【００７５】
すなわち、本実施例は、実施例１におけるスレッド管理テーブルの内容を論理アドレス空間の所定の位置に配置し、スレッド操作権限記憶部をＴＬＢに置き換えで実施例１と同様に動作させるようにしたものである。
【００７６】
【発明の効果】
以上詳述したように、本発明によればあるスレッドによる操作からあるスレッドを保護することを適切に行うことができる。
またメモリ保護機構を用いることにより新規ハードウェアの必要なく高速なスレッド操作保護を行うことができる。
【図面の簡単な説明】
【図１】本発明の実施例１に係るシステムの全体構成を示す図。
【図２】図１のスレッド操作権限記憶部７の内部構成例を示す図。
【図３】本実施例システムの動作を示すフロー図。
【図４】実施例２におけるプログラム構成例を示す図。
【図５】実施例２におけるスレッド操作権限記憶部７の内部構成例と関連システム構成を示す図。
【図６】実施例２における別のプログラム構成例を示す図。
【図７】図６に対応するスレッド操作権限記憶部７の内部構成例を示す図。
【図８】実施例２で図７に対するシステムの全体構成を示す図。
【図９】図８の対象メモリ領域ＩＤ検出部１９の動作を示すフロー図。
【図１０】実施例３における論理アドレス空間の説明図。
【図１１】実施例３に係るシステムの全体構成を示す図。
【図１２】実施例３におけるスレッド情報とセグメントの関係の説明図及び図１１のＴＬＢ２８の設定例を示す図。
【図１３】実施例３におけるスレッドの制御情報の論理アドレス空間への配置例を示す図。
【符号の説明】
１…プログラム記憶部、  ２，２１…プロセッサ、  ３…スレッド管理部、
４…実行状態切替部、  ５…メモリ領域ＩＤ記憶部、  ６…スレッドＩＤ記憶部、  ７…スレッド操作権限記憶部、  ８…システムコール受付部、  ９…引数検出部、  １０…システムコールの種類判定部、  １１…システムコール実行部、１２…操作権限判定部、  １３…対象スレッドＩＤ検出部、  １４…操作の種類判定部、  １５…エラー処理部、  １６…スレッド状態参照実行部、  １７…システムコール終了部、  １８…現在時刻記憶部、  １９…対象メモリ領域ＩＤ検出部、  ２２…プログラムカウンタ、  ２３…アクセスアドレス記憶部、  ２４…アクセス種別記憶部、  ２５…スレッドＩＤ記憶部、  ２６，２７…セグメント抽出部、  ２８…ＴＬＢ、  ２９…アクセス権限判定部、  ３０…ＭＭＵ。
【図１】
0003585510.tif 000002
【図２】
0003585510.tif 000003
【図３】
0003585510.tif 000004
【図４】
0003585510.tif 000005
【図５】
0003585510.tif 000006
【図６】
0003585510.tif 000007
【図７】
0003585510.tif 000008
【図８】
0003585510.tif 000009
【図９】
0003585510.tif 000010
【図１０】
0003585510.tif 000011
【図１１】
0003585510.tif 000012
【図１２】
0003585510.tif 000013
【図１３】
0003585510.tif 000014