(57)【要約】【課題】ＳＭＰ非対応のプログラムをＳＭＰ対応プログラムに変更する方法を提供する。【解決手段】情報処理装置は、ＳＭＰ構成の複数のプロセッサと、グローバル変数を使用するプログラムであって、グローバル変数についてプロセッサと同数のデータ領域を確保し、グローバル変数にアクセスする場合、データ領域のうち当該プログラムのタスクを実行するプロセッサに割り当てられたデータ領域にアクセスする処理を含むプログラムと、プログラムをプロセッサの何れかに割り当てて実行するＯＳと、を記憶する記憶部と、を備える。【選択図】図１３
2020086871.tif 000002
【特許請求の範囲】
【請求項１】
ＳＭＰ（Symmetric Multi-Processing）構成の複数のプロセッサと、
グローバル変数を使用するプログラムであって、前記グローバル変数について前記プロセッサと同数のデータ領域を確保し、前記グローバル変数にアクセスする場合、前記データ領域のうち当該プログラムのタスクを実行する前記プロセッサに割り当てられた前記データ領域にアクセスする処理を含むプログラムと、前記プログラムを前記プロセッサの何れかに割り当てて実行するオペレーティングシステムと、を記憶する記憶部と、
を備える情報処理装置。
【請求項２】
前記オペレーティングシステムが、前記グローバル変数の値を保存する固有値格納エリアを同時に実行可能状態となるタスク数の上限値分備え、前記プログラムを実行するタスクに対応する前記固有値格納エリアと当該タスクを実行する前記プロセッサに割り当てられた前記データ領域との間で、前記グローバル変数の値を退避または復元する処理を行う、
請求項１に記載の情報処理装置。
【請求項３】
前記オペレーティングシステムが、前記プログラムを実行するタスクが切り替わる際に、切り替え前の前記タスクである第１タスクを実行する前記プロセッサに割り当てられた前記データ領域から、前記第１タスクに対応する前記固有値格納エリアへ前記第１タスクに係る前記グローバル変数の値を退避し、切り替え後の前記タスクである第２タスクに対応する前記固有値格納エリアから切り替え後の前記第２タスクを実行する前記プロセッサに割り当てられた前記データ領域へ前記第２タスクに係る前記グローバル変数の値を復元する、
請求項２に記載の情報処理装置。
【請求項４】
ＳＭＰ構成の複数のプロセッサによって実行されるグローバル変数を使用するプログラムであって、前記グローバル変数について前記プロセッサと同数のデータ領域を確保し、前記グローバル変数にアクセスする場合、前記データ領域のうち当該プログラムのタスクを実行する前記プロセッサに割り当てられた前記データ領域にアクセスする処理を含む、
プログラム。
【請求項５】
プログラムが使用するグローバル変数の値を保存する固有値格納エリアを同時に実行可能状態となるタスク数の上限値分備え、前記プログラムを実行するタスクに対応する前記固有値格納エリアと、ＳＭＰ構成の複数のプロセッサのうちの前記タスクを実行する１つの前記プロセッサに対応して設けられた前記グローバル変数を格納するデータ領域であって前記プログラムからアクセス可能な前記データ領域との間で、前記グローバル変数の値を退避または復元する処理を行う、
オペレーティングシステム。
【請求項６】
ＳＭＰ構成の複数のプロセッサによるグローバル変数を利用するプログラムの実行方法であって、
前記グローバル変数について前記プロセッサと同数のデータ領域が前記プログラムからアクセス可能に確保され、実行中の前記プログラムが前記グローバル変数にアクセスする場合、前記データ領域のうち当該プログラムのタスクを実行する前記プロセッサに割り当てられた前記データ領域にアクセスする処理と、
前記グローバル変数の値を保存する固有値格納エリアが同時に実行可能状態となるタスク数の上限値分確保され、前記プログラムを実行するタスクが切り替わるたびに切り替えに係る前記タスクに対応する前記固有値格納エリアと当該タスクを実行する前記プロセッサに割り当てられた前記データ領域との間で、前記グローバル変数の値を退避または復元する処理を行う処理と、
を含む実行方法。
【請求項７】
ＳＭＰ非対応のプログラムをＳＭＰ対応のプログラムに修正する修正方法であって、
コンピュータが、
前記プログラムのグローバル変数について、ＳＭＰ構成で動作するプロセッサと同数のデータ領域を確保するよう修正するステップと、
前記グローバル変数にアクセスする処理を、前記データ領域のうち当該プログラムのタスクを実行する前記プロセッサに割り当てられた前記データ領域にアクセスする処理に変更するステップと、
を有するプログラムの修正方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、プログラム、オペレーティングシステム、実行方法及びプログラムの修正方法に関する。
【背景技術】
【０００２】
古いソフトウェア資産では、複数のタスク（プログラムの実行単位）が並列に動作する状況が想定されていないため、関数をまたいで参照される変数が、グローバル変数として定義されていることがある。グローバル変数は、各タスクで同一のアドレスとなるため、同時に実行可能状態にある複数のタスクが、複数のプロセッサに対称的に割り当てられて実行されるＳＭＰ（Symmetric Multi-Processing）環境では、期待しない動作（グローバル変数のデータ不整合）が生じる可能性がある。
【０００３】
例えば、図１０にＳＭＰ環境に対応しないプログラムの例を示す。ｆｕｎｃ１は、グローバル変数ｇｌｏｂａｌ＿ｎｕｍに「１」を設定するプログラムである。ｆｕｎｃ２は、ｇｌｏｂａｌ＿ｎｕｍに「１」を加算するプログラムである。ｔｅｓｔ＿ｔａｓｋは、ｆｕｎｃ１を実行し、その後、ｇｌｏｂａｌ＿ｎｕｍの値を出力し、続いてｆｕｎｃ２を実行し、その後、ｇｌｏｂａｌ＿ｎｕｍの値を出力するプログラムである。ｔｅｓｔ＿ｔａｓｋを実行すると、「１」が表示され、次に「２」が表示される。
【０００４】
図１０のプログラムを実行したときに参照されるグローバル変数ｇｌｏｂａｌ＿ｎｕｍのアドレスは、コンパイル時に一意に決定する。すると、マルチタスク環境で同時に複数のタスクがｔｅｓｔ＿ｔａｓｋを実行する場合、それら複数のタスクから、ｇｌｏｂａｌ＿ｎｕｍが割り当てられた同一のアドレスへアクセスが発生する。図１１に示すようにＡＭＰ（Asymmetric Multi-Processing）環境であれば複数タスクが同一アドレスにアクセスする場合においても同時に処理するプロセッサコアは１つのため、データの不整合は発生しない。しかし、図１２に示すようなＳＭＰ環境の場合、複数のプロセッサコアが並列にタスクを実行し、任意のタイミングでｇｌｏｂａｌ＿ｎｕｍを書き換えるため、データの不整合が発生し、実行結果が期待値にならない場合がある。
【０００５】
一般にＳＭＰ環境で実行するプログラムについては、期待しない動作が生じないように設計を行う。例えば、タスク間で共有しないデータを格納する変数については、グローバル変数として定義するのではなく、ＴＬＳ(Thread Local Storage)やＰＯＳＩＸ Ｋｅｙを使用し、タスク個別の変数として定義する。あるいは、グローバル変数として定義するのであれば、タスク間で排他制御をするか、ＴＬＢ(Translation Lookaside Buffer)を使用して、プログラム上のアドレスは共通だが、物理アドレスはタスク別に固有な値として管理し、データの不整合を回避する等の対処を行う。
【０００６】
しかし、ＴＬＳやＰＯＳＩＸ Ｋｅｙを使用する方法は、ＯＳやアーキテクチャによって使用できない場合がある。また、排他制御により、グローバル変数に同時にアクセスするタスクを制限する方法の場合、同時に動作可能なタスクが１つとなる。その為、他のタスクはロック取得を待ち待機状態となり、ＳＭＰ化する意義が失われてしまう。また、ＴＬＢを使用する方法は、タスクの切り替えごとにＴＬＢ設定の変更、それにともなう命令やキャッシュの同期処理が発生し、プログラムの実行時間に影響が及ぶ可能性がある。
【０００７】
また、ＴＬＳやＰＯＳＩＸ Ｋｅｙを使用せずにＳＭＰ非対応のプログラムを修正する場合、タスク間でアクセスの競合が発生するグローバル変数をローカル変数として宣言し直す等してデータの不整合を回避する修正を行う必要があるが、グローバル変数が多ければ、確認や修正のコストが増大し、修正が困難となる。
【０００８】
関連する技術として、特許文献１では、マルチスレッド上で動作するプログラムのプログラム・コードをロック衝突が少ないプログラム・コードに変換する方法が提案されている。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特許第４７５４００４号公報
【発明の概要】
【発明が解決しようとする課題】
【００１０】
ＳＭＰ環境に対応していないプログラムを、修正量と実行時間の増加を抑制しつつ、ＳＭＰ環境に対応させる方法が求められている。
【００１１】
そこでこの発明は、上述の課題を解決する情報処理装置、プログラム、オペレーティングシステム、実行方法及びプログラムの修正方法を提供することを目的としている。
【課題を解決するための手段】
【００１２】
本発明の一態様によれば、情報処理装置は、ＳＭＰ構成の複数のプロセッサと、グローバル変数を使用するプログラムであって、前記グローバル変数について前記プロセッサと同数のデータ領域を確保し、前記グローバル変数にアクセスする場合、前記データ領域のうち当該プログラムのタスクを実行する前記プロセッサに割り当てられた前記データ領域にアクセスする処理を含むプログラムと、前記プログラムを前記プロセッサの何れかに割り当てて実行するオペレーティングシステムと、を記憶する記憶部と、を備える。
【００１３】
また、本発明の一態様によれば、プログラムは、ＳＭＰ構成の複数のプロセッサによって実行されるグローバル変数を使用するプログラムであって、前記グローバル変数について前記プロセッサと同数のデータ領域を確保し、前記グローバル変数にアクセスする場合、前記データ領域のうち当該プログラムのタスクを実行する前記プロセッサに割り当てられた前記データ領域にアクセスする処理を含む。
【００１４】
また、本発明の他の一態様によれば、オペレーティングシステムは、プログラムが使用するグローバル変数の値を保存する固有値格納エリアを同時に実行可能状態となるタスク数の上限値分備え、前記プログラムを実行するタスクに対応する前記固有値格納エリアと、ＳＭＰ構成の複数のプロセッサのうちの前記タスクを実行する１つの前記プロセッサに対応して設けられた前記グローバル変数を格納するデータ領域であって前記プログラムからアクセス可能な前記データ領域との間で、前記グローバル変数の値を退避または復元する処理を行う。
【００１５】
また、本発明の他の一態様によれば、実行方法は、ＳＭＰ構成の複数のプロセッサによるグローバル変数を利用するプログラムの実行方法であって、前記グローバル変数について前記プロセッサと同数のデータ領域が前記プログラムからアクセス可能に確保され、実行中の前記プログラムが前記グローバル変数にアクセスする場合、前記データ領域のうち当該プログラムのタスクを実行する前記プロセッサに割り当てられた前記データ領域にアクセスする処理と、前記グローバル変数の値を保存する固有値格納エリアが同時に実行可能状態となるタスク数の上限値分確保され、前記プログラムを実行するタスクが切り替わるたびに切り替えに係る前記タスクに対応する前記固有値格納エリアと当該タスクを実行する前記プロセッサに割り当てられた前記データ領域との間で、前記グローバル変数の値を退避または復元する処理を行う処理と、を含む。
【００１６】
また、本発明の他の一態様によれば、プログラムの修正方法は、ＳＭＰ非対応のプログラムをＳＭＰ対応のプログラムに修正する修正方法であって、コンピュータが、前記プログラムのグローバル変数について、ＳＭＰ構成で動作するプロセッサと同数のデータ領域を確保するよう修正するステップと、前記グローバル変数にアクセスする処理を、前記データ領域のうち当該プログラムのタスクを実行する前記プロセッサに割り当てられた前記データ領域にアクセスする処理に変更するステップと、を有する。
【発明の効果】
【００１７】
本発明によれば、プログラムの実行時間の増加を抑えつつ、少ない修正量で、ＳＭＰ環境に対応していないプログラムを、ＳＭＰ環境に対応させることができる。
【図面の簡単な説明】
【００１８】
【図１】本発明の一実施形態による演算装置の一例を示す図である。
【図２】本発明の一実施形態によるＳＭＰ対応方法を説明する第１の図である。
【図３】本発明の一実施形態によるＳＭＰ対応方法を説明する第２の図である。
【図４】本発明の一実施形態によるＳＭＰ対応方法を説明する第３の図である。
【図５】本発明の一実施形態によるＳＭＰ対応方法を説明する第４の図である。
【図６】本発明の一実施形態によるメモリ領域の一例を示す図である。
【図７】本発明の一実施形態によるＳＭＰ環境へ対応したプログラムの一例を示す図である。
【図８】一般的なタスク切り替え動作の一例を示すフローチャートである。
【図９】本発明の一実施形態によるタスク切り替え動作の一例を示すフローチャートである。
【図１０】ＳＭＰ環境へ対応していないプログラムの一例である。
【図１１】図１０のプログラムの実行形態を示す第１の図である。
【図１２】図１０のプログラムの実行形態を示す第２の図である。
【図１３】本発明の一実施形態による情報処理装置の最小構成を示す図である。
【図１４】本発明の一実施形態における情報処理装置のハードウェア構成の一例を示す図である。
【発明を実施するための形態】
【００１９】
＜実施形態＞
以下、本発明の一実施形態におけるＳＭＰ非対応のプログラムをＳＭＰ環境で動作させるための方法について、図面を参照して説明する。
図１は、本発明の一実施形態による演算装置の一例を示す図である。
演算装置１は、プロセッサ（Ｐｒｏｃｅｓｓｏｒ１１）とメモリ（ＤＤＲ ＲＡＭ１２）とを備えるコンピュータである。このほかにも演算装置１は、ＯＳ（operating system）等を記憶する図示しない補助記憶装置、入出力インタフェース、通信インタフェースなどを備えていてもよい。
Ｐｒｏｃｅｓｓｏｒ１１は、Ｐｒｏｃｅｓｓｏｒ Ｃｏｒｅ１１１と、内部バス１１２と、Ｍｅｍｏｒｙ Ｃｏｎｔｒｏｌｌｅｒ１１３とを備える。Ｐｒｏｃｅｓｓｏｒ Ｃｏｒｅ１１１と、Ｍｅｍｏｒｙ Ｃｏｎｔｒｏｌｌｅｒ１１３とは、内部バス１１２で接続されている。
Ｐｒｏｃｅｓｓｏｒ Ｃｏｒｅ１１１は、４個のプロセッサコア（Ｐｒｏｃｅｓｓｏｒ Ｃｏｒｅ０〜Ｐｒｏｃｅｓｓｏｒ Ｃｏｒｅ３）を含む。プロセッサコアの数は４個に限定されず、２個以上であれば良い。
ＤＤＲ ＲＡＭ１２は、ＯＳ（operating system）を含むプログラム等を格納している。ＤＤＲ ＲＡＭ１２は、Ｐｒｏｃｅｓｓｏｒ１１のＭｅｍｏｒｙ Ｃｏｎｔｒｏｌｌｅｒ１１３と接続している。Ｐｒｏｃｅｓｓｏｒ Ｃｏｒｅ１１１は、Ｍｅｍｏｒｙ Ｃｏｎｔｒｏｌｌｅｒ１１３を介してＤＤＲ ＲＡＭ１２にアクセスすることができる。Ｐｒｏｃｅｓｓｏｒ Ｃｏｒｅ１１１は、ＤＤＲ ＲＡＭ１２からプログラムを読み出し実行することで演算処理を行う。
【００２０】
ＤＤＲ ＲＡＭ１２に格納されたＯＳは、マルチタスクに対応しており、マルチタスクの生成、実行等の機能を備える。また、ＯＳは、ＳＭＰ環境に対応しており、実行するタスク、プロセッサを適宜切り替える機能を備える。また、ＯＳは、実行するタスクの固有の識別番号(タスクＩＤ)を保存するＴＡＳＫ＿ＩＤと、タスクを生成し、そのタスクにＴＡＳＫ＿ＩＤを割り当てるＣＲＥＡＴＥ＿ＴＡＳＫ関数と、ＴＡＳＫ＿ＩＤと実行する関数名とを引数にして、生成したタスクを実行可能状態にするＳＴＡＲＴ＿ＴＡＳＫ関数とを備える。また、ＯＳが生成するタスクの上限数はあらかじめ定まっており、その値は、変数ＭＡＸ＿ＴＡＳＫとして取得することができる。生成されるタスクのＴＡＳＫ＿ＩＤは、０から順に割り当てられ、タスクを上限数まで生成した場合、最後に生成されたタスクのＴＡＳＫ＿ＩＤは、変数ＭＡＸ＿ＴＡＳＫ−１で表すことができる。
【００２１】
図２〜図５は、それぞれ、本発明の一実施形態によるＳＭＰ対応方法を説明する第１〜第４の図である。図７は、本発明の一実施形態によるＳＭＰ環境へ対応したプログラムの一例を示す図である。
まず、ＳＭＰ非対応プログラムに対して、グローバル変数ｇｌｏｂａｌ＿ｎｕｍを、並列に動作し得るプロセッサコアと同数の要素を持つ配列として定義する。図１の演算装置１であれば、プロセッサコア数が４なので、ｇｌｏｂａｌ＿ｎｕｍ［４］として宣言する（図７のソースコードの１行目）。そして、プロセッサコアごとに配列の要素を割り当てる。例えば、図２に示すように、ｇｌｏｂａｌ＿ｎｕｍ［０］をプロセッサコア０、ｇｌｏｂａｌ＿ｎｕｍ［１］をプロセッサコア１、ｇｌｏｂａｌ＿ｎｕｍ［２］をプロセッサコア２、ｇｌｏｂａｌ＿ｎｕｍ［３］をプロセッサコア３にそれぞれ割り当てる。つまり、プロセッサコア０が実行するタスクがｇｌｏｂａｌ＿ｎｕｍにアクセスするときは、ｇｌｏｂａｌ＿ｎｕｍ［０］にアクセスし、ｇｌｏｂａｌ＿ｎｕｍ［０］に格納されたＴａｓｋ＿Ｖａｌｕｅ０を読み出したり、更新したりする。他のプロセッサコア１〜３についても同様である。なお、グローバル変数の配列の要素数は、同時に実行可能状態となるタスクの数ではなく、プロセッサコアの数とする。これは、同時に必要となるグローバル変数の数はコア数に依存するためである。
【００２２】
上記の割り当てを実現するためにプロセッサコアがタスク実行中にｇｌｏｂａｌ＿ｎｕｍ［ｎ］（ｎ＝０〜３）にアクセスした場合、プロセッサコアに割り当てた配列の要素を参照するようＳＭＰ非対応プログラムを変更する。例えば、図７のソースコードのｆｕｎｃ１、ｆｕｎｃ２では、ｇｌｏｂａｌ＿ｎｕｍ［ｃｏｒｅ＿ｎｕｍ］に「１」を設定したり、「１」を加算したりしている。これにより、複数のタスクがそれぞれｔｓｅｔ＿ｔａｓｋを並列に実行した場合、各タスクは、そのタスクを実行するプロセッサコアに対応するｇｌｏｂａｌ＿ｎｕｍ［ｎ］（ｎ＝０〜３）を独立して使用する。これにより、プロセッサコアに配列の要素を割り当てることが可能になる。なお、プログラムの中でｃｏｒｅ＿ｎｕｍを参照することにより、そのプログラムのタスクを実行しているプロセッサコアの番号（０〜３）が取得可能であるとする。
【００２３】
図２の例では、プロセッサコア０では、Ｔａｓｋ０が実行中であり、Ｔａｓｋ０で実行中のプログラムは、プロセッサコア０の使用エリアであるｇｌｏｂａｌ＿ｎｕｍ［０］を、Ｔａｓｋ０固有の値(Ｔａｓｋ０＿Ｖａｌｕｅ)として使用する。プロセッサコア１〜３、実行中のタスクＴａｓｋ１〜３、ｇｌｏｂａｌ＿ｎｕｍ［ｎ］（ｎ＝１〜３）の関係についても同様である。ｇｌｏｂａｌ＿ｎｕｍ［ｎ］と使用プロセッサコアと実行タスクとｇｌｏｂａｌ＿ｎｕｍ［ｎ］の値の関係を図３の表に示す。
【００２４】
このようにＳＭＰ非対応プログラム側では、（Ａ１）１つのグローバル変数についてプロセッサコア数分の領域を確保し、（Ａ２）グローバル変数へアクセスする処理を、プロセッサコアに対応する領域へアクセスするようソースコードの変更を行う。
【００２５】
そして、ＯＳ側では、全タスク分のグローバル変数の値を、タスクごとの専用のメモリ領域（変数格納エリア）に退避し、タスクが実行されると、そのタスク用の変数格納エリアから、プログラム側で宣言したグローバル変数の配列のプロセッサコアに対応する要素に当該変数格納エリアに保存した値を復元し、一方、これまで実行されていたタスクによって演算されたグローバル変数の値は、上記配列のプロセッサコアに対応する要素から、そのタスク用の変数格納エリアに退避するようにして、データの不整合が生じないようにする。例えば、ｇｌｏｂａｌ＿ｎｕｍ［０］が割り当てられたプロセッサコア０が実行するタスクが切り替わる際に、ＯＳによるタスク切り替え処理の延長上で、新しく実行するタスク固有の値をそのタスク専用の変数格納エリアからｇｌｏｂａｌ＿ｎｕｍ［０］に復元し、これまで実行されていたタスクのｇｌｏｂａｌ＿ｎｕｍ［０］の値は、そのタスクの変数格納エリアに退避する機能をＯＳに追加する。
【００２６】
さらに詳しく説明すると、例えば、図２に例示したプロセッサコアとタスクの関係が図４に示す状態に変わったとする。具体的には、プロセッサコア２〜３が実行するタスクには変化が無く、プロセッサコア０がＴａｓｋ７を実行し、プロセッサコア１がＴａｓｋ４を実行する状態に遷移したとする。状態遷移後のｇｌｏｂａｌ＿ｎｕｍ［ｎ］と使用プロセッサコアと実行タスクとｇｌｏｂａｌ＿ｎｕｍ［ｎ］の値の関係を図５の表に示す。この場合、ＯＳによるタスク切り替え処理が実行される。タスク切り替え処理は、ＯＳの種類に依存するが、一般的にはレジスタのＳａｖｅ／Ｒｅｓｔｏｒｅ処理が実行される。すなわち、Ｔａｓｋ０からＴａｓｋ７に遷移する場合、Ｔａｓｋ０の実行状態のレジスタをメモリに退避(Ｓａｖｅ)し、Ｔａｓｋ７の状態をメモリから読み出してレジスタに復元(Ｒｅｓｔｏｒｅ)する。このＯＳが備えるタスク切り替えに連動し、実行状態のタスクがＴａｓｋ０からＴａｓｋ７に遷移する過程で、Ｔａｓｋ０固有のｇｌｏｂａｌ＿ｎｕｍ[０]の値をＴａｓｋ０用の変数格納エリアに退避し、Ｔａｓｋ７固有の値をＴａｓｋ７用の変数格納エリアからｇｌｏｂａｌ＿ｎｕｍ[０]に復元する処理をＯＳに追加する。また、タスク固有のｇｌｏｂａｌ＿ｎｕｍ［ｎ］の値を、タスクごとに保存する変数格納エリアを確保する処理をＯＳに追加する。
【００２７】
図６は、本発明の一実施形態によるメモリ領域の一例を示す図である。
図６にタスク固有のｇｌｏｂａｌ＿ｎｕｍの値を保存するための変数格納エリアの一例を示す。
（Ｂ１）ＯＳにおいて、例えば、配列ＴＡＳＫ＿ＶＡＬ［ＭＡＸ＿ＴＡＳＫ］を定義する。タスク固有に扱うグローバル変数は、あらかじめＳＭＰ非対応ソースコードを解析して抽出しておく。また、配列ＴＡＳＫ＿ＶＡＬを定義する際に指定する要素数は、ＯＳが生成しうるタスク数の上限値（同時に実行可能状態となるタスク数の上限値）であるＭＡＸ＿ＴＡＳＫとする。これにより、全てのタスクに対して、個別にｇｌｏｂａｌ＿ｎｕｍの値を保存するメモリ領域を確保することができる。
【００２８】
（Ｂ２）また、ＯＳの起動時などに配列ＴＡＳＫ＿ＶＡＬ［ＭＡＸ＿ＴＡＳＫ］をメモリ領域に確保する処理をＯＳに追加する。これにより、ＯＳは、各タスクに割り当てられたＴＡＳＫ＿ＩＤに基づいて、ＴＡＳＫ＿ＶＡＬ［ＴＡＳＫ＿ＩＤ］にアクセスすることで、タスクごとに割り当てられた変数格納エリアを使用することができる。
【００２９】
（Ｂ３）また、タスク切り替えに伴い、これまで実行されていたタスク（ＴＡＳＫ＿ＩＤ＝０とする。）のタスク固有の値を、配列ＴＡＳＫ＿ＶＡＬの対応する要素であるＴＡＳＫ＿ＶＡＬ［０］に退避し、切り替え後のタスク（ＴＡＳＫ＿ＩＤ＝７とする。）の固有値をＴＡＳＫ＿ＶＡＬ［７］からグローバル変数の配列のタスク切り替えを行うプロセッサコアに対応する要素（例えば、ｇｌｏｂａｌ＿ｎｕｍ［０］）へ復元する機能をＯＳに追加する。
【００３０】
次に図７を参照して図１０に例示したＳＭＰ非対応プログラムからの変更点について説明する。
まず、グローバル変数ｇｌｏｂａｌ＿ｎｕｍを、コア数に応じた要素を有する配列として宣言する。また、ｆｕｎｃ１、ｆｕｎｃ２内で、実行中のプロセッサコアに応じたｇｌｏｂａｌ＿ｎｕｍ［ｃｏｒｅ＿ｎｕｍ］にアクセスするように変更する。
また、ｍａｉｎ関数では、一例として、生成できるタスクの上限値ＭＡＸ＿ＴＡＳＫと同数のタスクを生成するようにする（７−１）。各タスクのＴＡＳＫ＿ＩＤは、ＴＡＳＫ０、ＴＡＳＫ１、ＴＡＳＫ２、・・・、ＴＡＳＫ［ＭＡＸ＿ＴＡＳＫ−１］となる。さらに、各タスクが関数ｔｅｓｔ＿ｔａｓｋを実行するよう指定し、タスクを起動する（７−２）。これにより、各タスク（ＴＡＳＫ＿ＩＤ＝ＴＡＳＫ０〜ＴＡＳＫ［ＭＡＸ＿ＴＡＳＫ−１］）が並列に実行可能な状態となる。実際には、プロセッサコア数が４でＭＡＸ＿ＴＡＳＫが４以上の場合、最大で４個のタスクが並列に動作する状態となる。
【００３１】
次に図８、図９を参照して、ＳＭＰ対応済みプログラムが実行される際の動作を説明する。
図８は、一般的なタスク切り替え動作の一例を示すフローチャートである。
比較の為、マルチスレッド対応のＯＳによる一般的なタスク切り替え処理を説明する。
例えば、プロセッサコア０にて、ＴＡＳＫ３が実行されている状態であるとする（ステップＳ１１）。ここで割り込みが発生し、プロセッサコア０が実行するタスクを、ＴＡＳＫ３からＴＡＳＫ７へ切り替えるとする。ＯＳは、ＴＡＳＫ３の実行時におけるレジスタの情報をメモリの所定の領域に退避し、ＴＡＳＫ７に係る実行情報をメモリの所定の領域から読み出してレジスタへ設定する等してタスクの切り替え処理を行う（ステップＳ１２）。そして、プロセッサコア０がＴＡＳＫ７を実行する（ステップＳ１３）。
【００３２】
次に本実施形態の機能追加を行ったＯＳおよびＳＭＰ対応済みプログラムによるタスク切り替え動作を説明する。
図９は、本発明の一実施形態によるタスク切り替え動作の一例を示すフローチャートである。
前提として、タスクが実行するプログラムは、ＳＭＰ対応済みであるとする。例えば、グローバル変数は、プロセッサコア数分の要素を持つ配列として定義され、また、実行中のタスク固有のグローバル変数の値は、配列の対応する要素（プロセッサコアの番号）へ格納するように修正されている。また、ＯＳは、図６に例示するＭＡＸ＿ＴＡＳＫ分の変数格納エリア（ＴＡＳＫ＿ＶＡＬ［ＭＡＸ＿ＴＡＳＫ］）を備え、タスク切り替えとともにタスク固有の値を変数格納エリアに対して退避、復元する機能を備えている。また、ＯＳの起動時にＭＡＸ＿ＴＡＳＫ分の変数格納エリアがメモリ（ＤＤＲ ＲＡＭ１２）に確保されているとする。
【００３３】
図７のソースコードに例示するようにＣＲＥＡＴＥ＿ＴＡＳＫによって生成され、ＳＴＡＲＴ＿ＴＡＳＫによって実行開始されたタスクは、実行可能なプロセッサコアが割り当てられると実行が開始される。ＴＡＳＫ３が、例えば、プロセッサコア０に割り当てられ実行中であるとする（ステップＳ１１）。ここで、ＴＡＳＫ３からＴＡＳＫ７への切り替えが発生するとする。
【００３４】
すると、ＯＳは、まず、ＴＡＳＫ３を実行しているプロセッサコアの番号とＴＡＳＫ＿ＩＤとを取得する（ステップＳ１２１）。この例では、プロセッサコアの番号が０、ＴＡＳＫ＿ＩＤは３である。より具体的には、ＯＳは、コア番号レジスタをＲｅａｄし、プロセッサコア番号として「０」を取得する。また、ＯＳは、ＯＳ管理情報から実行中タスクのＴＡＳＫ＿ＩＤとして「３」を取得する。
【００３５】
次にＯＳは、ＴＡＳＫ３固有のグローバル変数の値を変数格納エリアとして確保した配列のＴＡＳＫ＿ＩＤに対応する要素へ退避する（ステップＳ１２２）。例えば、ＯＳは、プロセッサコア０に対応するｇｌｏｂａｌ＿ｎｕｍ［０］の値を、ＴＡＳＫ３に対応するＴＡＳＫ＿ＶＡＬ［３］へ退避する。より具体的には、ＯＳは、ｇｌｏｂａｌ＿ｎｕｍ［０］に格納されたデータをＴＡＳＫ＿ＶＡＬ［３］にコピーする。
【００３６】
次にＯＳは、ＴＡＳＫ３の実行時におけるレジスタの情報をメモリの所定の領域に退避し、ＴＡＳＫ７に係る実行情報をメモリの所定の領域から読み出して、レジスタへ設定する等してタスクの切り替え処理を行う（ステップＳ１２）。
【００３７】
次にＯＳは、ＴＡＳＫ７を実行するプロセッサコアの番号とＴＡＳＫ７のＴＡＳＫ＿ＩＤとを取得する（ステップＳ１２３）。より具体的には、ＯＳは、コア番号レジスタをＲｅａｄし、プロセッサコア番号「０」を取得し、ＯＳ管理情報から次に実行するタスクのＴＡＳＫ＿ＩＤとして「７」を取得する。
【００３８】
次にＯＳは、ＴＡＳＫ７固有のグローバル変数の値を、変数格納エリアとして確保した配列のＴＡＳＫ＿ＩＤに対応する要素から復元する（ステップＳ１２４）。具体的には、ＯＳは、ＴＡＳＫ７に対応するＴＡＳＫ＿ＶＡＬ［７］に保存された値を、プロセッサコア０に対応するｇｌｏｂａｌ＿ｎｕｍ［０］へコピーする。タスク固有値のＳａｖｅ／Ｒｅｓｔｏｒｅ処理が完了すると、ＯＳは、ＴＡＳＫ７の実行を開始する（ステップＳ１３）。
【００３９】
なお、タスクを実行するプロセッサのコア番号は、プロセッサのアーキテクチャに依存するが、一般的にはプロセッサが備える所定のコア番号レジスタを読み出すことで取得することができる。また、タスクのＴＡＳＫ＿ＩＤは、ＯＳが管理するものであり、ＯＳの基本的な機能により取得することができる。
【００４０】
図９で説明した処理によれば、図７に例示するプログラムは、並列に実行されたとしても、まず「１」を表示し、次に「２」を表示するという期待通りの動作を行う。また、本実施形態によるプログラムの修正およびＯＳであれば、ＳＭＰ非対応プログラムの修正量が少なく済み、実行時間の増加も最小限に抑えることができる。
【００４１】
より具体的には、本実施形態に係るプログラムおよびＯＳによれば、タスク切り替えに連動してＴＬＢを切り替える手法に比べ、ＴＬＢ切り替えが発生しないため実行時間の増加を抑えることができる。また、ＴＬＳ／ＰＯＳＩＸ Ｋｅｙを使用する方法では、環境によっては使用できない（サポートされていない）場合があるのに対し、本実施形態に係るプログラムおよびＯＳの修正方法は、環境による制限を受けることなく適用することができる。また、各プロセッサコアが使用する変数格納エリア（ＴＡＳＫ＿ＶＡＬ）が明確なため、必要に応じて別コア（別タスク）の使用エリアへのアクセスが容易である。また、グローバル変数へのアクセスを排他制御する方法では、ロック取得待ち時間が発生しタスクの並列動作が妨げられる(実行時間が増加する)が、本実施形態のＯＳは、ＯＳのタスク切り替え処理に連動してタスク固有値のＳａｖｅ／Ｒｅｓｔｏｒｅ処理を行うため、ロック取得待ち時間が発生せずＳＭＰ化による高速化の恩恵を受けることができる。
【００４２】
また、タスク切り替え処理に連動し、あらかじめ指定したタスク固有値（グローバル変数）のＳａｖｅ／Ｒｅｓｔｏｒｅを行う処理をＯＳの機能として実装することで、過去資産（ＳＭＰ非対応プログラム）を流用して作成するプログラムについて、ＳＭＰを考慮した根本設計の見直しを行う必要が無い。つまり、グローバル変数の宣言部分と参照部のみの最小限のコード修正でＳＭＰに対応したソフトウェアを作成することができる。例えば、図９のソースコードを、図７のソースコードに修正する場合、ｇｌｏｂａｌ＿ｎｕｍの宣言をｉｎｔ型変数のからｉｎｔ型の配列に変更する。また、グローバル変数を参照する箇所について、ｇｌｏｂａｌ＿ｎｕｍをｇｌｏｂａｌ＿ｎｕｍ［ｃｏｒｅ＿ｎｕｍ］に変更するが、これらの修正は、機械的な一括置換によって修正可能であり、容易に修正が完了する。また、この修正を実行する修正用プログラムを作成し、修正用プログラムを実行することによって、グローバル変数の配列宣言、グローバル変数の宣言への参照箇所の修正を行ってもよい。
【００４３】
なお、上記の説明では、ＯＳ起動時に配列ＴＡＳＫ＿ＶＡＬのメモリ領域を確保する例を用いて説明を行ったが、タスク生成時またはタスクの実行開始時に動的にメモリを確保し、確保した領域にタスク固有値を退避する構成でもよい。また、上記の説明では、ＴＡＳＫ＿ＶＡＬを配列として定義したが、タスク固有メモリ領域は、ＴＡＳＫ＿ＩＤをキーに一意にデータ領域を特定できればよいので、例えば、リスト等の他のデータ構造を用いて実現しても良い。また、上記例では、グローバル変数は１つ(ｇｌｏｂａｌ＿ｎｕｍ)のみであったが、複数のグローバル変数を、図８に例示するタスク固有メモリ領域にＳａｖｅ／Ｒｅｓｔｏｒｅする構成でもよい。
【００４４】
図１３は、本発明の一実施形態による情報処理装置の最小構成を示す図である。
図１３に示すように情報処理装置１００は、少なくとも複数のプロセッサ１０１と、記憶部１０２を備える。
複数のプロセッサ１０１は、ＳＭＰ構成のプロセッサである。上記の実施形態中のプロセッサコア０〜３は、複数のプロセッサ１０１の一例である。
記憶部１０２は、ＯＳ１０３と、プログラム１０４と、を記憶する。複数のプロセッサ１０１は、記憶部１０２からＯＳ１０３を読み出して実行する。複数のプロセッサ１０１は、記憶部１０２からプログラム１０４を読み出して実行する。
ＯＳ１０３は、マルチタスクおよびＳＭＰ環境に対応している。さらにＯＳ１０３は、グローバル変数の値を記憶する固有値格納エリアを同時に実行可能状態となるタスク数の上限値分だけ備える。そして、ＯＳ１０３は、プログラム１０４を実行するタスクが切り替わるたびに切り替えに係るタスクに対応する固有値格納エリアと、当該タスクを実行する複数のプロセッサ１０１のうちの１つに対応するグローバル変数用の領域（プログラム１０４からアクセス可能な領域）との間で、プログラム１０４が使用するグローバル変数の値の退避、復元を行う機能を備える。
プログラム１０４は、グローバル変数を使用するプログラムであって、複数のプロセッサ１０１によって実行される。プログラム１０４は、グローバル変数について、複数のプロセッサ１０１に含まれるプロセッサと同数のデータ領域を確保し、グローバル変数にアクセスする場合、複数のデータ領域のうち当該プログラムのタスクを実行する１つのプロセッサに割り当てられたデータ領域にアクセスする処理を含む。
【００４５】
図１４は、本発明の一実施形態における情報処理装置のハードウェア構成の一例を示す図である。
コンピュータ９００は、ＣＰＵ９０１、主記憶装置９０２、補助記憶装置９０３、入出力インタフェース９０４、通信インタフェース９０５を備える。ＣＰＵ９０１は、複数のプロセッサコアを備えている。また、ＣＰＵ９０１は、複数のＣＰＵを備えたものとして構成されていてもよい。ＣＰＵ９０１はＳＭＰ構成のプロセッサである。上述の演算装置１のＰｒｏｃｅｓｓｏｒ１１とＤＤＲ ＲＡＭ１２は、それぞれＣＰＵ９０１と主記憶装置９０２に相当する。情報処理装置１００は、コンピュータ９００に相当する。複数のプロセッサ１０１はＣＰＵ９０１に、記憶部１０２は補助記憶装置９０３に相当する。そして、ＳＭＰ対応済みのプログラムやＯＳは、プログラムの形式で補助記憶装置９０３に記憶されている。ＣＰＵ９０１は、プログラムを補助記憶装置９０３から読み出して主記憶装置９０２に展開し、当該プログラムに従って上記処理を実行する。また、ＣＰＵ９０１は、プログラムに従って、記憶領域を主記憶装置９０２に確保する。ＣＰＵ９０１は、プログラムに従って、処理中のデータを記憶する記憶領域を補助記憶装置９０３に確保する。
【００４６】
なお、少なくとも１つの実施形態において、補助記憶装置９０３は、一時的でない有形の媒体の一例である。一時的でない有形の媒体の他の例としては、入出力インタフェース９０４を介して接続される磁気ディスク、光磁気ディスク、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ、半導体メモリ等が挙げられる。また、このプログラムが通信回線によってコンピュータ９００に配信される場合、配信を受けたコンピュータ９００が当該プログラムを主記憶装置９０２に展開し、上記処理を実行しても良い。また、当該プログラムは、前述した機能の一部を実現するためのものであっても良い。さらに、当該プログラムは、前述した機能を補助記憶装置９０３に既に記憶されている他のプログラムとの組み合わせで実現するもの、いわゆる差分ファイル（差分プログラム）であっても良い。また、補助記憶装置９０３は、ＣＰＵ９０１、主記憶装置９０２を備える演算装置とは別体として構成されていてもよい。
【００４７】
その他、本発明の趣旨を逸脱しない範囲で、上記した実施の形態における構成要素を周知の構成要素に置き換えることは適宜可能である。また、この発明の技術範囲は上記の実施形態に限られるものではなく、本発明の趣旨を逸脱しない範囲において種々の変更を加えることが可能である。
【符号の説明】
【００４８】
１・・・演算装置
１１・・・Ｐｒｏｃｅｓｓｏｒ
１２・・・ＤＤＲ ＲＡＭ
１１１・・・Ｐｒｏｃｅｓｓｏｒ Ｃｏｒｅ
１１２・・・内部バス
１１３・・・ＭｅｍｏｒｙＣｏｎｔｒｏｌｌｅｒ
１００・・・情報処理装置
１０１・・・複数のプロセッサ
１０２・・・記憶部
１０３・・・ＯＳ
１０４・・・プログラム
９００・・・コンピュータ
９０１・・・ＣＰＵ
９０２・・・主記憶装置
９０３・・・補助記憶装置
９０４・・・入出力インタフェース
９０５・・・通信インタフェース
【図１】
2020086871.tif 000003
【図２】
2020086871.tif 000004
【図３】
2020086871.tif 000005
【図４】
2020086871.tif 000006
【図５】
2020086871.tif 000007
【図６】
2020086871.tif 000008
【図７】
2020086871.tif 000009
【図８】
2020086871.tif 000010
【図９】
2020086871.tif 000011
【図１０】
2020086871.tif 000012
【図１１】
2020086871.tif 000013
【図１２】
2020086871.tif 000014
【図１３】
2020086871.tif 000015
【図１４】
2020086871.tif 000016