(57)【要約】【課題】１回あたりのコンテキストスイッチ、特にリストアの処理時間を短縮し、システム全体のパフォーマンスを効率よく引き出すことができる計算機システムを提供することである。【解決手段】コンテキストリストア時に正しい実行コードをリストアする部分とトラップを発生する部分を決定する機能と、コンテキストリストア処理時に前記決定機能に基づいて一部の実行コードを正しくリストアし，他の部分はトラップを発生する命令を埋める機能と、サブプロセッサ実行中にトラップが発生したときに，コンテキストリストア時に埋めたトラップであることを識別し，該当する部分を主メモリからローカルメモリにリストアし実行を継続する機能とを備える。【選択図】  図１
2009123064.tif 000002
【特許請求の範囲】
【請求項１】
主メモリと、主メモリにアクセスできるメインプロセッサと、自らの中にローカルメモリを持ち実行コードはローカルメモリからのみフェッチできる１つ以上のサブプロセッサと、主メモリとローカルメモリとの間でデータをコピーするための通信路であるバスとを備えた計算機システムにおいて、主メモリとローカルメモリとの間でデータをコピーするためのＤＭＡ機能と、１つのサブプロセッサで複数のタスクを時分割で実行するために実行コードを含むコンテキストをローカルメモリから主メモリにセーブする機能と、主メモリからローカルメモリにリストアする機能と、コンテキストリストア時に正しい実行コードをリストアする部分とトラップを発生する部分を決定する機能と、コンテキストリストア処理時に前記決定機能に基づいて一部の実行コードを正しくリストアし、他の部分はトラップを発生する命令を埋める機能と、サブプロセッサ実行中にトラップが発生したときに、コンテキストリストア時に埋めたトラップであることを識別し、該当する部分を主メモリからローカルメモリにリストアし実行を継続する機能とを有することを特徴とする計算機システム。
【請求項２】
請求項１の計算機システムにおいて、コンテキストリストア時にトラップを発生する命令で埋める処理は、正しい実行コードをコピーする処理と並行して、サブプロセッサが自らローカルメモリに書き込むことを特徴とする計算機システム。
【請求項３】
請求項１の計算機システムにおいて、メインプロセッサ内にキャッシュ領域と、キャッシュの一部を消去されないように固定する機能と、キャッシュから直接サブプロセッサのローカルメモリにコピーする機能とを有し、コンテキストリストア時にトラップを発生する命令で埋める処理は、キャッシュの一部領域にトラップを発生する命令を固定しておき、この領域からローカルメモリにコピーすることを特徴とする計算機システム。
【請求項４】
請求項１または２または３の計算機システムにおいて、サブプロセッサにタスクの処理を依頼するアプリケーションが実行コードをリストアする部分とトラップを発生する命令で埋める部分とを指定する機能を有し、コンテキストリストア時に正しい実行コードをリストアする部分とトラップを発生する部分を決定する方法は、前記アプリケーションの指定に従うことを特徴とする計算機システム。
【請求項５】
請求項１乃至４のいずれか一の計算機システムにおいて、サブプロセッサ実行中にトラップが発生したときに、次回のコンテキストリストア処理からは該当部分について実行コードをリストアするように動作を変更することを特徴とする計算機システム。
【請求項６】
請求項５の計算機システムにおいて、一部の部分をトラップを発生する命令を埋める部分から実行コードをリストアする部分に変更した際に、同時に同じ大きさの別の部分を実行コードをリストアする部分からトラップを発生する命令を埋める部分に変更することを特徴とする計算機システム。
【請求項７】
請求項６の計算機システムにおいて、部分ごとにトラップを発生した回数を記録する機能を有し、その発生した回数が少ない順に、優先的に実行コードをリストアする部分からトラップを発生する命令を埋める部分に変更することを特徴とする計算機システム。
【請求項８】
請求項６または７の計算機システムにおいて、部分ごとにトラップを発生した最新の時刻を記録する機能を有し、その時刻が古い順に、優先的に実行コードをリストアする部分からトラップを発生する命令を埋める部分に変更することを特徴とする計算機システム。
【請求項９】
請求項６乃至８のいずれか一の計算機システムにおいて、１個あたりのサブプロセッサで処理するタスクの数に応じて、その数が多いほど実行コードをリストアする部分を少なく、トラップを発生する命令を埋める部分を多くするように決定することを特徴とする計算機システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のプロセッサを搭載した計算機システムに関する。
【背景技術】
【０００２】
近年、１つのＩＣチップ内または１つの計算機内に複数のプロセッサを搭載することにより、全体の処理性能を向上した計算機システムが増えてきている。
【０００３】
これらの中には、同一機能のプロセッサ要素を複数並べる対称構成のシステムもあれば、１つないし少数のメインプロセッサと複数のサブプロセッサで構成する非対称型のシステムも存在する。
【０００４】
後者のような非対称マルチプロセッサシステムでは、例えばＯＳが行うタスク管理などの汎用的な処理をメインプロセッサが行い、アプリケーションが要求する高速な演算処理のタスクをサブプロセッサで行うなど、プロセッサ要素の特性を十分に生かすようにタスクを分散するのが通例である。
【０００５】
さらに、このような高速演算をサブプロセッサが行う構成では、サブプロセッサ内に主メモリよりも高速なローカルメモリを実装し、プログラムの実行コードをこのローカルメモリにコピーして、サブプロセッサがここから命令をフェッチして実行する方式がある。すなわち、サブプロセッサ実行時には、主メモリを使用するためのＭＭＵなどが動かず、常に高速なローカルメモリだけをアクセスする。この方式を用いることで、命令をフェッチするたびに頻繁に低速な主メモリにアクセスする必要がなくなり、サブプロセッサの性能を十分に引き出すことができる。
【０００６】
一方、サブプロセッサを使用したいタスクの数が物理的なサブプロセッサよりも多くなり、かつそれぞれのタスクがある一定の処理時間内で一定量の計算を行いたい、という要求が生じる場合がある。このようなケースにおいては、サブプロセッサを時分割でタスクに割り振る必要が生じる。
【０００７】
例えば、４つのサブプロセッサが存在し、サブプロセッサの最大演算性能の０．５倍程度の計算量を必要とする６つの持続的タスクが存在する場合を考える。必要な演算性能は６タスク×０．５＝３であり計算機システムとしてのサブプロセッサ能力は４で足りるが、タスクにサブプロセッサを割り振る機能がないと、不運な２つのタスクは他の４つのタスクのいずれかが完全に終了するまで待たされることになり、一定時間内に一定量の処理をするという要求を満たせないことになってしまう。
【０００８】
このようなケースにおいて、どのタスクにどのくらいのサブプロセッサ時間を割り振るかを決定したら、実際にタスクを切り替える処理が必要になる。すなわち、サブプロセッサ内の現在実行しているタスクの状態を保存し、次に実行するタスクの状態をサブプロセッサに充足する処理である。
【０００９】
タスクの状態は具体的にはプロセッサのレジスタの値やメモリ上のデータ構造の値で構成され、これを「コンテキスト」、コンテキストの切り換え処理を「コンテキストスイッチ」、コンテキストスイッチ処理のうち現在のコンテキストを保存する処理を「コンテキストセーブ」、次のコンテキストを充足する処理を「コンテキストリストア」と呼ぶ。
【００１０】
ここで、複数のプロセッサにリアルタイム処理を実行するためのスレッド群を割り当てるスケジューリング方法であって、スレッド間の結合属性を示す結合属性情報に基づいて、リアルタイム処理を実行するためのスレッド群の中から、互いに協調して動作する複数のスレッドの集合である密結合スレッドグループを選択する選択ステップと、選択ステップによって選択された密結合スレッドグループに属するスレッド群がそれぞれ別のプロセッサによって同時に実行されるように、密結合スレッドグループに属するスレッド群を当該スレッド群の個数分のプロセッサにそれぞれディスパッチするためのスケジューリング処理を実行するステップとを具備したものがある（例えば、特許文献１参照）。
【特許文献１】特開２００５−１８５９０号公報
【発明の開示】
【発明が解決しようとする課題】
【００１１】
しかし、プログラムの実行コードをこのローカルメモリにコピーして実行する構成においては、ローカルメモリ上の実行コードもコンテキストに含める必要があり、コンテキストリストアの処理のたびにこれをローカルメモリにコピーする必要がある。一般的にローカルメモリの大きさは、レジスタの大きさなどに比して数十倍から数百倍の大きさであることが多く、またこのコピーは比較的低速な主メモリのアクセスであるため、このような構成においてはコンテキストスイッチの処理自体に相当な時間を要するようになる。
【００１２】
１つのサブプロセッサあたりが処理すべきタスク数が増えてくると、一定時間あたりに必要なコンテキストスイッチ回数が増える。このようなケースにおいては前記のように時間のかかるコンテキストスイッチを多数回実行するため、サブプロセッサの処理時間の対部分をコンテキスト処理に費やすことになり、システム全体のパフォーマンスにとって問題となる。
【００１３】
サブプロセッサのプログラム実行コードをローカルメモリにコピーして実行する構成の非対称マルチプロセッサ計算機システムにおいて、タスク数が増えてくるとコンテキストスイッチの処理自体にサブプロセッサ時間の多くを費やしてしまうという問題があった。
【００１４】
本発明の目的は、１回あたりのコンテキストスイッチ、特にリストアの処理時間を短縮し、システム全体のパフォーマンスを効率よく引き出すことができる計算機システムを提供することである。
【課題を解決するための手段】
【００１５】
本発明の計算機システムは、主メモリと、主メモリにアクセスできるメインプロセッサと、自らの中にローカルメモリを持ち実行コードはローカルメモリからのみフェッチできる１つ以上のサブプロセッサと、主メモリとローカルメモリとの間でデータをコピーするための通信路であるバスとを備えた計算機システムにおいて、主メモリとローカルメモリとの間でデータをコピーするためのＤＭＡ機能と、１つのサブプロセッサで複数のタスクを時分割で実行するために実行コードを含むコンテキストをローカルメモリから主メモリにセーブする機能と、主メモリからローカルメモリにリストアするコンテキストスイッチ機能と、コンテキストリストア時に正しい実行コードをリストアする部分とトラップを発生する部分を決定する機能と、コンテキストリストア処理時に前記決定機能に基づいて一部の実行コードを正しくリストアし、他の部分はトラップを発生する命令を埋める機能と、サブプロセッサ実行中にトラップが発生したときに、コンテキストリストア時に埋めたトラップであることを識別し、該当する部分を主メモリからローカルメモリにリストアし実行を継続する機能とを有することを特徴とする。
【発明の効果】
【００１６】
本発明によれば、１回あたりのコンテキストスイッチ、特にリストアの処理時間を短縮し、システム全体のパフォーマンスを効率よく引き出すことができる。
【発明を実施するための最良の形態】
【００１７】
（第１の実施の形態：請求項１の発明に対応）
本発明の骨子は、サブプロセッサへ実行コードをリストアする際に、一部分は正しくリストアするが、残りの部分は本来の実行コードをリストアせず、トラップ（割り込み）を発生させるような命令で充足することにより、実行コードのコピー量を削減することにある。
【００１８】
これにより、コンテキストスイッチ処理に関わる比較的低速な主メモリへのアクセスが削減され、１回あたりのコンテキストスイッチ時間を飛躍的に短縮することができる。
【００１９】
サブプロセッサには不完全な実行コードがリストアされ、場合によっては実行中に本当にトラップが発生する。この場合、このときにあらためて該当する部分の正しい実行コードを主メモリなどからローカルメモリにコピーして、実行を継続する。
【００２０】
トラップを発生する命令で埋めた領域の全てが本当にトラップを発生してしまうと、トータルのコピー量は同じことになってしまうが、次の２つの観点から、十分に効果的であるということができる。
【００２１】
第一に、プログラムの実行コードは一般的に、全ての部分を同一頻度で実行するわけではない。たとえばエラー処理などの、ごく稀にしか実行しないような部分や、初期化処理部分、終了処理部分などの１度しか使用しない部分が含まれているのが通常である。このような領域は毎回サブプロセッサにリストアしても、今回の時間割り当ての内に一度も実行されない可能性が高い。したがって、このような部分を明示的に指定するか、あるいは効率よく予測することにより、リストアにかかる時間を削減することができる。
【００２２】
第二に、コンテキストリストア処理自体はシステム全体のタスク管理に関わる処理であり、その処理時間はシステム全体に必ずかかるコストであるといえる。本発明により、あるタスクの実行中にトラップが発生してコピー処理が発生してしまっても、そのタスク単独のコストであり、そのために他のタスクの割り当て時間が少なくなってしまったりすることがない、という特徴がある。
【００２３】
なお、トラップを発生させる命令の種類については本提案の本質に関わらない。プロセッサによっては引数付きのtrap命令そのものがある場合もあるし、それがない場合でも特定の値の不正命令を用いて割り込みを発生させても良い。
【００２４】
実行コードをローカルメモリにコピーする手段についても、既存の方法で構わない。サブプロセッサまたはメインプロセッサに付随するＤＭＡコントローラ、あるいは独立したＤＭＡコントローラなど、いずれのコピー手段においても本提案の方法を採用可能である。
【００２５】
また、実行コードをリストアするかトラップ命令を埋めるかを決める単位量についても、１命令以上の大きさであればいかようにも決定することができる。ハードウエアの特性などを考慮して、適切に決定すればよい。
【００２６】
実際に１命令を単位にするとトラップコストが大きすぎるので、ページ（数ＫＢ程度）単位やキャッシュライン、ＤＭＡライン（数百Ｂ程度）単位などが適切と思われる。
【００２７】
（第２の実施の形態：請求項２、３の発明に対応）
第２の実施の形態では、第１の実施の形態に加えて、どのような手段でトラップを発生する命令を埋めるかを工夫することにより、さらに効率よくコンテキストリストアの処理を行うものである。
【００２８】
第一は、実行コードのコピー手段がＤＭＡである場合、正しい実行コードをリストアする部分のＤＭＡの実行中はサブプロセッサ自身の演算部が動作し、トラップ命令をローカルメモリに書き込む方法である。すなわち、実行コードのＤＭＡを起動した後はそのコピー作業はＤＭＡコントローラが実行してくれるので、サブプロセッサ自身は並行して残りの部分にトラップ命令を書き込むことで処理を並列化することができる。
【００２９】
第二は、メインプロセッサに付随するキャッシュからサブプロセッサに直接コピーすることができ、かつキャッシュを部分的に固定化できる構成において、あらかじめトラップ命令を適当な量（決定の処理単位分が適当）だけキャッシュに固定化しておき、トラップ命令を埋めるべき部分についてはそこからＤＭＡでコピーする方法である。トラップ命令の充足については低速な主メモリにアクセスする必要がないため、短時間で処理できる。
【００３０】
これら２つの手法は同時には実装できない。システムのハードウエアの機能と性能から、より高速に処理できる方を選べばよい。
【００３１】
なお、ハードウエアによっては、ローカルメモリの適当な範囲（ページなど）にトラップを発生する命令を埋める機能そのものがついている場合も考えられる。たとえば領域の０フィル機能があり、０が命令としては不正である場合など。このようなハードウエアでは、その機能そのものを使用すればよいため、前記２つの効率化は必要ないといえる。
【００３２】
（第３の実施の形態：請求項４、５の発明に対応）
第１の実施の形態や第２の実施の形態においては、実行コードを正しくリストアする部分とトラップを発生する命令で埋める部分をできるだけ適切に決定できるのが望ましい。すなわち、できる限り実際に使われそうな部分を正しくリストアし、使われそうにない部分をトラップ命令で埋めるように決定したい。そこで、この要求を実現する手法について説明する。
【００３３】
第一は、サブプロセッサにタスクを要求する側のプログラム（アプリケーション）自身が、タスク生成時に実行コードをリストアする部分、または逆にトラップ命令を埋める部分を決定し、その内容をコンテキストスイッチ手段に対して指定する方法である。アプリケーションが自らが発生するタスクの実行コード内容を把握している場合、最も効率のよい決定が可能となる。
【００３４】
第二は、サブプロセッサがタスク実行中に実際にトラップを発生した場合に、該当部分について次回のリストア時からは正しく実行コードをリストアするように決定内容を変更する方法である。これにより、最初にトラップ命令を埋めると決定した部分について１度はトラップ処理のコストが発生することがあるが、以後のコンテキストリストア時には正しい実行コードがリストアされるため、該当部分のトラップ発生は１度だけにすることができる。これらの２つの手法を組み合わせることも容易に可能である。
【００３５】
（第４の実施の形態：請求項６の発明に対応）
第３の実施の形態における第二の手法を用いた場合、タスクの生存時間が半永久的または非常に長いと、ほとんどの部分が実行コードリストアの対象となってしまい、コンテキストリストア時間の短縮効果が十分に発揮できないことが考えられる。
【００３６】
そこで、このようなケースの回避方法としてリストアのコストとトラップのコストのバランスをとる手法について説明する。トラップ命令で埋める部分を実行コードリストアに変更した際に、別の実行コードリストア部分をトラップ命令部分に変更する。
【００３７】
これにより、実行コード部分とトラップ命令部分との比率は一定に保たれ、リストアコストは一定にすることができる。なお、トラップコストの最大値も決定できるが、その場合には、全部コピーすることになるので、特にメリットにはならない。
【００３８】
（第５の実施の形態：請求項７、８の発明に対応）
第４の実施の形態においては、実行コード→トラップ命令の変更を行う部分を決定する必要がある。そこで、下記のＡ手法及びＢ手法を採用する。Ａ手法は、各部分ごとに実際にトラップを発生してしまった回数を記録しておき、その回数の多い部分ほど使用頻度が高いと推定し、実行コード→トラップ命令の変更優先度を下げる手法である。これにより、使用頻度の低い部分をトラップ命令部分にすることができる。
【００３９】
また、Ｂ手法は、各部分ごとに最後にトラップを発生した時刻を記録しておき、最も新しい時刻の部分ほど次回も使用される確率が高いと推定し、実行コード→トラップ命令の変更優先度を下げる手法である。これにより、狭い部分を繰り返し実行するような状態になったときに、他の部分をトラップ命令部分にすることができる。なお、時刻の変わりに、何回目のリストアにおいてトラップが発生したかを使用することもできる。また、記録しておく時刻は１つに限る必要はなく、直近複数回を記録しておき、適当な重み付けで優先度を決定することも容易に可能である。Ａ手法及びＢ手法は、適当な重み係数をつけて組み合せて使用することもできる。
【００４０】
（第６の実施の形態：請求項９の発明に対応）
第６の実施の形態は、タスクスケジューリング全体からみたコンテキストスイッチのコストのバランスを改善する手法である。１つあたりのサブプロセッサが時分割で処理すべきタスクの数が多いほど、一巡させるために必要なコンテキストスイッチの回数が増加する。一定時間内に一巡させる必要があるシステムでは、１回あたりのコンテキストスイッチの処理時間がおよそ一定であるとすると、タスクの数が多いほどコンテキストスイッチ処理時間が全体に占める比率が上がっていくことになる。
【００４１】
そこで、時分割で実行すべきタスク数が増えるほど、コンテキストリストア時にトラップ部分を大きくしてスイッチ時間を短縮するように制御する。コンテキストスイッチ手段はスイッチ処理に関わる処理時間のうち定数時間と実行コードリストア量に比例する処理時間のおおよその予測が可能であることが多いため、例えば一定時間内にコンテキストスイッチに費やす処理時間の比率がおよそ一定になるように近づけるなどの処理ができるようになる。これにより、サブプロセッサの処理時間のほとんどがコンテキストスイッチに費やされてしまうという事態を回避することができる。
【実施例】
【００４２】
図１は本発明の実施例に係わる計算機システムのハードウエア構成図である。図１に示すように、１つのメインプロセッサ１１と、１つ以上のサブプロセッサ１２ａ〜１２ｎがバス１３に接続されている。メインプロセッサ１１は、主メモリ１４から命令をフェッチしたりデータを読み書きしてプログラムを実行する。サブプロセッサ１２ａ〜１２ｎは、例えば、アプリケーションが要求する高速な演算処理のタスクを実行する。Ｉ／Ｏ１５はユーザからの入力や計算結果の出力などに用いられる。
【００４３】
図２は、図１のサブプロセッサ１２及び主メモリ１４を詳細に示したブロック構成図である。なお、図２では説明を簡単にするため、サブプロセッサ１２は１つだけ示している。サブプロセッサ１２の演算ユニット１６は、付随するレジスタ群１７を用いて命令を実行するユニットである。ローカルメモリ１８はサブプロセッサ１２内だけで使用される高速なメモリであり、実行時にはプログラムの実行コード１９と使用するデータ２０が格納される。
【００４４】
演算ユニット１６はこの実行コード部分から逐次命令をフェッチして実行する。演算ユニット１６は主メモリ１４上の命令を直接実行したり、主メモリ１４上のデータを直接読み書きすることはできない。
【００４５】
ローカルメモリ１８と主メモリ１４の間の実行コード及びデータのやりとりは、サブプロセッサ１２内にあるＤＭＡコントローラ（ＤＭＡＣ）２１を駆動し、ＤＭＡを行うことによって可能となっている。ＤＭＡの起動はレジスタ群１７の中にある専用レジスタにアクセスすることで操作できる。
【００４６】
サブプロセッサ１２のレジスタ群１７は、ＭＭＩＯ２２を用いてメインプロセッサ１１からも読み書きできるようになっている。これによってメインプロセッサ１１からサブプロセッサ１２を停止・再開することができ、またレジスタ群１７のセーブ・リストアができるようになっている。
【００４７】
次に、主メモリ１４上には、メインプロセッサ１１が実行するプログラムとして、アプリケーション群２３とＯＳ２４とが存在する。ＯＳ２４は計算機システム全体を管理する基本ソフトウェアであり、その機能の一部として、アプリケーション群２３をどのプロセッサにどのように時分割して実行させるかを管理するスケジューラ２５、スケジューラ２５の決定に従って実際にプロセッサにコンテキストを割り当てて実行させるディスパッチャ２６とが存在する。本発明の骨子となるコンテキストスイッチは、このディスパッチャ機能に含まれる。
【００４８】
ディスパッチャ２６はサブプロセッサ１２のコンテキストスイッチを行う際に、現在サブプロセッサ１２で実行中のタスクのコンテキストをセーブする必要がある。このための領域が主メモリ１４上にコンテキストセーブ領域２７であり、図２では１つしか表示していないが、タスク１つにつき１つずつ用意するものである。コンテキストセーブ領域２７の内容は、ディスパッチャ２６などが使用する管理データ２８と、サブプロセッサ１２のレジスタ群１７、ローカルメモリ１８のコピー、つまり、レジスタ群コピー１７’、データコピー２０’、実行コードコピー１９’が保存される。
【００４９】
図３は、コンテキストスイッチが必要となるタイミングについての一例を示したものである。図３（ａ）の一例では、スケジューラ２５が２つのタスク１、２に対して、ある１つのサブプロセッサ１２を均等時間割り当てている。両方のタスク１、２が一定時間内（１周期）にいくらかの処理を実行しなければならないような場合、このようなスケジューリングになる。１周期あたりにタスク１に割り当てた時間が経過すると、メインプロセッサ１１にタイマ割り込みが発生しディスパッチャ２６が起動され、図３（ａ）の網掛け部分の時間Ｔ１でコンテキストスイッチ処理を行う。  図３（ａ）の一例では２タスクの例なので１周期に２回の網掛け部分となっている。
【００５０】
これに対し、１周期内に実行したいタスク数が増えてくると網掛け部分の数が増え、例えば、図３（ｂ）の一例のように４タスクの例では、同じ１周期中に４回が必要になり、本来実行したいタスク処理部分（網掛けなし部分の比率）が減ってくることになる。そこで、本発明では、１回のコンテキストスイッチにかかる時間（コスト）をなるべく小さくする。
【００５１】
図４は、主メモリ１４のコンテキストセーブ領域２７とローカルメモリ１８との間のデータのやり取りを概念的に示した説明図である。まず、データ領域の一部にＤＭＡテーブル２９を含んでいる。このＤＭＡテーブル２９は、コンテキストリストア時に正しい実行コードをＤＭＡでリストアするか、トラップ命令で埋めるかを決定するためのデータであり、その内容は、例えば図５に示すようになっている。図５はＤＭＡテーブル２９の内容の一例を示す説明図である。
【００５２】
図５の一例では、例えば、実行コード領域はアドレス０〜１FFFFの１２８KBで、実行コードリストアかトラップ命令かを決定する「部分」の大きさを４KBとしている。決定の要素としてアプリケーションからの指定値とトラップを起こした回数とを記録しており、その２つの値を参照してどちらにするかを決定し、その決定結果を保存している。決定の方法は例えば、ユーザ指定が１のページは必ず正しい実行コードをリストアすることとし、それ以外の部分についてカウンタ値が小さいものから最大１６個をトラップ命令の部分と決定し、結果をテーブル内に保存する。
【００５３】
図５の一例のように決定されると、実際のコンテキストリストア時には、図４のようなデータのコピーを行うようになる。トラップ命令で埋める部分はＤＭＡの対象とならず、ＤＭＡと平行してサブプロセッサ自身が埋めることができるので、コンテキストリストアの時間を短縮することができる。図５では１ページ（部分）しか表示していないが、例えば、これが１６ページあるとすると、６４KBのＤＭＡ分の時間短縮となる。
【００５４】
図６及び図７は、本発明の実施例によるコンテキストスイッチの具体的な処理手順を示すフローチャートである。図６に示す手順（１０１）〜（１０７）は現在実行しているタスクのコンテキストセーブ処理で、従来と同じである。なお、実行コードは実行中に変化しないことを想定しセーブの対象からは外している。
【００５５】
図７の手順（１０８）から最後の手順まで、手順（１０９）を除く手順がコンテキストリストア処理であり、特に手順（１１１）、（１１３）、（１１５）が本発明の重要な部分である。
【００５６】
手順（１１１）では、実行コードに先立ち、まずＤＭＡテーブルを含むデータ領域をＤＭＡでコピーする。これで手順（１１３）でサブプロセッサ内部でＤＭＡテーブルを用いて実行コードをリストアする部分を識別し、ＤＭＡリスト（＝ＤＭＡＣに渡す制御情報）を作成できるようになる。ＤＭＡリストを作成してＤＭＡを起動したら、データ転送事態はＤＭＡＣが実行してくれるので、サブプロセッサの演算ユニットは手順（１１５）で再びＤＭＡリストを参照しながら自身でトラップ命令を書き込んで行く。
【００５７】
ＤＭＡとトラップ命令書き込みが両方終了したところで、ローカルメモリ１８のリストア処理完了である。あとはメインプロセッサがサブプロセッサのレジスタを復元し、再び起動すればよい。
【００５８】
途中、手順（１０９）はオプションであり、ＤＭＡテーブルを逐次更新する実装の場合に必要になる。実行タイミングは手順（１０７）と手順（１０８）との間でも構わないが、サブプロセッサ１２のリストア処理を先に開始してしまったほうが並列に処理できる。具体的な例は後述する。
【００５９】
図８は、タスク実行中にトラップを発生した時の処理内容を示すフローチャートである。この一例では、トラップの割り込みはサブプロセッサ１２自身に入り、サブプロセッサ１２内のハンドラが処理する仕組みとなっている。もちろんトラップ割り込みがメインプロセッサ１１に配信されハンドラもメインプロセッサ１１のものである実装もあり得る。
【００６０】
手順（２０１）、（２０２）、（２０４）が必須手順で、トラップを起こしたページをＤＭＡでリストアしている。この後にトラップハンドラから元アドレスにもどると、今度は正しい実行コードがリストアされているので、タスクが実行を継続することができる。
【００６１】
手順（２０３）はオプションで、これもＤＭＡテーブルを逐次更新する場合に必要になる。例えば図５のようにトラップ回数をカウントする実装であれば、該当するページのカウンタを１つインクリメントする動作をここで行う。ここではまだ実行コードＤＭＡにするかトラップ命令にするかの決定を行わない。カウンタを更新されたＤＭＡテーブルはコンテキストセーブの時に主メモリ上のコンテキストセーブ領域に転送される。
【００６２】
図７のメインプロセッサ手順（１０９）で、この更新されたカウンタを参照しながら、実行コードＤＭＡにするかトラップ命令にするかの決定を行い、ＤＭＡテーブルを更新する。次回にそのタスクがリストアされるときからは、更新された決定がＤＭＡリストの作成が実行される。
【００６３】
なお、サブプロセッサ１２がタスク実行中にトラップを発生すると、その部分のＤＭＡによるコピーが発生してその分タスクの実行が待たされることになる。しかし、このＤＭＡコストは従来は直前のコンテキストリストアにおいて消費されていたコストであり、この分に関してはシステム全体として損はしていない。
【００６４】
実質増加する時間コストはトラップハンドラ内のＤＭＡを除く箇所だけであり、一般的なシステムでは、低速な主メモリへのアクセスを伴うＤＭＡに比べて十分無視できるほど小さいと考えられる。
【図面の簡単な説明】
【００６５】
【図１】本発明の実施例に係わる計算機システムのハードウエア構成図。
【図２】図１のサブプロセッサ及び主メモリを詳細に示したブロック構成図。
【図３】コンテキストスイッチが必要となるタイミングについての一例の説明図。
【図４】本発明の実施例による主メモリのコンテキストセーブ領域とローカルメモリとの間のデータのやり取りを概念的に示した説明図。
【図５】本発明の実施例によるＤＭＡテーブルの内容の一例を示す説明図。
【図６】本発明の実施例によるコンテキストスイッチの具体的な処理手順を示すフローチャート（その１）。
【図７】本発明の実施例によるコンテキストスイッチの具体的な処理手順を示すフローチャート（その２）。
【図８】本発明の実施例によるタスク実行中にトラップを発生した時の処理内容を示すフローチャート。
【符号の説明】
【００６６】
１１…メインプロセッサ、１２…サブプロセッサ、１３…バス、１４…主メモリ、１５…Ｉ／Ｏ、１６…演算ユニット、１７…レジスタ群、１７’…レジスタ群コピー、１８…ローカルメモリ、１９…実行コード、１９’…実行コードコピー、２０…データ、２０’…データコピー、２１…ＤＭＡＣ、２２…ＭＭＩＯ、２３…アプリケーション群、２４…ＯＳ、２５…スケジューラ、２６…ディスパッチャ、２７…コンテキストセーブ領域、２８…管理データ、２９…ＤＭＡテーブル
【図１】
2009123064.tif 000003
【図２】
2009123064.tif 000004
【図３】
2009123064.tif 000005
【図４】
2009123064.tif 000006
【図５】
2009123064.tif 000007
【図６】
2009123064.tif 000008
【図７】
2009123064.tif 000009
【図８】
2009123064.tif 000010