(57)【要約】【課題】キャッシュの一貫性をソフトウェアで維持することができるクラスタ型のマルチコアプロセッサシステムを得ること。【解決手段】メモリ領域は、１次キャッシュおよび２次キャッシュをともに使用する第１のアクセスによる読み書きが許可され、１つのタスクに独占的な使用権が与えられている第１の状態と、２次キャッシュのみ使用する第２のアクセスによる読み書きが許可され、１つのプロセスに独占的な使用権が与えられている第２の状態と、キャッシュを使用しない第３のアクセスによる読み書きが許可され、全てのプロセスに使用権が与えられている第３の状態とを容認する。カーネル部は、第１の状態から第２の状態に遷移させるとき、１次キャッシュを２次キャッシュにライトバックし、第２の状態から第３の状態に遷移させるとき、２次キャッシュをメモリ領域にライトバックする。【選択図】図３
2013003793.tif 000002
【特許請求の範囲】
【請求項１】
メモリ領域を備えるメモリと、
複数のプロセッサコアと、前記複数のプロセッサコア毎に対応する複数の１次キャッシュと、前記複数のプロセッサコア間で共有される２次キャッシュと、を備え、前記メモリ領域に対するマッピング設定が共通するプロセッサコア同士はコアグループを形成するマルチコアプロセッサと、
を備え、
前記メモリ領域は、前記１次キャッシュおよび前記２次キャッシュをともに使用する第１のアクセスによる読み書きが許可され、１つのプロセッサコアに独占的な使用権が与えられている第１の状態と、前記１次キャッシュを使用せず、かつ前記２次キャッシュを使用する第２のアクセスによる読み書きが許可され、１つのコアグループに独占的な使用権が与えられている第２の状態と、前記１次キャッシュおよび前記２次キャッシュをともに使用しない第３のアクセスによる読み書きが許可され、全てのコアグループに使用権が与えられている第３の状態と、を容認し、
前記マルチコアプロセッサは、前記第１の状態と前記第２の状態との間、および前記第２の状態と前記第３の状態との間の遷移を行うカーネル部を備え、
前記カーネル部は、
前記メモリ領域を前記第１の状態から前記第２の状態に遷移させるとき、対応する１次キャッシュを前記２次キャッシュにライトバックし、前記第２の状態から前記第３の状態に遷移させるとき、対応する２次キャッシュを前記メモリ領域にライトバックする、
ことを特徴とするマルチコアプロセッサシステム。
【請求項２】
前記メモリ領域は、何れのプロセッサコアにも割り当てられていない第４の状態をさらに容認し、
前記カーネル部は、前記第１乃至第３の状態のうちの少なくとも１つの状態と前記第４の状態との間の遷移を行う、
ことを特徴とする請求項１に記載のマルチコアプロセッサシステム。
【請求項３】
前記メモリ領域は、前記第１のアクセスによる読み出しが許可され、同一のコアグループに属する要求した１以上のプロセッサコアに使用権が与えられている第５の状態をさらに容認し、
前記カーネル部は、前記第２の状態と前記第５の状態との間の遷移を行う、
ことを特徴とする請求項１に記載のマルチコアプロセッサシステム。
【請求項４】
前記メモリ領域は、前記第１のアクセスによる読み出しが許可される、要求した１以上のコアグループに使用権が与えられている第６の状態をさらに容認し、
前記カーネル部は、前記第３の状態と前記第６の状態との間の遷移を行う、
ことを特徴とする請求項１に記載のマルチコアプロセッサシステム。
【請求項５】
前記メモリ領域は、前記第１のアクセスによる読み出しが許可される、１つのコアグループに独占的な使用権が与えられている第７の状態をさらに容認し、
前記カーネル部は、前記第２の状態と前記第７の状態との間の遷移を行う、
ことを特徴とする請求項１に記載のマルチコアプロセッサシステム。
【請求項６】
メモリ領域を備えるメモリと、
各々１次キャッシュを備える複数のプロセッサコアと、前記複数のプロセッサコア間で共有される２次キャッシュと、を備え、を備え、前記メモリ領域に対するマッピング設定が共通するプロセッサコア同士はコアグループを形成するマルチコアプロセッサと、
を備え、
前記メモリ領域は、前記１次キャッシュおよび前記２次キャッシュをともに使用する読み書きが許可され、１つのプロセッサコアに独占的な使用権が与えられている第１の状態と、読み書きが許可されない、１つのコアグループに独占的な使用権が与えられている第２の状態と、読み書きが許可されない、全てのコアグループに使用権が与えられている第３の状態と、を容認し、
前記マルチコアプロセッサは、前記第１の状態と前記第２の状態との間、および前記第２の状態と前記第３の状態との間の遷移を行うカーネル部を備え、
前記カーネル部は、
前記メモリ領域を前記第１の状態から前記第２の状態に遷移させるとき、対応する１次キャッシュを前記２次キャッシュにライトバックし、前記第２の状態から前記第３の状態に遷移させるとき、対応する２次キャッシュを前記メモリ領域にライトバックする、
ことを特徴とするマルチコアプロセッサシステム。
【請求項７】
前記メモリ領域は、何れのプロセッサコアにも割り当てられていない第４の状態をさらに容認し、
前記カーネル部は、前記第１乃至第３の状態のうちの少なくとも１つの状態と前記第４の状態との間の遷移を行う、
ことを特徴とする請求項６に記載のマルチコアプロセッサシステム。
【請求項８】
前記メモリ領域は、前記１次キャッシュおよび前記２次キャッシュをともに使用するアクセスによる読み出しが許可され、同一のコアグループに属する要求した１以上のプロセッサコアに使用権が与えられている第５の状態をさらに容認し、
前記カーネル部は、前記第２の状態と前記第５の状態との間の遷移を行う、
ことを特徴とする請求項６に記載のマルチコアプロセッサシステム。
【請求項９】
前記メモリ領域は、前記１次キャッシュおよび前記２次キャッシュをともに使用するアクセスによる読み出しが許可される、要求した１以上のコアグループに使用権が与えられている第６の状態をさらに容認し、
前記カーネル部は、前記第３の状態と前記第６の状態との間の遷移を行う、
ことを特徴とする請求項６に記載のマルチコアプロセッサシステム。
【請求項１０】
前記メモリ領域は、前記１次キャッシュおよび前記２次キャッシュをともに使用するアクセスによる読み出しが許可される、１つのコアグループに独占的な使用権が与えられている第７の状態をさらに容認し、
前記カーネル部は、前記第２の状態と前記第７の状態との間の遷移を行う、
ことを特徴とする請求項６に記載のマルチコアプロセッサシステム。
【請求項１１】
メモリ領域を備えるメモリに接続され、各々１次キャッシュを備える複数のプロセッサコアと、前記複数のプロセッサコア間で共有される２次キャッシュと、を備え、前記メモリ領域に対するマッピング設定が共通するプロセッサコア同士はコアグループを形成するマルチコアプロセッサであって、
前記メモリ領域は、前記１次キャッシュおよび前記２次キャッシュをともに使用する第１のアクセスによる読み書きが許可され、１つのプロセッサコアに独占的な使用権が与えられている第１の状態と、前記１次キャッシュを使用せず、かつ前記２次キャッシュを使用する第２のアクセスによる読み書きが許可され、１つのコアグループに独占的な使用権が与えられている第２の状態と、前記１次キャッシュおよび前記２次キャッシュをともに使用しない第３のアクセスによる読み書きが許可され、全てのコアグループに使用権が与えられている第３の状態と、を容認し、
前記マルチコアプロセッサは、前記第１の状態と前記第２の状態との間、および前記第２の状態と前記第３の状態との間の遷移を行うカーネル部を備え、
前記カーネル部は、
前記メモリ領域を前記第１の状態から前記第２の状態に遷移させるとき、対応する１次キャッシュを前記２次キャッシュにライトバックし、前記第２の状態から前記第３の状態に遷移させるとき、対応する２次キャッシュを前記メモリ領域にライトバックする、
ことを特徴とするマルチコアプロセッサ。
【請求項１２】
前記メモリ領域は、何れのプロセッサコアにも割り当てられていない第４の状態をさらに容認し、
前記カーネル部は、前記第１乃至第３の状態のうちの少なくとも１つの状態と前記第４の状態との間の遷移を行う、
ことを特徴とする請求項１１に記載のマルチコアプロセッサ。
【請求項１３】
前記メモリ領域は、前記第１のアクセスによる読み出し許可され、同一のコアグループに属する要求した１以上のプロセッサコアに使用権が与えられている第５の状態をさらに容認し、
前記カーネル部は、前記第２の状態と前記第５の状態との間の遷移を行う、
ことを特徴とする請求項１１に記載のマルチコアプロセッサ。
【請求項１４】
前記メモリ領域は、前記第１のアクセスによる読み出しが許可される、要求した１以上のコアグループに使用権が与えられている第６の状態をさらに容認し、
前記カーネル部は、前記第３の状態と前記第６の状態との間の遷移を行う、
ことを特徴とする請求項１１に記載のマルチコアプロセッサ。
【請求項１５】
前記メモリ領域は、前記第１のアクセスによる読み出しが許可される、１つのコアグループに独占的な使用権が与えられている第７の状態をさらに容認し、
前記カーネル部は、前記第２の状態と前記第７の状態との間の遷移を行う、
ことを特徴とする請求項１１に記載のマルチコアプロセッサ。
【請求項１６】
メモリ領域を備えるメモリに接続され、各々１次キャッシュを備える複数のプロセッサコアと、前記複数のプロセッサコア間で共有される２次キャッシュと、を備え、前記メモリ領域に対するマッピング設定が共通するプロセッサコア同士はコアグループを形成するマルチコアプロセッサであって、
前記メモリ領域は、前記１次キャッシュおよび前記２次キャッシュをともに使用する読み書きが許可され、１つのプロセッサコアに独占的な使用権が与えられている第１の状態と、読み書きが許可されない、１つのコアグループに独占的な使用権が与えられている第２の状態と、読み書きが許可されない、全てのコアグループに使用権が与えられている第３の状態と、を容認し、
前記マルチコアプロセッサは、前記第１の状態と前記第２の状態との間、および前記第２の状態と前記第３の状態との間の遷移を行うカーネル部を備え、
前記カーネル部は、
前記メモリ領域を前記第１の状態から前記第２の状態に遷移させるとき、対応する１次キャッシュを前記２次キャッシュにライトバックし、前記第２の状態から前記第３の状態に遷移させるとき、対応する２次キャッシュを前記メモリ領域にライトバックする、
ことを特徴とするマルチコアプロセッサ。
【請求項１７】
前記メモリ領域は、何れのプロセッサコアにも割り当てられていない第４の状態をさらに容認し、
前記カーネル部は、前記第１乃至第３の状態のうちの少なくとも１つの状態と前記第４の状態との間の遷移を行う、
ことを特徴とする請求項１６に記載のマルチコアプロセッサ。
【請求項１８】
前記メモリ領域は、前記１次キャッシュおよび前記２次キャッシュをともに使用するアクセスによる読み出しが許可され、同一のコアグループに属する要求した１以上のプロセッサコアに使用権が与えられている第５の状態をさらに容認し、
前記カーネル部は、前記第２の状態と前記第５の状態との間の遷移を行う、
ことを特徴とする請求項１６に記載のマルチコアプロセッサ。
【請求項１９】
前記メモリ領域は、前記１次キャッシュおよび前記２次キャッシュをともに使用するアクセスによる読み出しが許可される、要求した１以上のコアグループに使用権が与えられている第６の状態をさらに容認し、
前記カーネル部は、前記第３の状態と前記第６の状態との間の遷移を行う、
ことを特徴とする請求項１６に記載のマルチコアプロセッサ。
【請求項２０】
前記メモリ領域は、前記１次キャッシュおよび前記２次キャッシュをともに使用するアクセスによる読み出しが許可される、１つのコアグループに独占的な使用権が与えられている第７の状態をさらに容認し、
前記カーネル部は、前記第２の状態と前記第７の状態との間の遷移を行う、
ことを特徴とする請求項１６に記載のマルチコアプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、マルチコアプロセッサシステムおよびマルチコアプロセッサに関する。
【背景技術】
【０００２】
情報処理の中核となるプロセッサには、常に性能向上が期待されている。処理性能を向上させるためのひとつの手法として、プロセッサコアをクラスタ化することが挙げられる。
【０００３】
また、従来から、チップ面積および消費電力の増加を抑制するために、キャッシュの一貫性を維持する機能をハードウェア機構ではなくソフトウェアで実装する技術の開発が求められている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１１−００３０７２号公報
【非特許文献】
【０００５】
【非特許文献１】坪井芳郎、太田裕、山下高廣著、”東芝の次世代ＳｏＣ「Ｖｅｎｅｚｉａ」ホモジニアス・マルチコアを採用”、日経エレクトロニクス、日経ＢＰ社、２００８年６月３０日、第９８１号、ｐ．１１１、１１３−１１４
【発明の概要】
【発明が解決しようとする課題】
【０００６】
本発明の１つの実施形態は、キャッシュの一貫性をソフトウェアで維持することができるクラスタ型のマルチコアプロセッサシステムおよびマルチコアプロセッサを提供することを目的とする。
【課題を解決するための手段】
【０００７】
本発明の一つの実施形態によれば、メモリ領域を備えるメモリと、各々１次キャッシュを備える複数のプロセッサコアおよび前記複数のプロセッサコア間で共有される２次キャッシュを備え、前記２次キャッシュを共有するプロセッサコアが前記メモリ領域に対するマッピング設定が共通するプロセッサコア毎のコアグループを形成するマルチコアプロセッサと、を備えている。前記メモリ領域は、次の第１〜第３の状態を容認する。第１の状態は、前記１次キャッシュおよび前記２次キャッシュをともに使用する第１のアクセスによる読み書きが許可され、１つのプロセッサコアに独占的な使用権が与えられている状態である。第２の状態は、前記１次キャッシュを使用せず、かつ前記２次キャッシュを使用する第２のアクセスによる読み書きが許可され、１つのコアグループに独占的な使用権が与えられている状態である。第３の状態は、前記１次キャッシュおよび前記２次キャッシュをともに使用しない第３のアクセスによる読み書きが許可され、全てのコアグループに使用権が与えられている状態である。前記マルチコアプロセッサは、前記メモリ領域の夫々の状態間の遷移を行うカーネル部として機能する。前記カーネル部は、前記第１の状態と前記第２の状態との間、および前記第２の状態と前記第３の状態との間の遷移を行う。前記カーネル部は、前記第１の状態から前記第２の状態に遷移させるとき、対応する１次キャッシュを２次キャッシュにライトバックし、前記第２の状態から前記第３の状態に遷移させるとき、対応する２次キャッシュを前記メモリ領域にライトバックする。
【図面の簡単な説明】
【０００８】
【図１】本発明の第１の実施の形態のマルチコアプロセッサシステムの構成を示すブロック図
【図２】ＡＴＵによるメモリマッピングの一例を説明する図
【図３】第１の実施形態のＭＡＰを説明する図
【図４】プロセスの概念を説明する図
【図５】本発明の第１の実施形態のマルチコアプロセッサシステムの機能構成を説明する図
【図６】allocate_private_memory関数の動作を説明するフローチャート
【図７】free_private_memory関数の動作を説明するフローチャート
【図８】allocate_public_memory関数の動作を説明するフローチャート
【図９】free_public_memory関数の動作を説明するフローチャート
【図１０】allocate_external_memory関数の動作を説明するフローチャート
【図１１】free_external_memory関数の動作を説明するフローチャート
【図１２】open_private_memory関数の動作を説明するフローチャート
【図１３】close_private_memory関数の動作を説明するフローチャート
【図１４】open_protected_memory関数の動作を説明するフローチャート
【図１５】close_protected_memory関数の動作を説明するフローチャート
【図１６】open_public_memory関数の動作を説明するフローチャート
【図１７】close_public_memory関数の動作を説明するフローチャート
【図１８】enter_memory_access_protocol関数の動作を説明するフローチャート
【図１９】leave_memory_access_protocol関数の動作を説明するフローチャート
【図２０】プロセス内でメモリ領域を共有する場合の状態遷移の例を説明するフローチャート
【図２１】プロセス間でメモリ領域を共有する場合の状態遷移の例を説明するフローチャート
【図２２】第２の実施形態のＭＡＰを説明する図
【図２３】allocate_um_private_memory関数の動作を説明するフローチャート
【図２４】free_um_private_memory関数の動作を説明するフローチャート
【図２５】allocate_um_public_memory関数の動作を説明するフローチャート
【図２６】free_um_public_memory関数の動作を説明するフローチャート
【図２７】allocate_um_external_memory関数の動作を説明するフローチャート
【図２８】free_um_external_memory関数の動作を説明するフローチャート
【図２９】open_um_private_memory関数の動作を説明するフローチャート
【図３０】close_um_private_memory関数の動作を説明するフローチャート
【図３１】open_um_protected_memory関数の動作を説明するフローチャート
【図３２】close_um_protected_memory関数の動作を説明するフローチャート
【図３３】open_um_public_memory関数の動作を説明するフローチャート
【図３４】close_um_public_memory関数の動作を説明するフローチャート
【図３５】enter_um_memory_access_protocol関数の動作を説明するフローチャート
【図３６】leave_um_memory_access_protocol関数の動作を説明するフローチャート
【図３７】プロセス内でメモリ領域を共有する場合の状態遷移の例を説明するフローチャート
【図３８】プロセス間でメモリ領域を共有する場合の状態遷移の例を説明するフローチャート
【図３９】第３の実施形態のＭＡＰを説明する図
【図４０】freeze_um_external_memory関数の動作を説明するフローチャート
【図４１】melt_um_frozen_external_memory関数の動作を説明するフローチャート
【図４２】複数のプロセスからread  onlyアクセスをするための状態遷移の例を説明するフローチャート
【図４３】第４の実施形態のＭＡＰを説明する図
【図４４】freeze_external_memory関数の動作を説明するフローチャート
【図４５】melt_frozen_external_memory関数の動作を説明するフローチャート
【図４６】複数のプロセスからread  onlyアクセスをするための状態遷移の例を説明するフローチャート
【図４７】第５の実施形態のＭＡＰを説明する図
【図４８】freeze_public_memory関数の動作を説明するフローチャート
【図４９】melt_frozen_public_memory関数の動作を説明するフローチャート
【図５０】第６の実施形態のＭＡＰを説明する図
【図５１】freeze_um_public_memory関数の動作を説明するフローチャート
【図５２】melt_um_frozen_public_memory関数の動作を説明するフローチャート
【発明を実施するための形態】
【０００９】
以下に図面を参照して、実施形態にかかるマルチコアプロセッサシステムおよびマルチコアプロセッサを詳細に説明する。なお、これらの実施形態により本発明が限定されるものではない。
【００１０】
（第１の実施形態）
図１は、本発明の第１の実施形態のマルチコアプロセッサシステムの構成を示すブロック図である。
マルチコアプロセッサシステム１は、マルチコアプロセッサ２と、メモリ３とを備えている。マルチコアプロセッサ２およびメモリ３はバスを介して接続されている。なお、夫々の構成要素をバスではなくメッシュなど他のネットワークトポロジーによって夫々接続するように構成してもよい。
【００１１】
メモリ３は、例えばＲＡＭ（Random  Access  Memory）により構成される。メモリ３には、マルチコアプロセッサ２のハードウェア・リソースの管理を行うカーネルプログラム３２と、マルチコアプロセッサシステム１をユーザが所望するように動作させるためのユーザプログラム３３とがロードされている。また、メモリ３には、マルチコアプロセッサ２がメインメモリとして使用できるカーネル管理領域３１が確保されている。マルチコアプロセッサ２は、カーネルプログラム３２およびユーザプログラム３３を実行することによって、キャッシュ（後述するＬ１キャッシュ２２およびＬ２キャッシュ２４）の一貫性を保ちつつカーネル管理領域３１内のメモリ領域を各コア２１に割り当てる。
【００１２】
なお、以降の説明において、マルチコアプロセッサ２が主体となる動作は、マルチコアプロセッサ２（より正確にはコア２１）がカーネルプログラム３２またはユーザプログラム３３を実行することによって実現される。なお、カーネルプログラム３２に基づく動作は、カーネルプログラム３２を動作の主体として表現し、ユーザプログラム３３に基づく動作は、タスクを動作の主体として表現する場合がある。カーネルプログラム３２やユーザプログラム３３のロード元は、プログラムを予め格納したＲＯＭ（Read  Only  Memory）などにより構成される不揮発性メモリ領域や外部記憶装置などであってよい。以下、カーネルプログラム３２をカーネル３２と略して表現する。
【００１３】
マルチコアプロセッサ２は、コア（プロセッサコア）２１を複数備える。夫々のコア２１はＬ１キャッシュ（Ｌ１Ｃ）２２を備えている。また、マルチコアプロセッサ２は、複数（図１では２個）のクラスタ２５を備え、夫々のコア２１は複数のクラスタ２５のうちの何れかに属する。夫々のクラスタ２５は、メモリ３側にＬ２キャッシュ（Ｌ２Ｃ）２４を備えており、Ｌ２Ｃ２４には、同一クラスタ２５に属するコア２１がクラスタ内バスで共通接続されている。即ち、夫々のコア２１は、Ｌ１Ｃ２２およびＬ２Ｃ２４の２段のキャッシュを介してメモリ３にアクセスすることができるようになっている。なお、クラスタ内の各構成要素をバスではなくメッシュなどの他のネットワークトポロジーによって夫々接続するように構成してもよい。
【００１４】
また、Ｌ１Ｃ２２とＬ２Ｃ２４との間には、仮想アドレスを物理アドレスに変換するアドレス変換ユニット（ＡＴＵ）２３がコア２１毎に設けられている。コア２１は、アクセス先を特定する情報として仮想アドレスを使用し、Ｌ１Ｃ２２にアクセス先がヒットしなかった場合は当該仮想アドレスがＡＴＵ２３により物理アドレスに変換されてＬ２Ｃ２４またはメモリ３に伝達される。
【００１５】
このことは、各コア２１のメモリマップは、ＡＴＵ２３によってメモリ３にマッピングすることができるようになっていることを意味する。即ち、ＡＴＵ２３により、同一の物理アドレス空間上のメモリ領域に仮想アドレス空間上の複数のメモリ領域を重複して割り当てることができることができる。第１の実施形態においては、物理アドレス空間上のメモリ領域に仮想アドレス空間上の複数のメモリ領域を重複して割り当てて、当該重複して割り当てられた仮想アドレス空間上の複数のメモリ領域のうちのどのメモリ領域にアクセスするかによって当該アクセスにキャッシュ（Ｌ１Ｃ２２、Ｌ２Ｃ２４）を使用するか否かを選択できるようになっている。
【００１６】
図２は、ＡＴＵ２３によるメモリマッピングの一例を説明する図である。なお、ここでは、説明を簡単にするために、メモリマッピングの対象コアは２個とし、２個のコア２１を区別するために符号の後にアルファベットの添え字ａ、ｂを付すこととする。
【００１７】
図示するように、コア２１ａのＡＴＵ２３は、コア２１ａの仮想アドレス0x0000_0000〜0x3FFF_FFFFを、物理アドレス0x0000_0000〜0x3FFF_FFFFにＬ１Ｃ２２、Ｌ２Ｃ２４の双方を経由する設定（以下Ｌ１Ｃ／Ｌ２Ｃと表記する）でマッピングし、仮想アドレス0x4000_0000〜0x7FFFF_FFFFを同じ物理アドレス0x0000_0000〜0x3FFFF_FFFFに、Ｌ１Ｃ２２を経由せず、かつＬ２Ｃ２４を経由する設定（以下Ｌ１ＵＣ／Ｌ２Ｃと表記する）でマッピングしている。また、クラスタ２５間で共有するメモリ領域として、仮想アドレス0x8000_0000〜0x8FFF_FFFFまでを物理アドレス0xA000_0000〜0xAFFF_FFFFにＬ１Ｃ／Ｌ２Ｃでマッピングし、仮想アドレス0x9000_0000〜0x9FFF_FFFFまでを同じ物理アドレス0xA000_0000〜0xAFFF_FFFFにＬ１ＵＣ／Ｌ２Ｃでマッピングし、仮想アドレス0xA000_0000〜0xaFFF_FFFFまでを同じ物理アドレス0xA000_0000〜0xAFFF_FFFFに、Ｌ１Ｃ２２、Ｌ２Ｃ２４の双方を経由しない設定(以下Ｌ１ＵＣ／Ｌ２ＵＣと表記する)でマッピングしている。
【００１８】
また、コア２１ｂのＡＴＵ２３は、コア２１ｂの仮想アドレス0x0000_0000〜0x5FFF_FFFFを、物理アドレス0x4000_0000〜0x9FFF_FFFFにＬ１Ｃ／Ｌ２Ｃでマッピングし、仮想アドレス0x6000_0000〜0xBFFF_FFFFを同じ物理アドレス0x4000_0000〜0x9FFFF_FFFFに、Ｌ１ＵＣ／Ｌ２Ｃでマッピングしている。また、クラスタ２５間で共有するメモリ領域として、仮想アドレス0xC000_0000〜0xCFFF_FFFFまでを物理アドレス0xA000_0000〜0xAFFF_FFFFにＬ１Ｃ／Ｌ２Ｃでマッピングし、仮想アドレス0xD000_0000〜0xDFFF_FFFFまでを同じ物理アドレス0xA000_0000〜0xAFFF_FFFFにＬ１ＵＣ／Ｌ２Ｃでマッピングし、仮想アドレス0xE000_0000〜0xEFFF_FFFFまでを同じ物理アドレス0xA000_0000〜0xAFFF_FFFFに、Ｌ１ＵＣ／Ｌ２ＵＣでマッピングしている。
【００１９】
物理アドレス0xA000_0000〜0xAFFF_FFFFのメモリ領域には、コア２１ａ、２１ｂの両方から重複してマッピングされているため、当該メモリ領域を利用してコア２１ａとコア２１ｂとの間でデータを共有することができる。また、この物理アドレス空間上のメモリ領域は、Ｌ１Ｃ／Ｌ２Ｃでアクセスすることが決められているメモリ領域と、Ｌ１ＵＣ／Ｌ２Ｃでアクセスすることが決められているメモリ領域と、Ｌ１ＵＣ／Ｌ２ＵＣでアクセスすることが決められているメモリ領域との３つのメモリ領域に重複してマッピングされている。したがって、この物理アドレス空間上のメモリ領域には、コア２１ａおよびコア２１ｂは、アクセス先の仮想アドレスを切り替えることによって、当該物理アドレス空間のメモリ領域に対してＬ１Ｃ／Ｌ２Ｃ、Ｌ１ＵＣ／Ｌ２Ｃ、またはＬ１ＵＣ／Ｌ２ＵＣのうちの所望のモードでアクセスすることができる。なお、以降、Ｌ１ＵＣ／Ｌ２Ｃでアクセスすることが決められているメモリ領域と、Ｌ１ＵＣ／Ｌ２ＵＣでアクセスすることが決められているメモリ領域とは、Ｌ１Ｃ／Ｌ２Ｃでアクセスすることが決められているメモリ領域のシャドー領域と表現することがある。
【００２０】
第１の実施形態によれば、複数のコア２１にマッピングされた物理アドレス空間上のメモリ領域にかかるキャッシュ（Ｌ１Ｃ２２およびＬ２Ｃ２４）の一貫性を保つために、次に説明するメモリアクセスプロトコル（Memory  Access  Protocol；ＭＡＰ）が定義されている。
【００２１】
図３は、第１の実施形態のＭＡＰを説明する図である。図示するように、第１の実施形態のＭＡＰによれば、INVALID状態、PRIVATE状態、PUBLIC状態、PROTECTED状態、EXTERNAL状態、およびUNMANAGED状態の、６つの属性が定義されている。
（ａ）INVALID状態
この状態は、タスクに対するメモリ領域の割り当てが可能である。割り当て前、および解放後のメモリ領域がこの状態に属する。この状態のメモリ領域にはタスクからは一切アクセスできない。
（ｂ）PRIVATE状態
この状態は、この状態に遷移させたタスクのみがＬ１Ｃ／Ｌ２Ｃでのread／writeアクセスを許可されている。このアクセスは、Ｌ１Ｃ／Ｌ２Ｃで物理メモリにマッピングされた仮想アドレスに対して行うことにより実現される。
（ｃ）PUBLIC状態
この状態は、ＡＴＵ２３のマッピング設定が同一のタスク（コア２１）間でデータを共有している。すなわち、ＡＴＵ２３のマッピング設定が同一のタスクが、Ｌ１ＵＣ／Ｌ２Ｃでのread／writeアクセスを許可されている。このアクセスはＬ１ＵＣ／Ｌ２Ｃで物理メモリにマッピングされた仮想アドレスに対して行うことにより実現される。
ここで、ＡＴＵ２３のマッピング設定が同一のタスクの集合を意味するプロセス（コアグループ）という概念を導入する。図４は、プロセスの概念を説明する図である。図４では、３つのコア２１（タスク）がプロセスＡに属し、４つのコア２１（タスク）がプロセスＢに属している。ＡＴＵ２３の設定が同一の複数のコア２１において夫々実行されるタスクは、同一のプロセスに属することとなる。すなわち、PUBLIC状態のメモリ領域には、当該メモリ領域をPUBLIC状態に遷移させたタスクだけではなく、当該タスクを含むプロセスに属する全てのタスクがアクセスを許可される。なお、一つのクラスタ２５内には複数のプロセスが存在してもかまわないが、１つのプロセスはクラスタ２５をまたぐことはできないものとする。
（ｄ）PROTECTED状態
この状態は、同一のプロセスに属するこの状態に遷移させる要求を行った１以上のタスクがＬ１Ｃ／Ｌ２Ｃでのreadアクセスを許可されている。この状態のメモリ領域にはwriteアクセスは一切出来ない。
（ｅ）EXTERNAL状態
この状態は、クラスタ２５をまたぐ全てのタスクがＬ１ＵＣ／Ｌ２ＵＣでのread／writeアクセスを許可されている。このアクセスは、Ｌ１ＵＣ／Ｌ２ＵＣで物理メモリにマッピングされた仮想アドレスに対して行うことにより実現される。
（ｆ）UNMANAGED状態
この状態は、カーネル３２の管理下にない状態、すなわちメモリ３が備えるメモリ領域のうちのカーネル管理領域３１を除く部分である。カーネル３２はこの状態のメモリ領域におけるキャッシュの一貫性を管理しないため、このメモリ領域をタスクが利用する場合は、キャッシュの一貫性をタスク側で責任を持って保たなければならない。
【００２２】
カーネル管理領域３１に含まれるメモリ領域は、INVALID状態、PRIVATE状態、PUBLIC状態、PROTECTED状態、またはEXTERNAL状態のうちの何れか１つの状態となっている。INVALID状態は、PUBLIC状態との間、PRIVATE状態との間、およびEXTERNAL状態との間で相互に遷移することができる。また、PUBLIC状態は、PRIVATE状態との間、EXTERNAL状態との間、およびPROTECTED状態との間で相互に遷移することができる。カーネル管理領域３１内では、各状態の定義に基づくメモリアクセスおよび状態間の遷移ルールが守られることにより、キャッシュの一貫性が保たれる。
【００２３】
図５は、第１の実施形態のマルチコアプロセッサシステム１の機能構成を説明する図である。マルチコアプロセッサ２は、カーネル３２を実行することによって、状態遷移関数２６と、メモリアロケータ２７と、キャッシュ／メモリ管理部２８とを生成する。また、マルチコアプロセッサ２は、ユーザプログラム３３を実行することによってタスク２９を実行する。
【００２４】
状態遷移関数２６は、図３のＭＡＰにおける各状態間の遷移を行うためのＡＰＩ（Application  Programming  Interface）であって、メモリアロケータ２７およびキャッシュ／メモリ管理部２８と協働してカーネル部として機能する。状態遷移関数２６は、次に示す１４個の関数を含む。
【００２５】
（１）allocate_private_memory(size_t  size)
これは、INVALID状態のメモリ領域から引数“size”で指定されるPRIVATE状態のメモリ領域を確保する関数である。
（２）free_private_memory(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるPRIVATE状態のメモリ領域を解放する関数である。この関数により解放されたメモリ領域はINVALID状態となる。
（３）allocate_public_memory(size_t  size)
これは、INVALID状態のメモリ領域から引数“size”で指定されるPUBLIC状態のメモリ領域を確保する関数である。
（４）free_public_memory(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるPUBLIC状態のメモリ領域を解放する関数である。この関数により解放されたメモリ領域はINVALID状態となる。
（５）allocate_external_memory(size_t  size)
これは、INVALID状態のメモリ領域から引数“size”で指定される引数のEXTERNAL状態のメモリ領域を確保する関数である。
（６）free_external_memory(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるEXTERNAL状態のメモリ領域を解放する関数である。この関数により解放されたメモリ領域はINVALID状態となる。
（７）open_private_memory(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるPUBLIC状態のメモリ領域をからPUBLIC状態からPRIVATE状態に遷移させる関数である。
（８）close_private_memory(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるPRIVATE状態のメモリ領域をPRIVATE状態からPUBLIC状態に遷移させる関数である。
（９）open_protected_memory(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるPUBLIC状態のメモリ領域をPUBLIC状態からPROTECTED状態に遷移させる関数である。
（１０）close_protected_memory(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるPROTECTED状態のメモリ領域をPROTECTED状態からPUBLIC状態に遷移させる関数である。
（１１）open_public_memory(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるEXTERNAL状態のメモリ領域をEXTERNAL状態からPUBLIC状態に遷移させる関数である。
（１２）close_public_memory(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるPUBLIC状態のメモリ領域をPUBLIC状態からEXTERNAL状態に遷移させる関数である。
（１３）enter_memory_access_protocol(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるUNMANAGED状態のメモリ領域をUNMANAGED状態からINVALID状態に遷移させる関数である。
（１４）leave_memory_access_protocol(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるINVALID状態のメモリ領域をINVALID状態からUNMANAGED状態に遷移させる関数である。
【００２６】
allocate関数（allocate_private_memory、allocate_public_memoryおよびallocate_external_memory）、free関数（free_private_memory、free_public_memoryおよびfree_external_memory）、open関数（open_private_memory、open_protected_memoryおよびopen_public_memory）およびclose関数（close_private_memory、close_protected_memoryおよびclose_public_memory）は、タスク２９により呼び出され、enter関数（enter_memory_access_protocol）およびleave関数（leave_memory_access_protocol）はカーネル３２自身により呼び出される。
【００２７】
メモリアロケータ２７は、カーネル管理領域３１の増減およびカーネル管理領域３１内のメモリ領域のタスク２９に対する割り当て／解放を実行する。また、キャッシュ／メモリ管理部２８は、Ｌ１Ｃ２２およびＬ２Ｃ２４のキャッシュラインを管理する。メモリアロケータ２７およびキャッシュ／メモリ管理部２８は夫々状態遷移関数２６から呼び出される。
【００２８】
次に、第１の実施形態の状態遷移関数２６に含まれる各関数の動作を説明する。なお、第１の実施形態の説明においては、Ｌ１Ｃ／Ｌ２Ｃでアクセス可能に設定されている仮想アドレス空間上のメモリ領域におけるアドレスをＬ１Ｃ／Ｌ２Ｃ仮想アドレス、Ｌ１ＵＣ／Ｌ２Ｃでアクセス可能に設定されている仮想アドレス空間上のメモリ領域におけるアドレスをＬ１ＵＣ／Ｌ２Ｃ仮想アドレス、Ｌ１ＵＣ／Ｌ２ＵＣでアクセス可能に設定されている仮想アドレス空間上のメモリ領域におけるアドレスをＬ１ＵＣ／Ｌ２ＵＣ仮想アドレスと略記することとする。
【００２９】
図６は、allocate_private_memory関数の動作を説明するフローチャートである。タスク２９がallocate_private_memoryを呼び出すと、allocate_private_memory関数は、メモリアロケータ２７を用いて、INVALID状態のメモリ領域のうちから引数“size”で指定されたサイズの連続したメモリ領域を割り当て可能か否かを判定する（Ｓ１）。連続したINVALID状態の領域がなく、メモリ領域の割り当てが可能でない場合（Ｓ１、Ｎｏ）、allocate_private_memory関数はNULLを返し（Ｓ２）、動作が終了となる。メモリ領域の割り当てが可能である場合（Ｓ１、Ｙｅｓ）、allocate_private_memory関数は、メモリ領域をメモリアロケータ２７を用いて呼び出し元のタスク２９に割り当てて（Ｓ３）、割り当てられたメモリ領域の先頭アドレスをタスク２９に返し（Ｓ４）、動作が終了となる。呼び出し元のタスク２９は、Ｓ４により返されたアドレスと、引数“size”で指定されたメモリ領域をPRIVATE状態のメモリ領域として認識することができる。
【００３０】
図７は、free_private_memory関数の動作を説明するフローチャートである。タスク２９がfree_private_memory関数を呼び出すと、free_private_memory関数は、キャッシュ／メモリ管理部２８を用いて、Ｌ１Ｃ２２のうちの、先頭アドレス“addr”、引数“size”で指定されたメモリ領域が載っているキャッシュラインを無効化する（Ｓ１１）。そして、free_private_memory関数は、メモリアロケータ２７を用いて、先頭アドレス“addr”、引数“size”で指定されたメモリ領域を解放し（Ｓ１２）、動作が終了となる。
【００３１】
図８は、allocate_public_memory関数の動作を説明するフローチャートである。タスク２９がallocate_public_memory関数を呼び出すと、allocate_public_memory関数は、INVALID状態のメモリ領域のうちから引数“size”で指定されたサイズの連続したメモリ領域を割り当て可能か否かを判定する（Ｓ２１）。メモリ領域の割り当てが可能でない場合（Ｓ２１、Ｎｏ）、allocate_public_memory関数はNULLを返し（Ｓ２２）、動作が終了となる。メモリ領域の割り当てが可能である場合（Ｓ２１、Ｙｅｓ）、allocate_public_memory関数は、メモリアロケータ２７を用いてメモリ領域を呼び出し元のタスク２９に割り当てて（Ｓ２２）、当該割り当てられたメモリ領域の先頭アドレスをＬ１ＵＣ／Ｌ２Ｃ仮想アドレスに変換し（Ｓ２４）、変換後のアドレスをタスク２９に返す（Ｓ２５）。そして、動作が終了となる。呼び出し元のタスク２９と同じプロセスに属する他のタスク２９は、Ｓ２５により返されたアドレスと、引数“size”で指定されたメモリ領域をPUBLIC状態のメモリ領域として認識することができる。
【００３２】
図９は、free_public_memory関数の動作を説明するフローチャートである。タスク２９がfree_public_memory関数を呼び出すと、free_public_memory関数は、指定されたアドレス“addr”（Ｌ１ＵＣ／Ｌ２Ｃ仮想アドレス）を、対応するＬ１Ｃ／Ｌ２Ｃ仮想アドレスに変換する（Ｓ３１）。そして、free_public_memory関数は、キャッシュ／メモリ管理部２８を用いて、変換後のアドレスを先頭とし、引数“size”で指定されたメモリ領域を解放し（Ｓ３２）、動作が終了となる。
【００３３】
図１０は、allocate_external_memory関数の動作を説明するフローチャートである。タスクがallocate_external_memory関数を呼び出すと、allocate_external_memory関数は、INVALID状態のメモリ領域のうちから引数“size”で指定されたサイズの連続したメモリ領域を割り当て可能か否かを判定する（Ｓ４１）。メモリ領域の割り当てが可能でない場合（Ｓ４１、Ｎｏ）、allocate_external_memory関数はNULLを返し（Ｓ４２）、動作が終了となる。メモリ領域の割り当てが可能である場合（Ｓ４１、Ｙｅｓ）、allocate_external_memory関数は、メモリアロケータ２７を用いてメモリ領域を呼び出し元のタスク２９に割り当てて（Ｓ４３）、キャッシュ／メモリ管理部２８を用いて、Ｌ２Ｃ２４における当該割り当てられたメモリ領域が載っているキャッシュラインを無効化する（Ｓ４４）。そして、allocate_external_memory関数は、当該割り当てられたメモリ領域の先頭アドレスをＬ１ＵＣ／Ｌ２ＵＣ仮想アドレスに変換し（Ｓ４５）、変換後のアドレスをタスク２９に返す（Ｓ４６）。そして、動作が終了となる。全てのタスク２９は、Ｓ４６により返されたアドレスと、呼び出し元のタスク２９により引数“size”で指定されたメモリ領域をEXTERNAL状態のメモリ領域として認識することができる。
【００３４】
なお、呼び出し元のタスク２９は、Ｓ４６により返されたアドレスおよび指定された引数“size”を同一のプロセスに属する他のタスク２９および他のプロセスに属するタスク２９に通知することによって、全てのタスク２９が当該メモリ領域をEXTERNAL状態として認識できるようにしてもよい。また、プロセス間ではＡＴＵ２３のマッピングの設定が異なるため、プロセス間を跨いでアドレスを授受する際に当該アドレスを変換する必要があるが、どのような方法で当該変換を行うようにしてもよい。
【００３５】
図１１は、free_external_memory関数の動作を説明するフローチャートである。タスク２９がfree_external_memory関数を呼び出すと、free_external_memory関数は、指定されたアドレス“addr”（Ｌ１ＵＣ／Ｌ２ＵＣ仮想アドレス）を、対応するＬ１Ｃ／Ｌ２Ｃ仮想アドレスに変換する（Ｓ５１）。そして、free_external_memory関数は、メモリアロケータ２７を用いて、変換後のアドレスを先頭とし、引数“size”で指定されたメモリ領域を解放し（Ｓ５２）、動作が終了となる。
【００３６】
図１２は、open_private_memory関数の動作を説明するフローチャートである。タスク２９がopen_private_memory関数を呼び出すと、open_private_memory関数は、指定されたアドレス“addr”（Ｌ１ＵＣ／Ｌ２Ｃ仮想アドレス）を、対応するＬ１Ｃ／Ｌ２Ｃ仮想アドレスに変換する（Ｓ６１）。そして、open_private_memory関数は、変換後のアドレスをタスク２９に返し（Ｓ６２）、動作が終了となる。呼び出し元のタスク２９は、Ｓ６２により返されたアドレスと、引数“size”で指定されたメモリ領域をPRIVATE状態のメモリ領域として認識することができる。
【００３７】
図１３は、close_private_memory関数の動作を説明するフローチャートである。タスク２９がclose_private_memory関数を呼び出すと、close_private_memory関数は、キャッシュ／メモリ管理部２８を用いて、指定されたメモリ領域が載っているＬ１Ｃ２２のキャッシュラインを無効化して内容をＬ２Ｃ２４にライトバックする（Ｓ７１）。そして、close_private_memory関数は、指定されたアドレス“addr”（Ｌ１Ｃ／Ｌ２Ｃ仮想アドレス）を、対応するＬ１ＵＣ／Ｌ２Ｃ仮想アドレスに変換し（Ｓ７２）、変換後のアドレスを返し（Ｓ７３）、動作が終了となる。呼び出し元のタスク２９と同じプロセスに属するタスク２９は、Ｓ７３により返されたアドレスと、引数“size”で指定されたメモリ領域をPUBLIC状態のメモリ領域として認識することができる。
【００３８】
図１４は、open_protected_memory関数の動作を説明するフローチャートである。タスク２９がopen_protected_memory関数を呼び出すと、open_protected_memory関数は、指定されたアドレス“addr”（Ｌ１ＵＣ／Ｌ２Ｃ仮想アドレス）を、対応するＬ１Ｃ／Ｌ２Ｃ仮想アドレスに変換する（Ｓ８１）。そして、open_protected_memory関数は、変換後のアドレスを返し（Ｓ８２）、動作が終了となる。呼び出し元のタスク２９と同じプロセスに属するタスク２９は、Ｓ８２により返されたアドレスと、引数“size”で指定されたメモリ領域をPUBLIC状態のメモリ領域として認識することができる。
【００３９】
図１５は、close_protected_memory関数の動作を説明するフローチャートである。タスク２９がclose_protected_memory関数を呼び出すと、close_protected_memory関数は、キャッシュ／メモリ管理部２８を用いて、先頭アドレス“addr”、引数“size”で指定されたメモリ領域が載っているＬ１Ｃ２２のキャッシュラインを無効化する（Ｓ９１）。そして、close_protected_memory関数は、指定されたアドレス“addr”（Ｌ１Ｃ／Ｌ２Ｃ仮想アドレス）を、対応するＬ１ＵＣ／Ｌ２Ｃ仮想アドレスに変換する（Ｓ９２）。そして、close_protected_memory関数は、変換後のアドレスを返し（Ｓ９３）、動作が終了となる。呼び出し元のタスク２９と同じプロセスに属するタスク２９は、Ｓ９３により返されたアドレスと、引数“size”で指定されたメモリ領域をPUBLIC状態のメモリ領域として認識することができる。
【００４０】
図１６は、open_public_memory関数の動作を説明するフローチャートである。タスク２９がopen_public_memory関数を呼び出すと、open_public_memory関数は、指定されたアドレス“addr”（Ｌ１ＵＣ／Ｌ２ＵＣ仮想アドレス）を、対応するＬ１ＵＣ／Ｌ２Ｃ仮想アドレスに変換する（Ｓ１０１）。その後、open_public_memory関数は、変換後のアドレスを返し（Ｓ１０２）、動作が終了となる。呼び出し元のタスク２９と同じプロセスに属するタスク２９は、Ｓ１０２により返されたアドレスと、引数“size”で指定されたメモリ領域をPUBLIC状態のメモリ領域として認識することができる。
【００４１】
図１７は、close_public_memory関数の動作を説明するフローチャートである。タスク２９がclose_public_memory関数を呼び出すと、close_public_memory関数は、キャッシュ／メモリ管理部２８を用いて、先頭アドレス“addr”、引数“size”で指定されたメモリ領域が載っているＬ２Ｃ２４のキャッシュラインに対し、内容のメモリ領域へのライトバックと無効化とを実行する（Ｓ１１１）。そして、close_public_memory関数は、指定されたアドレス“addr”（Ｌ１ＵＣ／Ｌ２Ｃ仮想アドレス）を、対応するＬ１ＵＣ／Ｌ２ＵＣ仮想アドレスに変換する（Ｓ１１２）。そして、close_public_memory関数は、変換後のアドレスを返し（Ｓ１１３）、動作が終了となる。全てのタスク２９は、Ｓ１１３により返されたアドレスと、呼び出し元のタスク２９により引数“size”で指定されたメモリ領域をEXTERNAL状態のメモリ領域として認識することができる。
【００４２】
図１８は、enter_memory_access_protocol関数の動作を説明するフローチャートである。カーネル３２がenter_memory_access_protocol関数を呼び出すと、enter_memory_access_protocol関数は、メモリアロケータ２７を用いて、先頭アドレス“addr”、引数“size”で指定されたUNMANAGED状態のメモリ領域をカーネル管理領域３１に加える（Ｓ１２１）。そして、enter_memory_access_protocol関数は、当該カーネル管理領域３１に加えられたメモリ領域の先頭アドレスをカーネル３２に返し（Ｓ１２２）、動作が終了となる。カーネル３２は、当該カーネル管理領域３１に加えられたメモリ領域を未割り当て状態（すなわちINVALID状態）のメモリ領域として認識する。
【００４３】
図１９は、leave_memory_access_protocol関数の動作を説明するフローチャートである。カーネル３２がleave_memory_access_protocol関数を呼び出すと、leave_memory_access_protocol関数は、メモリアロケータ２７を用いて、先頭アドレス“addr”、引数“size”で指定されたINVALID状態のメモリ領域をカーネル管理領域３１から除外する（Ｓ１３１）。そして、leave_memory_access_protocol関数は、当該カーネル管理領域３１から除外したメモリ領域の先頭アドレスをカーネル３２に返し（Ｓ１３２）、動作が終了となる。当該カーネル管理領域３１から除外されたメモリ領域はUNMANAGED状態、すなわちカーネル３２が管理しない状態となる。
【００４４】
次に、以上のように動作する状態遷移関数２６を用いてメモリ領域の状態遷移を行う例を説明する。図２０は、プロセス内でメモリ領域を共有する場合の状態遷移の例を説明するフローチャートである。
【００４５】
初めに、メモリ領域の状態は、UNMANAGED状態となっている（Ｓ１４１）。そして、カーネル３２からenter_memory_access_protocol関数が呼ばれることにより、当該メモリ領域はUNMANAGED状態からINVALID状態に遷移する（Ｓ１４２）。次に、あるプロセス内のタスク２９間でデータを共有するために、そのプロセス内の１つのタスク２９からallocate_public_memory関数が呼び出され、当該メモリ領域がINVALID状態からPUBLIC状態に遷移する（Ｓ１４３）。次に、そのプロセス内の１つのタスク２９がopen_private_memory関数を呼ぶことにより、当該メモリ領域はPRIVATE状態に遷移して、当該open_private_memory関数の読み出し元のタスク２９によりＬ１Ｃ／Ｌ２Ｃでread／writeアクセスされる（Ｓ１４４）。この間、他のタスク２９からのアクセスは許可されないため、アクセスは適切に行われる。
【００４６】
アクセスが終了すると、open_private_memory関数の呼び出し元のタスク２９によるclose_private_memoyty関数の呼び出しにより、当該メモリ領域はPUBLIC状態に戻される（Ｓ１４５）。この時、そのメモリ領域に対応するＬ１Ｃ２２のキャッシュラインは適切にＬ２Ｃ２４に書き戻されたのち無効化される。PUBLIC状態となった当該メモリ領域に対しては、Ｌ１ＵＣ／Ｌ２Ｃ仮想アドレスによってプロセス内のどのタスク２９もread／writeが許される（Ｓ１４６）。その後、そのプロセス内のタスク２９がopen_protected_memory関数を呼び出すことによって、当該メモリ領域がPROTECTED状態に遷移され、open_protected_memory関数の呼び出し元のタスク２９によるＬ１Ｃ／Ｌ２Ｃのreadアクセスが行われる（Ｓ１４７）。アクセスが終了すると、open_protected_memory関数を呼び出したタスク２９によるclose_protected_memory関数の呼び出しにより、当該メモリ領域はPUBLIC状態に戻される（Ｓ１４８）。この時、そのメモリ領域に対応するＬ１Ｃ２２のキャッシュラインは適切に無効化される。
【００４７】
そして、同一のプロセス内のタスク２９がfree_public_memory関数を呼び出すことによって、当該メモリ領域はINVALID状態に遷移する（Ｓ１４９）。そして、カーネル３２がleave_memory_access_protocol関数を呼び出して、当該メモリ領域がUNMANAGED状態となり（Ｓ１５０）、一連の動作が終了となる。
【００４８】
図２１は、プロセス間でメモリ領域を共有する場合の状態遷移の例を説明するフローチャートである。初めに、メモリ領域の状態は、UNMANAGED状態となっている（Ｓ１６１）。そして、カーネル３２からenter_memory_access_protocol関数が呼ばれることにより、当該メモリ領域はUNMANAGED状態からINVALID状態に遷移する（Ｓ１６２）。次に、あるタスク２９からプロセス間でデータを共有するためにallocate_external_memory関数が呼び出され、当該メモリ領域は、Ｌ２Ｃ２４の対応するキャッシュラインが無効化された後、INVALID状態からEXTERNAL状態に遷移する（Ｓ１６３）。この状態ではどのプロセスのどのタスクもＬ１ＵＣ／Ｌ２ＵＣ仮想アドレスによってread／writeアクセスが許される（Ｓ１６４）。ただし、そのアクセスに使用するＬ１ＵＣ／Ｌ２ＵＣ仮想アドレスは、前述したように、プロセスごとに異なる。
【００４９】
その後、あるプロセスの１つのタスク２９が、そのプロセス内の共有目的に占有して使うために、open_public_memory関数を呼び出すと、当該メモリ領域はPUBLIC状態に遷移する（Ｓ１６５）。この状態では、open_public_memory関数の呼び出し元のタスク２９が属するプロセス内のすべてのタスク２９がＬ１ＵＣ／Ｌ２Ｃ仮想アドレスによるread／writeアクセスを許される（Ｓ１６６）。その後、そのプロセス内の１つのタスク２９が当該メモリ領域を占有して使うためにopen_private_memory関数を呼び出すと、当該メモリ領域はPRIVATE状態に遷移する（Ｓ１６７）。この状態では、open_private_memory関数の呼び出し元のタスク２９だけがＬ１Ｃ／Ｌ２Ｃ仮想アドレスによるread／writeアクセスを許可される。アクセス終了後、open_private_memory関数の呼び出し元のタスク２９がclose_private_memory関数を呼ぶと、当該メモリ領域はPUBLIC状態に戻される（Ｓ１６８）。この時、そのメモリ領域に対応するＬ１Ｃ２２のキャッシュラインが適切にＬ２Ｃ２４に書き戻されたのち、無効化される。
【００５０】
その後、そのプロセス内のタスク２９がopen_protected_memory関数を呼び出すことによって、当該メモリ領域はPROTECTED状態に遷移し、open_protected_memory関数の呼び出し元のタスク２９によるＬ１Ｃ／Ｌ２Ｃのreadアクセスが行われる（Ｓ１６９）。アクセスが終了すると、open_protected_memory関数の呼び出し元のタスク２９によるclose_protected_memory関数の呼び出しにより、当該メモリ領域はPUBLIC状態に戻される（Ｓ１７０）。この時、そのメモリ領域に対応するＬ１Ｃ２２のキャッシュラインが適切に無効化される。
【００５１】
その後、プロセスによる占有使用が終了すると、そのプロセスの１つのタスク２９がclose_public_memory関数を呼び出すことによって、当該メモリ領域はEXTERNAL状態に戻される（Ｓ１７１）。この時、そのメモリ領域に対応するＬ２Ｃ２４のキャッシュラインが適切にメモリ３に書き戻されたのち、無効化される。そして、いずれかのタスクからfree_external_memory関数が呼び出されると、当該メモリ領域はINVALID状態に遷移する（Ｓ１７２）。そしてカーネル３２からleave_memory_access_protocol関数が呼び出されると、当該メモリ領域はUNMANAGED状態となり（Ｓ１７３）、動作が終了となる。
【００５２】
このように、第１の実施形態によれば、メモリ領域は、Ｌ１Ｃ／Ｌ２Ｃのアクセスによるread／writeが許可され、１つのタスク２９（コア２１）に独占的な使用権が与えられているPROVATE状態と、Ｌ１ＵＣ／Ｌ２Ｃのアクセスによるread／writeが許可され、１つのプロセスに独占的な使用権が与えられているPUBLIC状態と、Ｌ１ＵＣ／Ｌ２ＵＣのアクセスによるread／writeが許可され、全てのタスク２９（すなわち全てのプロセス）に使用権が与えられているEXTERNAL状態と、を容認し、PRIVATE状態とPUBLIC状態との間、およびPUBLIC状態とEXTERNAL状態との間の遷移を行うカーネル部を備え、カーネル部は、メモリ領域をPRIVATE状態からPUBLIC状態に遷移させるとき、対応するＬ１Ｃ２２をＬ２Ｃ２４にライトバックし、PUBLIC状態からEXTERNAL状態に遷移させるとき、対応するＬ２Ｃ２４をメモリ領域にライトバックするように構成したので、夫々１次キャッシュを備える複数のコアが２次キャッシュを共有してクラスタを形成するマルチコアプロセッサを備えるマルチコアプロセッサシステムにおいて、１次キャッシュ、２次キャッシュ、およびメモリ３の記憶内容の一貫性を保ったままタスク２９間、プロセス間、およびクラスタ間でメモリ領域を共有できるようになる。すなわち、クラスタ型のマルチコアプロセッサシステムにおいてキャッシュの一貫性をソフトウェアで維持することができるようになる。
【００５３】
また、カーネル部は、PRIVATE状態、PUBLIC状態またはEXTERNAL状態と、INVALID状態との間で遷移を行うようにしたので、特定のタスク、特定のプロセス、または全プロセスに対するメモリ領域の割り当てを行うことができる。
【００５４】
また、カーネル部は、PUBLIC状態と、PROTECTED状態との間で遷移を行うようにしたので、同一のプロセスに属する１以上のタスクからのメモリ読み出しを高速化することができる。
【００５５】
なお、第１の実施形態の説明においては、マルチコアプロセッサシステム１は、各タスク２９がＭＡＰにより禁止されている動作（例えば各状態で禁止されているアクセスを行う動作や、状態間の遷移ルールに反するタスク間でのメモリ領域の受け渡しなど）のチェックを行っていない。ＭＡＰにより禁止されている動作が行われると、キャッシュの一貫性を保つことが出来なくなってしまう。
【００５６】
そこで、状態遷移関数２６に含まれる各関数に遷移後のメモリ領域の状態と使用権を所有するタスク２９（またはプロセス）の識別子とを対応付けて出力させる。関数が呼び出された際には、当該出力された対応付けを参照することによって、自関数による遷移がＭＡＰに定義されている遷移ルールに則しているか否かを判断させるようにしてもよい。そして、遷移ルールに則していない動作を検出したとき、検出結果を出力するようにしてもよい。また、メモリ領域に対するアクセスが行われたとき、状態遷移関数２６が出力した対応付けを参照して、当該アクセスがアクセス先のメモリ領域の状態に則したアクセスであるか否かを判断する機構を設けるようにしてもよい。
【００５７】
また、第１の実施形態は、夫々複数のコア２１を備える複数のクラスタ２５を有するマルチコアプロセッサ２だけでなく、複数のコア２１を備えるクラスタ２５を１つのみ備えるマルチコアプロセッサにも適用することができる。
【００５８】
（第２の実施形態）
第１の実施形態によれば、シャドー領域を持つ物理メモリ領域においてキャッシュの一貫性を保つことができるようになる。これに対して、第２の実施形態によれば、シャドー領域を持たず、アクセスする際にはＬ１キャッシュおよびＬ２キャッシュを有効としたアクセスしか許可されない物理メモリ領域においてキャッシュの一貫性を保つことができる。
【００５９】
なお、第２の実施形態のマルチコアプロセッサシステムの構成は、状態遷移関数２６に含まれる関数の内容を除いて第１の実施形態と等しいので、状態遷移関数２６に含まれる関数を除く構成についての重複する説明を省略する。
【００６０】
図２２は、第２の実施形態のＭＡＰを説明する図である。第２の実施形態のＭＡＰによれば、UM_INVALID状態、UM_PRIVATE状態、UM_PUBLIC状態、UM_PROTECTED状態、UM_EXTERNAL状態、およびUNMANAGED状態の、６つの属性が定義されている。
（ｇ）UM_INVALID状態
この状態は、カーネル３２によるメモリ領域の割り当てが可能である。メモリ割り当て前、メモリ解放後のメモリ領域がこの状態に属する。タスクからは一切アクセスできない。
（ｈ）UM_PRIVATE状態
この状態は、この状態に遷移させたタスクのみがＬ１Ｃ／Ｌ２Ｃでのread／writeアクセスを許可される。このアクセスは、Ｌ１Ｃ／Ｌ２Ｃで物理メモリ領域にマッピングされた仮想アドレスに対して行うことにより実現される。
（ｉ）UM_PUBLIC状態
この状態は、ＡＴＵ２３のマッピングの設定が同一のタスク間、すなわち同一のプロセスに属するタスク間でデータを共有している。ただし、この状態のメモリ領域に対して直接アクセスすることは許されない。同一のプロセスに属するタスクのみ、この状態のメモリをUM_PRIVATE状態もしくはUM_PROTECTED状態に遷移させた後に、アクセスが許される。
（ｊ）UM_PROTECTED状態
この状態は、同一のプロセスに属するこの状態に遷移させる要求を行った１以上のタスクがＬ１Ｃ／Ｌ２Ｃでのreadアクセスを許可されている。この状態のメモリ領域に対するwriteアクセスは許されない。
（ｋ）UM_EXTERNAL状態
この状態は、すべてのタスクがデータを共有している。ただし、この状態のメモリ領域に対して直接アクセスすることは許されない。タスクは、UM_PUBLIC状態に遷移させた後、そのタスクと同じメモリアドレスマッピングを持つタスクがUM_PRIVATE状態、もしくはUM_PUBLIC状態に遷移させた後に、アクセスが許される。
（ｌ）UNMANAGED状態
この状態は、第１の実施形態における同名の状態と同じである。
【００６１】
カーネル管理領域３１に含まれるメモリ領域は、UM_INVALID状態、UM_PRIVATE状態、UM_PUBLIC状態、UM_PROTECTED状態、またはUM_EXTERNAL状態のうちの何れか１つの状態となっている。UM_INVALID状態は、UM_PUBLIC状態との間、UM_PRIVATE状態との間、およびUM_EXTERNAL状態との間で相互に遷移することができる。また、UM_PUBLIC状態は、UM_PRIVATE状態との間、UM_EXTERNAL状態との間、およびUM_PROTECTED状態との間で相互に遷移することができる。カーネル管理領域３１内では、UM_INVALID状態、UM_PRIVATE状態、UM_PUBLIC状態、UM_PROTECTED状態またはUM_EXTERNAL状態の定義に基づくメモリアクセスおよび状態間の遷移ルールが守られることにより、キャッシュの一貫性が保たれる。
【００６２】
なお、第２の実施形態においても、UNMANAGED状態とUM_INVALID状態との間が遷移可能となっており、これによりカーネル管理領域３１を動的に増減させることができる。
【００６３】
第２の実施形態の状態遷移関数２６は、上述に定義される各状態間の遷移を行うためのＡＰＩ（Application  Programming  Interface）である。状態遷移関数２６は、次に示す１４個の関数を含む。
【００６４】
（１５）allocate_um_private_memory(size_t  size)
これは、引数“size”で指定されるUM_PRIVATE状態のメモリ領域を確保する関数である。
（１６）free_um_private_memory(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_PRIVATE状態のメモリ領域を解放する関数である。
（１７）allocate_um_public_memory(size_t  size)
これは、引数“size”で指定されるのUM_PUBLIC状態のメモリ領域を確保する関数である。
（１８）free_um_public_memory(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_PUBLIC状態のメモリ領域を解放する関数である。
（１９）allocate_um_external_memory(size_t  size)
これは、引数“size”で指定されるのUM_EXTERNAL状態のメモリ領域を確保する関数である。
（２０）free_um_external_memory(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_EXTERNAL状態のメモリ領域を解放する関数である。
（２１）open_um_private_memory(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_PUBLIC状態のメモリ領域をUM_PUBLIC状態からUN_PRIVATE状態に遷移させる関数である。
（２２）close_um_private_memory(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_PRIVATE状態のメモリ領域をUM_PRIVATE状態からUM_PUBLIC状態に遷移させる関数である。
（２３）open_um_protected_memory(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_PUBLIC状態のメモリ領域をUM_PUBLIC状態からUM_PROTECTED状態に遷移させる関数である。
（２４）close_um_protected_memory(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_PROTECTED状態のメモリ領域をUM_PROTECTED状態からUM_PUBLIC状態に遷移させる関数である。
（２５）open_um_public_memory(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_EXTERNAL状態のメモリ領域をUM_EXTERNAL状態からUM_PUBLIC状態に遷移させる関数である。
（２６）close_um_public_memory(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_PUBLIC状態のメモリ領域をUM_PUBLIC状態からUM_EXTERNAL状態に遷移させる関数である。
（２７）enter_um_memory_access_protocol(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるUNMANAGED状態のメモリ領域をUNMANAGED状態からUM_INVALID状態に遷移させる関数である。
（２８）leave_um_memory_access_protocol(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_INVALID状態のメモリ領域をUM_INVALID状態からUNMANAGED状態に遷移させる関数である。
【００６５】
allocate関数（allocate_um_private_memory、allocate_um_public_memoryおよびallocate_um_external_memory）、free関数（free_um_private_memory、free_um_public_memoryおよびfree_um_external_memory）、open関数（open_um_private_memory、open_um_protected_memoryおよびopen_um_public_memory）およびclose関数（close_um_private_memory、close_um_protected_memoryおよびclose_um_public_memory）は、タスク２９により呼び出され、enter関数（enter_um_memory_access_protocol）およびleave関数（leave_um_memory_access_protocol）はカーネル３２自身により呼び出される。
【００６６】
次に、第２の実施形態の状態遷移関数２６に含まれる各関数の動作を説明する。なお、第２の実施形態の説明においては、シャドー空間を持たない物理メモリ領域には、Ｌ１Ｃ／Ｌ２Ｃでアクセス可能に設定されている仮想アドレス空間上のメモリ領域のみが割り当てられる。当該仮想アドレス空間上のメモリ領域におけるアドレスをＬ１Ｃ／Ｌ２Ｃ仮想アドレスと略記する。
【００６７】
図２３は、allocate_um_private_memory関数の動作を説明するフローチャートである。タスク２９がallocate_um_private_memory関数を呼び出すと、allocate_um_private_memory関数は、メモリアロケータ２７を用いて、メモリアロケータ２７を用いて、UM_INVALID状態のメモリ領域のうちから引数“size”で指定されたサイズの連続したメモリ領域を割り当て可能か否かを判定する（Ｓ１８１）。連続したUM_INVALID状態の領域がなく、メモリ領域の割り当てが可能でない場合（Ｓ１８１、Ｎｏ）、allocate_um_private_memory関数はNULLを返し（Ｓ１８２）、動作が終了となる。メモリ領域の割り当てが可能である場合（Ｓ１８１、Ｙｅｓ）、allocate_um_private_memory関数は、メモリアロケータ２７を用いてメモリ領域を呼び出し元のタスク２９に割り当てて（Ｓ１８３）、当該割り当てられたメモリ領域の先頭アドレスをタスク２９に返す（Ｓ１８４）。そして、動作が終了となる。呼び出し元のタスク２９は、Ｓ１８４により返されたアドレスと、引数“size”で指定されたメモリ領域をUM_PRIVATE状態のメモリ領域として認識することができる。
【００６８】
図２４は、free_um_private_memory関数の動作を説明するフローチャートである。タスク２９がfree_um_private_memory関数を呼び出すと、free_um_private_memory関数は、キャッシュ／メモリ管理部２８を用いて、Ｌ１Ｃ２２のうちの、先頭アドレス“addr”、引数“size”で指定されたメモリ領域が載っているキャッシュラインを無効化する（Ｓ１９１）。そして、free_um_private_memory関数は、メモリアロケータ２７を用いて、先頭アドレス“addr”、引数“size”で指定されたメモリ領域を解放し（Ｓ１９２）、動作が終了となる。
【００６９】
図２５は、allocate_um_public_memory関数の動作を説明するフローチャートである。タスク２９がallocate_um_public_memory関数を呼び出すと、allocate_um_public_memory関数は、メモリアロケータ２７を用いて、UM_INVALID状態のメモリ領域のうちから引数“size”で指定されたサイズの連続したメモリ領域を割り当て可能か否かを判定する（Ｓ２０１）。メモリ領域の割り当てが可能でない場合（Ｓ２０１、Ｎｏ）、allocate_um_public_memory関数はNULLを返し（Ｓ２０２）、動作が終了となる。メモリ領域の割り当てが可能である場合（Ｓ２０１、Ｙｅｓ）、allocate_um_public_memory関数は、メモリアロケータ２７を用いてメモリ領域を呼び出し元のタスク２９に割り当てて（Ｓ２０３）、当該割り当てられたメモリ領域の先頭アドレスをタスク２９に返す（Ｓ２０４）。そして、動作が終了となる。呼び出し元のタスク２９と同じプロセスに属するタスク２９は、Ｓ２０４により返されたアドレスと、から引数“size”で指定されたメモリ領域をUM_PUBLIC状態のメモリ領域として認識することができる。
【００７０】
なお、呼び出し元のタスク２９は、Ｓ２０４により返されたアドレスおよび指定された引数“size”を同一のプロセスに属する他のタスク２９に通知することによって、同一のプロセスに属する他のタスク２９が当該メモリ領域をUM_PUBLIC状態として認識できるようにしてもよい。
【００７１】
図２６は、free_um_public_memory関数の動作を説明するフローチャートである。タスク２９がfree_um_public_memory関数を呼び出すと、free_um_public_memory関数は、メモリアロケータ２７を用いて、指定されたメモリ領域を解放し（Ｓ２１１）、動作が終了となる。
【００７２】
図２７は、allocate_um_external_memory関数の動作を説明するフローチャートである。タスク２９がallocate_um_external_memory関数を呼び出すと、allocate_um_external_memory関数は、メモリアロケータ２７を用いて、UM_INVALID状態のメモリ領域のうちから引数“size”で指定されたサイズの連続したメモリ領域を割り当て可能か否かを判定する（Ｓ２２１）。メモリ領域の割り当てが可能でない場合（Ｓ２２１、Ｎｏ）、allocate_um_external_memory関数はNULLを返し（Ｓ２２２）、動作が終了となる。モリ領域の割り当てが可能である場合（Ｓ２２１、Ｙｅｓ）、allocate_um_external_memory関数は、メモリアロケータ２７を用いてメモリ領域を呼び出し元のタスク２９に割り当てる（Ｓ２２３）。そして、キャッシュ／メモリ管理部２８を用いて、Ｌ２Ｃ２４における当該割り当てられたメモリ領域が載っているキャッシュラインを無効化する（Ｓ２２４）。そして、allocate_um_external_memory関数は、当該割り当てられたメモリ領域の先頭アドレスをタスク２９に返し（Ｓ２２５）、動作が終了となる。全てのタスク２９は、Ｓ２２５により返されたアドレスと、呼び出し元のタスク２９により引数“size”で指定されたメモリ領域をUM_EXTERNAL状態のメモリ領域として認識することができる。
【００７３】
なお、呼び出し元のタスク２９は、Ｓ２２５により返されたアドレスおよび指定された引数“size”を同一のプロセスに属する他のタスク２９および他のプロセスに属するタスク２９に通知することによって、全てのタスク２９が当該メモリ領域をUM_EXTERNAL状態として認識できるようにしてもよい。また、プロセス間ではＡＴＵ２３のマッピングの設定が異なるため、プロセス間を跨いでアドレスを授受する際に当該アドレスを変換する必要があるが、どのような方法で当該変換を行うようにしてもよい。
【００７４】
図２８は、free_um_external_memory関数の動作を説明するフローチャートである。タスク２９がfree_um_external_memory関数を呼び出すと、free_um_external_memory関数は、メモリアロケータ２７を用いて、指定されたメモリ領域を解放し（Ｓ２３１）、動作が終了となる。
【００７５】
図２９は、open_um_private_memory関数の動作を説明するフローチャートである。タスク２９がopen_um_private_memory関数を呼び出すと、open_um_private_memory関数は、指定されたメモリ領域の先頭アドレスをタスク２９に返し（Ｓ２４１）、動作が終了となる。呼び出し元のタスク２９は、Ｓ２４１により返されたアドレスと、引数“size”で指定されたメモリ領域をUM_PRIVATE状態のメモリ領域として認識することができる。
【００７６】
図３０は、close_um_private_memory関数の動作を説明するフローチャートである。タスク２９がclose_um_private_memory関数を呼び出すと、close_um_private_memory関数は、キャッシュ／メモリ管理部２８を用いて、指定されたメモリ領域が載っているＬ１Ｃ２２のキャッシュラインを無効化して内容をＬ２Ｃ２４にライトバックするとともに当該キャッシュラインを無効化する（Ｓ２５１）。そして、close_um_private_memory関数は、指定されたメモリ領域の先頭アドレスを返し（Ｓ２５２）、動作が終了となる。呼び出し元のタスク２９と同じプロセスに属するタスク２９は、Ｓ２５２により返されたアドレスと、引数“size”で指定されたメモリ領域をUM_PUBLIC状態のメモリ領域として認識することができる。
【００７７】
図３１は、open_um_protected_memory関数の動作を説明するフローチャートである。タスク２９がopen_um_protected_memory関数を呼び出すと、open_um_protected_memory関数は、指定されたメモリ領域の先頭アドレスを返し（Ｓ２６１）、動作が終了となる。呼び出し元のタスク２９と同じプロセスに属するタスク２９は、Ｓ２６１により返されたアドレスと、引数“size”で指定されたメモリ領域をUM_PUBLIC状態のメモリ領域として認識することができる。
【００７８】
図３２は、close_um_protected_memory関数の動作を説明するフローチャートである。タスク２９がclose_um_protected_memory関数を呼び出すと、close_um_protected_memory関数は、キャッシュ／メモリ管理部２８を用いて、指定されたメモリ領域が載っているＬ１Ｃ２２のキャッシュラインを無効化する（Ｓ２７１）。そして、close_um_protected_memory関数は、指定されたメモリ領域の先頭アドレスを返し（Ｓ２７２）、動作が終了となる。呼び出し元のタスク２９と同じプロセスに属するタスク２９は、Ｓ２７２により返されたアドレスと、引数“size”で指定されたメモリ領域をUM_PUBLIC状態のメモリ領域として認識することができる。
【００７９】
図３３は、open_um_public_memory関数の動作を説明するフローチャートである。タスク２９がopen_um_public_memory関数を呼び出すと、open_um_public_memory関数は、指定されたメモリ領域の先頭アドレスを返し（Ｓ２８１）、動作が終了となる。呼び出し元のタスク２９と同じプロセスに属するタスク２９は、Ｓ２８１により返されたアドレスと、引数“size”で指定されたメモリ領域をUM_PUBLIC状態のメモリ領域として認識することができる。
【００８０】
図３４は、close_um_public_memory関数の動作を説明するフローチャートである。タスク２９がclose_um_public_memory関数を呼び出すと、close_um_public_memory関数は、キャッシュ／メモリ管理部２８を用いて、指定されたメモリ領域の内容が載っているＬ２Ｃ２４のキャッシュラインのメモリ領域へのライトバックと無効化とを実行する（Ｓ２９１）。そして、close_um_public_memory関数は、指定されたメモリ領域の先頭アドレスを返し（Ｓ２９２）、動作が終了となる。全てのタスク２９は、Ｓ２９２により返されたアドレスと、呼び出し元のタスク２９により引数“size”で指定されたメモリ領域をUM_EXTERNAL状態のメモリ領域として認識することができる。
【００８１】
図３５は、enter_um_memory_access_protocol関数の動作を説明するフローチャートである。カーネル３２がenter_um_memory_access_protocol関数を呼び出すと、enter_um_memory_access_protocol関数は、メモリアロケータ２７を用いて、指定されたUNMANAGED状態のメモリ領域をカーネル管理領域３１に加える（Ｓ３０１）。そして、enter_um_memory_access_protocol関数は、当該カーネル管理領域３１に加えられたメモリ領域の先頭アドレスをカーネル３２に返し（Ｓ３０２）、動作が終了となる。カーネル３２は、当該カーネル管理領域３１に加えられたメモリ領域を未割り当て状態（すなわちUM_INVALID状態）のメモリ領域として認識する。
【００８２】
図３６は、leave_um_memory_access_protocol関数の動作を説明するフローチャートである。カーネル３２がleave_um_memory_access_protocol関数を呼び出すと、leave_um_memory_access_protocol関数は、メモリアロケータ２７を用いて、指定されたUM_INVALID状態のメモリ領域をカーネル管理領域３１から除外する（Ｓ３１１）。そして、leave_um_memory_access_protocol関数は、当該カーネル管理領域３１から除外したメモリ領域の先頭アドレスをカーネル３２に返し（Ｓ３１２）、動作が終了となる。当該カーネル管理領域３１から除外されたメモリ領域はUNMANAGED状態、すなわちカーネル３２が管理しない状態となる。
【００８３】
次に、以上のように動作する状態遷移関数２６を用いてメモリ領域の状態遷移を行う例を説明する。図３７は、プロセス内でメモリ領域を共有する場合の状態遷移の例を説明するフローチャートである。
【００８４】
初めに、メモリ領域の状態はUNMANAGED状態となっている（Ｓ３２１）。そして、カーネル３２からenter_um_memory_access_protocol関数が呼ばれることにより、当該メモリ領域はUNMANAGED状態からUM_INVALID状態に遷移する（Ｓ３２２）。次に、あるプロセス内の一つのタスク２９から、そのプロセス内のタスク２９でデータを共有するためにallocate_um_public_memory関数を呼ぶことにより、当該メモリ領域はUM_INVALID状態からUM_PUBLIC状態に遷移する（Ｓ３２３）。次に、そのプロセスに属する1つのタスク２９は、open_um_private_memory関数を呼ぶことにより、当該メモリ領域がUM_PRIVATE状態に遷移し、open_um_private_memory関数を呼び出したタスク２９によってＬ１Ｃ／Ｌ２Ｃでread／writeアクセスされる（Ｓ３２４）。この間、他のタスク２９からのアクセスは許可されないため、アクセスは適切に行われる。
【００８５】
アクセスが終了すると、当該メモリ領域は、open_um_private_memory関数を呼び出したタスク２９によるclose_um_private_memory関数の呼び出しによりUM_PUBLIC状態に戻される（Ｓ３２５）。この時、Ｌ１Ｃ２２の当該メモリ領域に対応するキャッシュラインは適切にＬ２Ｃ２４に書き戻されたのち無効化される。UM_PUBLIC状態のメモリに対しては、そのままの状態でのアクセスが禁止される。その後、そのプロセス内の別のタスク２９がopen_um_protected_memory関数を呼び出すことによって、当該メモリ領域は、UM_PROTECTED状態に遷移し、open_um_protected_memory関数を呼び出したタスク２９により、Ｌ１Ｃ／Ｌ２Ｃのreadアクセスが行われる（Ｓ３２６）。アクセスが終了すると、open_um_protected_memory関数を呼び出したタスク２９によるclose_um_protected_memory関数の呼び出しにより、当該メモリ領域はUM_PUBLIC状態に戻される（Ｓ３２７）。この時、Ｌ１Ｃ２２の当該メモリ領域に対応するキャッシュラインは適切に無効化される。
【００８６】
そして、同一のプロセス内のタスク２９がfree_um_public_memory関数を呼び出すことによってメモリ開放が行われ、当該メモリ領域はUM_INVALID状態に遷移する（Ｓ３２８）。そして、カーネル３２がleave_memory_access_protocol関数を呼び出して、当該メモリ領域がUNMANAGED状態となり（Ｓ３２９）、一連の動作が終了となる。
【００８７】
図３８は、プロセス間でメモリ領域を共有する場合の状態遷移の例を説明するフローチャートである。初めに、メモリ領域の状態は、UNMANAGED状態となっている（Ｓ３３１）。そして、カーネル３２からenter_um_memory_access_protocol関数が呼ばれることにより、当該メモリ領域はUNMANAGED状態からUM_INVALID状態に遷移する（Ｓ３３２）。次に、あるタスク２９からプロセス間でデータを共有するためにallocate_um_external_memory関数が呼び出され、当該メモリ領域は、Ｌ２Ｃ２４の対応するキャッシュラインが無効化された後、UM_INVALID状態からUM_EXTERNAL状態に遷移する（Ｓ３３３）。この状態ではどのプロセスのどのタスクもアクセスが禁止される。
【００８８】
その後、あるプロセスの１つのタスク２９が、そのプロセス内の共有目的に占有して使うために、open_um_public_memory関数を呼び出すと、当該メモリ領域はUM_PUBLIC状態に遷移する（Ｓ３３４）。この状態でも依然として、そのプロセス内のすべてのタスクからのアクセスは禁止である。その後、そのプロセス内の一つのタスク２９が当該メモリ領域を占有して使うためにopen_um_private_memory関数を呼び出すと、当該メモリ領域はUM_PRIVATE状態に遷移する（Ｓ３３５）。この状態ではopen_um_private_memory関数の呼び出し元のタスクだけがＬ１Ｃ／Ｌ２Ｃ仮想アドレスによるread／writeアクセスを許可される。アクセス終了後、open_um_private_memory関数の呼び出し元のタスク２９がclose_um_private_memory関数を呼ぶと、当該メモリ領域はUM_PUBLIC状態に戻される（Ｓ３３６）。この時、そのメモリ領域に対応するＬ１Ｃ２２のキャッシュラインが適切にＬ２Ｃ２４に書き戻されたのち、無効化される。
【００８９】
その後、そのプロセス内のタスク２９がopen_um_protected_memory関数を呼び出すことによって、当該メモリ領域はUM_PROTECTED状態に遷移し、open_um_protected_memory関数の呼び出し元のタスク２９によるＬ１Ｃ／Ｌ２Ｃのreadアクセスが行われる（Ｓ３３７）。アクセスが終了すると、open_um_protected_memory関数の呼び出し元のタスク２９による、close_um_protected_memory関数の呼び出しにより、当該メモリ領域はUM_PUBLIC状態に戻される（Ｓ３３８）。この時、そのメモリ領域に対応するＬ１Ｃ２２のキャッシュラインが適切に無効化される。
【００９０】
その後、プロセスによる占有使用が終了すると、そのプロセスの１つのタスク２９がclose_um_public_memory関数を呼び出すことによって、当該メモリ領域はUM_EXTERNAL状態に戻される（Ｓ３３９）。この時、そのメモリ領域に対応するＬ２Ｃ２４のキャッシュラインが適切にメモリ３に書き戻されたのち、無効化される。
【００９１】
次に、別のプロセスがそのメモリ領域のアクセスを行うために、そのプロセスの中のいずれかのタスク２９がopen_um_public_memory関数を呼び出して、当該メモリ領域をUM_PUBLIC状態に遷移させる（Ｓ３４０）。ただし、UM_EXTERNAL状態のメモリを指すアドレスは、プロセス毎に異なるので、その対応は別途管理する必要がある。その後そのプロセス内のタスク２９が当該メモリ領域を適宜UM_PRIVATE状態、UM_PROTECTED状態に遷移させて必要なアクセスを行い（Ｓ３４１）、アクセスが終了したら、UM_PUBLIC状態に戻す（Ｓ３４２）。プロセスでのアクセスが終了したら、当該プロセスのうちの１つのタスク２９はclose_um_public_memory関数を呼び出して、当該メモリ領域をUM_EXTENAL状態に戻す（Ｓ３４３）。そして、いずれかのタスク２９からfree_external_memory関数が呼び出されると、メモリ解放が行われ、当該メモリ領域はUM_INVALID状態に遷移する（Ｓ３４４）。そしてカーネル３２からleave_memory_access_protocol関数が呼び出されると、当該メモリ領域はUNMANAGED状態となり（Ｓ３４５）、動作が終了となる。
【００９２】
このように、第２の実施形態によれば、メモリ領域は、Ｌ１Ｃ／Ｌ２Ｃのアクセスによるread／writeが許可され、１つのタスク２９に独占的な使用権が与えられているUM_PROVATE状態と、read／writeが禁止され、１つのプロセスに独占的な使用権が与えられているUM_PUBLIC状態と、read／writeが禁止され、全てのタスク２９（すなわち全てのプロセス）に使用権が与えられているUM_EXTERNAL状態と、を容認する。そして、UM_PRIVATE状態とUM_PUBLIC状態との間、およびUM_PUBLIC状態とUM_EXTERNAL状態との間の遷移を行うカーネル部を備え、カーネル部は、UM_PRIVATE状態からUM_PUBLIC状態に遷移させるとき、対応するＬ１Ｃ２２をＬ２Ｃ２４にライトバックし、UM_PUBLIC状態からUM_EXTERNAL状態に遷移させるとき、対応するＬ２Ｃ２４を前記メモリ領域にライトバックする、ように構成した。夫々１次キャッシュを備える複数のコアが２次キャッシュを共有してクラスタを形成するマルチコアプロセッサを備えるマルチコアプロセッサシステムにおいて、シャドー領域を持たないメモリ３においても、１次キャッシュ、２次キャッシュ、およびメモリ３の記憶内容の一貫性を保ったまま、タスク２９間、プロセス間、およびクラスタ間でメモリ３の当該メモリ領域を共有できるようになる。
【００９３】
また、カーネル部は、UM_PRIVATE状態、UM_PUBLIC状態またはUM_EXTERNAL状態と、何れのコア２１にも割り当てられていないUM_INVALID状態との間で遷移を行うようにしたので、特定のタスク２９、特定のプロセス、または全プロセスに対するメモリ領域の割り当てを行うことができる。
【００９４】
また、カーネル部は、UM_PUBLIC状態と、Ｌ１Ｃ／Ｌ２Ｃのread  onlyアクセスが許可され、同一のプロセスに属する要求した１以上のタスク２９に使用権が与えられているUM_PROTECTED状態との間で遷移を行うようにしたので、単一タスクからのメモリ読み出しを高速化することができる。
【００９５】
なお、第２の実施形態は、状態遷移関数２６に第１の実施形態において説明した（１）〜（１４）の項目の関数を加えることによって、シャドー領域を備えるメモリ領域とシャドー領域を有さないメモリ領域との両方を備えるメモリ３を有するマルチコアプロセッサシステムにも適用することができるようになる。
【００９６】
また、第２の実施形態は、夫々複数のコア２１を備える複数のクラスタ２５を有するマルチコアプロセッサ２だけでなく、複数のコア２１を備えるクラスタ２５を１つのみ備えるマルチコアプロセッサにも適用することができる。
【００９７】
（第３の実施形態）
第２の実施形態で説明したメモリアクセスプロトコルにおいては、プロセス間共有のために利用するメモリについて、UM_EXTERNAL状態のままではどのプロセス内のタスクからもアクセスが禁止される。アクセスするためには、いずれかのプロセス内のタスクがUM_PUBLIC状態を経て、UM_PRIVATE状態もしくはUM_PROTECTED状態に遷移させる必要がある。その間、その他のプロセス内のタスクは一切アクセスが許されない。これは、プロセス間で共通に参照したいread  onlyのデータがある場合に、複数のプロセスから同時にアクセスすることが許されないという厳しい制約となる。第３の実施形態は、この制約を緩和するために、第２の実施形態のＭＡＰに更に状態を追加している。
【００９８】
なお、第３の実施形態のマルチコアプロセッサシステムの構成は、状態遷移関数２６に含まれる関数の内容を除いて第２の実施形態と等しいので、状態遷移関数２６に含まれる関数を除く構成についての重複する説明を省略する。
【００９９】
図３９は、第３の実施形態のＭＡＰを説明する図である。第３の実施形態のＭＡＰは、（ｇ）〜（ｌ）において説明した第２の実施形態のＭＡＰに、次に説明するUM_FROZEN_EXTERNAL状態が追加されたものとなっている。
（ｍ）UM_FROZEN_EXTERNAL状態
この状態は、UM_EXTERNAL状態から遷移でき、あるプロセス内のタスクでread  onlyアクセスが可能である。あるプロセスがUM_FROZEN_EXTERNAL状態にしたメモリ領域を対象に、別のプロセスが重ねてUM_FROZEN_EXTERNAL状態に遷移させる事も許される。複数のプロセスがこの状態にしたメモリ領域は、それらすべてのプロセスがUM_EXTERNAL状態に戻す動作を行うまで、UM_FROZEN_EXTERNAL状態に留まる。
【０１００】
第３の実施形態の状態遷移関数２６は、（１５）〜（２８）において説明した関数に加えて、さらに次の２つの関数を含んでいる。
（２９）freeze_um_external_memory(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_EXTERNAL状態またはUM_FROZEN_EXTERNAL状態のメモリ領域を呼び出し元のタスク２９および当該タスク２９と同一のプロセスに属するタスク２９がUM_FROZEN_EXTERNAL状態のメモリ領域として使用できるようにする関数である。
（３０）melt_um_frozen_external_memory(void  *addr,  size_t  size)
これは先頭アドレス“addr”、引数“size”で指定されるUM_FROZEN_EXTERNAL状態として使用していたメモリ領域をUM_FROZEN_EXTERNAL状態からUM_EXTERNAL状態に戻す関数である。UM_FROZEN_EXTERNAL状態のメモリ領域を使用していたプロセスが複数存在する場合には、当該複数のプロセスの全てからこの関数が呼び出されたとき、対象のメモリ領域がUM_FROZEN_EXTERNAL状態からUM_EXTERNAL状態に遷移する。
【０１０１】
なお、第３の実施形態は、UM_FROZEN_EXTERNAL状態となっているメモリ領域および当該メモリ領域をUM_FROZEN_EXTERNAL状態のメモリ領域として使用中のプロセスの数をタスク２９およびカーネル３２から認識できるようになっているものとする。一例を挙げると、UM_FROZEN_EXTERNAL状態となっているメモリ領域を特定する情報（例えば先頭の物理アドレスおよびサイズ）と当該メモリ領域をUM_FROZEN_EXTERNAL状態のメモリ領域として使用中のプロセスの識別子の一覧とを対応づけたテーブルがメモリ３内に用意され、当該テーブルはタスク２９およびカーネル３２から参照される。
【０１０２】
次に、第３の実施形態の状態遷移関数２６に含まれる各関数の動作を説明する。（１５）〜（２８）において説明した関数の動作は第２の実施形態と同じであるので説明を省略し、freeze_um_external_memory関数およびmelt_um_frozen_external_memory関数の動作のみを説明する。
【０１０３】
図４０は、freeze_um_external_memory関数の動作を説明するフローチャートである。タスク２９がfreeze_um_external_memory関数を呼び出すと、freeze_um_external_memory関数は、指定されたメモリ領域の先頭アドレスを返し（Ｓ３５１）、動作が終了となる。freeze_um_external_memory関数の呼び出し元のタスク２９および当該タスク２９と同一のプロセスに属するタスク２９は、Ｓ３５１により返されたアドレスと、引数“size”で指定されたメモリ領域をUM_FROZEN_EXTERNAL状態のメモリ領域として使用することができる。
【０１０４】
図４１は、melt_um_frozen_external_memory関数の動作を説明するフローチャートである。タスク２９がmelt_um_frozen_external_memory関数を呼び出すと、melt_um_frozen_external_memory関数は、キャッシュ／メモリ管理部２８を用いて、指定されたメモリ領域の内容が載っているＬ１Ｃ２２のキャッシュラインを無効化する（Ｓ３６１）。そして、melt_um_frozen_external_memory関数は、指定されたメモリ領域を同一クラスタ２５内の他のプロセスが使用しているか否かを判定する（Ｓ３６２）。同一クラスタ２５内に当該メモリ領域を使用しているプロセスが存在しない場合（Ｓ３６２、Ｎｏ）、melt_um_frozen_external_memory関数は、キャッシュ／メモリ管理部２８を用いて、当該指定されたメモリ領域の内容が載っているＬ２Ｃ２４のキャッシュラインを無効化し（Ｓ３６３）、当該指定されたメモリ領域の先頭アドレスを返し（Ｓ３６４）、動作が終了となる。同一クラスタ２５内に当該メモリ領域を使用しているプロセスが存在する場合（Ｓ３６２、Ｙｅｓ）、Ｓ３６３の動作がスキップされる。全てのタスク２９は、Ｓ３６３により返されたアドレスと、引数“size”で指定されたメモリ領域をUM_FROZEN_EXTERNAL状態のメモリ領域として使用しているプロセスが残っていない場合、当該メモリ領域をUM_EXTERNAL状態として認識することができる。
【０１０５】
次に、以上のように動作する状態遷移関数２６を用いてメモリ領域の状態遷移を行う例を説明する。図４２は、複数のプロセスからread  onlyアクセスをするための状態遷移の例を説明するフローチャートである。
【０１０６】
図４２のＳ３７１〜Ｓ３７３は、図３８のＳ３３１〜Ｓ３３３と同じ処理が実行される。そして、UM_EXTERNAL状態となったメモリ領域を指定して、あるプロセス（プロセスＡ）に属するタスク２９がfreeze_um_external_memory関数を呼ぶと、当該指定されたメモリ領域はUM_FROZEN_EXTERNAL状態となり、プロセスＡに属するすべてのタスク２９が当該メモリ領域にread  onlyでアクセスすることが許可される（Ｓ３７４）。次いで、プロセスＡとは異なるプロセスＢに属するタスク２９が、当該メモリ領域を指定してfreeze_um_external_memory関数を呼ぶと、プロセスＡに加えて、プロセスＢに属するすべてのタスク２９が当該メモリ領域にread  onlyでアクセスすることが許可される（Ｓ３７５）。このメモリ領域を指定する際の仮想アドレスは、プロセス毎に異なる。したがって、プロセス毎の仮想アドレスの対応付けは別途管理が必要である。
【０１０７】
続いて、プロセスＡともプロセスＢとも異なるプロセスＣに属するタスク２９が、当該メモリ領域を指定してfreeze_um_external_memory関数を呼ぶと、プロセスＡおよびプロセスＢに加えて、プロセスＣに属するすべてのタスク２９も当該メモリ領域にread  onlyでアクセスすることが許可される（Ｓ３７６）。
【０１０８】
その後、プロセスＢがアクセスを終了してプロセスＢに属するタスク２９がmelt_um_frozen_external_memory関数を呼ぶと、プロセスＢに属する全てのタスク２９は当該メモリ領域へのアクセスが禁止される（Ｓ３７７）。このとき、プロセスＢに属するコア２１のＬ１Ｃ２２から対応するキャッシュラインが無効化される。また、プロセスＡおよびプロセスＣが共にプロセスＢと異なるクラスタ２５に属する場合は、Ｌ２Ｃ２４も無効化される。この時点ではプロセスＢの他に当該メモリ領域をUM_FROZEN_EXTERNAL状態として使用しているプロセスがあるので、Ｓ３７７の処理の後も当該メモリ領域の状態は依然としてUM_FROZEN_EXTERNAL状態として認識される。
【０１０９】
続いて、プロセスＡがアクセスを終了してプロセスＡに属するタスク２９がmelt_um_frozen_external_memory関数を呼ぶと、プロセスＡに属する全てのタスク２９は当該メモリ領域へのアクセスが禁止される（Ｓ３７８）。このとき、プロセスＡに属するコア２１のＬ１Ｃ２２から対応するキャッシュラインが無効化される。また、プロセスＣがプロセスＢと異なるクラスタ２５に属する場合は、Ｌ２Ｃ２４も無効化される。この時点ではプロセスＡの他に当該メモリ領域をUM_FROZEN_EXTERNAL状態として使用しているプロセスがあるので、Ｓ３７８の処理の後も当該メモリ領域の状態は依然としてUM_FROZEN_EXTERNAL状態として認識される。
【０１１０】
続いて、プロセスＣがアクセスを終了してプロセスＣに属するタスク２９がmelt_um_frozen_external_memory関数を呼ぶと、プロセスＣに属する全てのタスク２９は当該メモリ領域へのアクセスが禁止され、他に当該メモリ領域をUM_FROZEN_EXTERNAL状態として使用しているプロセスが無いので、当該メモリ領域はUM_EXTERNAL状態に遷移する（Ｓ３７９）。この際、プロセスＣに属するコア２１のＬ１Ｃ２２およびプロセスＣが属するクラスタ２５のＬ２Ｃ２４から対応するキャッシュラインが無効化される。
【０１１１】
その後、Ｓ３４４およびＳ３４５と同じ処理がＳ３８０およびＳ３８１において実行され、一連の動作が終了となる。
【０１１２】
このように、第３の実施形態によれば、要求した１つ以上のプロセスにＬ１Ｃ／Ｌ２Ｃのread  onlyアクセスが許可されるUM_FROZEN_EXTERNAL状態をＭＡＰに加えるようにしたので、シャドー領域を有さないメモリ領域においても、複数のプロセスが同時にキャッシュを利用したreadを行うことができる。したがって、プロセス間でのデータの授受が簡単になる。また、同時に、単一のプロセス内のデータの授受も簡単になる。
【０１１３】
（第４の実施形態）
第３の実施形態によれば、第２の実施形態のＭＡＰにUM_FROZEN_EXTERNAL状態を加えたるようにしたが、第４の実施形態によれば、第１の実施形態のＭＡＰに同様の状態が追加されて構成されるＭＡＰを備えている。
【０１１４】
第４の実施形態のマルチコアプロセッサシステムの構成は、状態遷移関数２６に含まれる関数の内容を除いて第１の実施形態と等しいので、状態遷移関数２６に含まれる関数を除く構成についての重複する説明を省略する。
【０１１５】
図４３は、第４の実施形態のＭＡＰを説明する図である。第４の実施形態のＭＡＰは、（ａ）〜（ｆ）において説明した第１の実施形態のＭＡＰに以下に示す状態が追加されたものとなっている。
（ｎ）FROZEN_EXTERNAL状態
この状態は、EXTERNAL状態から遷移でき、あるプロセス内のタスクでＬ１Ｃ／Ｌ２Ｃによるread  onlyアクセスが可能である。あるプロセスがFROZEN_EXTERNAL状態にしたメモリ領域を対象に、別のプロセスが重ねてFROZEN_EXTERNAL状態に遷移させる事も許される。複数のプロセスがこの状態にしたメモリ領域は、それらすべてのプロセスがEXTERNAL状態に戻す動作を行うまで、FROZEN_EXTERNAL状態に留まる。
【０１１６】
第４の実施形態の状態遷移関数２６は、（１）〜（１４）において説明した関数に加えて、さらに次の２つの関数を含んでいる。
（３１）freeze_external_memory(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるEXTERNAL状態またはFROZEN_EXTERNAL状態のメモリ領域を呼び出し元のタスク２９および当該タスク２９と同一のプロセスに属する他のタスク２９がFROZEN_EXTERNAL状態のメモリ領域として使用できるようにする関数である。
（３２）melt_frozen_external_memory(void  *addr,  size_t  size)
これは先頭アドレス“addr”、引数“size”で指定されるFROZEN_EXTERNAL状態として使用していたメモリ領域をFROZEN_EXTERNAL状態からEXTERNAL状態に戻す関数である。FROZEN_EXTERNAL状態のメモリ領域を使用していたプロセスが複数存在する場合には、当該複数のプロセスの全てからこの関数が呼び出されたときに、対象のメモリ領域がFROZEN_EXTERNAL状態からEXTERNAL状態に遷移する。
【０１１７】
なお、第４の実施形態においても、第３の実施形態と同様に、タスク２９およびカーネル３２は、FROZEN_EXTERNAL状態となっているメモリ領域および当該メモリ領域をFROZEN_EXTERNAL状態のメモリ領域として使用中のプロセスの数を認識できるようになっているものとする。
【０１１８】
次に、第４の実施形態の状態遷移関数２６に含まれる各関数の動作を説明する。ここでは、freeze_external_memory関数およびmelt_frozen_external_memory関数の動作をのみ説明する。
【０１１９】
図４４は、freeze_external_memory関数の動作を説明するフローチャートである。タスク２９がfreeze_external_memory関数を呼び出すと、freeze__external_memory関数は、指定されたＬ１ＵＣ／Ｌ２ＵＣ仮想アドレスを対応するＬ１Ｃ／Ｌ２Ｃ仮想アドレスに変換する（Ｓ３９１）。そして、freeze__external_memory関数は、変換後のアドレスを返し（Ｓ３９２）、動作が終了となる。freeze_external_memory関数の呼び出し元のタスク２９および当該タスク２９と同一のプロセスに属する他のタスク２９は、Ｓ３９２により返されたアドレスと、引数“size”で指定されたメモリ領域をFROZEN_EXTERNAL状態のメモリ領域として使用することができる。
【０１２０】
図４５は、melt_frozen_external_memory関数の動作を説明するフローチャートである。タスク２９がmelt_frozen_external_memory関数を呼び出すと、melt_frozen_external_memory関数は、キャッシュ／メモリ管理部２８を用いて、指定されたメモリ領域の内容が載っているＬ２Ｃ２４のキャッシュラインを無効化する（Ｓ４０１）。そして、melt_frozen_external_memory関数は、指定されたメモリ領域を同一クラスタ２５内の他のプロセスが使用しているか否かを判定する（Ｓ４０２）。同一クラスタ２５内に当該メモリ領域を使用しているプロセスが存在しない場合（Ｓ４０２、Ｎｏ）、melt_frozen_external_memory関数は、キャッシュ／メモリ管理部２８を用いて、当該指定されたメモリ領域の内容が載っているＬ２Ｃ２４のキャッシュラインを無効化する（Ｓ４０３）。そして、melt_frozen_external_memory関数は、当該指定されたメモリ領域の先頭アドレス（Ｌ１Ｃ／Ｌ２Ｃ仮想アドレス）を対応するＬ１ＵＣ／Ｌ２ＵＣ仮想アドレスに変換し（Ｓ４０４）、変換後のアドレスを返し（Ｓ４０５）、動作が終了となる。同一クラスタ２５内に当該メモリ領域を使用しているプロセスが存在する場合（Ｓ４０２、Ｙｅｓ）、Ｓ４０３の動作がスキップされる。全てのタスク２９は、Ｓ４０５により返されたアドレスと、引数“size”で指定されたメモリ領域をFROZEN_EXTERNAL状態のメモリ領域として使用しているプロセスが残っていない場合、当該メモリ領域をEXTERNAL状態として認識することができる。
【０１２１】
次に、以上のように動作する状態遷移関数２６を用いてメモリ領域の状態遷移を行う例を説明する。図４６は、複数のプロセスからread  onlyアクセスをするための状態遷移の例を説明するフローチャートである。
【０１２２】
初めに、メモリ領域の状態は、UNMANAGED状態となっている（Ｓ４１１）。そして、カーネル３２からenter_memory_access_protocol関数が呼ばれることにより、当該メモリ領域はUNMANAGED状態からINVALID状態に遷移する（Ｓ４１２）。次に、あるタスク２９からプロセス間でデータを共有するためにallocate_external_memory関数が呼び出され、結果として当該メモリ領域は、Ｌ２Ｃ２４の対応するキャッシュラインが無効化された後、INVALID状態からEXTERNAL状態に遷移する（Ｓ４１３）。この状態ではどのプロセスのどのタスクもＬ１ＵＣ／Ｌ２ＵＣのアクセスが許可される。
【０１２３】
そして、EXTERNAL状態となったメモリ領域を指定して、あるプロセス（プロセスＡ）に属するタスク２９がfreeze_external_memory関数を呼ぶと、当該指定されたメモリ領域はFROZEN_EXTERNAL状態となり、プロセスＡに属するすべてのタスク２９が当該メモリ領域にＬ１Ｃ／Ｌ２Ｃでread  onlyアクセスを行うことが許可される（Ｓ４１４）。プロセスＡ以外のプロセスに属するタスク２９は、Ｌ１ＵＣ／Ｌ２ＵＣのread  onlyアクセスが許可される。
【０１２４】
次いで、プロセスＡとは異なるプロセスＢに属するタスク２９が、当該メモリ領域を指定してfreeze_external_memory関数を呼ぶと、プロセスＡに加えて、プロセスＢに属するすべてのタスク２９が当該メモリ領域にＬ１Ｃ／Ｌ２Ｃでread  onlyアクセスを行うことが許可される（Ｓ４１５）。このメモリ領域を指定する際の仮想アドレスは、プロセス毎に異なる。したがって、プロセス毎の仮想アドレスの対応付けは別途管理が必要である。
【０１２５】
続いて、プロセスＡともプロセスＢとも異なるプロセスＣに属するタスク２９が、当該メモリ領域を指定してfreeze_external_memory関数を呼ぶと、プロセスＡおよびプロセスＢに加えて、プロセスＣに属するすべてのタスク２９も当該メモリ領域にＬ１Ｃ／Ｌ２Ｃでread  onlyアクセスを行うことが許可される（Ｓ４１６）。
【０１２６】
その後、プロセスＢがアクセスを終了してプロセスＢに属するタスク２９がmelt_frozen_external_memory関数を呼ぶと、プロセスＢに属する全てのタスク２９は当該メモリ領域へのＬ１Ｃ／Ｌ２Ｃでのアクセスが禁止され、Ｌ１ＵＣ／Ｌ２ＵＣのread  onlyアクセスが許可される（Ｓ４１７）。このとき、プロセスＢに属するコア２１のＬ１Ｃ２２から対応するキャッシュラインが無効化される。また、プロセスＡおよびプロセスＣが共にプロセスＢと異なるクラスタ２５に属する場合は、Ｌ２Ｃ２４も無効化される。この時点ではプロセスＢの他に当該メモリ領域をFROZEN_EXTERNAL状態として使用しているプロセスがあるので、Ｓ４１７の処理の後も当該メモリ領域の状態は依然としてFROZEN_EXTERNAL状態として認識される。
【０１２７】
続いて、プロセスＡがアクセスを終了してプロセスＡに属するタスク２９がmelt_frozen_external_memory関数を呼ぶと、プロセスＡに属する全てのタスク２９は当該メモリ領域へのＬ１Ｃ／Ｌ２Ｃでのアクセスが禁止され、Ｌ１ＵＣ／Ｌ２ＵＣのread  onlyアクセスが許可される（Ｓ４１８）。このとき、プロセスＡに属するコア２１のＬ１Ｃ２２から対応するキャッシュラインが無効化される。また、プロセスＣがプロセスＢと異なるクラスタ２５に属する場合は、Ｌ２Ｃ２４も無効化される。この時点ではプロセスＡの他に当該メモリ領域をFROZEN_EXTERNAL状態として使用しているプロセスがあるので、Ｓ４１８の処理の後も当該メモリ領域の状態は依然としてFROZEN_EXTERNAL状態として認識される。
【０１２８】
続いて、プロセスＣがアクセスを終了してプロセスＣに属するタスク２９がmelt_frozen_external_memory関数を呼ぶと、プロセスＣに属する全てのタスク２９は当該メモリ領域へのＬ１Ｃ／Ｌ２Ｃでのアクセスが禁止され、他に当該メモリ領域をUM_FROZEN_EXTERNAL状態として使用しているプロセスが無いので、当該メモリ領域はEXTERNAL状態に遷移する（Ｓ４１９）。すなわち、全てのタスク２９は、当該メモリ領域へのＬ１ＵＣ／Ｌ２ＵＣのread／writeアクセスが許可される。この際、プロセスＣに属するコア２１のＬ１Ｃ２２およびプロセスＣが属するクラスタ２５のＬ２Ｃ２４から対応するキャッシュラインが無効化される。
【０１２９】
その後、図２１のＳ１７２およびＳ１７３と同じ処理がＳ４２０およびＳ４２１において実行され、一連の動作が終了となる。
【０１３０】
このように、第４の実施形態によれば、ＭＡＰに、要求した１つ以上のプロセスにＬ１Ｃ／Ｌ２Ｃのread  onlyアクセスが許可されるFROZEN_EXTERNAL状態を加えるようにしたので、複数のプロセスが同時にＬ１ＣおよびＬ２Ｃを利用したreadを行うことができる。したがって、プロセス間でのデータの授受を高速に行うことができるようになる。また、同時に、単一のプロセス内のデータの授受も高速に行うことができる。
【０１３１】
（第５の実施形態）
第５の実施形態によれば、第１の実施形態のＭＡＰに、PUBLIC状態から遷移可能で、同一のプロセスに属するタスクが読み出しアクセスできるFROZEN_PUBLIC状態が追加されて構成されるＭＡＰを備えている。
【０１３２】
第５の実施形態のマルチコアプロセッサシステムの構成は、状態遷移関数２６に含まれる関数の内容を除いて第１の実施形態と等しいので、状態遷移関数２６に含まれる関数を除く構成についての重複する説明を省略する。
【０１３３】
図４７は、第５の実施形態のＭＡＰを説明する図である。第５の実施形態のＭＡＰは、（ａ）〜（ｆ）において説明した第１の実施形態のＭＡＰに次に説明するFROZEN_PUBLIC状態が追加されたものとなっている。
（ｏ）FROZEN_PUBLIC状態
この状態は、PUBLIC状態から遷移でき、同一プロセス内の全てのタスク２９でＬ１Ｃ／Ｌ２Ｃによるread  onlyアクセスが可能である。
【０１３４】
第５の実施形態の状態遷移関数２６は、（１）〜（１４）において説明した関数に加えて、さらに次の２つの関数を含んでいる。
（３３）freeze_public_memory(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるPUBLIC状態のメモリ領域をPUBLIC状態からFROZEN_PUBLIC状態に遷移させる関数である。PUBLIC状態でアクセスが許可されたプロセスに属するタスク２９のみがこの関数を呼び出すことができる。
（３４）melt_frozen_public_memory(void  *addr,  size_t  size)
これは先頭アドレス“addr”、引数“size”で指定されるFROZEN_PUBLIC状態のメモリ領域をFROZEN_PUBLIC状態からPUBLIC状態に遷移させる関数である。
【０１３５】
次に、第５の実施形態の状態遷移関数２６に含まれる各関数の動作を説明する。ここでは、freeze_public_memory関数およびmelt_frozen_public_memory関数の動作のみを説明する。
【０１３６】
図４８は、freeze_public_memory関数の動作を説明するフローチャートである。PUBLIC状態のメモリ領域を指定して、当該PUBLIC状態のメモリ領域にＬ１ＵＣ／Ｌ２Ｃのread／writeアクセスが許可されたプロセスに属するタスク２９が、freeze_public_memory関数を呼び出すと、freeze_public_memory関数は、指定されたメモリ領域の先頭アドレス（Ｌ１ＵＣ／Ｌ２Ｃ仮想アドレス）を対応するＬ１Ｃ／Ｌ２Ｃ仮想アドレスに変換する（Ｓ４３1）。そして、freeze_public_memory関数は、変換後のアドレスを返し（Ｓ４３２）、動作が終了となる。freeze_public_memory関数の呼び出し元のタスク２９および当該タスク２９と同一のプロセスに属する他のタスク２９は、Ｓ４３２により返されたアドレスと、引数“size”で指定されたメモリ領域をFROZEN_PUBLIC状態のメモリ領域として使用することができる。
【０１３７】
図４９は、melt_frozen_public_memory関数の動作を説明するフローチャートである。タスク２９がmelt_frozen_public_memory関数を呼び出すと、melt_frozen_public_memory関数は、キャッシュ／メモリ管理部２８を用いて、当該タスク２９が属するプロセスが属するＬ１Ｃ２２の、指定されたメモリ領域の内容が載っているキャッシュラインを無効化する（Ｓ４４１）。そして、melt_frozen_public_memory関数は、指定されたメモリ領域の先頭アドレス（Ｌ１Ｃ／Ｌ２Ｃ仮想アドレス）を対応するＬ１ＵＣ／Ｌ２ＵＣ仮想アドレスに変換し（Ｓ４４２）、変換後のアドドレスを返し（Ｓ４４３）、動作が終了となる。関数の呼び出し元のタスク２９および当該タスク２９と同一のプロセスに属する他のタスク２９は、Ｓ４４３により返されたアドレスと、引数“size”で指定されたメモリ領域をPUBLIC状態のメモリ領域として使用することができる。
【０１３８】
このように、第５の実施形態によれば、ＭＡＰに、同一のプロセスに属するタスクにＬ１Ｃ／Ｌ２Ｃのread  onlyアクセスが許可されるFROZEN_PUBLIC状態を加えるようにしたので、同一のプロセスに属する複数のタスクが同時にＬ１ＣおよびＬ２Ｃを利用したreadを行うことができる。したがって、プロセス内のタスク間でのデータの授受を高速に行うことができるようになる。
【０１３９】
さらに、EXTERNAL状態を経由することなくPUBLIC状態から直接FROZEN_PUBLIC状態に遷移させることができるので、同一のプロセス内でデータを共有したい場合、第４の実施形態よりもさらに簡単にデータの共有を実現することができるようになる。
【０１４０】
（第６の実施形態）
第６の実施形態によれば、第２の実施形態のＭＡＰに、UM_PUBLIC状態から遷移可能で、同一のプロセスに属するタスクが読み出しアクセスできるUM_FROZEN_PUBLIC状態が追加されて構成されるＭＡＰを備えている。
【０１４１】
第６の実施形態のマルチコアプロセッサシステムの構成は、状態遷移関数２６に含まれる関数の内容を除いて第２の実施形態と等しいので、状態遷移関数２６に含まれる関数を除く構成についての重複する説明を省略する。
【０１４２】
図５０は、第６の実施形態のＭＡＰを説明する図である。第５の実施形態のＭＡＰは、（ｇ）〜（ｌ）において説明した第２の実施形態のＭＡＰに次に説明するUM_FROZEN_PUBLIC状態が追加されたものとなっている。
（ｐ）UM_FROZEN_PUBLIC状態
この状態は、UM_PUBLIC状態から遷移でき、同一プロセス内の全てのタスク２９でＬ１Ｃ／Ｌ２Ｃによるread  onlyアクセスが可能である。
【０１４３】
第６の実施形態の状態遷移関数２６は、（１５）〜（２８）において説明した関数に加えて、さらに次の２つの関数を含んでいる。
（３５）freeze_um_public_memory(void  *addr,  size_t  size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_PUBLIC状態のメモリ領域をUM_PUBLIC状態からUM_FROZEN_PUBLIC状態に遷移させる関数である。UM_PUBLIC状態でアクセスが許可されたプロセスに属するタスク２９のみがこの関数を呼び出すことができる。
（３６）melt_um_frozen_public_memory(void  *addr,  size_t  size)
これは先頭アドレス“addr”、引数“size”で指定されるUM_FROZEN_PUBLIC状態のメモリ領域をUM_FROZEN_PUBLIC状態からUM_PUBLIC状態に遷移させる関数である。
【０１４４】
次に、第６の実施形態の状態遷移関数２６に含まれる各関数の動作を説明する。ここでは、freeze_um_public_memory関数およびmelt_um_frozen_public_memory関数の動作のみを説明する。
【０１４５】
図５１は、freeze_um_public_memory関数の動作を説明するフローチャートである。UM_PUBLIC状態のメモリ領域を指定して、当該UM_PUBLIC状態のメモリ領域に対するread／writeアクセスが許可されたプロセスに属するタスク２９が、freeze_um_public_memory関数を呼び出すと、freeze_um_public_memory関数は、指定されたメモリ領域の先頭アドレスを返し（Ｓ４５１）、動作が終了となる。freeze_um_public_memory関数の呼び出し元のタスク２９および当該タスク２９と同一のプロセスに属する他のタスク２９は、Ｓ４５１により返されたアドレスと、引数“size”で指定されたメモリ領域をFROZEN_UM_PUBLIC状態のメモリ領域として使用することができる。
【０１４６】
図５２は、melt_um_frozen_public_memory関数の動作を説明するフローチャートである。タスク２９がmelt_um_frozen_public_memory関数を呼び出すと、melt_um_frozen_public_memory関数は、キャッシュ／メモリ管理部２８を用いて、指定されたメモリ領域の内容が載っている、当該タスク２９が属するプロセスのＬ１Ｃ２２のキャッシュラインを無効化する（Ｓ４６１）。そして、melt_um_frozen_public_memory関数は、指定されたメモリ領域の先頭アドレスを返し（Ｓ４６２）、動作が終了となる。関数の呼び出し元のタスク２９および当該タスク２９と同一のプロセスに属する他のタスク２９は、Ｓ４６２により返されたアドレスと、引数“size”で指定されたメモリ領域をUM_PUBLIC状態のメモリ領域として使用することができる。
【０１４７】
このように、第６の実施形態によれば、ＭＡＰに、同一のプロセスに属するタスクにＬ１Ｃ／Ｌ２Ｃのread  onlyアクセスが許可されるUM_FROZEN_PUBLIC状態を加えるようにしたので、同一のタスクに属する複数のタスクが同時にＬ１ＣおよびＬ２Ｃを利用したreadを行うことができる。したがって、同一のプロセス内のタスク間でのデータの授受を高速に行うことができるようになる。
【０１４８】
さらに、UM_EXTERNAL状態を経由することなくUM_PUBLIC状態から直接UM_FROZEN_PUBLIC状態に遷移させることができるので、１つのプロセス内のタスク間でデータを共有したい場合、第３の実施形態よりもさらに簡単にデータの共有を実現することができるようになる。
【０１４９】
このように本発明の第１〜第６の実施形態によれば、クラスタ型のマルチコアプロセッサシステム１においてキャッシュ（Ｌ１Ｃ２２、Ｌ２Ｃ２４）の一貫性をソフトウェアで維持することができるようになる。
【０１５０】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【０１５１】
１  マルチコアプロセッサシステム、２  マルチコアプロセッサ、３  メモリ、２１  コア、２２  Ｌ１キャッシュ（Ｌ１Ｃ）、２３  ＡＴＵ、２４  Ｌ２キャッシュ（Ｌ２Ｃ）、２５  クラスタ、２６  状態遷移関数、２７  メモリアロケータ、２８  キャッシュ／メモリ管理部、２９  タスク、３１  カーネル管理領域、３２  カーネルプログラム（カーネル）、３３  ユーザプログラム。
【図１】
2013003793.tif 000003
【図２】
2013003793.tif 000004
【図３】
2013003793.tif 000005
【図４】
2013003793.tif 000006
【図５】
2013003793.tif 000007
【図６】
2013003793.tif 000008
【図７】
2013003793.tif 000009
【図８】
2013003793.tif 000010
【図９】
2013003793.tif 000011
【図１０】
2013003793.tif 000012
【図１１】
2013003793.tif 000013
【図１２】
2013003793.tif 000014
【図１３】
2013003793.tif 000015
【図１４】
2013003793.tif 000016
【図１５】
2013003793.tif 000017
【図１６】
2013003793.tif 000018
【図１７】
2013003793.tif 000019
【図１８】
2013003793.tif 000020
【図１９】
2013003793.tif 000021
【図２０】
2013003793.tif 000022
【図２１】
2013003793.tif 000023
【図２２】
2013003793.tif 000024
【図２３】
2013003793.tif 000025
【図２４】
2013003793.tif 000026
【図２５】
2013003793.tif 000027
【図２６】
2013003793.tif 000028
【図２７】
2013003793.tif 000029
【図２８】
2013003793.tif 000030
【図２９】
2013003793.tif 000031
【図３０】
2013003793.tif 000032
【図３１】
2013003793.tif 000033
【図３２】
2013003793.tif 000034
【図３３】
2013003793.tif 000035
【図３４】
2013003793.tif 000036
【図３５】
2013003793.tif 000037
【図３６】
2013003793.tif 000038
【図３７】
2013003793.tif 000039
【図３８】
2013003793.tif 000040
【図３９】
2013003793.tif 000041
【図４０】
2013003793.tif 000042
【図４１】
2013003793.tif 000043
【図４２】
2013003793.tif 000044
【図４３】
2013003793.tif 000045
【図４４】
2013003793.tif 000046
【図４５】
2013003793.tif 000047
【図４６】
2013003793.tif 000048
【図４７】
2013003793.tif 000049
【図４８】
2013003793.tif 000050
【図４９】
2013003793.tif 000051
【図５０】
2013003793.tif 000052
【図５１】
2013003793.tif 000053
【図５２】
2013003793.tif 000054