(57)【要約】【課題】プログラムの実行時にオペレーティングシステムがアクセス速度の速いメモリを動的に選択してメモリ割り当てを実行できるオペレーティングシステム及びメモリ割り当て方法を提供する。【解決手段】メモリ領域作成部は、メモリ領域でツリー構造を作成し、メモリ割り当て部は、ヒープＩＤで指定されたメモリ領域からのメモリ割り当てに失敗したときには、当該メモリ領域の上位のメモリ領域からメモリ割り当てを実行させるようにした。【選択図】図１３
2020077402.tif 000002
【特許請求の範囲】
【請求項１】
それぞれローカルメモリを備えた複数のプロセッサコアを相互に接続したマルチコア環境において実行され、アプリケーションプログラムから呼び出し可能なメモリ獲得用ＡＰＩを実装したオペレーティングシステムであって、
予め設定された内部データに従って複数のメモリ領域を作成するメモリ領域作成部と、
前記メモリ獲得用ＡＰＩの引数として指定されたヒープＩＤを参照し、前記ヒープＩＤに関連付けられた前記メモリ領域からメモリ割り当てを実行させるメモリ割り当て部と、
を備え、
前記メモリ領域として、前記複数のプロセッサコアのローカルメモリに係るコアメモリ領域と、前記ローカルメモリよりもアクセス速度が遅いメモリに係るメモリ領域と、を含み、
前記メモリ領域作成部は、前記メモリ領域で、前記コアメモリ領域が最下層であり、かつ、前記アクセス速度が遅いメモリに係るメモリ領域が前記コアメモリ領域よりも上位に配置されたツリー構造を作成し、
前記メモリ割り当て部は、
前記ヒープＩＤで指定されたメモリ領域からのメモリ割り当てに失敗したときには、当該メモリ領域の上位のメモリ領域からメモリ割り当てを実行させることを特徴とする、オペレーティングシステム。
【請求項２】
前記アクセス速度が遅いメモリに係るメモリ領域として、１以上の前記コアメモリ領域に紐付けられたクラスタメモリ領域と、１以上の前記クラスタメモリ領域に紐付けられたグローバルメモリ領域と、を含み、
前記メモリ領域作成部は、前記クラスタメモリ領域が前記コアメモリ領域よりも上位に配置され、かつ、前記グローバルメモリ領域が前記クラスタメモリ領域よりも上位に配置されたツリー構造を作成することを特徴とする、請求項１記載のオペレーティングシステム。
【請求項３】
それぞれローカルメモリを備えた複数のプロセッサコアを相互に接続したマルチコア環境において、アプリケーションプログラムからメモリ獲得用ＡＰＩが呼び出されたときに、メモリ割り当てを実行させるためのメモリ割り当て方法であって、
予め設定された内部データに従って複数のメモリ領域を作成するステップと、
前記メモリ獲得用ＡＰＩの引数として指定されたヒープＩＤを参照し、前記ヒープＩＤに関連付けられた前記メモリ領域からメモリ割り当てを実行させるステップと、
を備え、
前記メモリ領域として、前記複数のプロセッサコアのローカルメモリに係るコアメモリ領域と、前記ローカルメモリよりもアクセス速度が遅いメモリに係るメモリ領域と、を含み、
前記メモリ領域で、前記コアメモリ領域が最下層であり、かつ、前記アクセス速度が遅いメモリに係るメモリ領域が前記コアメモリ領域よりも上位に配置されたツリー構造を作成し、
前記ヒープＩＤで指定されたメモリ領域からのメモリ割り当てに失敗したときには、当該メモリ領域の上位のメモリ領域からメモリ割り当てを実行させることを特徴とする、メモリ割り当て方法。
【請求項４】
前記アクセス速度が遅いメモリに係るメモリ領域として、１以上の前記コアメモリ領域に紐付けられたクラスタメモリ領域と、１以上の前記クラスタメモリ領域に紐付けられたグローバルメモリ領域と、を含み、
前記メモリ領域作成部は、前記クラスタメモリ領域が前記コアメモリ領域よりも上位に配置され、かつ、前記グローバルメモリ領域が前記クラスタメモリ領域よりも上位に配置されたツリー構造を作成することを特徴とする、請求項３記載のメモリ割り当て方法。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、プロセッサコアを相互に接続したマルチコア環境において実行されるオペレーティングシステム、及び、メモリ割り当て方法に関する。
【背景技術】
【０００２】
近年、組み込み製品などのシステムが複雑化しており、多機能を実現するために複数のプロセッサコアを備えたマルチコアプロセッサを採用するシステムが増加している。こうしたマルチコア環境においては、各プロセッサコア間でメモリを共有化することでリソースの効率良く使用するとともに、メモリ競合などを避けて処理速度を高めることが重要である。
【０００３】
ところで、こうしたシステムは、複数の異なる種類のメモリを備えていることが多く、それぞれのメモリのアクセス速度にも差がある。よって、処理の内容によってどのメモリを使用するかを適切に振り分けることが重要となる。
【０００４】
しかしながら、アプリケーションプログラムの開発者がメモリの種類まで把握しているとは限らないので、オペレーティングシステムが適切なメモリの割り当てを実行することが望ましい。例えば、アプリケーションプログラムがアクセス速度の速いメモリを要求している場合には、オペレーティングシステムがアクセス速度の速いメモリを選択し、そのメモリからメモリ割り当てを実行することが考えられる。
【０００５】
なお、特許文献１に記載されているように、それぞれのプロセッサコアに固有のメモリ（一次キャッシュ）を備えたシステムにおいては、あるプロセッサコアにとって最もアクセス速度の速いメモリはそのプロセッサコアに固有のメモリである。よって、実行時のプロセッサコアに依存して最もアクセス速度の早いメモリが変化することになる。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０１２−５３８１７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
上記したように、実行時のプロセッサコアに依存して最もアクセス速度の早いメモリがどれであるかが変化する場合、オペレーティングシステムがアクセス速度の早いメモリを動的に選択してメモリ割り当てを実行させることができれば、メモリリソースの効率化や処理速度の向上を図ることができる。
【０００８】
【０００９】
【００１０】
そこで、本発明は、プログラムの実行時にオペレーティングシステムがアクセス速度の速いメモリを動的に選択してメモリ割り当てを実行できるオペレーティングシステム及びメモリ割り当て方法を提供することを課題とする。
【課題を解決するための手段】
【００１１】
本発明は、上記した課題を解決するためになされたものであり、以下を特徴とする。
【００１２】
【００１３】
【００１４】
【００１５】
本発明は、それぞれローカルメモリを備えた複数のプロセッサコアを相互に接続したマルチコア環境において実行され、アプリケーションプログラムから呼び出し可能なメモリ獲得用ＡＰＩを実装したオペレーティングシステムであって、予め設定された内部データに従って複数のメモリ領域を作成するメモリ領域作成部と、前記メモリ獲得用ＡＰＩの引数として指定されたヒープＩＤを参照し、前記ヒープＩＤに関連付けられた前記メモリ領域からメモリ割り当てを実行させるメモリ割り当て部と、を備え、前記メモリ領域として、前記複数のプロセッサコアのローカルメモリに係るコアメモリ領域と、前記ローカルメモリよりもアクセス速度が遅いメモリに係るメモリ領域と、を含み、前記メモリ領域作成部は、前記メモリ領域で、前記コアメモリ領域が最下層であり、かつ、前記アクセス速度が遅いメモリに係るメモリ領域が前記コアメモリ領域よりも上位に配置されたツリー構造を作成し、前記メモリ割り当て部は、前記ヒープＩＤで指定されたメモリ領域からのメモリ割り当てに失敗したときには、当該メモリ領域の上位のメモリ領域からメモリ割り当てを実行させることを特徴とする。
【００１６】
【００１７】
【００１８】
【００１９】
【００２０】
【発明の効果】
【００２１】
【００２２】
【００２３】
【００２４】
【００２５】
【００２６】
本発明は上記の通りであり、前記メモリ領域でツリー構造を作成し、ヒープＩＤで指定されたメモリ領域からのメモリ割り当てに失敗したときには、当該メモリ領域の上位のメモリ領域からメモリ割り当てを実行させるようにしている。このため、例えばアクセス速度の速いメモリリソースが枯渇してしまった場合でも、次の候補のメモリ領域からメモリ割り当てを実行させることができる。よって、できるだけアクセス速度の速いメモリ領域を検索してメモリ割り当てを実行させることができる。
【００２７】
【図面の簡単な説明】
【００２８】
【図１】本発明の実施形態に係るプロセッサとメモリの構成を示す図である。
【図２】メモリ管理に係るオペレーティングシステムの構成を示す図である。
【図３】コンパイル処理に係る流れを示す図である。
【図４】コンフィギュレーションファイルにメモリの定義を記述するための書式を説明する図である。
【図５】コンフィギュレーションファイルにメモリ領域の定義を記述するための書式を説明する図である。
【図６】コンフィギュレーションファイルにヒープＩＤの定義を記述するための書式を説明する図である。
【図７】コンフィギュレーションファイルの記述例を示す図である。
【図８】メモリ領域のツリー構造を示す図である。
【図９】メモリ獲得用ＡＰＩの仕様を説明する図である。
【図１０】メモリ割り当て処理のメインフロー図である。
【図１１】グローバルメモリ割り当て処理のフロー図である。
【図１２】クラスタメモリ割り当て処理のフロー図である。
【図１３】コアメモリ割り当て処理のフロー図である。
【図１４】実メモリ割り当て処理のフロー図である。
【発明を実施するための形態】
【００２９】
本発明の実施形態について、図を参照しながら説明する。
【００３０】
本実施形態に係るオペレーティングシステム１０は、例えば図１に示すような複数のプロセッサコアを相互に接続したマルチコア環境において実行されるプログラムである。このオペレーティングシステム１０は、ハードウェアリソースを管理するとともに、ハードウェアリソースを抽象化した各種のサービスをアプリケーションプログラム４０に提供する。例えば、アプリケーションプログラム４０から呼び出し可能なメモリ獲得用ＡＰＩを実装しており、これによりアプリケーションプログラム４０がメモリリソースを安全に使用できるサービスを提供している。なお、このメモリ獲得用ＡＰＩがアプリケーションプログラム４０から呼び出されると、オペレーティングシステム１０は物理メモリからメモリ割り当てを実行し、割り当てたメモリの先頭アドレスを示すポインタをアプリケーションプログラム４０に返す。アプリケーションプログラム４０は、このポインタを参照することでメモリを使用した各種の処理を実行することができる。
【００３１】
本実施形態に係るマルチコアプロセッサは、複数のプロセッサコアを備えている。本実施形態においては、図１に示すように、第１のプロセッサコア３０ａと、第２のプロセッサコア３０ｂと、第３のプロセッサコア３０ｃと、第４のプロセッサコア３０ｄと、の４つのプロセッサコアを備えている。また、これらの４つのプロセッサコアは、それぞれ固有のローカルメモリ（１次キャッシュなど）を備えている。すなわち、第１のプロセッサコアのローカルメモリ３１ａと、第２のプロセッサコアのローカルメモリ３１ｂと、第３のプロセッサコアのローカルメモリ３１ｃと、第４のプロセッサコアのローカルメモリ３１ｄと、が存在する。
【００３２】
なお、本実施形態においては４つのプロセッサコアを備えたマルチコアプロセッサを例に説明しているが、これに限らず、プロセッサコアの数は３つ以下や５つ以上であってもよい。また、複数のプロセッサコアを備えたチップを複数使用してマルチコア環境を構成してもよい。
【００３３】
また、本実施形態に係る実行環境は、プロセッサコア固有のメモリ以外にも、例えばＳＤＲＡＭなどの共有メモリを備えている。これらの共有メモリは、特定のクラスタによる使用を想定したクラスタメモリと、すべてのプロセッサコアからアクセスできるグローバルメモリ３４と、に割り振られている。なお、クラスタとは、例えばマルチコア環境の管理効率を高めるためにプロセッサコアをいくつかのグループに分割したものである。本実施形態においては、第１のプロセッサコア３０ａと第２のプロセッサコア３０ｂとで第１のクラスタ３２ａを構成し、第３のプロセッサコア３０ｃと第４のプロセッサコア３０ｄとで第２のクラスタ３２ｂを構成している。そして、これらのクラスタには、それぞれクラスタメモリが割り当てられている。すなわち、第１のクラスタメモリ３３ａと、第２のクラスタメモリ３３ｂと、である。
【００３４】
なお、本実施形態においては特に説明しないが、クラスタ構造を階層化してもよい。すなわち、複数のクラスタの親となる上位のクラスタを設定していくことで、クラスタをツリー構造で管理してもよい。
【００３５】
本実施形態においては、この図１が示すように、特定のプロセッサコアにとって最もアクセス速度の速いメモリはそのプロセッサコアに固有のメモリである（例えば第１のプロセッサコア３０ａにとって最もアクセス速度の速いメモリは第１のプロセッサコアのローカルメモリ３１ａである）。また、その次にアクセス速度の早い（または優先される）メモリは、自分が属するクラスタのメモリである（例えば第１のプロセッサコア３０ａにとっては、第１のクラスタメモリ３３ａである）。更に、その次にアクセス速度の早い（または優先される）メモリは、そのクラスタの親のメモリ（例えば第１のプロセッサコア３０ａにとっては、グローバルメモリ３４である）。
【００３６】
このため、アプリケーションプログラム４０がどのプロセッサコアで実行されているかによって、アクセス速度の早いメモリや優先して割り当てるべきメモリが変化する環境となっている。例えば、アプリケーションプログラム４０が第１のプロセッサコア３０ａで実行されている場合、アクセス速度の最も早いメモリは第１のプロセッサコアのローカルメモリ３１ａである。一方、アプリケーションプログラム４０が第２のプロセッサコア３０ｂで実行されている場合、アクセス速度の最も早いメモリは第２のプロセッサコアのローカルメモリ３１ｂである。
【００３７】
このような環境下で適切なメモリ割り当てを実行するために、本実施形態に係るオペレーティングシステム１０は、図２に示すように、メモリ領域作成部１２と、メモリ割り当て部１４と、を備える。
【００３８】
メモリ領域作成部１２は、システムの初期化時に後述する内部データ４３を読み込み、内部データ４３の内容に従って複数のメモリ領域２０を作成するためのものである。メモリ領域２０は、オペレーティングシステム１０がメモリリソースを管理するための単位である。メモリ領域作成部１２は、メモリをアドレスとサイズで分割して複数のメモリ領域２０を作成するとともに、これらのメモリ領域２０でツリー構造を作成する（図８参照）。このツリー構造については後ほど詳述する。
【００３９】
メモリ割り当て部１４は、メモリ獲得用ＡＰＩが呼び出されたときに、メモリ獲得用ＡＰＩの引数として指定されたヒープＩＤを参照し、ヒープＩＤに関連付けられたメモリ領域２０からメモリ割り当てを実行させるものである。ヒープＩＤは後述するコンフィギュレーションファイル４１において定義され、ユーザによって書き換え可能となっている。このヒープＩＤについては後ほど詳述する。
【００４０】
このメモリ割り当て部１４は、本実施形態においては、マイクロカーネル１６と、ヒープマネージャ１５と、を備えて構成されている。
【００４１】
マイクロカーネル１６は、各プロセッサコアにおけるプログラムの実行制御を行うプログラムであり、各プロセッサコアにおいて１つずつ実行されている。よって、本実施形態のように４つのプロセッサコアが存在する場合には、それぞれのプロセッサコアに対応した４つのマイクロカーネル１６が実行される。なお、アプリケーションプログラム４０がメモリ獲得用ＡＰＩを呼び出すと、当該アプリケーションプログラム４０を実行しているプロセッサコアを制御するマイクロカーネル１６に命令が通知される。命令を受け取ったマイクロカーネル１６は、メモリ獲得用ＡＰＩの引数（ヒープＩＤ）を基に、メモリ割り当てを実行するメモリ領域２０を特定し、当該メモリ領域２０を管理するヒープマネージャ１５に依頼してメモリ割り当てを実行する。
【００４２】
ヒープマネージャ１５は、各メモリ領域２０を制御するプログラムであり、メモリ領域２０ごとに１つずつ実行されている。例えば図８に示すように７つのメモリ領域２０が存在する場合には、それぞれのメモリ領域２０に対応した７つのヒープマネージャ１５が実行される。このヒープマネージャ１５は、上述したように、メモリ獲得用ＡＰＩが呼び出されたときにマイクロカーネル１６によって呼び出され、自らが管理するメモリ領域２０からのメモリ割り当てを実行する。具体的には、ヒープマネージャ１５は、マイクロカーネル１６からメモリ割り当ての要求があったときには、マイクロカーネル１６によって指定されたサイズのメモリを確保してマイクロカーネル１６にアドレスを通知するとともに、当該メモリが明示的に開放されるまでは再びメモリ割り当てに使用されることがないように管理する。
【００４３】
なお、ヒープマネージャ１５が管理するメモリ領域２０は、図８に示すように、大きく３つの種類に分類することができる。すなわち、コアメモリ領域と、クラスタメモリ領域と、グローバルメモリ領域２３と、である。
【００４４】
コアメモリ領域は、複数のプロセッサコアのローカルメモリに係るメモリ領域２０であり、これらのメモリ領域２０をオペレーティングシステム１０で管理するために作成される。このコアメモリ領域は、複数のプロセッサコアと同じ数だけ作成される。本実施形態においては、第１のプロセッサコアのローカルメモリ３１ａに対応した第１のコアメモリ領域２１ａと、第２のプロセッサコアのローカルメモリ３１ｂに対応した第２のコアメモリ領域２１ｂと、第３のプロセッサコアのローカルメモリ３１ｃに対応した第３のコアメモリ領域２１ｃと、第４のプロセッサコアのローカルメモリ３１ｄに対応した第４のコアメモリ領域２１ｄと、が作成される。
【００４５】
クラスタメモリ領域は、１以上のコアメモリ領域に紐付けられたメモリ領域２０であり、これらのメモリ領域２０をオペレーティングシステム１０で管理するために作成される。このクラスタメモリ領域は、本実施形態においてはクラスタと同じ数だけ作成される。すなわち、第１のクラスタメモリ３３ａに対応した第１のクラスタメモリ領域２２ａと、第２のクラスタメモリ３３ｂに対応した第２のクラスタメモリ領域２２ｂと、が作成される。
【００４６】
グローバルメモリ領域２３は、１以上のクラスタメモリ領域に紐付けられたメモリ領域２０であり、これらのメモリ領域２０をオペレーティングシステム１０で管理するために作成される。本実施形態においては、グローバルメモリ領域２３を１つだけ作成している。しかしながら、複数のグローバルメモリ領域２３を設けてもよい。
【００４７】
これらコアメモリ領域、クラスタメモリ領域、グローバルメモリ領域２３は、図８に示すような階層構造を形成する。すなわち、コアメモリ領域が最下層であり、クラスタメモリ領域が中間層であり、グローバルメモリ領域２３が最上層であるツリー構造を形成する。なお、図８に示す例ではクラスタメモリ領域が１階層であるが、クラスタメモリ領域は複数の階層を形成してもよい。
【００４８】
これらのメモリ領域２０は、図７に示すようなコンフィギュレーションファイル４１の記載によって、アドレス、サイズ、ツリー構造、その他の属性が決定される。よって、コンフィギュレーションファイル４１の記述を書き換えることで、メモリ領域２０の設定を変更することができる。例えば、物理メモリの構成やプロセッサコアの数等に応じたメモリ領域２０となるように設定を変更し、オペレーティングシステム１０の制御に使用することができる。
【００４９】
また、このコンフィギュレーションファイル４１には、メモリ領域２０とヒープＩＤとの関係を自由に記述し、設定することができる。これにより、アプリケーションプログラム４０がヒープＩＤを使用して所望のメモリ領域２０にアクセスできるようにしている。
【００５０】
このコンフィギュレーションファイル４１は、図３に示すように、情報生成手段４２によって読み込まれて使用される。情報生成手段４２は、単独で実行可能なコンフィギュレーションツール（例えばコンピュータ上で実行可能な実行可能形式のファイル）であり、コンフィギュレーションファイル４１に記載された内容を読み込んで、アプリケーションプログラム４０用のヘッダファイル４４とオペレーティングシステム１０用の内部データ４３とを生成する。
【００５１】
このうち、内部データ４３は、上述したメモリ領域作成部１２がシステムの初期化時に読み込んでメモリ領域２０を作成するために使用される。
【００５２】
一方、ヘッダファイル４４は、アプリケーションプログラム４０のソースコード４５をコンパイルする際に使用される。具体的には、コンパイラ４６によってアプリケーションプログラム４０のソースコード４５をコンパイルする際にヘッダファイル４４が使用され、これによりオブジェクトファイル４７が生成される。ヘッダファイル４４にはヒープＩＤが定義されているため、アプリケーションプログラム４０がヘッダファイル４４を参照することで、メモリ獲得用ＡＰＩの呼び出しにヒープＩＤを使用することができる。
【００５３】
（コンフィギュレーションファイル４１の記述例）
次に、コンフィギュレーションファイル４１の記述例について説明する。なお、図７がコンフィギュレーションファイル４１の具体的な記述例である。この図７に示すコンフィギュレーションファイル４１では、ＤＥＦ＿ＭＥＭ（メモリの定義）と、ＤＥＦ＿ＭＥＭＯＢＪ（メモリ領域２０の定義）と、ＤＥＦ＿ＨＥＡＰ（ヒープＩＤの定義）と、の３つの定義を記述することができる。
【００５４】
図４は、コンフィギュレーションファイル４１においてメモリの定義（ＤＥＦ＿ＭＥＭ）を記述するための書式である。この書式を使用することにより、メモリ空間をアドレスとサイズで分割し、その分割したメモリにメモリＩＤ（コンフィギュレーションファイル４１内で使用する一意の文字列）を付与することができる。具体的には、ｓｔａｒｔａｄｄｒに記載されたアドレスからｍｅｍｓｚで指定されたサイズのメモリに対して、ｍｅｍｉｄで指定されたメモリＩＤが付与される。
【００５５】
例えば、図７の（１）で示す例では、０ｘｃ０００００００を開始アドレスとして０ｘ８００００００のメモリに（つまり０ｘｃ０００００００〜０ｘｃ７ｆｆｆｆｆｆの範囲のメモリに）ＭＥＭ＿ＳＤＲＡＭ１というメモリＩＤが付与される。
【００５６】
図５は、コンフィギュレーションファイル４１においてメモリ領域２０の定義（ＤＥＦ
＿ＭＥＭＯＢＪ）を記述するための書式である。この書式を使用することにより、名前、位置、属性、親子関係、プロセッサコアとの関係を指定してメモリ領域２０を作成することができる。
【００５７】
図５に示す書式において、ｍｅｍｏｂｊｉｄには「メモリ領域２０の名前（コンフィギュレーションファイル４１内で使用する一意の文字列）」を指定する。
【００５８】
ｍｅｍｏｂｊａｔｒには「メモリ領域２０の属性」を指定する。指定可能な属性は、グローバルメモリ領域２３を意味する「ＭＯＡ＿ＧＬＯＢＡＬ」、クラスタメモリ領域を意味する「ＭＯＡ＿ＣＬＵＳＴＥＲ」、コアメモリ領域を意味する「ＭＯＡ＿ＣＯＲＥ」のいずれかである。
【００５９】
ｏｗｎｅｒｃｏｒｅｉｄには「このメモリ領域２０を管理しているプロセッサコアの番号」を指定する。具体的には、メモリ領域２０がコアメモリ領域である場合に、そのコアメモリ領域がどのプロセッサコアのローカルメモリに関連付けられているかを指定する。例えば、第１のプロセッサコアのローカルメモリ３１ａに関連付けられたコアメモリ領域（図８に示す第１のコアメモリ領域２１ａ）であれば「１」を指定する。なお、メモリ領域２０がコアメモリ領域ではない場合、当該メモリ領域２０を管理するヒープマネージャ１５が実行されているプロセッサコアの番号を指定する。
【００６０】
ｐａｒｅｎｔｉｄには「このメモリ領域２０の親となるメモリ領域２０の名前」を指定する。具体的には、コアメモリ領域の場合には、親となるクラスタメモリ領域の名前を指定する。クラスタメモリ領域の場合には、親となるクラスタメモリ領域またはグローバルメモリ領域２３の名前を指定する。グローバルメモリ領域２３の場合は、親がいないことを示す規定値「ＭＥＭＯＢＪ＿ＲＯＯＴ」を指定する。
【００６１】
ｍｅｍｌｉｓｔには「このメモリ領域２０に属するメモリＩＤのリスト」を指定する。すなわち、図４で説明した記述方法により定義されたメモリＩＤのリストを指定する。
【００６２】
例えば、図７の（２）で示す例では、ＭＥＭ＿ＳＤＲＡＭ１（０ｘｃ０００００００〜０ｘｃ７ｆｆｆｆｆｆの範囲のメモリ）とＭＥＭ＿ＳＤＲＡＭ２（０ｘｃｃ００００００
〜０ｘｃｆｆｆｆｆｆｆの範囲のメモリ）に対して、「ＭＥＭＯＢＪ＿ＧＬＯＢＡＬ１」という名前で、グローバルメモリ領域２３が作成される。
【００６３】
また、図７の（３）で示す例では、ＭＥＭ＿ＣＬＵＳＴＥＲ１（０ｘ８１２０００００
〜０ｘ８１２７ｅｆｆｆの範囲のメモリ）に対して、「ＭＥＭＯＢＪ＿ＣＬＵＳＴＥＲ１
」という名前で、クラスタメモリ領域が作成される。なお、このクラスタメモリ領域の親のメモリ領域２０は「ＭＥＭＯＢＪ＿ＧＬＯＢＡＬ１」である。
【００６４】
また、図７の（４）で示す例では、ＭＥＭ＿ＣＯＲＥ１（０ｘ８１００００００〜０ｘ８１００７ｆｆｆの範囲のメモリ）に対して、「ＭＥＭＯＢＪ＿ＣＯＲＥ１」という名前で、コアメモリ領域が作成される。なお、このコアメモリ領域は、番号「１」のプロセッサコアのローカルメモリを使用するものであり、このコアメモリ領域の親のメモリ領域２０は「ＭＥＭＯＢＪ＿ＣＬＵＳＴＥＲ１」である。
このように、メモリ領域２０が定義されることで、図８に示すようなツリー構造が作成される。
【００６５】
図６は、コンフィギュレーションファイル４１においてヒープＩＤの定義（ＤＥＦ＿ＨＥＡＰ）を記述するための書式である。この書式を使用することにより、ヒープＩＤとメモリ領域２０との関係を記述することができる。
【００６６】
図６に示す書式において、ｈｅａｐｉｄには「ヒープＩＤ（アプリケーションプログラム４０で使用可能な一意の文字列）」を指定する。
ｍｅｍｏｂｊｉｄには「予め決められた仮想属性」または「ヒープＩＤに関連付けるメモリ領域２０の名前」を指定する。
【００６７】
なお、ｍｅｍｏｂｊｉｄに指定可能な「予め決められた仮想属性」としては、このヒープＩＤが仮想グローバルＩＤであることを示す「ＭＥＭＯＢＪ＿ＧＬＯＢＡＬ」、このヒープＩＤが仮想クラスタＩＤであることを示す「ＭＥＭＯＢＪ＿ＣＬＵＳＴＥＲ」、このヒープＩＤが仮想コアＩＤであることを示す「ＭＥＭＯＢＪ＿ＣＯＲＥ」のいずれかを指定することができる。
【００６８】
例えば、図７の（５）で示す例では、「ＨＥＡＰ＿ＧＬＯＢＡＬ」というヒープＩＤで、仮想グローバルＩＤが作成される。仮想グローバルＩＤは、グローバルメモリ領域２３を参照するためのヒープＩＤである。仮想グローバルＩＤを使用してアプリケーションプログラム４０がメモリ獲得用ＡＰＩを呼び出すと、オペレーティングシステム１０が使用可能なグローバルメモリ領域２３を検索し、このグローバルメモリ領域２３からメモリ割り当てを実行する。
【００６９】
また、図７の（６）で示す例では、「ＨＥＡＰ＿ＣＬＵＳＴＥＲ」というヒープＩＤで、仮想クラスタＩＤが作成される。仮想クラスタＩＤは、クラスタメモリ領域を動的に割り当てるためのヒープＩＤである。仮想クラスタＩＤを使用してアプリケーションプログラム４０がメモリ獲得用ＡＰＩを呼び出すと、オペレーティングシステム１０が使用可能なクラスタメモリ領域を検索し、このクラスタメモリ領域からメモリ割り当てを実行する。
【００７０】
また、図７の（７）で示す例では、「ＨＥＡＰ＿ＣＯＲＥ」というヒープＩＤで、仮想コアＩＤが作成される。仮想コアＩＤは、コアメモリ領域を動的に割り当てるためのヒープＩＤである。仮想コアＩＤを使用してアプリケーションプログラム４０がメモリ獲得用ＡＰＩを呼び出すと、オペレーティングシステム１０が使用可能なコアメモリ領域を検索し、このコアメモリ領域からメモリ割り当てを実行する。
【００７１】
また、ｍｅｍｏｂｊｉｄに指定可能な「ヒープＩＤに関連付けるメモリ領域２０の名前
」としては、図５で説明した記述方法により定義されたメモリ領域２０の名前を指定することができる。なお、このように直接的にメモリ領域２０の名前を指定した場合、ヒープＩＤとメモリ領域２０とが直接的に関連付けられる。このようなヒープＩＤを使用してアプリケーションプログラム４０がメモリ獲得用ＡＰＩを呼び出すと、オペレーティングシステム１０が指定されたメモリ領域２０からメモリを直接割り当てる。このようなヒープＩＤを実メモリＩＤと呼ぶ。
【００７２】
例えば、図７の（８）で示す例では、「ＨＥＡＰ＿ＣＬＵＳＴＥＲ１」というヒープＩＤで、実メモリＩＤが作成される。この実メモリＩＤは、「ＭＥＭＯＢＪ＿ＣＬＵＳＴＥＲ１」という名前で定義されたメモリ領域２０と直接的に関連付けられている。
【００７３】
また、図７の（９）で示す例では、「ＨＥＡＰ＿ＣＯＲＥ１」というヒープＩＤで、実メモリＩＤが作成される。この実メモリＩＤは、「ＭＥＭＯＢＪ＿ＣＯＲＥ４」という名前で定義されたメモリ領域２０と直接的に関連付けられている。
【００７４】
ａｓｋｐａｒｅｎｔには、指定されたメモリ領域２０からのメモリ割り当てに失敗した場合に、親のメモリ領域２０を参照するか否かを指定する。「ｔｒｕｅ」が指定された場合には、図８に示すようなツリー構造の親のメモリ領域２０を再帰的に参照してメモリ割り当てを行う。例えば、第１のコアメモリ領域２１ａからのメモリ割り当てに失敗した場合には、第１のクラスタメモリ領域２２ａからのメモリ割り当てを試行する。この第１のクラスタメモリ領域２２ａからのメモリ割り当てにも失敗した場合には、グローバルメモリ領域２３からのメモリ割り当てを試行する。一方、「ｆａｌｓｅ」が指定された場合には、指定されたメモリ領域２０からのメモリ割り当てに失敗した場合でも親のメモリ領域２０からのメモリ割り当てを行わない。
【００７５】
（メモリ獲得用ＡＰＩ）
次に、メモリ獲得用ＡＰＩの仕様について説明する。本実施形態に係るオペレーティングシステム１０は、例えば図９に示すようなメモリ獲得用ＡＰＩを備えており、このメモリ獲得用ＡＰＩをアプリケーションプログラム４０から呼び出し可能となっている。このメモリ獲得用ＡＰＩには、引数として「ｈｅａｐｉｄ」「ｓｉｚｅ」「ａｄｄｒ」を指定可能である。
【００７６】
ｈｅａｐｉｄには「ヒープＩＤ」を指定する。オペレーティングシステム１０は、ここで指定されたヒープＩＤで特定されるメモリ領域２０からのメモリ割り当てを試行する。ヒープＩＤには、すでに説明したような仮想グローバルＩＤ、仮想クラスタＩＤ、仮想コアＩＤ、実メモリＩＤのいずれかを指定することができる。なお、アプリケーションプログラム４０がヒープＩＤを使用する場合には、情報生成手段４２が出力したヘッダファイル４４を参照する。このヘッダファイル４４には、アプリケーションプログラム４０が使用可能な形でヒープＩＤが定義されている。なお、ヘッダファイル４４に定義されるヒープＩＤは、コンフィギュレーションファイル４１で定義したものに限らず、情報生成手段４２が自動的に追加するようにしてもよい。例えば、仮想グローバルＩＤ、仮想クラスタＩＤ、仮想コアＩＤの少なくともいずれかを、コンフィギュレーションファイル４１で定義されていなくても、情報生成手段４２が自動的にヘッダファイル４４に出力するようにしてもよい。
ｓｉｚｅには「獲得したいメモリのサイズ」を指定する。
【００７７】
ａｄｄｒには「獲得したメモリの先頭アドレスを返す領域へのポインタ」を指定する。メモリ獲得に成功した場合には、アプリケーションプログラム４０がこのポインタの中身を参照することで、獲得したメモリの先頭アドレスを得ることができる。
【００７８】
なお、このＡＰＩの戻り値はエラーコードである。具体的には、メモリ獲得に成功した場合には「ＥＯＫ（定数）」を返却し、ｓｉｚｅやａｄｄｒが不正な場合には「ＥＰＡＲ（定数）」を返却し、ヒープＩＤが不正な場合には「ＥＮＯＥＸＳ（定数）」を返却し、メモリ枯渇等によりメモリ獲得に失敗した場合には「ＥＮＯＭＥＭ（定数）」を返却する。
【００７９】
（メモリ割り当て処理）
次に、上記したメモリ獲得用ＡＰＩが呼び出されたときのオペレーティングシステム１０の処理について説明する。図１０は、メモリ割り当て処理のメインフロー図である。
【００８０】
まず、図１０に示すステップＳ１００において、アプリケーションプログラム４０がメモリ獲得用ＡＰＩの呼び出しを実行し、このＡＰＩ呼び出しに起因するメモリ獲得要求をマイクロカーネル１６が受信する。このとき、メモリ獲得要求を受信するマイクロカーネル１６は、アプリケーションプログラム４０が実行されているプロセッサコアにおいて実行されているマイクロカーネル１６である。マイクロカーネル１６は、メモリ獲得用ＡＰＩで指定されたヒープＩＤを取得し、このヒープＩＤを基に内部データ４３を参照し、ヒープＩＤの属性をチェックする。そして、ステップＳ１０１に進む。
【００８１】
ステップＳ１０１では、ヒープＩＤが仮想グローバルＩＤであるか（すなわちコンフィギュレーションファイル４１においてＭＥＭＯＢＪ＿ＧＬＯＢＡＬ属性を付与されて定義されたヒープＩＤであるか）がチェックされる。仮想グローバルＩＤである場合には、ステップＳ１０２へ進み、グローバルメモリ割り当て処理（図１１参照）を実行する。一方、仮想グローバルＩＤでない場合には、ステップＳ１０３に進む。
【００８２】
ステップＳ１０３では、ヒープＩＤが仮想クラスタＩＤであるか（すなわちコンフィギュレーションファイル４１においてＭＥＭＯＢＪ＿ＣＬＵＳＴＥＲ属性を付与されて定義されたヒープＩＤであるか）がチェックされる。仮想クラスタＩＤである場合には、ステップＳ１０４へ進み、クラスタメモリ割り当て処理（図１２参照）を実行する。一方、仮想クラスタＩＤでない場合には、ステップＳ１０５に進む。
【００８３】
ステップＳ１０５では、ヒープＩＤが仮想コアＩＤであるか（すなわちコンフィギュレーションファイル４１においてＭＥＭＯＢＪ＿ＣＯＲＥ属性を付与されて定義されたヒープＩＤであるか）がチェックされる。仮想コアＩＤである場合には、ステップＳ１０６へ進み、コアメモリ割り当て処理（図１３参照）を実行する。一方、仮想コアＩＤでない場合には、このヒープＩＤは実メモリＩＤであるので、ステップＳ１０７に進み、実メモリ割り当て処理（図１４参照）を実行する。
【００８４】
（グローバルメモリ割り当て処理）
グローバルメモリ割り当て処理について、図１１を参照しつつ説明する。
まず、図１１に示すステップＳ２００において、マイクロカーネル１６は、メモリ獲得用ＡＰＩの呼び出し元のプロセッサコアの番号（本実施形態においてはマイクロカーネル１６が実行されているプロセッサコアの番号）を取得する。そして、ステップＳ２０１に進む。
【００８５】
ステップＳ２０１では、マイクロカーネル１６は、ステップＳ２００で取得したプロセッサコアの番号を基に、メモリ領域２０のツリー構造を参照し、当該番号に関連付けられたコアメモリ領域を取得する。例えば、プロセッサコアの番号が「１」の場合、コンフィギュレーションファイル４１においてｏｗｎｅｒｃｏｒｅｉｄに「１」を指定したコアメモリ領域（図７の（４）の記述によって定義されるコアメモリ領域）を取得する。そして、ステップＳ２０２に進む。
【００８６】
ステップＳ２０２では、取得したメモリ領域２０が「ＭＯＡ＿ＧＬＯＢＡＬ」属性であるか、すなわち、グローバルメモリ領域２３であるかがチェックされる。グローバルメモリ領域２３である場合には、当該メモリ領域２０をメモリ割り当ての対象に選択して、ステップＳ２０４へ進む。一方、グローバルメモリ領域２３でない場合には、ステップＳ２０３に進む。
【００８７】
ステップＳ２０３に進んだ場合、取得したメモリ領域２０の親のメモリ領域２０が取得される。すなわち、図８に示すようなツリー構造において、現在取得しているメモリ領域２０の親のメモリ領域２０を取得する。そして、ステップＳ２０３に戻り、この新しく取得したメモリ領域２０がグローバルメモリ領域２３であるかがチェックされる。そして、グローバルメモリ領域２３である場合には、当該メモリ領域２０をメモリ割り当ての対象に選択して、ステップＳ２０４へ進む。一方、グローバルメモリ領域２３でない場合には、ステップＳ２０３に進んで上記と同様の処理を行う。このように、グローバルメモリ領域２３が見つかるまで、親のメモリ領域２０を再帰的に取得する。
【００８８】
ステップＳ２０４では、マイクロカーネル１６は、メモリ割り当ての対象に選択したメモリ領域２０を管理するヒープマネージャ１５を呼び出し、ヒープマネージャ１５にメモリ割り当てを依頼する。そして、ステップＳ２０５に進む。
【００８９】
ステップＳ２０５では、ヒープマネージャ１５によるメモリ割り当てが成功したかがチェックされる。メモリ割り当てが成功した場合には、ステップＳ２０６へ進む。一方、メモリリソースが枯渇するなどしてメモリ割り当てに失敗した場合には、ステップＳ２０７に進む。
【００９０】
ステップＳ２０６へ進んだ場合、獲得したメモリのメモリポインタをアプリケーションプログラム４０に返却する。このメモリポインタを使用することで、アプリケーションプログラム４０は安全にメモリを使用することができる。そして処理が終了する。
【００９１】
一方、ステップＳ２０７へ進んだ場合、親のメモリ領域２０を取得するかがチェックされる。親のメモリ領域２０が存在しない場合、または、メモリ獲得用ＡＰＩの引数で指定されたヒープＩＤが親のメモリ領域２０を参照しない設定である場合（コンフィギュレーションファイル４１におけるヒープＩＤの定義でａｓｋｐａｒｅｎｔがｆａｌｓｅの場合）には、ステップＳ２０９へ進む。それ以外の場合には、図８に示すようなツリー構造を参照し、メモリ割り当てに失敗したメモリ領域２０の親のメモリ領域２０をメモリ割り当ての対象に選択して、ステップＳ２０８へ進む。
ステップＳ２０９へ進んだ場合、エラーコードをアプリケーションプログラム４０に返却する。そして処理が終了する。
【００９２】
一方、ステップＳ２０８へ進んだ場合、メモリ割り当ての対象に選択した親のメモリ領域２０を管理するヒープマネージャ１５を呼び出し、ヒープマネージャ１５にメモリ割り当てを依頼する。そして、上記したステップＳ２０５に進み、既に説明した手順を繰り返す。このとき、親のメモリ領域２０においてもメモリ割り当てが失敗した場合には、更に親のメモリ領域２０からのメモリ割り当てが再帰的に試行される。
【００９３】
このように、グローバルメモリ割り当て処理においては、アプリケーションプログラム４０が実行されているプロセッサコアのローカルメモリに係るメモリ領域２０（コアメモリ領域）を特定し、当該メモリ領域２０に紐付けられたメモリ領域２０を再帰的に辿って発見したグローバルメモリ領域２３からメモリ割り当てを実行させる。
【００９４】
（クラスタメモリ割り当て処理）
クラスタメモリ割り当て処理について、図１２を参照しつつ説明する。
まず、図１２に示すステップＳ３００において、マイクロカーネル１６は、メモリ獲得用ＡＰＩの呼び出し元のプロセッサコアの番号（本実施形態においてはマイクロカーネル１６が実行されているプロセッサコアの番号）を取得する。そして、ステップＳ３０１に進む。
【００９５】
ステップＳ３０１では、マイクロカーネル１６は、ステップＳ３００で取得したプロセッサコアの番号を基に、メモリ領域２０のツリー構造を参照し、当該番号に関連付けられたコアメモリ領域を取得する。そして、ステップＳ３０３に進む。
【００９６】
ステップＳ３０３では、取得したコアメモリ領域の親のメモリ領域２０をメモリ割り当ての対象に選択する。このコアメモリ領域の親のメモリ領域２０は、「ＭＯＡ＿ＣＬＵＳＴＥＲ」属性を有するクラスタメモリ領域である。そして、ステップＳ３０４に進む。
【００９７】
なお、ステップＳ３０４〜Ｓ３０９における処理は、上述したグローバルメモリ割り当て処理のステップＳ２０４〜Ｓ２０９における処理と同様であるので、説明を省略する。
【００９８】
このように、クラスタメモリ割り当て処理においては、アプリケーションプログラム４０が実行されているプロセッサコアのローカルメモリに係るコアメモリ領域を特定し、当該コアメモリ領域に紐付けられたクラスタメモリ領域からメモリ割り当てを実行させる。
【００９９】
（コアメモリ割り当て処理）
コアメモリ割り当て処理について、図１３を参照しつつ説明する。
まず、図１３に示すステップＳ４００において、マイクロカーネル１６は、メモリ獲得用ＡＰＩの呼び出し元のプロセッサコアの番号（本実施形態においてはマイクロカーネル１６が実行されているプロセッサコアの番号）を取得する。そして、ステップＳ４０１に進む。
【０１００】
ステップＳ４０１では、マイクロカーネル１６は、ステップＳ４００で取得したプロセッサコアの番号を基に、メモリ領域２０のツリー構造を参照し、当該番号に関連付けられたコアメモリ領域２０をメモリ割り当ての対象として選択する。そして、ステップＳ４０２に進む。
【０１０１】
ステップＳ４０２では、マイクロカーネル１６が、メモリ割り当ての対象として選択したコアメモリ領域を管理するヒープマネージャ１５を呼び出し、ヒープマネージャ１５によってメモリ割り当てが実行される。そして、ステップＳ４０３に進む。
【０１０２】
なお、ステップＳ４０３〜Ｓ４０７における処理は、上述したグローバルメモリ割り当て処理のステップＳ２０５〜Ｓ２０９における処理と同様であるので、説明を省略する。
【０１０３】
このように、クラスタメモリ割り当て処理においては、アプリケーションプログラム４０が実行されているプロセッサコアのローカルメモリに係るコアメモリ領域からメモリ割り当てを実行させる。
【０１０４】
（実メモリ割り当て処理）
実メモリ割り当て処理について、図１４を参照しつつ説明する。
まず、図１４に示すステップＳ５００において、マイクロカーネル１６は、メモリ獲得用ＡＰＩの引数で指定されたヒープＩＤ（実メモリＩＤ）を基に、そのヒープＩＤに関連付けられたメモリ領域２０をメモリ割り当ての対象として選択する。例えば、図７の（９）で定義された「ＨＥＡＰ＿ＣＯＲＥ４」というヒープＩＤがメモリ獲得用ＡＰＩの引数で指定されている場合、このヒープＩＤに関連付けられた「ＭＥＭＯＢＪ＿ＣＯＲＥ４」という名前のメモリ領域２０をメモリ割り当ての対象として選択する。そして、ステップＳ５０１に進む。
【０１０５】
ステップＳ５０１では、マイクロカーネル１６が、メモリ割り当ての対象として選択したメモリ領域２０を管理するヒープマネージャ１５を呼び出し、ヒープマネージャ１５にメモリ割り当てを依頼する。そして、ステップＳ５０２に進む。
【０１０６】
なお、ステップＳ５０２〜Ｓ５０６における処理は、上述したグローバルメモリ割り当て処理のステップＳ２０５〜Ｓ２０９における処理と同様であるので、説明を省略する。
【０１０７】
このように、実メモリ割り当て処理においては、指定された実メモリＩＤに関連付けられたメモリ領域２０からメモリ割り当てを実行させる。
【０１０８】
（まとめ）
以上説明したように、本実施形態によれば、実メモリＩＤが指定されてメモリ獲得用ＡＰＩが呼び出されたときには、指定された実メモリＩＤに関連付けられたメモリ領域２０からメモリ割り当てを実行させるようにしている。このため、アプリケーションプログラム４０が指定した特定のメモリからのメモリ割り当てを実行したい場合には、実メモリＩＤを指定してメモリ獲得用ＡＰＩを呼び出せばよい。
【０１０９】
また、仮想コアＩＤが指定されてメモリ獲得用ＡＰＩが呼び出されたときには、メモリ獲得用ＡＰＩを呼び出したアプリケーションプログラム４０が実行されているプロセッサコアのローカルメモリに係るコアメモリ領域からメモリ割り当てを実行させるようにしている。このため、アクセス速度の速いメモリ（プロセッサコア固有のメモリ）をオペレーティングシステム１０に動的に選択させてメモリ割り当てを実行したい場合には、仮想コアＩＤを指定してメモリ獲得用ＡＰＩを呼び出せばよい。
【０１１０】
また、仮想クラスタＩＤが指定されてメモリ獲得用ＡＰＩが呼び出されたときには、メモリ獲得用ＡＰＩを呼び出したアプリケーションプログラム４０が実行されているプロセッサコアのローカルメモリに係るコアメモリ領域を特定し、当該コアメモリ領域に紐付けられたクラスタメモリ領域からメモリ割り当てを実行させるようにしている。このため、例えばマルチコア環境の管理効率を高めるためにプロセッサコアをいくつかのグループ（クラスタ）に分割し、そのクラスタにメモリ領域２０を割り当てた場合、このクラスタ用のメモリ領域２０をクラスタメモリ領域として定義することで、プログラムの実行時にオペレーティングシステム１０が動的に判断してクラスタメモリ領域からメモリ割り当てを実行させることができる。
【０１１１】
また、仮想グローバルＩＤが指定されてメモリ獲得用ＡＰＩが呼び出されたときには、メモリ獲得用ＡＰＩを呼び出したアプリケーションプログラム４０が実行されているプロセッサコアのローカルメモリに係るメモリ領域２０を特定し、当該メモリ領域２０に紐付けられたメモリ領域２０を再帰的に辿って発見したグローバルメモリ領域２３からメモリ割り当てを実行させるようにしている。このため、例えばすべてのプロセッサコアからアクセスできるメモリをグローバルメモリ領域２３とすることで、プログラムの実行時にオペレーティングシステム１０が動的に判断してこのグローバルメモリ領域２３からメモリ割り当てを実行させることができる。
【０１１２】
しかも、上記したような複数のメモリ割り当て方法が同じメモリ獲得用ＡＰＩで実現されているため、アプリケーションプログラム４０を変更しなくても、ヒープＩＤの定義を変更するだけでメモリ割り当て方法を切り替えることができる。例えば、コンフィギュレーションファイル４１を書き換えることでヒープＩＤの定義を変更し、仮想コアＩＤに割り当てられていたヒープＩＤを実メモリＩＤに割り当てるようにすれば、当該ヒープＩＤを使用してメモリ獲得用ＡＰＩを呼び出していたアプリケーションプログラム４０を変更することなく、メモリ割り当ての方法を切り替えることができる。仮想コアＩＤを実メモリＩＤに変更した場合には、ヒープＩＤの定義を変更する前は、プログラム実行時のプロセッサコアに固有のメモリ領域２０からメモリ割り当てが実行され、ヒープＩＤの定義を変更した後は、ヒープＩＤによって指定された特定のメモリ領域２０からのメモリ割り当てが実行される。
【０１１３】
また、メモリ領域２０でツリー構造を作成し、ヒープＩＤで指定されたメモリ領域２０からのメモリ割り当てに失敗したときには、当該メモリ領域２０の上位のメモリ領域２０からメモリ割り当てを実行させるようにしている。このため、例えばアクセス速度の速いメモリリソースが枯渇してしまった場合でも、次の候補のメモリ領域２０からメモリ割り当てを実行させることができる。よって、できるだけアクセス速度の速いメモリ領域２０を検索してメモリ割り当てを実行させることができる。
【０１１４】
また、ヒープＩＤとメモリ領域２０との関係を記述したコンフィギュレーションファイル４１と、コンフィギュレーションファイル４１を読み込んで、アプリケーションプログラム４０用のヘッダファイル４４とオペレーティングシステム１０用の内部データ４３とを生成する情報生成手段４２と、を備える。このような構成によれば、コンフィギュレーションファイル４１を書き換えて情報生成手段４２を実行するだけで、アプリケーションプログラム４０やオペレーティングシステム１０を変更することなく、メモリ領域２０の定義やヒープＩＤの定義を変更することができる。例えば、異なる物理メモリやプロセッサコアを備えたハードウェア環境へプログラムを移植する場合でも、コンフィギュレーションファイル４１を書き換えて情報生成手段４２を実行するだけで、アプリケーションプログラム４０やオペレーティングシステム１０を変更することなく、適切なメモリ割り当てを実現することができる。
【符号の説明】
【０１１５】
１０  オペレーティングシステム
１２  メモリ領域作成部
１４  メモリ割り当て部
１５  ヒープマネージャ
１６  マイクロカーネル
２０  メモリ領域
２１ａ  第１のコアメモリ領域
２１ｂ  第２のコアメモリ領域
２１ｃ  第３のコアメモリ領域
２１ｄ  第４のコアメモリ領域
２２ａ  第１のクラスタメモリ領域
２２ｂ  第２のクラスタメモリ領域
２３  グローバルメモリ領域
３０ａ  第１のプロセッサコア
３０ｂ  第２のプロセッサコア
３０ｃ  第３のプロセッサコア
３０ｄ  第４のプロセッサコア
３１ａ  第１のプロセッサコアのローカルメモリ
３１ｂ  第２のプロセッサコアのローカルメモリ
３１ｃ  第３のプロセッサコアのローカルメモリ
３１ｄ  第４のプロセッサコアのローカルメモリ
３２ａ  第１のクラスタ
３２ｂ  第２のクラスタ
３３ａ  第１のクラスタメモリ
３３ｂ  第２のクラスタメモリ
３４  グローバルメモリ
４０  アプリケーションプログラム
４１  コンフィギュレーションファイル
４２  情報生成手段
４３  内部データ
４４  ヘッダファイル
４５  アプリケーションプログラムのソースコード
４６  コンパイラ
４７  オブジェクトファイル
【図１】
2020077402.tif 000003
【図２】
2020077402.tif 000004
【図３】
2020077402.tif 000005
【図４】
2020077402.tif 000006
【図５】
2020077402.tif 000007
【図６】
2020077402.tif 000008
【図７】
2020077402.tif 000009
【図８】
2020077402.tif 000010
【図９】
2020077402.tif 000011
【図１０】
2020077402.tif 000012
【図１１】
2020077402.tif 000013
【図１２】
2020077402.tif 000014
【図１３】
2020077402.tif 000015
【図１４】
2020077402.tif 000016