(57)【特許請求の範囲】
【請求項１】
複数のレジスタを有しプロセスを実行する演算処理装置と前記演算処理装置に接続された主記憶装置とを備える情報処理装置の制御プログラムにおいて、
前記演算処理装置に、
前記演算処理装置が実行している第１のプロセスを第２のプロセスに切り替える場合、
前記複数のレジスタのうち前記第２のプロセスが使用する対象レジスタの使用頻度を示す使用頻度情報を前記主記憶装置から読み出させ、
前記使用頻度情報が示す前記対象レジスタの使用頻度が所定の使用頻度より大きい使用頻度であることを表す場合、前記第１のプロセスが使用していたレジスタの値を前記主記憶装置に退避させ、
前記使用頻度情報が示す前記対象レジスタの使用頻度が所定の使用頻度より大きい使用頻度であることを表す場合、前記主記憶装置から前記第２のプロセスの実行に必要な値を前記対象レジスタに復元させ、
前記第２のプロセスを実行させ、
前記演算処理装置が実行している前記第２のプロセスを前記第１のプロセスに切り替える場合、
前記第１のプロセスを実行させ、
前記演算処理装置が前記第１のプロセスを実行したことにより、例外が発生したとき、前記第２のプロセスが使用していた前記対象レジスタの値を前記主記憶装置に退避させ、
前記主記憶装置から前記第１のプロセスの実行に必要な値を前記レジスタに復元させることを特徴とする情報処理装置の制御プログラム。
【請求項２】
前記情報処理装置の制御プログラムはさらに、
前記演算処理装置に、
前記使用頻度情報が示す前記対象レジスタの使用頻度が前記所定の使用頻度より大きい使用頻度であることを表す場合、前記第１のプロセスを識別する第１のプロセス識別情報を前記主記憶装置から読み出させ、
前記演算処理装置による、前記主記憶装置からの前記第２のプロセスの実行に必要な値の前記対象レジスタへの復元は、前記主記憶装置から読み出した前記第１のプロセス識別情報と前記第２のプロセスを識別する第２のプロセス識別情報とが異なる場合に行わせることを特徴とする請求項１記載の情報処理装置の制御プログラム。
【請求項３】
前記情報処理装置の制御プログラムはさらに、
前記演算処理装置に、
前記演算処理装置が実行している前記第１のプロセスを含むプログラムの起動時に、前記使用頻度情報を前記主記憶装置へ格納させることを特徴とする請求項１又は２記載の情報処理装置の制御プログラム。
【請求項４】
前記情報処理装置の制御プログラムにおいて、
前記レジスタは、
浮動小数点数レジスタであることを特徴とする請求項１〜３のいずれか１項に記載の情報処理装置の制御プログラム。
【請求項５】
複数のレジスタを有しプロセスを実行する演算処理装置と前記演算処理装置に接続された主記憶装置とを備える情報処理装置の制御方法において、
前記演算処理装置が、
前記演算処理装置が実行している第１のプロセスを第２のプロセスに切り替える場合、
前記複数のレジスタのうち前記第２のプロセスが使用する対象レジスタの使用頻度を示す使用頻度情報を前記主記憶装置から読み出し、
前記使用頻度情報が示す前記対象レジスタの使用頻度が所定の使用頻度より大きい使用頻度であることを表す場合、前記第１のプロセスが使用していたレジスタの値を前記主記憶装置に退避し、
前記使用頻度情報が示す前記対象レジスタの使用頻度が所定の使用頻度より大きい使用頻度であることを表す場合、前記主記憶装置から前記第２のプロセスの実行に必要な値を前記対象レジスタに復元し、
前記第２のプロセスを実行し、
前記演算処理装置が実行している前記第２のプロセスを前記第１のプロセスに切り替える場合、
前記第１のプロセスを実行し、
前記演算処理装置が前記第１のプロセスを実行したことにより、例外が発生したとき、前記第２のプロセスが使用していた前記対象レジスタの値を前記主記憶装置に退避し、
前記主記憶装置から前記第１のプロセスの実行に必要な値を前記レジスタに復元することを特徴とする情報処理装置の制御方法。
【請求項６】
前記情報処理装置の制御方法はさらに、
前記演算処理装置が、
前記使用頻度情報が示す前記対象レジスタの使用頻度が前記所定の使用頻度より大きい使用頻度であることを表す場合、前記第１のプロセスを識別する第１のプロセス識別情報を前記主記憶装置から読み出し、
前記演算処理装置による、前記主記憶装置からの前記第２のプロセスの実行に必要な値の前記対象レジスタへの復元は、前記主記憶装置から読み出した前記第１のプロセス識別情報と前記第２のプロセスを識別する第２のプロセス識別情報とが異なる場合に行うことを特徴とする請求項５記載の情報処理装置の制御方法。
【請求項７】
前記情報処理装置の制御方法はさらに、
前記演算処理装置が、前記演算処理装置が実行している前記第１のプロセスを含むプログラムの起動時に、前記使用頻度情報を前記主記憶装置へ格納することを特徴とする請求項５又は６記載の情報処理装置の制御方法。
【請求項８】
前記情報処理装置の制御方法において、
前記レジスタは、
浮動小数点数レジスタであることを特徴とする請求項５〜７のいずれか１項に記載の情報処理装置の制御方法。
【請求項９】
演算処理装置と、前記演算処理装置に接続された主記憶装置とを有する情報処理装置において、
前記演算処理装置は、
複数のレジスタと、
実行している第１のプロセスを第２のプロセスに切り替える場合、前記複数のレジスタのうち前記第２のプロセスが使用する対象レジスタの使用頻度を示す使用頻度情報を前記主記憶装置から読み出し、前記使用頻度情報が示す前記対象レジスタの使用頻度が所定の使用頻度より大きい使用頻度であることを表す場合、前記第１のプロセスが使用していたレジスタの値を前記主記憶装置に退避し、前記使用頻度情報が示す前記対象レジスタの使用頻度が所定の使用頻度より大きい使用頻度であることを表す場合、前記主記憶装置から前記第２のプロセスの実行に必要な値を前記対象レジスタに復元し、前記第２のプロセスを実行し、実行している前記第２のプロセスを前記第１のプロセスに切り替える場合、前記第１のプロセスを実行し、前記第１のプロセスを実行したことにより、例外が発生したとき、前記第２のプロセスが使用していた前記対象レジスタの値を前記主記憶装置に退避し、前記主記憶装置から前記第１のプロセスの実行に必要な値を前記レジスタに復元する演算処理部とを有することを特徴とする情報処理装置。
【請求項１０】
前記演算処理装置はさらに、
前記使用頻度情報が示す前記対象レジスタの使用頻度が前記所定の使用頻度より大きい使用頻度であることを表す場合、前記第１のプロセスを識別する第１のプロセス識別情報を前記主記憶装置から読み出し、
前記演算処理部による、前記主記憶装置からの前記第２のプロセスの実行に必要な値の前記対象レジスタへの復元は、前記主記憶装置から読み出した前記第１のプロセス識別情報と前記第２のプロセスを識別する第２のプロセス識別情報とが異なる場合に行うことを特徴とする請求項９記載の情報処理装置。
【請求項１１】
前記情報処理装置において、
前記演算処理部はさらに、
前記演算処理装置が実行している前記第１のプロセスを含むプログラムの起動時に、前記使用頻度情報を前記主記憶装置へ格納することを特徴とする請求項９又は１０記載の情報処理装置。
【請求項１２】
前記情報処理装置において、
前記レジスタは、
浮動小数点数レジスタであることを特徴とする請求項９〜１１のいずれか１項に記載の情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、情報処理装置の制御方法及び制御プログラムに関する。
【背景技術】
【０００２】
近年のオペレーティングシステム（OS：Operating System）は、単一の計算機上で複数の処理（プロセス）を並行して実行するマルチプロセス機能を備えている。一般的なマルチプロセス機能では、情報処理装置の資源を時分割で特定のプロセスに割り当てる。
【０００３】
従って、オペレーティングシステムによって情報処理装置の資源を割り当てられたプロセスは、割り当てられた情報処理装置の資源の使用権を有し、あたかも１台の情報処理装置を占有しているかのように振舞うことができる。このようなプロセスの振る舞いを可能とするため、オペレーティングシステムは、これから情報処理装置の資源の使用権を剥奪されるプロセス固有のコンテキスト情報(レジスタ／カーネルスタック／Translation Lookaside Buffer（TLB）が使用するページテーブルに含まれるアドレス変換情報など)をカーネルメモリ領域に退避させ、次に使用権を得るプロセスのコンテキスト情報をハードウェア資源に復元する機能（以下、「コンテキストスイッチ」という）を提供している。
【０００４】
近年のCentral Processing Unit （CPU）は計算能力を向上させるアプローチとして、レジスタを追加するとともに、追加されたレジスタを効率的に操作する命令セット拡張を施している。結果としてプロセスが退避するコンテキストサイズ情報が増加し、コンテキストのスイッチングによるオペレーティングシステムのオーバーヘッド等のコストが増加する傾向にある。
【０００５】
この問題に対処するため、近年のオペレーティングシステムでは、コンテキストスイッチ時に退避する必要の無いレジスタは意図的に退避を行わず、コンテキストスイッチ後に退避する必要が発生した場合に限って退避するというアプローチ(StateOwner機能によるアプローチ)を採用している。
【０００６】
また、CPUの改造は、ソフトウェアの改造と比較してコストがかかるため、ソフトウェアの改造のみによるコンテキストスイッチにかかるコストを削減する方式が存在する。当該方式ではコンテキストスイッチの発生を計数するカウンタを用意し、カウント回数がカーネルに埋め込まれた閾値を超えた場合にコンテキストスイッチの方式を切替える。その後、カウンタがラップアラウンドして初期値に戻った場合に再度コンテキストスイッチの方式を元に戻し、再び閾値を超えた場合に再度コンテキストスイッチの方式を切替える。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００５−１８６１０号公報
【特許文献２】特開平２−１４６６３１号公報
【非特許文献】
【０００８】
【非特許文献１】Daniel P. Bovet、 Marco Cesati、「詳解Linuxカーネル 第３版」、オライリー・ジャパン、２００７年２月２２日、３．３節
【非特許文献２】Fujitsu Limited、“SPARC64TM VIIIfx Extensions” Ver.15、２０１０年４月２６日、インターネット<http://img.jp.fujitsu.com/downloads/jp/jhpc/sparc64viiifx-extensions.pdf>
【非特許文献３】Intel、“Intel(R) 64 and IA-32 Architectures Software Developer’s Manual Volume 3A; System Programming Guide, Part 1”、２０１０年３月、インターネット<http://www.intel.com/Assets/PDF/manual/253668.pdf>
【非特許文献４】LXR community、“the Linux Cross Reference”、２００９年１２月２日、インターネット<http://lxr.linux.no/#linux+v2.6.32/include/linux/sched.h#L1249>
【発明の概要】
【発明が解決しようとする課題】
【０００９】
StateOwner機能は、不要なレジスタ退避を遅延させることでコンテキストスイッチによるコストの低減を図っている。ここで、プログラムのプロセスが退避を遅延させられた情報処理装置の資源にアクセスしようとした場合、OSは実際に退避処理を実行しなければならない。プロセスが遅延退避対象の資源にアクセスしたことを知ることができるコンポーネントはCPUであり、プロセスによるアクセスを検知したCPUはOSに対して割り込むことにより例外が発生する。CPUに割り込まれたOSは、現在実行中のプロセスを中断して、遅延していたコンテキスト情報の退避処理を行う。
【００１０】
このようにOSの例外処理は、プロセス実行の中断を招く上に、カーネル内で例外処理を実行するためのレジスタ退避処理が実行され、CPUによるプログラム実行のスループットを低下させる問題がある。従って、StateOwner機能の対象となる資源を頻繁に利用するプロセスにおいては、例外発生の頻発によってシステム全体の性能低下を招くという問題がある。
【００１１】
ここで、スーパーコンピュータが実行する高度科学技術計算(High Performance Computing)のジョブは、応答性を犠牲にしても一定時間内におけるCPU占有時間を長く確保したい性質を持つプログラムである。従ってCPU例外によるOSの例外処理が頻発することはジョブのスループットを悪化させ、スーパーコンピュータとしての性能の低下要因となる。
【００１２】
従来技術で実現されるStateOwner機能は、CPU内部にStateOwnerを記録する専用のレジスタを準備し、オペレーティングシステムは、このStateOwner専用レジスタを管理する必要がある。そのため、CPUの回路設計の複雑さや製造コストが増加するという問題がある。
【００１３】
ジョブ実行のみの観点からは、上記で言及した通り、CPU例外発生を抑制する必要がある。このためにはコンテキスト切り替え発生時にすべてのコンテキスト情報を退避すべきである。しかし、近年のスーパーコンピュータでは応答性を重視するプログラムも同時に実行される。このとき、コンテキスト切り替え発生時に全てのコンテキストを退避させる方式を採用すると、コンテキストスイッチにかかる処理時間が増加し、プログラムの応答性が損なわれるという問題がある。
【００１４】
プログラムの実行中にコンテキストスイッチ方式を切り替える方法では、コンテキストスイッチ方式の切替がプログラムの走行中に頻繁に発生してしまうため、ジョブの様にプログラムの実行前から最適なコンテキストスイッチ方式が判明しているプログラムではオーバーヘッドを生じると共に、コンテキストスイッチの発生を計数するカウンタの閾値監視を行う処理がシステムにとって余計な負荷となるという問題がある。
【００１５】
本発明の課題は、プログラムの種別に応じたコンテキストスイッチ方式を実行するプログラムを提供することである。
【課題を解決するための手段】
【００１６】
実施の形態の制御プログラムは、複数のレジスタを有しプロセスを実行する演算処理装置と前記演算処理装置に接続された主記憶装置とを備える情報処理装置の制御プログラムにおいて、前記演算処理装置に、前記演算処理装置が実行している第１のプロセスを第２のプロセスに切り替える場合、前記複数のレジスタのうち前記第２のプロセスが使用する対象レジスタの使用頻度を示す使用頻度情報を前記主記憶装置から読み出させ、前記使用頻度情報が示す前記対象レジスタの使用頻度が所定の使用頻度より大きい使用頻度であることを表す場合、前記第１のプロセスが使用していたレジスタの値を前記主記憶装置に退避させ、前記使用頻度情報が示す前記対象レジスタの使用頻度が所定の使用頻度より大きい使用頻度であることを表す場合、前記主記憶装置から前記第２のプロセスの実行に必要な値を前記対象レジスタに復元させ、前記第２のプロセスを実行させ、前記演算処理装置が実行している前記第２のプロセスを前記第１のプロセスに切り替える場合、前記第１のプロセスを実行させ、前記演算処理装置が前記第１のプロセスを実行したことにより、例外が発生したとき、前記第２のプロセスが使用していた前記対象レジスタの値を前記主記憶装置に退避させ、前記主記憶装置から前記第１のプロセスの実行に必要な値を前記レジスタに復元させる。
【発明の効果】
【００１７】
実施の形態のプログラムによれば、プログラムの種別に応じたコンテキストスイッチ方式を実行することで、スループットを向上することが出来る。
【図面の簡単な説明】
【００１８】
【図１】実施の形態に係る情報処理装置の構成図である。
【図２】FP状態レジスタの形式を示す図である。
【図３】プロセス管理情報格納領域の形式を示す図である。
【図４】FPowner記憶領域の形式を示す図である。
【図５】実施の形態に係るプロセス起動処理のフローチャートである。
【図６Ａ】実施の形態に係るコンテキストスイッチのフローチャートである。
【図６Ｂ】実施の形態に係るコンテキストスイッチのフローチャートである。
【図７】従来技術および実施の形態に係るコンテキストスイッチのタイムチャートである。
【発明を実施するための形態】
【００１９】
以下、図面を参照しながら実施の形態について説明する。
実施の形態では、汎用のオペレーティングシステム(例えば、Linux（登録商標）)が動作する計算ノードをクラスタ接続したスーパーコンピュータにおいて本発明を適用した場合について述べる。
【００２０】
尚、計算ノードでは科学技術計算を実施するユーザジョブと、ファイル操作などを行うためのコマンドが並列に動作する。
ユーザジョブは、計算を短い時間で完了できるように、オペレーティングシステムからの介入を必要最低限とし、ジョブへのCPU割り当て時間をより長くする事が求められる。一方、コマンドはCPU時間以外にも、I/O処理も含めたコマンドの応答性を重視し、ユーザへの処理結果を迅速に返すことが重視される。
【００２１】
実施の形態では、ユーザジョブは、例えば、CPUが具備する浮動小数点数レジスタを頻繁に使用するプロセスと定義する。
また、コマンドは、例えば、CPUが具備する浮動小数点数レジスタの使用頻度が低いプロセスと定義する。
【００２２】
実施の形態では、StateOwner機能の対象とする資源を、CPUが装備する浮動小数点数レジスタ群に適用した場合のプロセスによるコンテキストスイッチに対する例を記載する。以下、StateOwner機能を実施の形態で採用した資源（浮動小数点数レジスタ）に合わせてFPowner機能と表現し、浮動小数点演算ユニット（FPU：Floating Point Unit）についてのデバイス使用不可例外をFPU使用不可例外と表現する。
【００２３】
また、浮動小数点数レジスタを全く使用しないか、ほとんど使用しないプロセスをLAZYプロセス、浮動小数点数レジスタを多用するプロセスをUNLAZYプロセスと呼ぶ。
例えば、ソースコードに基づき、浮動小数点数演算を頻繁に行うアルゴリズムのプログラムのプロセスをUNLAZYプロセス、浮動小数点数演算を全く行わないか、局所的にしか使用しないアルゴリズムのプログラムのプロセスをLAZYプロセスと定義してもよい。
【００２４】
例えば、浮動小数点数レジスタの使用頻度が閾値より高いプロセスをUNLAZYプロセス、浮動小数点数レジスタの使用頻度が閾値以下のプロセスをLAZYプロセスと定義してもよい。
【００２５】
例えば、使用頻度は、一定時間あたりの浮動小数点数レジスタに対する読み出しおよび書き込み回数と定義することが出来る。例えば、使用頻度は、実際にプロセスを動作させて、浮動小数点数レジスタへのアクセスをモニタすることにより計測することが出来る。
【００２６】
尚、以下に示す実施の形態では、浮動小数点数演算を多用する科学技術計算向けのプロセスはUNLAZYプロセスとして起動し、コマンドやデーモン等に通常のプロセスはLAZYプロセスとして起動することが望ましい。
【００２７】
図１は、実施の形態に係る情報処理装置の構成図である。
情報処理装置（コンピュータ）１０１は、CPU(Central Processing Unit)２０１およびメモリ３０１を備える。
【００２８】
CPU２０１は、各種の演算処理を実行する演算処理装置である。
CPU２０１は、例えば、一つ又は複数のコア２０２−ｎ（ｎ＝１〜３）を有する。
コア２０２−ｎは、複数の浮動小数点数レジスタからなる浮動小数点数レジスタ群２０３−ｎおよびFP（Floating Point）状態レジスタ群２０４−ｎを備える。また、コア２０２−ｎは、浮動小数点演算を行うFloating Point Unit(FPU)を含む演算部（不図示）および汎用レジスタ（不図示）を備える。
【００２９】
図１においては、コア２０２−１のみ詳細を示す。尚、コア２０２−１以外の他のコアも同様に浮動少数点レジスタ群およびFP状態レジスタを有している。
浮動小数点数レジスタ群２０３を構成する浮動小数点数レジスタは、浮動小数点数演算を行う際にデータを一時的に保持するレジスタである。尚、実施の形態において、例えば、浮動小数点数レジスタ群は、６４bit長の浮動小数点数レジスタ６４本で構成される。
FP状態レジスタ２０４は、使用可能または使用不可能等のFPUの状態および浮動小数点数レジスタ群２０３の使用状況を格納する。
【００３０】
図２は、FP状態レジスタの形式を示す図である。
FP状態レジスタ２０３は、FPUの使用可能または使用不可能を表すbit、および現在使用中の浮動小数点数レジスタをビットフィールドで表す領域を有する。
FP状態レジスタ２０３のbit32は、FPUが使用可能か使用不可能かを示す。例えば、bit32が０の場合は、FPUが使用不可能、１の場合は、FPUが使用可能であることを示す。
【００３１】
FP状態レジスタ２０３のbit0からbit7は、浮動小数点数レジスタの使用状況を示す。ここで、６４本の浮動小数点数レジスタには、それぞれ%f0から%f63まで番号が割り当てられているものとする。例えば、bit0は、浮動小数点数レジスタ%f0から%f7までの使用状況を示す。例えば、bit0が０の場合は、浮動小数点数レジスタ%f0から%f7は使用されていないことを示し、１の場合は、浮動小数点数レジスタ%f0から%f7の一部または全てが使用されていることを示す。
【００３２】
メモリ３０１は、CPU２０１が実行するプログラムおよびデータを格納する主記憶装置である。
メモリ３０１は、オペレーティングシステム４０１、プロセス４１１、プロセス管理情報格納領域４１２、FPowner記憶領域４１３、FPレジスタ退避領域４１４を有する。
【００３３】
オペレーティングシステム４０１は、コマンド実行部４０２、カーネルサービス４０３、例外入口処理部４０４、例外出口処理部４０５、スケジューラ４０６、およびFPU使用不可例外処理部４０７を備える。
【００３４】
コマンド実行部４０２は、オペレーティングシステム４０１が提供するシステムコールと呼ばれる関数を呼び出す。
カーネルサービス４０３は、ユーザプログラムに対してサービスを提供する。具体的には、I/O装置への入出力やメモリ確保等のサービスを提供する。
【００３５】
カーネルサービス４０３は、プロセス起動部４０８およびシステムコール処理部４０９を備える。
プロセス起動部４０８は、プロセスを起動する。
【００３６】
システムコール処理部４０９は、呼び出されたシステムコールに対応したカーネルサービスを実行する。
例外入口処理部４０４は、ユーザ空間４５１で動作していたプロセスが例外処理の発生によりカーネルサービス等を利用する際に、カーネル空間４５２へ遷移するために必要な処理を行う。
【００３７】
例外出口処理部４０５は、例外処理の終了によりカーネル空間４５２からユーザ空間４５１に復帰し、ユーザ空間４５１のプロセスを動作させるための処理を行う。また、例外出口処理部４０５は、FPowner記憶領域４１３の設定および初期化およびFPレジスタ退避領域４１４から浮動小数点数レジスタ群２０３へ値を復元する機能を具備する。
【００３８】
スケジューラ４０６は、プロセススイッチを行うためのコンポーネントである。
スケジューラ４０６は、コンテキストスイッチ部４１０を備える。
コンテキストスイッチ部４１０は、カーネルスタック４１６を切替えることにより、プロセスの切替えを行うとともに、プロセスの切替えに伴うコンテキストの切替えも行う。
【００３９】
FPU使用不可例外処理部４０７は、ユーザ空間で動作していたプロセスがカーネルサービス等を利用する際に、ユーザ空間からカーネル空間へ遷移するために必要な処理を行う。
【００４０】
プロセス４１１は、ユーザが動作させるプログラムをカーネルが管理するためのインスタンスである。
プロセス４１１は、ユーザプログラム４１５、カーネルスタック４１６、およびプロセスコンテキスト４１７を有する。
【００４１】
ユーザプログラム４１５は、ユーザ空間で動作するプロセスの命令を記述したオブジェクトファイルである。
カーネルスタック４１６は、カーネルの呼び出し関係や引数情報、プロセスの管理情報などの情報である。
【００４２】
プロセスコンテキスト４１７は、プロセスを構成する情報である。具体的には、プロセスIDや使用しているメモリ３０１のアドレス情報、現在実行中のプロセスの命令位置などを含む。
プロセス管理情報格納領域４１２は、プロセスの種別を示す情報を有し、プロセスが生成された場合にカーネルによって作成され、プロセスの消滅とともに削除される。
【００４３】
図３は、プロセス管理情報格納領域の形式を示す図である。
プロセス管理情報格納領域４１２は、プロセスの種別（LAZYまたはUNLAZY）を示すprogram_class（プロセス種別記憶領域）およびFPレジスタ退避領域へのポインタを示すfpregsを有する。
【００４４】
program_classが０の場合、プロセスはLAZYであることを示し、１の場合、プロセスはUNLAZYであることを示す。尚、program_classが０および１以外の場合は、プロセスの種別はLAZYとする。
FPowner記憶領域４１３は、浮動小数点レジスタ群２０３を現在使用しているプロセス（FPowner）の識別子を格納する。
【００４５】
図４は、FPowner記憶領域の形式を示す図である。
FPowner記憶領域４１３は、浮動小数点レジスタ群２０３を現在使用しているプロセス（FPowner）の識別子を示すfp_ownerを有する。
FPレジスタ退避領域４１４は、プロセス毎に浮動小数点数レジスタ群２０３の値を退避するために確保された領域である。
【００４６】
メモリ３０１は、ユーザ空間４５１およびカーネル空間４５２の２つの領域を有する。
ユーザ空間４５１は、オペレーティングシステム４０１がユーザプログラムを動作させるために必要な仮想メモリ空間である。
【００４７】
カーネル空間４５２は、カーネルおよびカーネルに付随するシステムソフトウェア(デバイスドライバ等)が動作するために必要な仮想メモリ空間である。一般的に、カーネル空間４５２はソフトウェア的にユーザから保護されており、ユーザ空間４５１で動作するプログラムからアクセスする事はできない。
コマンド実行部４０２およびユーザプログラム４１５はユーザ空間４５１に配置されている。
【００４８】
一方、カーネルサービス４０３、例外入口処理部４０４、例外出口処理部４０５、スケジューラ４０６、FPU使用不可例外処理部４０７、プロセス管理情報格納領域４１２、FPOwner記憶領域４１３、FPレジスタ退避領域４１４、カーネルスタック４１６、およびプロセスコンテキスト４１７は、カーネル空間４５２に配置されている。
従って、コマンド実行部４０２又はユーザプログラム４１５から、カーネル空間４５２に配置されたカーネルサービス４０３、例外入口処理部４０４、例外出口処理部４０５、スケジューラ４０６、FPU使用不可例外処理部４０７、プロセス管理情報格納領域４１２、FPOwner記憶領域４１３、FPレジスタ退避領域４１４、カーネルスタック４１６、およびプロセスコンテキスト４１７に対してはアクセスすることはできない。
【００４９】
最初に、実施の形態に係るプロセスの起動方法について述べる。
実施の形態の情報処理装置１０１ではプログラムの起動方法は、以下の２つの方式がある。
（１）既存のプログラム起動システムコール（exec）を使用する。
プログラム起動システムコールであるexecは、Portable Operating System Interface（POSIX）に準拠している。
【００５０】
（２）新規のプログラム起動システムコール（exec_fp_proc）を使用して、ユーザがプログラム起動時にLAZYまたはUNLAZYを指定する。
exec_fp_procは、本実施の形態で新設されるシステムコールである。
【００５１】
尚、本実施の形態においては、新規のプログラム起動システムコールの名称を例示的にexec_fp_procと定義しているが、他のシステムコール名称でもよい。
例えば、C言語でプロセスの種別をLAZYと指定する場合、exec_fp_proc(const char *command_path, const char *argv[], LAZY)とソースファイルに記述する。
【００５２】
また、C言語でプロセスの種別をUNLAZYと指定する場合、exec_fp_proc(const char *command_path, const char *argv[], UNLAZY)とソースファイルに記述する。
ここで、*command_pathは、実行ファイルへのファイルパスであり、*argv[]は、起動したプロセスに引き渡す引数配列へのポインタである。また、LAZYおよびUNLAZYは、プロセスの種別を示し、これらはプロセス指定引数と呼ぶ。
【００５３】
図５は、実施の形態に係るプロセス起動処理のフローチャートである。
以下においては、システムコール（exe_fp_proc）を使用してプロセスを起動する場合について述べる。
【００５４】
先ず、コマンド実行部４０２は、システムコール（exe_fp_proc）を呼び出す（ステップＳ５０１）。
プロセス実行部４０８は、プロセス（ls(list segments)やcat(concatenate)コマンドなど）をexec_fp_procを利用して起動する（ステップＳ５０２）。
【００５５】
プロセス起動部４０８は、プロセス管理情報格納領域４１２を確保し（ステップＳ５０３）、さらにプロセスコンテキスト４１７を保存する領域（コンテキスト保存領域）を確保する（ステップＳ５０４）。
【００５６】
そして、プロセス起動部４０８は、プロセス指定引数の種別を判定し、プロセス指定引数がLAZYの場合および引数が無い場合は、プロセス管理情報格納領域４１２のプログラム種別記憶領域を初期化してLAZYに設定し（ステップＳ５０６、Ｓ５０７）、プロセス指定引数がUNLAZYの場合は、プロセス管理情報格納領域４１２のプログラム種別記憶領域を初期化してUNLAZYに設定する（ステップＳ５０８）。
以上の処理で、プロセスに必要な情報の設定がなされ、プロセスを実行することが可能となる。
【００５７】
図６Ａおよび図６Ｂは、実施の形態に係るプロセススイッチのフローチャートである。
ここでは、最初にプロセスＡが実行されているものとする。
ステップＳ６０１において、例外入口処理部４０４は、発生した例外がFPUが使用できないFPU使用不可例外であるか否かについて判定を行う。発生した例外がFPU使用不可例外である場合（FPUが使用できない場合）、ステップＳ６１０に制御は進み、FPU使用不可例外でない場合（FPUが使用できる場合）、ステップＳ６０２に制御は進む。
【００５８】
尚、FPU使用不可例外は、現プロセスがLAZYである場合のみ発生する。
ステップＳ６０２において、例外入口処理部４０４は、現在のプロセスのFPUレジスタ以外のコンテキストをプロセスコンテキスト４１７に退避する。
【００５９】
ステップＳ６０３において、システムコール処理部４０９は、カーネルサービスを実行する。
ステップＳ６０４において、例外出口処理部４０５は、スケジューラ呼び出し判定を行う。すなわち、例外出口処理部４０５は、カーネルサービス後に実行するプロセスがカーネルサービス実行前と同じプロセス（プロセスＡ）か異なるプロセス（プロセスＢ）かを判定する。
【００６０】
カーネルサービス後に実行するプロセスがプロセスＡの場合、ステップＳ６０５に制御は進み、カーネルサービス後に実行するプロセスがプロセスＢの場合、ステップＳ６１５に制御は進む。
【００６１】
ステップＳ６０５において、例外出口処理部４０５は、プロセス管理情報格納領域４１２を参照し、プロセスＡがLAZYかUNLAZYか判定する。プロセスＡがLAZYの場合、制御はステップＳ６０９に進み、UNLAZYの場合、制御はステップＳ６０６に進む。
【００６２】
ステップＳ６０６において、例外出口処理部４０５は、FPowner記憶領域を参照し、現在のFPownerの識別子の値を取得する。
ステップＳ６０７において、例外出口処理部４０５は、現在のプロセス（プロセスＡ）が現在のFPownerの識別子の値と同一か判定する。現在のプロセスが現在のFPownerの識別子の値と同一の場合、制御はステップＳ６０９に進み、現在のFPownerの識別子の値と異なる場合、制御はステップＳ６０８に進む。
【００６３】
ステップＳ６０８において、例外出口処理部４０５は、現在のプロセスのFPレジスタ退避領域４１４からのレジスタ値を読み出し、浮動小数点数レジスタ群２０３にレジスタを復元する。また、例外出口処理部４０５は、FP状態レジスタ２０４のbit32を１に設定する。
【００６４】
ステップＳ６０９において、例外出口処理部４０５は、プロセスＡのコンテキストを復元する。こで、例外出口処理部４０５が復元するコンテキストは、浮動小数点レジスタ群２０３に含まれるレジスタの値以外のコンテキスト（例えば、汎用レジスタの値など）である。
【００６５】
ステップＳ６１０において、FPU使用不可例外処理部４０７は、FPowner記憶領域４１３を参照し、現在のFPownerの識別子の値を取得する。そして、FPU使用不可例外処理部４０７は、現在のプロセス（プロセスＡ）が現在のFPownerの識別子の値と同一か判定する。現在のプロセスが現在のFPownerの識別子の値と同一の場合、制御はステップＳ６０９に進み、異なる場合、制御はステップＳ６１１に進む。
【００６６】
ステップＳ６１１において、FPU使用不可例外処理部４０７は、浮動小数点レジスタ群２０３のレジスタ値をFPownerの識別子に対応するFPレジスタ退避領域４１４に退避する。
【００６７】
ステップＳ６１２において、FPU使用不可例外処理部４０７は、FPownerの識別子の値を現在のプロセス（プロセスＡ）に設定する。
ステップＳ６１３において、FPU使用不可例外処理部４０７は、現在のプロセスのFPレジスタ退避領域４１４からレジスタ値を読み出し、浮動小数点レジスタ群２０３にレジスタ値を復元する。
【００６８】
ステップＳ６１４において、FPU使用不可例外処理部４０７は、FP状態レジスタのbit32を１に設定する。
ステップＳ６１５において、例外出口処理部４０７は、スケジューラ４０６を呼び出す。
【００６９】
ステップＳ６１６において、スケジューラ４０６は、次に実行するプロセスを選択する。本実施の形態では、プロセスＢを選択するものとする。
ステップＳ６１７において、コンテキストスイッチ部４１０は、プロセス管理情報格納領域４１２を参照し、プロセスＢの種別を判定する。プロセスＢがLAZYの場合、制御はステップＳ６２０に進み、UNLAZYの場合、制御はステップＳ６１８に進む。
【００７０】
ステップＳ６１８において、コンテキストスイッチ部４１０は、浮動小数点数レジスタ群２０３のレジスタ値をFPownerの識別子に対応するFPレジスタ退避領域４１４に退避する。
【００７１】
ステップＳ６１９において、コンテキストスイッチ部４１０は、FPownerをidleプロセスに設定する。idleプロセスとは、I/O完了待ちなどでCPUの計算資源を使用しないアイドル状態の場合に動作するプロセスのことである。
【００７２】
ステップＳ６２０において、コンテキストスイッチ部４１０は、実行するプロセスをプロセスＢに切替える。すなわち、コンテキストスイッチ部４１０は、カーネルスタック４１６をプロセスＢのカーネルスタックへ切替える。
【００７３】
ステップＳ６２１において、例外出口処理部４０５は、プロセスＢをカーネル空間４５２からユーザ空間４１１へ復帰させる。
ステップＳ６２２において、例外出口処理部４０５は、プロセス管理情報格納領域４１２を参照し、プロセスＢがLAZYかUNLAZYか判定する。プロセスＢがLAZYの場合、制御はステップＳ６２６に進み、UNLAZYの場合、制御はステップＳ６２３に進む。
【００７４】
ステップＳ６２３において、例外出口処理部４０５は、FPowner記憶領域４１３を参照し、現在のFPownerの識別子の値を取得する。
ステップＳ６２４において、例外出口処理部４０５は、現在のプロセス（プロセスＢ）が現在のFPownerの識別子の値と同一か否かを判定する。現在のプロセスが現在のFPownerの識別子の値と同一の場合、制御はステップＳ６２６に進み、現在のFPownerの識別子の値と異なる場合、制御はステップＳ６２５に進む。
【００７５】
ステップＳ６２５において、例外出口処理部４０５は、現在のプロセスのFPレジスタ退避領域４１４からレジスタ値を読み出し、浮動小数点数レジスタ群２０３にレジスタ値を復元する。また、例外出口処理部４０５は、FP状態レジスタのbit32を１に設定する。
【００７６】
ステップＳ６２６において、例外出口処理部４０５は、プロセスＢのコンテキストを復元する。ここで、例外出口処理部４０５が復元するコンテキストは、浮動小数点レジスタ群２０３のレジスタ以外のコンテキスト（例えば、汎用レジスタなど）である。
【００７７】
実施の形態のオペレーティングシステムによれば、次に実行するプロセスがLAZYプロセスの場合、浮動小数点数レジスタ群のレジスタ値を退避しない。これにより、浮動小数点数レジスタ群を使用する可能性の低いLAZYプロセスの実行において、浮動小数点数レジスタ群のレジスタ値を退避しないことにより、プロセスの切替えに伴うコンテキストスイッチの発生回数を抑え、コンテキストスイッチの発生によるオペレーティングシステムのオーバーヘッド等のコストを低減することができる。
【００７８】
実施の形態のオペレーティングシステムによれば、次に実行するプロセスがUNLAZYプロセスの場合、浮動小数点数レジスタ群のレジスタ値を退避する。これにより、浮動小数点数レジスタ群を使用する可能性の高いUNLAZYプロセスの実行において、FPUが使用できないFPU使用不可例外が発生せず、例外発生によるシステムのスループットの低下を防ぐことが出来る。
【００７９】
実施の形態のオペレーティングシステムによれば、実行しようとするプロセスの種別に応じて、浮動小数点数レジスタ群の退避および復元の実行の有無を判定することで、効率の良いコンテキストスイッチを実行することが出来る。それにより、情報処理装置全体のスループットが向上する。
【００８０】
図７は、従来技術および実施の形態に係るコンテキストスイッチのタイムチャートである。
図７の上部は、従来技術のコンテキストスイッチによる処理を示し、下部は実施の形態のコンテキストスイッチによる処理を示す。
【００８１】
図７において、プロセスＡはLAZYプロセス、プロセスＢはUNLAZYプロセスである。ただし、従来技術においては、プロセスがLZAYプロセスであるかUNLAZYプロセスであるかは区別していない。
【００８２】
図７において、一目盛りの間隔はΔtである。
図７は、最初、プロセスＡが実行されており、プロセスＡからプロセスＢに切り替え、CPUに5*Δt分、プロセスＢを割り当て、その後、CPUに4*Δt分、プロセスＡを割り当てるまでの処理を示している。
【００８３】
従来技術によるコンテキストスイッチにおいて、t0において、汎用レジスタの退避および復元やTLBの切替処理などを含むコンテキストスイッチが行われる。そして、t1において、プロセスＢが実行され、t2において、FPU使用不可例外が発生する。FPU使用不可例外が発生したので、t3において、プロセスＡのFPレジスタは退避され、t4において、プロセスＢのFPレジスタが復元され、t5において、プロセスＢが実行される。t6において、t0におけるコンテキストスイッチから合計して、プロセスＢは5*Δt分実行されたので、コンテキストスイッチが行われ、プロセスＡに切り替わる。その後、プロセスＡが実行され、FPU使用不可例外が発生し、プロセスＢのFPレジスタの退避とプロセスＡのFPレジスタの復元が行われ、プロセスＡが実行される。t7において、t0におけるタスクスイッチ後、プロセスＢは5*Δt分、実行され、プロセスＡは4*Δt分、実行されている。
【００８４】
実施の形態によるコンテキストスイッチにおいて、t0において、汎用レジスタの退避および復元やTLBの切替処理などを含むコンテキストスイッチが行われる。そして、t1において、プロセスＡのFPレジスタは退避され、t2において、プロセスＢのFPレジスタが復元され、t3において、プロセスＢが実行される。t6’において、t0におけるコンテキストスイッチから合計して、プロセスＢは5*Δt分実行されたので、コンテキストスイッチが行われ、プロセスＡに切り替わる。その後、プロセスＡが実行され、FPU使用不可例外が発生し、プロセスＢのFPレジスタの退避とプロセスＡのFPレジスタの復元が行われ、プロセスＡが実行される。t7’において、t0におけるタスクスイッチ後、プロセスＢは5*Δt分、実行され、プロセスＡは4*Δt分、実行されている。
【００８５】
図７において、実施の形態によるコンテキストスイッチと従来技術によるコンテキストスイッチとを比較すると、プロセスＡとプロセスＢが同じ分だけ実行された場合、実施の形態によるコンテキストスイッチの方が、2Δt早く処理が完了している。
【００８６】
本実施の形態により、図７に示すとおり浮動小数点数レジスタを多用するプロセスのコンテキスト復元に浮動小数点使用不可例外を必要としなくなるため、従来、例外ハンドラの駆動時間に割り当てられていたCPU時間をジョブに割当てることが可能となる。したがって、情報処理装置のスループットが向上する。
【００８７】
尚、実施の形態においては、浮動小数点数レジスタに本発明を適用した例を述べたが、本発明はこれに限られず、任意のレジスタに適用することが出来る。例えば、CPUの汎用レジスタに本発明を適用して、汎用レジスタのレジスタ値の退避および復元を行っても良い。
【符号の説明】
【００８８】
１０１    情報処理装置
２０１    CPU
３０１    メモリ
４０１    オペレーティングシステム
４０２    コマンド実行部
４０３    カーネルサービス
４０４    例外入口処理部
４０５    例外出口処理部
４０６    スケジューラ
４０７    FPU使用不可例外処理部
４０８    プロセス起動部
４０９    システムコール処理部
４１０    コンテキストスイッチ部
４１１    プロセス
４１２    プロセス管理情報格納領域
４１３    FPowner記憶領域
４１４    FPレジスタ退避領域
４１５    ユーザプログラム
４１６    カーネルスタック
４１７    プロセスコンテキスト
４５１    ユーザ空間
４５２    カーネル空間
【図１】
0005644307.tif 000002
【図２】
0005644307.tif 000003
【図３】
0005644307.tif 000004
【図４】
0005644307.tif 000005
【図５】
0005644307.tif 000006
【図６Ａ】
0005644307.tif 000007
【図６Ｂ】
0005644307.tif 000008
【図７】
0005644307.tif 000009