メモリ領域を備えるメモリと、複数のプロセッサコアと、前記複数のプロセッサコア毎に対応する複数の1次キャッシュと、前記複数のプロセッサコア間で共有される2次キャッシュと、を備え、前記メモリ領域に対するマッピング設定が共通するプロセッサコア同士はコアグループを形成するマルチコアプロセッサと、を備え、前記メモリ領域は、前記1次キャッシュおよび前記2次キャッシュをともに使用する第1のアクセスによる読み書きが許可され、1つのプロセッサコアに独占的な使用権が与えられている第1の状態と、前記1次キャッシュを使用せず、かつ前記2次キャッシュを使用する第2のアクセスによる読み書きが許可され、1つのコアグループに独占的な使用権が与えられている第2の状態と、前記1次キャッシュおよび前記2次キャッシュをともに使用しない第3のアクセスによる読み書きが許可され、全てのコアグループに使用権が与えられている第3の状態と、を容認し、前記マルチコアプロセッサは、前記第1の状態と前記第2の状態との間、および前記第2の状態と前記第3の状態との間の遷移を行うカーネル部を備え、前記カーネル部は、前記メモリ領域を前記第1の状態から前記第2の状態に遷移させるとき、対応する1次キャッシュを前記2次キャッシュにライトバックし、前記第2の状態から前記第3の状態に遷移させるとき、対応する2次キャッシュを前記メモリ領域にライトバックする、ことを特徴とするマルチコアプロセッサシステム。前記メモリ領域は、何れのプロセッサコアにも割り当てられていない第4の状態をさらに容認し、前記カーネル部は、前記第1乃至第3の状態のうちの少なくとも1つの状態と前記第4の状態との間の遷移を行う、ことを特徴とする請求項1に記載のマルチコアプロセッサシステム。前記メモリ領域は、前記第1のアクセスによる読み出しが許可され、同一のコアグループに属する要求した1以上のプロセッサコアに使用権が与えられている第5の状態をさらに容認し、前記カーネル部は、前記第2の状態と前記第5の状態との間の遷移を行う、ことを特徴とする請求項1に記載のマルチコアプロセッサシステム。前記メモリ領域は、前記第1のアクセスによる読み出しが許可される、要求した1以上のコアグループに使用権が与えられている第6の状態をさらに容認し、前記カーネル部は、前記第3の状態と前記第6の状態との間の遷移を行う、ことを特徴とする請求項1に記載のマルチコアプロセッサシステム。前記メモリ領域は、前記第1のアクセスによる読み出しが許可される、1つのコアグループに独占的な使用権が与えられている第7の状態をさらに容認し、前記カーネル部は、前記第2の状態と前記第7の状態との間の遷移を行う、ことを特徴とする請求項1に記載のマルチコアプロセッサシステム。メモリ領域を備えるメモリと、各々1次キャッシュを備える複数のプロセッサコアと、前記複数のプロセッサコア間で共有される2次キャッシュと、を備え、を備え、前記メモリ領域に対するマッピング設定が共通するプロセッサコア同士はコアグループを形成するマルチコアプロセッサと、を備え、前記メモリ領域は、前記1次キャッシュおよび前記2次キャッシュをともに使用する読み書きが許可され、1つのプロセッサコアに独占的な使用権が与えられている第1の状態と、読み書きが許可されない、1つのコアグループに独占的な使用権が与えられている第2の状態と、読み書きが許可されない、全てのコアグループに使用権が与えられている第3の状態と、を容認し、前記マルチコアプロセッサは、前記第1の状態と前記第2の状態との間、および前記第2の状態と前記第3の状態との間の遷移を行うカーネル部を備え、前記カーネル部は、前記メモリ領域を前記第1の状態から前記第2の状態に遷移させるとき、対応する1次キャッシュを前記2次キャッシュにライトバックし、前記第2の状態から前記第3の状態に遷移させるとき、対応する2次キャッシュを前記メモリ領域にライトバックする、ことを特徴とするマルチコアプロセッサシステム。前記メモリ領域は、何れのプロセッサコアにも割り当てられていない第4の状態をさらに容認し、前記カーネル部は、前記第1乃至第3の状態のうちの少なくとも1つの状態と前記第4の状態との間の遷移を行う、ことを特徴とする請求項6に記載のマルチコアプロセッサシステム。前記メモリ領域は、前記1次キャッシュおよび前記2次キャッシュをともに使用するアクセスによる読み出しが許可され、同一のコアグループに属する要求した1以上のプロセッサコアに使用権が与えられている第5の状態をさらに容認し、前記カーネル部は、前記第2の状態と前記第5の状態との間の遷移を行う、ことを特徴とする請求項6に記載のマルチコアプロセッサシステム。前記メモリ領域は、前記1次キャッシュおよび前記2次キャッシュをともに使用するアクセスによる読み出しが許可される、要求した1以上のコアグループに使用権が与えられている第6の状態をさらに容認し、前記カーネル部は、前記第3の状態と前記第6の状態との間の遷移を行う、ことを特徴とする請求項6に記載のマルチコアプロセッサシステム。前記メモリ領域は、前記1次キャッシュおよび前記2次キャッシュをともに使用するアクセスによる読み出しが許可される、1つのコアグループに独占的な使用権が与えられている第7の状態をさらに容認し、前記カーネル部は、前記第2の状態と前記第7の状態との間の遷移を行う、ことを特徴とする請求項6に記載のマルチコアプロセッサシステム。メモリ領域を備えるメモリに接続され、各々1次キャッシュを備える複数のプロセッサコアと、前記複数のプロセッサコア間で共有される2次キャッシュと、を備え、前記メモリ領域に対するマッピング設定が共通するプロセッサコア同士はコアグループを形成するマルチコアプロセッサであって、前記メモリ領域は、前記1次キャッシュおよび前記2次キャッシュをともに使用する第1のアクセスによる読み書きが許可され、1つのプロセッサコアに独占的な使用権が与えられている第1の状態と、前記1次キャッシュを使用せず、かつ前記2次キャッシュを使用する第2のアクセスによる読み書きが許可され、1つのコアグループに独占的な使用権が与えられている第2の状態と、前記1次キャッシュおよび前記2次キャッシュをともに使用しない第3のアクセスによる読み書きが許可され、全てのコアグループに使用権が与えられている第3の状態と、を容認し、前記マルチコアプロセッサは、前記第1の状態と前記第2の状態との間、および前記第2の状態と前記第3の状態との間の遷移を行うカーネル部を備え、前記カーネル部は、前記メモリ領域を前記第1の状態から前記第2の状態に遷移させるとき、対応する1次キャッシュを前記2次キャッシュにライトバックし、前記第2の状態から前記第3の状態に遷移させるとき、対応する2次キャッシュを前記メモリ領域にライトバックする、ことを特徴とするマルチコアプロセッサ。前記メモリ領域は、何れのプロセッサコアにも割り当てられていない第4の状態をさらに容認し、前記カーネル部は、前記第1乃至第3の状態のうちの少なくとも1つの状態と前記第4の状態との間の遷移を行う、ことを特徴とする請求項11に記載のマルチコアプロセッサ。前記メモリ領域は、前記第1のアクセスによる読み出し許可され、同一のコアグループに属する要求した1以上のプロセッサコアに使用権が与えられている第5の状態をさらに容認し、前記カーネル部は、前記第2の状態と前記第5の状態との間の遷移を行う、ことを特徴とする請求項11に記載のマルチコアプロセッサ。前記メモリ領域は、前記第1のアクセスによる読み出しが許可される、要求した1以上のコアグループに使用権が与えられている第6の状態をさらに容認し、前記カーネル部は、前記第3の状態と前記第6の状態との間の遷移を行う、ことを特徴とする請求項11に記載のマルチコアプロセッサ。前記メモリ領域は、前記第1のアクセスによる読み出しが許可される、1つのコアグループに独占的な使用権が与えられている第7の状態をさらに容認し、前記カーネル部は、前記第2の状態と前記第7の状態との間の遷移を行う、ことを特徴とする請求項11に記載のマルチコアプロセッサ。メモリ領域を備えるメモリに接続され、各々1次キャッシュを備える複数のプロセッサコアと、前記複数のプロセッサコア間で共有される2次キャッシュと、を備え、前記メモリ領域に対するマッピング設定が共通するプロセッサコア同士はコアグループを形成するマルチコアプロセッサであって、前記メモリ領域は、前記1次キャッシュおよび前記2次キャッシュをともに使用する読み書きが許可され、1つのプロセッサコアに独占的な使用権が与えられている第1の状態と、読み書きが許可されない、1つのコアグループに独占的な使用権が与えられている第2の状態と、読み書きが許可されない、全てのコアグループに使用権が与えられている第3の状態と、を容認し、前記マルチコアプロセッサは、前記第1の状態と前記第2の状態との間、および前記第2の状態と前記第3の状態との間の遷移を行うカーネル部を備え、前記カーネル部は、前記メモリ領域を前記第1の状態から前記第2の状態に遷移させるとき、対応する1次キャッシュを前記2次キャッシュにライトバックし、前記第2の状態から前記第3の状態に遷移させるとき、対応する2次キャッシュを前記メモリ領域にライトバックする、ことを特徴とするマルチコアプロセッサ。前記メモリ領域は、何れのプロセッサコアにも割り当てられていない第4の状態をさらに容認し、前記カーネル部は、前記第1乃至第3の状態のうちの少なくとも1つの状態と前記第4の状態との間の遷移を行う、ことを特徴とする請求項16に記載のマルチコアプロセッサ。前記メモリ領域は、前記1次キャッシュおよび前記2次キャッシュをともに使用するアクセスによる読み出しが許可され、同一のコアグループに属する要求した1以上のプロセッサコアに使用権が与えられている第5の状態をさらに容認し、前記カーネル部は、前記第2の状態と前記第5の状態との間の遷移を行う、ことを特徴とする請求項16に記載のマルチコアプロセッサ。前記メモリ領域は、前記1次キャッシュおよび前記2次キャッシュをともに使用するアクセスによる読み出しが許可される、要求した1以上のコアグループに使用権が与えられている第6の状態をさらに容認し、前記カーネル部は、前記第3の状態と前記第6の状態との間の遷移を行う、ことを特徴とする請求項16に記載のマルチコアプロセッサ。前記メモリ領域は、前記1次キャッシュおよび前記2次キャッシュをともに使用するアクセスによる読み出しが許可される、1つのコアグループに独占的な使用権が与えられている第7の状態をさらに容認し、前記カーネル部は、前記第2の状態と前記第7の状態との間の遷移を行う、ことを特徴とする請求項16に記載のマルチコアプロセッサ。本発明の1つの実施形態は、キャッシュの一貫性をソフトウェアで維持することができるクラスタ型のマルチコアプロセッサシステムおよびマルチコアプロセッサを提供することを目的とする。本発明の一つの実施形態によれば、メモリ領域を備えるメモリと、各々1次キャッシュを備える複数のプロセッサコアおよび前記複数のプロセッサコア間で共有される2次キャッシュを備え、前記2次キャッシュを共有するプロセッサコアが前記メモリ領域に対するマッピング設定が共通するプロセッサコア毎のコアグループを形成するマルチコアプロセッサと、を備えている。前記メモリ領域は、次の第1~第3の状態を容認する。第1の状態は、前記1次キャッシュおよび前記2次キャッシュをともに使用する第1のアクセスによる読み書きが許可され、1つのプロセッサコアに独占的な使用権が与えられている状態である。第2の状態は、前記1次キャッシュを使用せず、かつ前記2次キャッシュを使用する第2のアクセスによる読み書きが許可され、1つのコアグループに独占的な使用権が与えられている状態である。第3の状態は、前記1次キャッシュおよび前記2次キャッシュをともに使用しない第3のアクセスによる読み書きが許可され、全てのコアグループに使用権が与えられている状態である。前記マルチコアプロセッサは、前記メモリ領域の夫々の状態間の遷移を行うカーネル部として機能する。前記カーネル部は、前記第1の状態と前記第2の状態との間、および前記第2の状態と前記第3の状態との間の遷移を行う。前記カーネル部は、前記第1の状態から前記第2の状態に遷移させるとき、対応する1次キャッシュを2次キャッシュにライトバックし、前記第2の状態から前記第3の状態に遷移させるとき、対応する2次キャッシュを前記メモリ領域にライトバックする。以下に図面を参照して、実施形態にかかるマルチコアプロセッサシステムおよびマルチコアプロセッサを詳細に説明する。なお、これらの実施形態により本発明が限定されるものではない。第1の実施形態図1は、本発明の第1の実施形態のマルチコアプロセッサシステムの構成を示すブロック図である。マルチコアプロセッサシステム1は、マルチコアプロセッサ2と、メモリ3とを備えている。マルチコアプロセッサ2およびメモリ3はバスを介して接続されている。なお、夫々の構成要素をバスではなくメッシュなど他のネットワークトポロジーによって夫々接続するように構成してもよい。メモリ3は、例えばRAMRandomAccessMemoryにより構成される。メモリ3には、マルチコアプロセッサ2のハードウェアリソースの管理を行うカーネルプログラム32と、マルチコアプロセッサシステム1をユーザが所望するように動作させるためのユーザプログラム33とがロードされている。また、メモリ3には、マルチコアプロセッサ2がメインメモリとして使用できるカーネル管理領域31が確保されている。マルチコアプロセッサ2は、カーネルプログラム32およびユーザプログラム33を実行することによって、キャッシュ後述するL1キャッシュ22およびL2キャッシュ24の一貫性を保ちつつカーネル管理領域31内のメモリ領域を各コア21に割り当てる。なお、以降の説明において、マルチコアプロセッサ2が主体となる動作は、マルチコアプロセッサ2より正確にはコア21がカーネルプログラム32またはユーザプログラム33を実行することによって実現される。なお、カーネルプログラム32に基づく動作は、カーネルプログラム32を動作の主体として表現し、ユーザプログラム33に基づく動作は、タスクを動作の主体として表現する場合がある。カーネルプログラム32やユーザプログラム33のロード元は、プログラムを予め格納したROMReadOnlyMemoryなどにより構成される不揮発性メモリ領域や外部記憶装置などであってよい。以下、カーネルプログラム32をカーネル32と略して表現する。マルチコアプロセッサ2は、コアプロセッサコア21を複数備える。夫々のコア21はL1キャッシュL1C22を備えている。また、マルチコアプロセッサ2は、複数図1では2個のクラスタ25を備え、夫々のコア21は複数のクラスタ25のうちの何れかに属する。夫々のクラスタ25は、メモリ3側にL2キャッシュL2C24を備えており、L2C24には、同一クラスタ25に属するコア21がクラスタ内バスで共通接続されている。即ち、夫々のコア21は、L1C22およびL2C24の2段のキャッシュを介してメモリ3にアクセスすることができるようになっている。なお、クラスタ内の各構成要素をバスではなくメッシュなどの他のネットワークトポロジーによって夫々接続するように構成してもよい。また、L1C22とL2C24との間には、仮想アドレスを物理アドレスに変換するアドレス変換ユニットATU23がコア21毎に設けられている。コア21は、アクセス先を特定する情報として仮想アドレスを使用し、L1C22にアクセス先がヒットしなかった場合は当該仮想アドレスがATU23により物理アドレスに変換されてL2C24またはメモリ3に伝達される。このことは、各コア21のメモリマップは、ATU23によってメモリ3にマッピングすることができるようになっていることを意味する。即ち、ATU23により、同一の物理アドレス空間上のメモリ領域に仮想アドレス空間上の複数のメモリ領域を重複して割り当てることができることができる。第1の実施形態においては、物理アドレス空間上のメモリ領域に仮想アドレス空間上の複数のメモリ領域を重複して割り当てて、当該重複して割り当てられた仮想アドレス空間上の複数のメモリ領域のうちのどのメモリ領域にアクセスするかによって当該アクセスにキャッシュL1C22、L2C24を使用するか否かを選択できるようになっている。図2は、ATU23によるメモリマッピングの一例を説明する図である。なお、ここでは、説明を簡単にするために、メモリマッピングの対象コアは2個とし、2個のコア21を区別するために符号の後にアルファベットの添え字a、bを付すこととする。図示するように、コア21aのATU23は、コア21aの仮想アドレス0x00000000~0x3FFFFFFFを、物理アドレス0x00000000~0x3FFFFFFFにL1C22、L2C24の双方を経由する設定以下L1C/L2Cと表記するでマッピングし、仮想アドレス0x40000000~0x7FFFFFFFFを同じ物理アドレス0x00000000~0x3FFFFFFFFに、L1C22を経由せず、かつL2C24を経由する設定以下L1UC/L2Cと表記するでマッピングしている。また、クラスタ25間で共有するメモリ領域として、仮想アドレス0x80000000~0x8FFFFFFFまでを物理アドレス0xA0000000~0xAFFFFFFFにL1C/L2Cでマッピングし、仮想アドレス0x90000000~0x9FFFFFFFまでを同じ物理アドレス0xA0000000~0xAFFFFFFFにL1UC/L2Cでマッピングし、仮想アドレス0xA0000000~0xaFFFFFFFまでを同じ物理アドレス0xA0000000~0xAFFFFFFFに、L1C22、L2C24の双方を経由しない設定でマッピングしている。また、コア21bのATU23は、コア21bの仮想アドレス0x00000000~0x5FFFFFFFを、物理アドレス0x40000000~0x9FFFFFFFにL1C/L2Cでマッピングし、仮想アドレス0x60000000~0xBFFFFFFFを同じ物理アドレス0x40000000~0x9FFFFFFFFに、L1UC/L2Cでマッピングしている。また、クラスタ25間で共有するメモリ領域として、仮想アドレス0xC0000000~0xCFFFFFFFまでを物理アドレス0xA0000000~0xAFFFFFFFにL1C/L2Cでマッピングし、仮想アドレス0xD0000000~0xDFFFFFFFまでを同じ物理アドレス0xA0000000~0xAFFFFFFFにL1UC/L2Cでマッピングし、仮想アドレス0xE0000000~0xEFFFFFFFまでを同じ物理アドレス0xA0000000~0xAFFFFFFFに、L1UC/L2UCでマッピングしている。物理アドレス0xA0000000~0xAFFFFFFFのメモリ領域には、コア21a、21bの両方から重複してマッピングされているため、当該メモリ領域を利用してコア21aとコア21bとの間でデータを共有することができる。また、この物理アドレス空間上のメモリ領域は、L1C/L2Cでアクセスすることが決められているメモリ領域と、L1UC/L2Cでアクセスすることが決められているメモリ領域と、L1UC/L2UCでアクセスすることが決められているメモリ領域との3つのメモリ領域に重複してマッピングされている。したがって、この物理アドレス空間上のメモリ領域には、コア21aおよびコア21bは、アクセス先の仮想アドレスを切り替えることによって、当該物理アドレス空間のメモリ領域に対してL1C/L2C、L1UC/L2C、またはL1UC/L2UCのうちの所望のモードでアクセスすることができる。なお、以降、L1UC/L2Cでアクセスすることが決められているメモリ領域と、L1UC/L2UCでアクセスすることが決められているメモリ領域とは、L1C/L2Cでアクセスすることが決められているメモリ領域のシャドー領域と表現することがある。第1の実施形態によれば、複数のコア21にマッピングされた物理アドレス空間上のメモリ領域にかかるキャッシュL1C22およびL2C24の一貫性を保つために、次に説明するメモリアクセスプロトコルMemoryAccessProtocol;MAPが定義されている。図3は、第1の実施形態のMAPを説明する図である。図示するように、第1の実施形態のMAPによれば、INVALID状態、PRIVATE状態、PUBLIC状態、PROTECTED状態、EXTERNAL状態、およびUNMANAGED状態の、6つの属性が定義されている。aINVALID状態この状態は、タスクに対するメモリ領域の割り当てが可能である。割り当て前、および解放後のメモリ領域がこの状態に属する。この状態のメモリ領域にはタスクからは一切アクセスできない。bPRIVATE状態この状態は、この状態に遷移させたタスクのみがL1C/L2Cでのread/writeアクセスを許可されている。このアクセスは、L1C/L2Cで物理メモリにマッピングされた仮想アドレスに対して行うことにより実現される。cPUBLIC状態この状態は、ATU23のマッピング設定が同一のタスクコア21間でデータを共有している。すなわち、ATU23のマッピング設定が同一のタスクが、L1UC/L2Cでのread/writeアクセスを許可されている。このアクセスはL1UC/L2Cで物理メモリにマッピングされた仮想アドレスに対して行うことにより実現される。ここで、ATU23のマッピング設定が同一のタスクの集合を意味するプロセスコアグループという概念を導入する。図4は、プロセスの概念を説明する図である。図4では、3つのコア21タスクがプロセスAに属し、4つのコア21タスクがプロセスBに属している。ATU23の設定が同一の複数のコア21において夫々実行されるタスクは、同一のプロセスに属することとなる。すなわち、PUBLIC状態のメモリ領域には、当該メモリ領域をPUBLIC状態に遷移させたタスクだけではなく、当該タスクを含むプロセスに属する全てのタスクがアクセスを許可される。なお、一つのクラスタ25内には複数のプロセスが存在してもかまわないが、1つのプロセスはクラスタ25をまたぐことはできないものとする。dPROTECTED状態この状態は、同一のプロセスに属するこの状態に遷移させる要求を行った1以上のタスクがL1C/L2Cでのreadアクセスを許可されている。この状態のメモリ領域にはwriteアクセスは一切出来ない。eEXTERNAL状態この状態は、クラスタ25をまたぐ全てのタスクがL1UC/L2UCでのread/writeアクセスを許可されている。このアクセスは、L1UC/L2UCで物理メモリにマッピングされた仮想アドレスに対して行うことにより実現される。fUNMANAGED状態この状態は、カーネル32の管理下にない状態、すなわちメモリ3が備えるメモリ領域のうちのカーネル管理領域31を除く部分である。カーネル32はこの状態のメモリ領域におけるキャッシュの一貫性を管理しないため、このメモリ領域をタスクが利用する場合は、キャッシュの一貫性をタスク側で責任を持って保たなければならない。カーネル管理領域31に含まれるメモリ領域は、INVALID状態、PRIVATE状態、PUBLIC状態、PROTECTED状態、またはEXTERNAL状態のうちの何れか1つの状態となっている。INVALID状態は、PUBLIC状態との間、PRIVATE状態との間、およびEXTERNAL状態との間で相互に遷移することができる。また、PUBLIC状態は、PRIVATE状態との間、EXTERNAL状態との間、およびPROTECTED状態との間で相互に遷移することができる。カーネル管理領域31内では、各状態の定義に基づくメモリアクセスおよび状態間の遷移ルールが守られることにより、キャッシュの一貫性が保たれる。図5は、第1の実施形態のマルチコアプロセッサシステム1の機能構成を説明する図である。マルチコアプロセッサ2は、カーネル32を実行することによって、状態遷移関数26と、メモリアロケータ27と、キャッシュ/メモリ管理部28とを生成する。また、マルチコアプロセッサ2は、ユーザプログラム33を実行することによってタスク29を実行する。状態遷移関数26は、図3のMAPにおける各状態間の遷移を行うためのAPIApplicationProgrammingInterfaceであって、メモリアロケータ27およびキャッシュ/メモリ管理部28と協働してカーネル部として機能する。状態遷移関数26は、次に示す14個の関数を含む。1allocateprivatememoryこれは、INVALID状態のメモリ領域から引数sizeで指定されるPRIVATE状態のメモリ領域を確保する関数である。2freeprivatememoryこれは、先頭アドレスaddr、引数sizeで指定されるPRIVATE状態のメモリ領域を解放する関数である。この関数により解放されたメモリ領域はINVALID状態となる。3allocatepublicmemoryこれは、INVALID状態のメモリ領域から引数sizeで指定されるPUBLIC状態のメモリ領域を確保する関数である。4freepublicmemoryこれは、先頭アドレスaddr、引数sizeで指定されるPUBLIC状態のメモリ領域を解放する関数である。この関数により解放されたメモリ領域はINVALID状態となる。5allocateexternalmemoryこれは、INVALID状態のメモリ領域から引数sizeで指定される引数のEXTERNAL状態のメモリ領域を確保する関数である。6freeexternalmemoryこれは、先頭アドレスaddr、引数sizeで指定されるEXTERNAL状態のメモリ領域を解放する関数である。この関数により解放されたメモリ領域はINVALID状態となる。7openprivatememoryこれは、先頭アドレスaddr、引数sizeで指定されるPUBLIC状態のメモリ領域をからPUBLIC状態からPRIVATE状態に遷移させる関数である。8closeprivatememoryこれは、先頭アドレスaddr、引数sizeで指定されるPRIVATE状態のメモリ領域をPRIVATE状態からPUBLIC状態に遷移させる関数である。9openprotectedmemoryこれは、先頭アドレスaddr、引数sizeで指定されるPUBLIC状態のメモリ領域をPUBLIC状態からPROTECTED状態に遷移させる関数である。10closeprotectedmemoryこれは、先頭アドレスaddr、引数sizeで指定されるPROTECTED状態のメモリ領域をPROTECTED状態からPUBLIC状態に遷移させる関数である。11openpublicmemoryこれは、先頭アドレスaddr、引数sizeで指定されるEXTERNAL状態のメモリ領域をEXTERNAL状態からPUBLIC状態に遷移させる関数である。12closepublicmemoryこれは、先頭アドレスaddr、引数sizeで指定されるPUBLIC状態のメモリ領域をPUBLIC状態からEXTERNAL状態に遷移させる関数である。13entermemoryaccessprotocolこれは、先頭アドレスaddr、引数sizeで指定されるUNMANAGED状態のメモリ領域をUNMANAGED状態からINVALID状態に遷移させる関数である。14leavememoryaccessprotocolこれは、先頭アドレスaddr、引数sizeで指定されるINVALID状態のメモリ領域をINVALID状態からUNMANAGED状態に遷移させる関数である。allocate関数allocateprivatememory、allocatepublicmemoryおよびallocateexternalmemory、free関数freeprivatememory、freepublicmemoryおよびfreeexternalmemory、open関数openprivatememory、openprotectedmemoryおよびopenpublicmemoryおよびclose関数closeprivatememory、closeprotectedmemoryおよびclosepublicmemoryは、タスク29により呼び出され、enter関数entermemoryaccessprotocolおよびleave関数leavememoryaccessprotocolはカーネル32自身により呼び出される。メモリアロケータ27は、カーネル管理領域31の増減およびカーネル管理領域31内のメモリ領域のタスク29に対する割り当て/解放を実行する。また、キャッシュ/メモリ管理部28は、L1C22およびL2C24のキャッシュラインを管理する。メモリアロケータ27およびキャッシュ/メモリ管理部28は夫々状態遷移関数26から呼び出される。次に、第1の実施形態の状態遷移関数26に含まれる各関数の動作を説明する。なお、第1の実施形態の説明においては、L1C/L2Cでアクセス可能に設定されている仮想アドレス空間上のメモリ領域におけるアドレスをL1C/L2C仮想アドレス、L1UC/L2Cでアクセス可能に設定されている仮想アドレス空間上のメモリ領域におけるアドレスをL1UC/L2C仮想アドレス、L1UC/L2UCでアクセス可能に設定されている仮想アドレス空間上のメモリ領域におけるアドレスをL1UC/L2UC仮想アドレスと略記することとする。図6は、allocateprivatememory関数の動作を説明するフローチャートである。タスク29がallocateprivatememoryを呼び出すと、allocateprivatememory関数は、メモリアロケータ27を用いて、INVALID状態のメモリ領域のうちから引数sizeで指定されたサイズの連続したメモリ領域を割り当て可能か否かを判定するS1。連続したINVALID状態の領域がなく、メモリ領域の割り当てが可能でない場合S1、No、allocateprivatememory関数はNULLを返しS2、動作が終了となる。メモリ領域の割り当てが可能である場合S1、Yes、allocateprivatememory関数は、メモリ領域をメモリアロケータ27を用いて呼び出し元のタスク29に割り当ててS3、割り当てられたメモリ領域の先頭アドレスをタスク29に返しS4、動作が終了となる。呼び出し元のタスク29は、S4により返されたアドレスと、引数sizeで指定されたメモリ領域をPRIVATE状態のメモリ領域として認識することができる。図7は、freeprivatememory関数の動作を説明するフローチャートである。タスク29がfreeprivatememory関数を呼び出すと、freeprivatememory関数は、キャッシュ/メモリ管理部28を用いて、L1C22のうちの、先頭アドレスaddr、引数sizeで指定されたメモリ領域が載っているキャッシュラインを無効化するS11。そして、freeprivatememory関数は、メモリアロケータ27を用いて、先頭アドレスaddr、引数sizeで指定されたメモリ領域を解放しS12、動作が終了となる。図8は、allocatepublicmemory関数の動作を説明するフローチャートである。タスク29がallocatepublicmemory関数を呼び出すと、allocatepublicmemory関数は、INVALID状態のメモリ領域のうちから引数sizeで指定されたサイズの連続したメモリ領域を割り当て可能か否かを判定するS21。メモリ領域の割り当てが可能でない場合S21、No、allocatepublicmemory関数はNULLを返しS22、動作が終了となる。メモリ領域の割り当てが可能である場合S21、Yes、allocatepublicmemory関数は、メモリアロケータ27を用いてメモリ領域を呼び出し元のタスク29に割り当ててS22、当該割り当てられたメモリ領域の先頭アドレスをL1UC/L2C仮想アドレスに変換しS24、変換後のアドレスをタスク29に返すS25。そして、動作が終了となる。呼び出し元のタスク29と同じプロセスに属する他のタスク29は、S25により返されたアドレスと、引数sizeで指定されたメモリ領域をPUBLIC状態のメモリ領域として認識することができる。図9は、freepublicmemory関数の動作を説明するフローチャートである。タスク29がfreepublicmemory関数を呼び出すと、freepublicmemory関数は、指定されたアドレスaddrL1UC/L2C仮想アドレスを、対応するL1C/L2C仮想アドレスに変換するS31。そして、freepublicmemory関数は、キャッシュ/メモリ管理部28を用いて、変換後のアドレスを先頭とし、引数sizeで指定されたメモリ領域を解放しS32、動作が終了となる。図10は、allocateexternalmemory関数の動作を説明するフローチャートである。タスクがallocateexternalmemory関数を呼び出すと、allocateexternalmemory関数は、INVALID状態のメモリ領域のうちから引数sizeで指定されたサイズの連続したメモリ領域を割り当て可能か否かを判定するS41。メモリ領域の割り当てが可能でない場合S41、No、allocateexternalmemory関数はNULLを返しS42、動作が終了となる。メモリ領域の割り当てが可能である場合S41、Yes、allocateexternalmemory関数は、メモリアロケータ27を用いてメモリ領域を呼び出し元のタスク29に割り当ててS43、キャッシュ/メモリ管理部28を用いて、L2C24における当該割り当てられたメモリ領域が載っているキャッシュラインを無効化するS44。そして、allocateexternalmemory関数は、当該割り当てられたメモリ領域の先頭アドレスをL1UC/L2UC仮想アドレスに変換しS45、変換後のアドレスをタスク29に返すS46。そして、動作が終了となる。全てのタスク29は、S46により返されたアドレスと、呼び出し元のタスク29により引数sizeで指定されたメモリ領域をEXTERNAL状態のメモリ領域として認識することができる。なお、呼び出し元のタスク29は、S46により返されたアドレスおよび指定された引数sizeを同一のプロセスに属する他のタスク29および他のプロセスに属するタスク29に通知することによって、全てのタスク29が当該メモリ領域をEXTERNAL状態として認識できるようにしてもよい。また、プロセス間ではATU23のマッピングの設定が異なるため、プロセス間を跨いでアドレスを授受する際に当該アドレスを変換する必要があるが、どのような方法で当該変換を行うようにしてもよい。図11は、freeexternalmemory関数の動作を説明するフローチャートである。タスク29がfreeexternalmemory関数を呼び出すと、freeexternalmemory関数は、指定されたアドレスaddrL1UC/L2UC仮想アドレスを、対応するL1C/L2C仮想アドレスに変換するS51。そして、freeexternalmemory関数は、メモリアロケータ27を用いて、変換後のアドレスを先頭とし、引数sizeで指定されたメモリ領域を解放しS52、動作が終了となる。図12は、openprivatememory関数の動作を説明するフローチャートである。タスク29がopenprivatememory関数を呼び出すと、openprivatememory関数は、指定されたアドレスaddrL1UC/L2C仮想アドレスを、対応するL1C/L2C仮想アドレスに変換するS61。そして、openprivatememory関数は、変換後のアドレスをタスク29に返しS62、動作が終了となる。呼び出し元のタスク29は、S62により返されたアドレスと、引数sizeで指定されたメモリ領域をPRIVATE状態のメモリ領域として認識することができる。図13は、closeprivatememory関数の動作を説明するフローチャートである。タスク29がcloseprivatememory関数を呼び出すと、closeprivatememory関数は、キャッシュ/メモリ管理部28を用いて、指定されたメモリ領域が載っているL1C22のキャッシュラインを無効化して内容をL2C24にライトバックするS71。そして、closeprivatememory関数は、指定されたアドレスaddrL1C/L2C仮想アドレスを、対応するL1UC/L2C仮想アドレスに変換しS72、変換後のアドレスを返しS73、動作が終了となる。呼び出し元のタスク29と同じプロセスに属するタスク29は、S73により返されたアドレスと、引数sizeで指定されたメモリ領域をPUBLIC状態のメモリ領域として認識することができる。図14は、openprotectedmemory関数の動作を説明するフローチャートである。タスク29がopenprotectedmemory関数を呼び出すと、openprotectedmemory関数は、指定されたアドレスaddrL1UC/L2C仮想アドレスを、対応するL1C/L2C仮想アドレスに変換するS81。そして、openprotectedmemory関数は、変換後のアドレスを返しS82、動作が終了となる。呼び出し元のタスク29と同じプロセスに属するタスク29は、S82により返されたアドレスと、引数sizeで指定されたメモリ領域をPUBLIC状態のメモリ領域として認識することができる。図15は、closeprotectedmemory関数の動作を説明するフローチャートである。タスク29がcloseprotectedmemory関数を呼び出すと、closeprotectedmemory関数は、キャッシュ/メモリ管理部28を用いて、先頭アドレスaddr、引数sizeで指定されたメモリ領域が載っているL1C22のキャッシュラインを無効化するS91。そして、closeprotectedmemory関数は、指定されたアドレスaddrL1C/L2C仮想アドレスを、対応するL1UC/L2C仮想アドレスに変換するS92。そして、closeprotectedmemory関数は、変換後のアドレスを返しS93、動作が終了となる。呼び出し元のタスク29と同じプロセスに属するタスク29は、S93により返されたアドレスと、引数sizeで指定されたメモリ領域をPUBLIC状態のメモリ領域として認識することができる。図16は、openpublicmemory関数の動作を説明するフローチャートである。タスク29がopenpublicmemory関数を呼び出すと、openpublicmemory関数は、指定されたアドレスaddrL1UC/L2UC仮想アドレスを、対応するL1UC/L2C仮想アドレスに変換するS101。その後、openpublicmemory関数は、変換後のアドレスを返しS102、動作が終了となる。呼び出し元のタスク29と同じプロセスに属するタスク29は、S102により返されたアドレスと、引数sizeで指定されたメモリ領域をPUBLIC状態のメモリ領域として認識することができる。図17は、closepublicmemory関数の動作を説明するフローチャートである。タスク29がclosepublicmemory関数を呼び出すと、closepublicmemory関数は、キャッシュ/メモリ管理部28を用いて、先頭アドレスaddr、引数sizeで指定されたメモリ領域が載っているL2C24のキャッシュラインに対し、内容のメモリ領域へのライトバックと無効化とを実行するS111。そして、closepublicmemory関数は、指定されたアドレスaddrL1UC/L2C仮想アドレスを、対応するL1UC/L2UC仮想アドレスに変換するS112。そして、closepublicmemory関数は、変換後のアドレスを返しS113、動作が終了となる。全てのタスク29は、S113により返されたアドレスと、呼び出し元のタスク29により引数sizeで指定されたメモリ領域をEXTERNAL状態のメモリ領域として認識することができる。図18は、entermemoryaccessprotocol関数の動作を説明するフローチャートである。カーネル32がentermemoryaccessprotocol関数を呼び出すと、entermemoryaccessprotocol関数は、メモリアロケータ27を用いて、先頭アドレスaddr、引数sizeで指定されたUNMANAGED状態のメモリ領域をカーネル管理領域31に加えるS121。そして、entermemoryaccessprotocol関数は、当該カーネル管理領域31に加えられたメモリ領域の先頭アドレスをカーネル32に返しS122、動作が終了となる。カーネル32は、当該カーネル管理領域31に加えられたメモリ領域を未割り当て状態すなわちINVALID状態のメモリ領域として認識する。図19は、leavememoryaccessprotocol関数の動作を説明するフローチャートである。カーネル32がleavememoryaccessprotocol関数を呼び出すと、leavememoryaccessprotocol関数は、メモリアロケータ27を用いて、先頭アドレスaddr、引数sizeで指定されたINVALID状態のメモリ領域をカーネル管理領域31から除外するS131。そして、leavememoryaccessprotocol関数は、当該カーネル管理領域31から除外したメモリ領域の先頭アドレスをカーネル32に返しS132、動作が終了となる。当該カーネル管理領域31から除外されたメモリ領域はUNMANAGED状態、すなわちカーネル32が管理しない状態となる。次に、以上のように動作する状態遷移関数26を用いてメモリ領域の状態遷移を行う例を説明する。図20は、プロセス内でメモリ領域を共有する場合の状態遷移の例を説明するフローチャートである。初めに、メモリ領域の状態は、UNMANAGED状態となっているS141。そして、カーネル32からentermemoryaccessprotocol関数が呼ばれることにより、当該メモリ領域はUNMANAGED状態からINVALID状態に遷移するS142。次に、あるプロセス内のタスク29間でデータを共有するために、そのプロセス内の1つのタスク29からallocatepublicmemory関数が呼び出され、当該メモリ領域がINVALID状態からPUBLIC状態に遷移するS143。次に、そのプロセス内の1つのタスク29がopenprivatememory関数を呼ぶことにより、当該メモリ領域はPRIVATE状態に遷移して、当該openprivatememory関数の読み出し元のタスク29によりL1C/L2Cでread/writeアクセスされるS144。この間、他のタスク29からのアクセスは許可されないため、アクセスは適切に行われる。アクセスが終了すると、openprivatememory関数の呼び出し元のタスク29によるcloseprivatememoyty関数の呼び出しにより、当該メモリ領域はPUBLIC状態に戻されるS145。この時、そのメモリ領域に対応するL1C22のキャッシュラインは適切にL2C24に書き戻されたのち無効化される。PUBLIC状態となった当該メモリ領域に対しては、L1UC/L2C仮想アドレスによってプロセス内のどのタスク29もread/writeが許されるS146。その後、そのプロセス内のタスク29がopenprotectedmemory関数を呼び出すことによって、当該メモリ領域がPROTECTED状態に遷移され、openprotectedmemory関数の呼び出し元のタスク29によるL1C/L2Cのreadアクセスが行われるS147。アクセスが終了すると、openprotectedmemory関数を呼び出したタスク29によるcloseprotectedmemory関数の呼び出しにより、当該メモリ領域はPUBLIC状態に戻されるS148。この時、そのメモリ領域に対応するL1C22のキャッシュラインは適切に無効化される。そして、同一のプロセス内のタスク29がfreepublicmemory関数を呼び出すことによって、当該メモリ領域はINVALID状態に遷移するS149。そして、カーネル32がleavememoryaccessprotocol関数を呼び出して、当該メモリ領域がUNMANAGED状態となりS150、一連の動作が終了となる。図21は、プロセス間でメモリ領域を共有する場合の状態遷移の例を説明するフローチャートである。初めに、メモリ領域の状態は、UNMANAGED状態となっているS161。そして、カーネル32からentermemoryaccessprotocol関数が呼ばれることにより、当該メモリ領域はUNMANAGED状態からINVALID状態に遷移するS162。次に、あるタスク29からプロセス間でデータを共有するためにallocateexternalmemory関数が呼び出され、当該メモリ領域は、L2C24の対応するキャッシュラインが無効化された後、INVALID状態からEXTERNAL状態に遷移するS163。この状態ではどのプロセスのどのタスクもL1UC/L2UC仮想アドレスによってread/writeアクセスが許されるS164。ただし、そのアクセスに使用するL1UC/L2UC仮想アドレスは、前述したように、プロセスごとに異なる。その後、あるプロセスの1つのタスク29が、そのプロセス内の共有目的に占有して使うために、openpublicmemory関数を呼び出すと、当該メモリ領域はPUBLIC状態に遷移するS165。この状態では、openpublicmemory関数の呼び出し元のタスク29が属するプロセス内のすべてのタスク29がL1UC/L2C仮想アドレスによるread/writeアクセスを許されるS166。その後、そのプロセス内の1つのタスク29が当該メモリ領域を占有して使うためにopenprivatememory関数を呼び出すと、当該メモリ領域はPRIVATE状態に遷移するS167。この状態では、openprivatememory関数の呼び出し元のタスク29だけがL1C/L2C仮想アドレスによるread/writeアクセスを許可される。アクセス終了後、openprivatememory関数の呼び出し元のタスク29がcloseprivatememory関数を呼ぶと、当該メモリ領域はPUBLIC状態に戻されるS168。この時、そのメモリ領域に対応するL1C22のキャッシュラインが適切にL2C24に書き戻されたのち、無効化される。その後、そのプロセス内のタスク29がopenprotectedmemory関数を呼び出すことによって、当該メモリ領域はPROTECTED状態に遷移し、openprotectedmemory関数の呼び出し元のタスク29によるL1C/L2Cのreadアクセスが行われるS169。アクセスが終了すると、openprotectedmemory関数の呼び出し元のタスク29によるcloseprotectedmemory関数の呼び出しにより、当該メモリ領域はPUBLIC状態に戻されるS170。この時、そのメモリ領域に対応するL1C22のキャッシュラインが適切に無効化される。その後、プロセスによる占有使用が終了すると、そのプロセスの1つのタスク29がclosepublicmemory関数を呼び出すことによって、当該メモリ領域はEXTERNAL状態に戻されるS171。この時、そのメモリ領域に対応するL2C24のキャッシュラインが適切にメモリ3に書き戻されたのち、無効化される。そして、いずれかのタスクからfreeexternalmemory関数が呼び出されると、当該メモリ領域はINVALID状態に遷移するS172。そしてカーネル32からleavememoryaccessprotocol関数が呼び出されると、当該メモリ領域はUNMANAGED状態となりS173、動作が終了となる。このように、第1の実施形態によれば、メモリ領域は、L1C/L2Cのアクセスによるread/writeが許可され、1つのタスク29コア21に独占的な使用権が与えられているPROVATE状態と、L1UC/L2Cのアクセスによるread/writeが許可され、1つのプロセスに独占的な使用権が与えられているPUBLIC状態と、L1UC/L2UCのアクセスによるread/writeが許可され、全てのタスク29すなわち全てのプロセスに使用権が与えられているEXTERNAL状態と、を容認し、PRIVATE状態とPUBLIC状態との間、およびPUBLIC状態とEXTERNAL状態との間の遷移を行うカーネル部を備え、カーネル部は、メモリ領域をPRIVATE状態からPUBLIC状態に遷移させるとき、対応するL1C22をL2C24にライトバックし、PUBLIC状態からEXTERNAL状態に遷移させるとき、対応するL2C24をメモリ領域にライトバックするように構成したので、夫々1次キャッシュを備える複数のコアが2次キャッシュを共有してクラスタを形成するマルチコアプロセッサを備えるマルチコアプロセッサシステムにおいて、1次キャッシュ、2次キャッシュ、およびメモリ3の記憶内容の一貫性を保ったままタスク29間、プロセス間、およびクラスタ間でメモリ領域を共有できるようになる。すなわち、クラスタ型のマルチコアプロセッサシステムにおいてキャッシュの一貫性をソフトウェアで維持することができるようになる。また、カーネル部は、PRIVATE状態、PUBLIC状態またはEXTERNAL状態と、INVALID状態との間で遷移を行うようにしたので、特定のタスク、特定のプロセス、または全プロセスに対するメモリ領域の割り当てを行うことができる。また、カーネル部は、PUBLIC状態と、PROTECTED状態との間で遷移を行うようにしたので、同一のプロセスに属する1以上のタスクからのメモリ読み出しを高速化することができる。なお、第1の実施形態の説明においては、マルチコアプロセッサシステム1は、各タスク29がMAPにより禁止されている動作例えば各状態で禁止されているアクセスを行う動作や、状態間の遷移ルールに反するタスク間でのメモリ領域の受け渡しなどのチェックを行っていない。MAPにより禁止されている動作が行われると、キャッシュの一貫性を保つことが出来なくなってしまう。そこで、状態遷移関数26に含まれる各関数に遷移後のメモリ領域の状態と使用権を所有するタスク29またはプロセスの識別子とを対応付けて出力させる。関数が呼び出された際には、当該出力された対応付けを参照することによって、自関数による遷移がMAPに定義されている遷移ルールに則しているか否かを判断させるようにしてもよい。そして、遷移ルールに則していない動作を検出したとき、検出結果を出力するようにしてもよい。また、メモリ領域に対するアクセスが行われたとき、状態遷移関数26が出力した対応付けを参照して、当該アクセスがアクセス先のメモリ領域の状態に則したアクセスであるか否かを判断する機構を設けるようにしてもよい。また、第1の実施形態は、夫々複数のコア21を備える複数のクラスタ25を有するマルチコアプロセッサ2だけでなく、複数のコア21を備えるクラスタ25を1つのみ備えるマルチコアプロセッサにも適用することができる。第2の実施形態第1の実施形態によれば、シャドー領域を持つ物理メモリ領域においてキャッシュの一貫性を保つことができるようになる。これに対して、第2の実施形態によれば、シャドー領域を持たず、アクセスする際にはL1キャッシュおよびL2キャッシュを有効としたアクセスしか許可されない物理メモリ領域においてキャッシュの一貫性を保つことができる。なお、第2の実施形態のマルチコアプロセッサシステムの構成は、状態遷移関数26に含まれる関数の内容を除いて第1の実施形態と等しいので、状態遷移関数26に含まれる関数を除く構成についての重複する説明を省略する。図22は、第2の実施形態のMAPを説明する図である。第2の実施形態のMAPによれば、UMINVALID状態、UMPRIVATE状態、UMPUBLIC状態、UMPROTECTED状態、UMEXTERNAL状態、およびUNMANAGED状態の、6つの属性が定義されている。gUMINVALID状態この状態は、カーネル32によるメモリ領域の割り当てが可能である。メモリ割り当て前、メモリ解放後のメモリ領域がこの状態に属する。タスクからは一切アクセスできない。hUMPRIVATE状態この状態は、この状態に遷移させたタスクのみがL1C/L2Cでのread/writeアクセスを許可される。このアクセスは、L1C/L2Cで物理メモリ領域にマッピングされた仮想アドレスに対して行うことにより実現される。iUMPUBLIC状態この状態は、ATU23のマッピングの設定が同一のタスク間、すなわち同一のプロセスに属するタスク間でデータを共有している。ただし、この状態のメモリ領域に対して直接アクセスすることは許されない。同一のプロセスに属するタスクのみ、この状態のメモリをUMPRIVATE状態もしくはUMPROTECTED状態に遷移させた後に、アクセスが許される。jUMPROTECTED状態この状態は、同一のプロセスに属するこの状態に遷移させる要求を行った1以上のタスクがL1C/L2Cでのreadアクセスを許可されている。この状態のメモリ領域に対するwriteアクセスは許されない。kUMEXTERNAL状態この状態は、すべてのタスクがデータを共有している。ただし、この状態のメモリ領域に対して直接アクセスすることは許されない。タスクは、UMPUBLIC状態に遷移させた後、そのタスクと同じメモリアドレスマッピングを持つタスクがUMPRIVATE状態、もしくはUMPUBLIC状態に遷移させた後に、アクセスが許される。lUNMANAGED状態この状態は、第1の実施形態における同名の状態と同じである。カーネル管理領域31に含まれるメモリ領域は、UMINVALID状態、UMPRIVATE状態、UMPUBLIC状態、UMPROTECTED状態、またはUMEXTERNAL状態のうちの何れか1つの状態となっている。UMINVALID状態は、UMPUBLIC状態との間、UMPRIVATE状態との間、およびUMEXTERNAL状態との間で相互に遷移することができる。また、UMPUBLIC状態は、UMPRIVATE状態との間、UMEXTERNAL状態との間、およびUMPROTECTED状態との間で相互に遷移することができる。カーネル管理領域31内では、UMINVALID状態、UMPRIVATE状態、UMPUBLIC状態、UMPROTECTED状態またはUMEXTERNAL状態の定義に基づくメモリアクセスおよび状態間の遷移ルールが守られることにより、キャッシュの一貫性が保たれる。なお、第2の実施形態においても、UNMANAGED状態とUMINVALID状態との間が遷移可能となっており、これによりカーネル管理領域31を動的に増減させることができる。第2の実施形態の状態遷移関数26は、上述に定義される各状態間の遷移を行うためのAPIApplicationProgrammingInterfaceである。状態遷移関数26は、次に示す14個の関数を含む。15allocateumprivatememoryこれは、引数sizeで指定されるUMPRIVATE状態のメモリ領域を確保する関数である。16freeumprivatememoryこれは、先頭アドレスaddr、引数sizeで指定されるUMPRIVATE状態のメモリ領域を解放する関数である。17allocateumpublicmemoryこれは、引数sizeで指定されるのUMPUBLIC状態のメモリ領域を確保する関数である。18freeumpublicmemoryこれは、先頭アドレスaddr、引数sizeで指定されるUMPUBLIC状態のメモリ領域を解放する関数である。19allocateumexternalmemoryこれは、引数sizeで指定されるのUMEXTERNAL状態のメモリ領域を確保する関数である。20freeumexternalmemoryこれは、先頭アドレスaddr、引数sizeで指定されるUMEXTERNAL状態のメモリ領域を解放する関数である。21openumprivatememoryこれは、先頭アドレスaddr、引数sizeで指定されるUMPUBLIC状態のメモリ領域をUMPUBLIC状態からUNPRIVATE状態に遷移させる関数である。22closeumprivatememoryこれは、先頭アドレスaddr、引数sizeで指定されるUMPRIVATE状態のメモリ領域をUMPRIVATE状態からUMPUBLIC状態に遷移させる関数である。23openumprotectedmemoryこれは、先頭アドレスaddr、引数sizeで指定されるUMPUBLIC状態のメモリ領域をUMPUBLIC状態からUMPROTECTED状態に遷移させる関数である。24closeumprotectedmemoryこれは、先頭アドレスaddr、引数sizeで指定されるUMPROTECTED状態のメモリ領域をUMPROTECTED状態からUMPUBLIC状態に遷移させる関数である。25openumpublicmemoryこれは、先頭アドレスaddr、引数sizeで指定されるUMEXTERNAL状態のメモリ領域をUMEXTERNAL状態からUMPUBLIC状態に遷移させる関数である。26closeumpublicmemoryこれは、先頭アドレスaddr、引数sizeで指定されるUMPUBLIC状態のメモリ領域をUMPUBLIC状態からUMEXTERNAL状態に遷移させる関数である。27enterummemoryaccessprotocolこれは、先頭アドレスaddr、引数sizeで指定されるUNMANAGED状態のメモリ領域をUNMANAGED状態からUMINVALID状態に遷移させる関数である。28leaveummemoryaccessprotocolこれは、先頭アドレスaddr、引数sizeで指定されるUMINVALID状態のメモリ領域をUMINVALID状態からUNMANAGED状態に遷移させる関数である。allocate関数allocateumprivatememory、allocateumpublicmemoryおよびallocateumexternalmemory、free関数freeumprivatememory、freeumpublicmemoryおよびfreeumexternalmemory、open関数openumprivatememory、openumprotectedmemoryおよびopenumpublicmemoryおよびclose関数closeumprivatememory、closeumprotectedmemoryおよびcloseumpublicmemoryは、タスク29により呼び出され、enter関数enterummemoryaccessprotocolおよびleave関数leaveummemoryaccessprotocolはカーネル32自身により呼び出される。次に、第2の実施形態の状態遷移関数26に含まれる各関数の動作を説明する。なお、第2の実施形態の説明においては、シャドー空間を持たない物理メモリ領域には、L1C/L2Cでアクセス可能に設定されている仮想アドレス空間上のメモリ領域のみが割り当てられる。当該仮想アドレス空間上のメモリ領域におけるアドレスをL1C/L2C仮想アドレスと略記する。図23は、allocateumprivatememory関数の動作を説明するフローチャートである。タスク29がallocateumprivatememory関数を呼び出すと、allocateumprivatememory関数は、メモリアロケータ27を用いて、メモリアロケータ27を用いて、UMINVALID状態のメモリ領域のうちから引数sizeで指定されたサイズの連続したメモリ領域を割り当て可能か否かを判定するS181。連続したUMINVALID状態の領域がなく、メモリ領域の割り当てが可能でない場合S181、No、allocateumprivatememory関数はNULLを返しS182、動作が終了となる。メモリ領域の割り当てが可能である場合S181、Yes、allocateumprivatememory関数は、メモリアロケータ27を用いてメモリ領域を呼び出し元のタスク29に割り当ててS183、当該割り当てられたメモリ領域の先頭アドレスをタスク29に返すS184。そして、動作が終了となる。呼び出し元のタスク29は、S184により返されたアドレスと、引数sizeで指定されたメモリ領域をUMPRIVATE状態のメモリ領域として認識することができる。図24は、freeumprivatememory関数の動作を説明するフローチャートである。タスク29がfreeumprivatememory関数を呼び出すと、freeumprivatememory関数は、キャッシュ/メモリ管理部28を用いて、L1C22のうちの、先頭アドレスaddr、引数sizeで指定されたメモリ領域が載っているキャッシュラインを無効化するS191。そして、freeumprivatememory関数は、メモリアロケータ27を用いて、先頭アドレスaddr、引数sizeで指定されたメモリ領域を解放しS192、動作が終了となる。図25は、allocateumpublicmemory関数の動作を説明するフローチャートである。タスク29がallocateumpublicmemory関数を呼び出すと、allocateumpublicmemory関数は、メモリアロケータ27を用いて、UMINVALID状態のメモリ領域のうちから引数sizeで指定されたサイズの連続したメモリ領域を割り当て可能か否かを判定するS201。メモリ領域の割り当てが可能でない場合S201、No、allocateumpublicmemory関数はNULLを返しS202、動作が終了となる。メモリ領域の割り当てが可能である場合S201、Yes、allocateumpublicmemory関数は、メモリアロケータ27を用いてメモリ領域を呼び出し元のタスク29に割り当ててS203、当該割り当てられたメモリ領域の先頭アドレスをタスク29に返すS204。そして、動作が終了となる。呼び出し元のタスク29と同じプロセスに属するタスク29は、S204により返されたアドレスと、から引数sizeで指定されたメモリ領域をUMPUBLIC状態のメモリ領域として認識することができる。なお、呼び出し元のタスク29は、S204により返されたアドレスおよび指定された引数sizeを同一のプロセスに属する他のタスク29に通知することによって、同一のプロセスに属する他のタスク29が当該メモリ領域をUMPUBLIC状態として認識できるようにしてもよい。図26は、freeumpublicmemory関数の動作を説明するフローチャートである。タスク29がfreeumpublicmemory関数を呼び出すと、freeumpublicmemory関数は、メモリアロケータ27を用いて、指定されたメモリ領域を解放しS211、動作が終了となる。図27は、allocateumexternalmemory関数の動作を説明するフローチャートである。タスク29がallocateumexternalmemory関数を呼び出すと、allocateumexternalmemory関数は、メモリアロケータ27を用いて、UMINVALID状態のメモリ領域のうちから引数sizeで指定されたサイズの連続したメモリ領域を割り当て可能か否かを判定するS221。メモリ領域の割り当てが可能でない場合S221、No、allocateumexternalmemory関数はNULLを返しS222、動作が終了となる。モリ領域の割り当てが可能である場合S221、Yes、allocateumexternalmemory関数は、メモリアロケータ27を用いてメモリ領域を呼び出し元のタスク29に割り当てるS223。そして、キャッシュ/メモリ管理部28を用いて、L2C24における当該割り当てられたメモリ領域が載っているキャッシュラインを無効化するS224。そして、allocateumexternalmemory関数は、当該割り当てられたメモリ領域の先頭アドレスをタスク29に返しS225、動作が終了となる。全てのタスク29は、S225により返されたアドレスと、呼び出し元のタスク29により引数sizeで指定されたメモリ領域をUMEXTERNAL状態のメモリ領域として認識することができる。なお、呼び出し元のタスク29は、S225により返されたアドレスおよび指定された引数sizeを同一のプロセスに属する他のタスク29および他のプロセスに属するタスク29に通知することによって、全てのタスク29が当該メモリ領域をUMEXTERNAL状態として認識できるようにしてもよい。また、プロセス間ではATU23のマッピングの設定が異なるため、プロセス間を跨いでアドレスを授受する際に当該アドレスを変換する必要があるが、どのような方法で当該変換を行うようにしてもよい。図28は、freeumexternalmemory関数の動作を説明するフローチャートである。タスク29がfreeumexternalmemory関数を呼び出すと、freeumexternalmemory関数は、メモリアロケータ27を用いて、指定されたメモリ領域を解放しS231、動作が終了となる。図29は、openumprivatememory関数の動作を説明するフローチャートである。タスク29がopenumprivatememory関数を呼び出すと、openumprivatememory関数は、指定されたメモリ領域の先頭アドレスをタスク29に返しS241、動作が終了となる。呼び出し元のタスク29は、S241により返されたアドレスと、引数sizeで指定されたメモリ領域をUMPRIVATE状態のメモリ領域として認識することができる。図30は、closeumprivatememory関数の動作を説明するフローチャートである。タスク29がcloseumprivatememory関数を呼び出すと、closeumprivatememory関数は、キャッシュ/メモリ管理部28を用いて、指定されたメモリ領域が載っているL1C22のキャッシュラインを無効化して内容をL2C24にライトバックするとともに当該キャッシュラインを無効化するS251。そして、closeumprivatememory関数は、指定されたメモリ領域の先頭アドレスを返しS252、動作が終了となる。呼び出し元のタスク29と同じプロセスに属するタスク29は、S252により返されたアドレスと、引数sizeで指定されたメモリ領域をUMPUBLIC状態のメモリ領域として認識することができる。図31は、openumprotectedmemory関数の動作を説明するフローチャートである。タスク29がopenumprotectedmemory関数を呼び出すと、openumprotectedmemory関数は、指定されたメモリ領域の先頭アドレスを返しS261、動作が終了となる。呼び出し元のタスク29と同じプロセスに属するタスク29は、S261により返されたアドレスと、引数sizeで指定されたメモリ領域をUMPUBLIC状態のメモリ領域として認識することができる。図32は、closeumprotectedmemory関数の動作を説明するフローチャートである。タスク29がcloseumprotectedmemory関数を呼び出すと、closeumprotectedmemory関数は、キャッシュ/メモリ管理部28を用いて、指定されたメモリ領域が載っているL1C22のキャッシュラインを無効化するS271。そして、closeumprotectedmemory関数は、指定されたメモリ領域の先頭アドレスを返しS272、動作が終了となる。呼び出し元のタスク29と同じプロセスに属するタスク29は、S272により返されたアドレスと、引数sizeで指定されたメモリ領域をUMPUBLIC状態のメモリ領域として認識することができる。図33は、openumpublicmemory関数の動作を説明するフローチャートである。タスク29がopenumpublicmemory関数を呼び出すと、openumpublicmemory関数は、指定されたメモリ領域の先頭アドレスを返しS281、動作が終了となる。呼び出し元のタスク29と同じプロセスに属するタスク29は、S281により返されたアドレスと、引数sizeで指定されたメモリ領域をUMPUBLIC状態のメモリ領域として認識することができる。図34は、closeumpublicmemory関数の動作を説明するフローチャートである。タスク29がcloseumpublicmemory関数を呼び出すと、closeumpublicmemory関数は、キャッシュ/メモリ管理部28を用いて、指定されたメモリ領域の内容が載っているL2C24のキャッシュラインのメモリ領域へのライトバックと無効化とを実行するS291。そして、closeumpublicmemory関数は、指定されたメモリ領域の先頭アドレスを返しS292、動作が終了となる。全てのタスク29は、S292により返されたアドレスと、呼び出し元のタスク29により引数sizeで指定されたメモリ領域をUMEXTERNAL状態のメモリ領域として認識することができる。図35は、enterummemoryaccessprotocol関数の動作を説明するフローチャートである。カーネル32がenterummemoryaccessprotocol関数を呼び出すと、enterummemoryaccessprotocol関数は、メモリアロケータ27を用いて、指定されたUNMANAGED状態のメモリ領域をカーネル管理領域31に加えるS301。そして、enterummemoryaccessprotocol関数は、当該カーネル管理領域31に加えられたメモリ領域の先頭アドレスをカーネル32に返しS302、動作が終了となる。カーネル32は、当該カーネル管理領域31に加えられたメモリ領域を未割り当て状態すなわちUMINVALID状態のメモリ領域として認識する。図36は、leaveummemoryaccessprotocol関数の動作を説明するフローチャートである。カーネル32がleaveummemoryaccessprotocol関数を呼び出すと、leaveummemoryaccessprotocol関数は、メモリアロケータ27を用いて、指定されたUMINVALID状態のメモリ領域をカーネル管理領域31から除外するS311。そして、leaveummemoryaccessprotocol関数は、当該カーネル管理領域31から除外したメモリ領域の先頭アドレスをカーネル32に返しS312、動作が終了となる。当該カーネル管理領域31から除外されたメモリ領域はUNMANAGED状態、すなわちカーネル32が管理しない状態となる。次に、以上のように動作する状態遷移関数26を用いてメモリ領域の状態遷移を行う例を説明する。図37は、プロセス内でメモリ領域を共有する場合の状態遷移の例を説明するフローチャートである。初めに、メモリ領域の状態はUNMANAGED状態となっているS321。そして、カーネル32からenterummemoryaccessprotocol関数が呼ばれることにより、当該メモリ領域はUNMANAGED状態からUMINVALID状態に遷移するS322。次に、あるプロセス内の一つのタスク29から、そのプロセス内のタスク29でデータを共有するためにallocateumpublicmemory関数を呼ぶことにより、当該メモリ領域はUMINVALID状態からUMPUBLIC状態に遷移するS323。次に、そのプロセスに属する1つのタスク29は、openumprivatememory関数を呼ぶことにより、当該メモリ領域がUMPRIVATE状態に遷移し、openumprivatememory関数を呼び出したタスク29によってL1C/L2Cでread/writeアクセスされるS324。この間、他のタスク29からのアクセスは許可されないため、アクセスは適切に行われる。アクセスが終了すると、当該メモリ領域は、openumprivatememory関数を呼び出したタスク29によるcloseumprivatememory関数の呼び出しによりUMPUBLIC状態に戻されるS325。この時、L1C22の当該メモリ領域に対応するキャッシュラインは適切にL2C24に書き戻されたのち無効化される。UMPUBLIC状態のメモリに対しては、そのままの状態でのアクセスが禁止される。その後、そのプロセス内の別のタスク29がopenumprotectedmemory関数を呼び出すことによって、当該メモリ領域は、UMPROTECTED状態に遷移し、openumprotectedmemory関数を呼び出したタスク29により、L1C/L2Cのreadアクセスが行われるS326。アクセスが終了すると、openumprotectedmemory関数を呼び出したタスク29によるcloseumprotectedmemory関数の呼び出しにより、当該メモリ領域はUMPUBLIC状態に戻されるS327。この時、L1C22の当該メモリ領域に対応するキャッシュラインは適切に無効化される。そして、同一のプロセス内のタスク29がfreeumpublicmemory関数を呼び出すことによってメモリ開放が行われ、当該メモリ領域はUMINVALID状態に遷移するS328。そして、カーネル32がleavememoryaccessprotocol関数を呼び出して、当該メモリ領域がUNMANAGED状態となりS329、一連の動作が終了となる。図38は、プロセス間でメモリ領域を共有する場合の状態遷移の例を説明するフローチャートである。初めに、メモリ領域の状態は、UNMANAGED状態となっているS331。そして、カーネル32からenterummemoryaccessprotocol関数が呼ばれることにより、当該メモリ領域はUNMANAGED状態からUMINVALID状態に遷移するS332。次に、あるタスク29からプロセス間でデータを共有するためにallocateumexternalmemory関数が呼び出され、当該メモリ領域は、L2C24の対応するキャッシュラインが無効化された後、UMINVALID状態からUMEXTERNAL状態に遷移するS333。この状態ではどのプロセスのどのタスクもアクセスが禁止される。その後、あるプロセスの1つのタスク29が、そのプロセス内の共有目的に占有して使うために、openumpublicmemory関数を呼び出すと、当該メモリ領域はUMPUBLIC状態に遷移するS334。この状態でも依然として、そのプロセス内のすべてのタスクからのアクセスは禁止である。その後、そのプロセス内の一つのタスク29が当該メモリ領域を占有して使うためにopenumprivatememory関数を呼び出すと、当該メモリ領域はUMPRIVATE状態に遷移するS335。この状態ではopenumprivatememory関数の呼び出し元のタスクだけがL1C/L2C仮想アドレスによるread/writeアクセスを許可される。アクセス終了後、openumprivatememory関数の呼び出し元のタスク29がcloseumprivatememory関数を呼ぶと、当該メモリ領域はUMPUBLIC状態に戻されるS336。この時、そのメモリ領域に対応するL1C22のキャッシュラインが適切にL2C24に書き戻されたのち、無効化される。その後、そのプロセス内のタスク29がopenumprotectedmemory関数を呼び出すことによって、当該メモリ領域はUMPROTECTED状態に遷移し、openumprotectedmemory関数の呼び出し元のタスク29によるL1C/L2Cのreadアクセスが行われるS337。アクセスが終了すると、openumprotectedmemory関数の呼び出し元のタスク29による、closeumprotectedmemory関数の呼び出しにより、当該メモリ領域はUMPUBLIC状態に戻されるS338。この時、そのメモリ領域に対応するL1C22のキャッシュラインが適切に無効化される。その後、プロセスによる占有使用が終了すると、そのプロセスの1つのタスク29がcloseumpublicmemory関数を呼び出すことによって、当該メモリ領域はUMEXTERNAL状態に戻されるS339。この時、そのメモリ領域に対応するL2C24のキャッシュラインが適切にメモリ3に書き戻されたのち、無効化される。次に、別のプロセスがそのメモリ領域のアクセスを行うために、そのプロセスの中のいずれかのタスク29がopenumpublicmemory関数を呼び出して、当該メモリ領域をUMPUBLIC状態に遷移させるS340。ただし、UMEXTERNAL状態のメモリを指すアドレスは、プロセス毎に異なるので、その対応は別途管理する必要がある。その後そのプロセス内のタスク29が当該メモリ領域を適宜UMPRIVATE状態、UMPROTECTED状態に遷移させて必要なアクセスを行いS341、アクセスが終了したら、UMPUBLIC状態に戻すS342。プロセスでのアクセスが終了したら、当該プロセスのうちの1つのタスク29はcloseumpublicmemory関数を呼び出して、当該メモリ領域をUMEXTENAL状態に戻すS343。そして、いずれかのタスク29からfreeexternalmemory関数が呼び出されると、メモリ解放が行われ、当該メモリ領域はUMINVALID状態に遷移するS344。そしてカーネル32からleavememoryaccessprotocol関数が呼び出されると、当該メモリ領域はUNMANAGED状態となりS345、動作が終了となる。このように、第2の実施形態によれば、メモリ領域は、L1C/L2Cのアクセスによるread/writeが許可され、1つのタスク29に独占的な使用権が与えられているUMPROVATE状態と、read/writeが禁止され、1つのプロセスに独占的な使用権が与えられているUMPUBLIC状態と、read/writeが禁止され、全てのタスク29すなわち全てのプロセスに使用権が与えられているUMEXTERNAL状態と、を容認する。そして、UMPRIVATE状態とUMPUBLIC状態との間、およびUMPUBLIC状態とUMEXTERNAL状態との間の遷移を行うカーネル部を備え、カーネル部は、UMPRIVATE状態からUMPUBLIC状態に遷移させるとき、対応するL1C22をL2C24にライトバックし、UMPUBLIC状態からUMEXTERNAL状態に遷移させるとき、対応するL2C24を前記メモリ領域にライトバックする、ように構成した。夫々1次キャッシュを備える複数のコアが2次キャッシュを共有してクラスタを形成するマルチコアプロセッサを備えるマルチコアプロセッサシステムにおいて、シャドー領域を持たないメモリ3においても、1次キャッシュ、2次キャッシュ、およびメモリ3の記憶内容の一貫性を保ったまま、タスク29間、プロセス間、およびクラスタ間でメモリ3の当該メモリ領域を共有できるようになる。また、カーネル部は、UMPRIVATE状態、UMPUBLIC状態またはUMEXTERNAL状態と、何れのコア21にも割り当てられていないUMINVALID状態との間で遷移を行うようにしたので、特定のタスク29、特定のプロセス、または全プロセスに対するメモリ領域の割り当てを行うことができる。また、カーネル部は、UMPUBLIC状態と、L1C/L2Cのreadonlyアクセスが許可され、同一のプロセスに属する要求した1以上のタスク29に使用権が与えられているUMPROTECTED状態との間で遷移を行うようにしたので、単一タスクからのメモリ読み出しを高速化することができる。なお、第2の実施形態は、状態遷移関数26に第1の実施形態において説明した1~14の項目の関数を加えることによって、シャドー領域を備えるメモリ領域とシャドー領域を有さないメモリ領域との両方を備えるメモリ3を有するマルチコアプロセッサシステムにも適用することができるようになる。また、第2の実施形態は、夫々複数のコア21を備える複数のクラスタ25を有するマルチコアプロセッサ2だけでなく、複数のコア21を備えるクラスタ25を1つのみ備えるマルチコアプロセッサにも適用することができる。第3の実施形態第2の実施形態で説明したメモリアクセスプロトコルにおいては、プロセス間共有のために利用するメモリについて、UMEXTERNAL状態のままではどのプロセス内のタスクからもアクセスが禁止される。アクセスするためには、いずれかのプロセス内のタスクがUMPUBLIC状態を経て、UMPRIVATE状態もしくはUMPROTECTED状態に遷移させる必要がある。その間、その他のプロセス内のタスクは一切アクセスが許されない。これは、プロセス間で共通に参照したいreadonlyのデータがある場合に、複数のプロセスから同時にアクセスすることが許されないという厳しい制約となる。第3の実施形態は、この制約を緩和するために、第2の実施形態のMAPに更に状態を追加している。なお、第3の実施形態のマルチコアプロセッサシステムの構成は、状態遷移関数26に含まれる関数の内容を除いて第2の実施形態と等しいので、状態遷移関数26に含まれる関数を除く構成についての重複する説明を省略する。図39は、第3の実施形態のMAPを説明する図である。第3の実施形態のMAPは、g~lにおいて説明した第2の実施形態のMAPに、次に説明するUMFROZENEXTERNAL状態が追加されたものとなっている。mUMFROZENEXTERNAL状態この状態は、UMEXTERNAL状態から遷移でき、あるプロセス内のタスクでreadonlyアクセスが可能である。あるプロセスがUMFROZENEXTERNAL状態にしたメモリ領域を対象に、別のプロセスが重ねてUMFROZENEXTERNAL状態に遷移させる事も許される。複数のプロセスがこの状態にしたメモリ領域は、それらすべてのプロセスがUMEXTERNAL状態に戻す動作を行うまで、UMFROZENEXTERNAL状態に留まる。第3の実施形態の状態遷移関数26は、15~28において説明した関数に加えて、さらに次の2つの関数を含んでいる。29freezeumexternalmemoryこれは、先頭アドレスaddr、引数sizeで指定されるUMEXTERNAL状態またはUMFROZENEXTERNAL状態のメモリ領域を呼び出し元のタスク29および当該タスク29と同一のプロセスに属するタスク29がUMFROZENEXTERNAL状態のメモリ領域として使用できるようにする関数である。30meltumfrozenexternalmemoryこれは先頭アドレスaddr、引数sizeで指定されるUMFROZENEXTERNAL状態として使用していたメモリ領域をUMFROZENEXTERNAL状態からUMEXTERNAL状態に戻す関数である。UMFROZENEXTERNAL状態のメモリ領域を使用していたプロセスが複数存在する場合には、当該複数のプロセスの全てからこの関数が呼び出されたとき、対象のメモリ領域がUMFROZENEXTERNAL状態からUMEXTERNAL状態に遷移する。なお、第3の実施形態は、UMFROZENEXTERNAL状態となっているメモリ領域および当該メモリ領域をUMFROZENEXTERNAL状態のメモリ領域として使用中のプロセスの数をタスク29およびカーネル32から認識できるようになっているものとする。一例を挙げると、UMFROZENEXTERNAL状態となっているメモリ領域を特定する情報例えば先頭の物理アドレスおよびサイズと当該メモリ領域をUMFROZENEXTERNAL状態のメモリ領域として使用中のプロセスの識別子の一覧とを対応づけたテーブルがメモリ3内に用意され、当該テーブルはタスク29およびカーネル32から参照される。次に、第3の実施形態の状態遷移関数26に含まれる各関数の動作を説明する。15~28において説明した関数の動作は第2の実施形態と同じであるので説明を省略し、freezeumexternalmemory関数およびmeltumfrozenexternalmemory関数の動作のみを説明する。図40は、freezeumexternalmemory関数の動作を説明するフローチャートである。タスク29がfreezeumexternalmemory関数を呼び出すと、freezeumexternalmemory関数は、指定されたメモリ領域の先頭アドレスを返しS351、動作が終了となる。freezeumexternalmemory関数の呼び出し元のタスク29および当該タスク29と同一のプロセスに属するタスク29は、S351により返されたアドレスと、引数sizeで指定されたメモリ領域をUMFROZENEXTERNAL状態のメモリ領域として使用することができる。図41は、meltumfrozenexternalmemory関数の動作を説明するフローチャートである。タスク29がmeltumfrozenexternalmemory関数を呼び出すと、meltumfrozenexternalmemory関数は、キャッシュ/メモリ管理部28を用いて、指定されたメモリ領域の内容が載っているL1C22のキャッシュラインを無効化するS361。そして、meltumfrozenexternalmemory関数は、指定されたメモリ領域を同一クラスタ25内の他のプロセスが使用しているか否かを判定するS362。同一クラスタ25内に当該メモリ領域を使用しているプロセスが存在しない場合S362、No、meltumfrozenexternalmemory関数は、キャッシュ/メモリ管理部28を用いて、当該指定されたメモリ領域の内容が載っているL2C24のキャッシュラインを無効化しS363、当該指定されたメモリ領域の先頭アドレスを返しS364、動作が終了となる。同一クラスタ25内に当該メモリ領域を使用しているプロセスが存在する場合S362、Yes、S363の動作がスキップされる。全てのタスク29は、S363により返されたアドレスと、引数sizeで指定されたメモリ領域をUMFROZENEXTERNAL状態のメモリ領域として使用しているプロセスが残っていない場合、当該メモリ領域をUMEXTERNAL状態として認識することができる。次に、以上のように動作する状態遷移関数26を用いてメモリ領域の状態遷移を行う例を説明する。図42は、複数のプロセスからreadonlyアクセスをするための状態遷移の例を説明するフローチャートである。図42のS371~S373は、図38のS331~S333と同じ処理が実行される。そして、UMEXTERNAL状態となったメモリ領域を指定して、あるプロセスプロセスAに属するタスク29がfreezeumexternalmemory関数を呼ぶと、当該指定されたメモリ領域はUMFROZENEXTERNAL状態となり、プロセスAに属するすべてのタスク29が当該メモリ領域にreadonlyでアクセスすることが許可されるS374。次いで、プロセスAとは異なるプロセスBに属するタスク29が、当該メモリ領域を指定してfreezeumexternalmemory関数を呼ぶと、プロセスAに加えて、プロセスBに属するすべてのタスク29が当該メモリ領域にreadonlyでアクセスすることが許可されるS375。このメモリ領域を指定する際の仮想アドレスは、プロセス毎に異なる。したがって、プロセス毎の仮想アドレスの対応付けは別途管理が必要である。続いて、プロセスAともプロセスBとも異なるプロセスCに属するタスク29が、当該メモリ領域を指定してfreezeumexternalmemory関数を呼ぶと、プロセスAおよびプロセスBに加えて、プロセスCに属するすべてのタスク29も当該メモリ領域にreadonlyでアクセスすることが許可されるS376。その後、プロセスBがアクセスを終了してプロセスBに属するタスク29がmeltumfrozenexternalmemory関数を呼ぶと、プロセスBに属する全てのタスク29は当該メモリ領域へのアクセスが禁止されるS377。このとき、プロセスBに属するコア21のL1C22から対応するキャッシュラインが無効化される。また、プロセスAおよびプロセスCが共にプロセスBと異なるクラスタ25に属する場合は、L2C24も無効化される。この時点ではプロセスBの他に当該メモリ領域をUMFROZENEXTERNAL状態として使用しているプロセスがあるので、S377の処理の後も当該メモリ領域の状態は依然としてUMFROZENEXTERNAL状態として認識される。続いて、プロセスAがアクセスを終了してプロセスAに属するタスク29がmeltumfrozenexternalmemory関数を呼ぶと、プロセスAに属する全てのタスク29は当該メモリ領域へのアクセスが禁止されるS378。このとき、プロセスAに属するコア21のL1C22から対応するキャッシュラインが無効化される。また、プロセスCがプロセスBと異なるクラスタ25に属する場合は、L2C24も無効化される。この時点ではプロセスAの他に当該メモリ領域をUMFROZENEXTERNAL状態として使用しているプロセスがあるので、S378の処理の後も当該メモリ領域の状態は依然としてUMFROZENEXTERNAL状態として認識される。続いて、プロセスCがアクセスを終了してプロセスCに属するタスク29がmeltumfrozenexternalmemory関数を呼ぶと、プロセスCに属する全てのタスク29は当該メモリ領域へのアクセスが禁止され、他に当該メモリ領域をUMFROZENEXTERNAL状態として使用しているプロセスが無いので、当該メモリ領域はUMEXTERNAL状態に遷移するS379。この際、プロセスCに属するコア21のL1C22およびプロセスCが属するクラスタ25のL2C24から対応するキャッシュラインが無効化される。その後、S344およびS345と同じ処理がS380およびS381において実行され、一連の動作が終了となる。このように、第3の実施形態によれば、要求した1つ以上のプロセスにL1C/L2Cのreadonlyアクセスが許可されるUMFROZENEXTERNAL状態をMAPに加えるようにしたので、シャドー領域を有さないメモリ領域においても、複数のプロセスが同時にキャッシュを利用したreadを行うことができる。したがって、プロセス間でのデータの授受が簡単になる。また、同時に、単一のプロセス内のデータの授受も簡単になる。第4の実施形態第3の実施形態によれば、第2の実施形態のMAPにUMFROZENEXTERNAL状態を加えたるようにしたが、第4の実施形態によれば、第1の実施形態のMAPに同様の状態が追加されて構成されるMAPを備えている。第4の実施形態のマルチコアプロセッサシステムの構成は、状態遷移関数26に含まれる関数の内容を除いて第1の実施形態と等しいので、状態遷移関数26に含まれる関数を除く構成についての重複する説明を省略する。図43は、第4の実施形態のMAPを説明する図である。第4の実施形態のMAPは、a~fにおいて説明した第1の実施形態のMAPに以下に示す状態が追加されたものとなっている。nFROZENEXTERNAL状態この状態は、EXTERNAL状態から遷移でき、あるプロセス内のタスクでL1C/L2Cによるreadonlyアクセスが可能である。あるプロセスがFROZENEXTERNAL状態にしたメモリ領域を対象に、別のプロセスが重ねてFROZENEXTERNAL状態に遷移させる事も許される。複数のプロセスがこの状態にしたメモリ領域は、それらすべてのプロセスがEXTERNAL状態に戻す動作を行うまで、FROZENEXTERNAL状態に留まる。第4の実施形態の状態遷移関数26は、1~14において説明した関数に加えて、さらに次の2つの関数を含んでいる。31freezeexternalmemoryこれは、先頭アドレスaddr、引数sizeで指定されるEXTERNAL状態またはFROZENEXTERNAL状態のメモリ領域を呼び出し元のタスク29および当該タスク29と同一のプロセスに属する他のタスク29がFROZENEXTERNAL状態のメモリ領域として使用できるようにする関数である。32meltfrozenexternalmemoryこれは先頭アドレスaddr、引数sizeで指定されるFROZENEXTERNAL状態として使用していたメモリ領域をFROZENEXTERNAL状態からEXTERNAL状態に戻す関数である。FROZENEXTERNAL状態のメモリ領域を使用していたプロセスが複数存在する場合には、当該複数のプロセスの全てからこの関数が呼び出されたときに、対象のメモリ領域がFROZENEXTERNAL状態からEXTERNAL状態に遷移する。なお、第4の実施形態においても、第3の実施形態と同様に、タスク29およびカーネル32は、FROZENEXTERNAL状態となっているメモリ領域および当該メモリ領域をFROZENEXTERNAL状態のメモリ領域として使用中のプロセスの数を認識できるようになっているものとする。次に、第4の実施形態の状態遷移関数26に含まれる各関数の動作を説明する。ここでは、freezeexternalmemory関数およびmeltfrozenexternalmemory関数の動作をのみ説明する。図44は、freezeexternalmemory関数の動作を説明するフローチャートである。タスク29がfreezeexternalmemory関数を呼び出すと、freezeexternalmemory関数は、指定されたL1UC/L2UC仮想アドレスを対応するL1C/L2C仮想アドレスに変換するS391。そして、freezeexternalmemory関数は、変換後のアドレスを返しS392、動作が終了となる。freezeexternalmemory関数の呼び出し元のタスク29および当該タスク29と同一のプロセスに属する他のタスク29は、S392により返されたアドレスと、引数sizeで指定されたメモリ領域をFROZENEXTERNAL状態のメモリ領域として使用することができる。図45は、meltfrozenexternalmemory関数の動作を説明するフローチャートである。タスク29がmeltfrozenexternalmemory関数を呼び出すと、meltfrozenexternalmemory関数は、キャッシュ/メモリ管理部28を用いて、指定されたメモリ領域の内容が載っているL2C24のキャッシュラインを無効化するS401。そして、meltfrozenexternalmemory関数は、指定されたメモリ領域を同一クラスタ25内の他のプロセスが使用しているか否かを判定するS402。同一クラスタ25内に当該メモリ領域を使用しているプロセスが存在しない場合S402、No、meltfrozenexternalmemory関数は、キャッシュ/メモリ管理部28を用いて、当該指定されたメモリ領域の内容が載っているL2C24のキャッシュラインを無効化するS403。そして、meltfrozenexternalmemory関数は、当該指定されたメモリ領域の先頭アドレスL1C/L2C仮想アドレスを対応するL1UC/L2UC仮想アドレスに変換しS404、変換後のアドレスを返しS405、動作が終了となる。同一クラスタ25内に当該メモリ領域を使用しているプロセスが存在する場合S402、Yes、S403の動作がスキップされる。全てのタスク29は、S405により返されたアドレスと、引数sizeで指定されたメモリ領域をFROZENEXTERNAL状態のメモリ領域として使用しているプロセスが残っていない場合、当該メモリ領域をEXTERNAL状態として認識することができる。次に、以上のように動作する状態遷移関数26を用いてメモリ領域の状態遷移を行う例を説明する。図46は、複数のプロセスからreadonlyアクセスをするための状態遷移の例を説明するフローチャートである。初めに、メモリ領域の状態は、UNMANAGED状態となっているS411。そして、カーネル32からentermemoryaccessprotocol関数が呼ばれることにより、当該メモリ領域はUNMANAGED状態からINVALID状態に遷移するS412。次に、あるタスク29からプロセス間でデータを共有するためにallocateexternalmemory関数が呼び出され、結果として当該メモリ領域は、L2C24の対応するキャッシュラインが無効化された後、INVALID状態からEXTERNAL状態に遷移するS413。この状態ではどのプロセスのどのタスクもL1UC/L2UCのアクセスが許可される。そして、EXTERNAL状態となったメモリ領域を指定して、あるプロセスプロセスAに属するタスク29がfreezeexternalmemory関数を呼ぶと、当該指定されたメモリ領域はFROZENEXTERNAL状態となり、プロセスAに属するすべてのタスク29が当該メモリ領域にL1C/L2Cでreadonlyアクセスを行うことが許可されるS414。プロセスA以外のプロセスに属するタスク29は、L1UC/L2UCのreadonlyアクセスが許可される。次いで、プロセスAとは異なるプロセスBに属するタスク29が、当該メモリ領域を指定してfreezeexternalmemory関数を呼ぶと、プロセスAに加えて、プロセスBに属するすべてのタスク29が当該メモリ領域にL1C/L2Cでreadonlyアクセスを行うことが許可されるS415。このメモリ領域を指定する際の仮想アドレスは、プロセス毎に異なる。したがって、プロセス毎の仮想アドレスの対応付けは別途管理が必要である。続いて、プロセスAともプロセスBとも異なるプロセスCに属するタスク29が、当該メモリ領域を指定してfreezeexternalmemory関数を呼ぶと、プロセスAおよびプロセスBに加えて、プロセスCに属するすべてのタスク29も当該メモリ領域にL1C/L2Cでreadonlyアクセスを行うことが許可されるS416。その後、プロセスBがアクセスを終了してプロセスBに属するタスク29がmeltfrozenexternalmemory関数を呼ぶと、プロセスBに属する全てのタスク29は当該メモリ領域へのL1C/L2Cでのアクセスが禁止され、L1UC/L2UCのreadonlyアクセスが許可されるS417。このとき、プロセスBに属するコア21のL1C22から対応するキャッシュラインが無効化される。また、プロセスAおよびプロセスCが共にプロセスBと異なるクラスタ25に属する場合は、L2C24も無効化される。この時点ではプロセスBの他に当該メモリ領域をFROZENEXTERNAL状態として使用しているプロセスがあるので、S417の処理の後も当該メモリ領域の状態は依然としてFROZENEXTERNAL状態として認識される。続いて、プロセスAがアクセスを終了してプロセスAに属するタスク29がmeltfrozenexternalmemory関数を呼ぶと、プロセスAに属する全てのタスク29は当該メモリ領域へのL1C/L2Cでのアクセスが禁止され、L1UC/L2UCのreadonlyアクセスが許可されるS418。このとき、プロセスAに属するコア21のL1C22から対応するキャッシュラインが無効化される。また、プロセスCがプロセスBと異なるクラスタ25に属する場合は、L2C24も無効化される。この時点ではプロセスAの他に当該メモリ領域をFROZENEXTERNAL状態として使用しているプロセスがあるので、S418の処理の後も当該メモリ領域の状態は依然としてFROZENEXTERNAL状態として認識される。続いて、プロセスCがアクセスを終了してプロセスCに属するタスク29がmeltfrozenexternalmemory関数を呼ぶと、プロセスCに属する全てのタスク29は当該メモリ領域へのL1C/L2Cでのアクセスが禁止され、他に当該メモリ領域をUMFROZENEXTERNAL状態として使用しているプロセスが無いので、当該メモリ領域はEXTERNAL状態に遷移するS419。すなわち、全てのタスク29は、当該メモリ領域へのL1UC/L2UCのread/writeアクセスが許可される。この際、プロセスCに属するコア21のL1C22およびプロセスCが属するクラスタ25のL2C24から対応するキャッシュラインが無効化される。その後、図21のS172およびS173と同じ処理がS420およびS421において実行され、一連の動作が終了となる。このように、第4の実施形態によれば、MAPに、要求した1つ以上のプロセスにL1C/L2Cのreadonlyアクセスが許可されるFROZENEXTERNAL状態を加えるようにしたので、複数のプロセスが同時にL1CおよびL2Cを利用したreadを行うことができる。したがって、プロセス間でのデータの授受を高速に行うことができるようになる。また、同時に、単一のプロセス内のデータの授受も高速に行うことができる。第5の実施形態第5の実施形態によれば、第1の実施形態のMAPに、PUBLIC状態から遷移可能で、同一のプロセスに属するタスクが読み出しアクセスできるFROZENPUBLIC状態が追加されて構成されるMAPを備えている。第5の実施形態のマルチコアプロセッサシステムの構成は、状態遷移関数26に含まれる関数の内容を除いて第1の実施形態と等しいので、状態遷移関数26に含まれる関数を除く構成についての重複する説明を省略する。図47は、第5の実施形態のMAPを説明する図である。第5の実施形態のMAPは、a~fにおいて説明した第1の実施形態のMAPに次に説明するFROZENPUBLIC状態が追加されたものとなっている。oFROZENPUBLIC状態この状態は、PUBLIC状態から遷移でき、同一プロセス内の全てのタスク29でL1C/L2Cによるreadonlyアクセスが可能である。第5の実施形態の状態遷移関数26は、1~14において説明した関数に加えて、さらに次の2つの関数を含んでいる。33freezepublicmemoryこれは、先頭アドレスaddr、引数sizeで指定されるPUBLIC状態のメモリ領域をPUBLIC状態からFROZENPUBLIC状態に遷移させる関数である。PUBLIC状態でアクセスが許可されたプロセスに属するタスク29のみがこの関数を呼び出すことができる。34meltfrozenpublicmemoryこれは先頭アドレスaddr、引数sizeで指定されるFROZENPUBLIC状態のメモリ領域をFROZENPUBLIC状態からPUBLIC状態に遷移させる関数である。次に、第5の実施形態の状態遷移関数26に含まれる各関数の動作を説明する。ここでは、freezepublicmemory関数およびmeltfrozenpublicmemory関数の動作のみを説明する。図48は、freezepublicmemory関数の動作を説明するフローチャートである。PUBLIC状態のメモリ領域を指定して、当該PUBLIC状態のメモリ領域にL1UC/L2Cのread/writeアクセスが許可されたプロセスに属するタスク29が、freezepublicmemory関数を呼び出すと、freezepublicmemory関数は、指定されたメモリ領域の先頭アドレスL1UC/L2C仮想アドレスを対応するL1C/L2C仮想アドレスに変換するS431。そして、freezepublicmemory関数は、変換後のアドレスを返しS432、動作が終了となる。freezepublicmemory関数の呼び出し元のタスク29および当該タスク29と同一のプロセスに属する他のタスク29は、S432により返されたアドレスと、引数sizeで指定されたメモリ領域をFROZENPUBLIC状態のメモリ領域として使用することができる。図49は、meltfrozenpublicmemory関数の動作を説明するフローチャートである。タスク29がmeltfrozenpublicmemory関数を呼び出すと、meltfrozenpublicmemory関数は、キャッシュ/メモリ管理部28を用いて、当該タスク29が属するプロセスが属するL1C22の、指定されたメモリ領域の内容が載っているキャッシュラインを無効化するS441。そして、meltfrozenpublicmemory関数は、指定されたメモリ領域の先頭アドレスL1C/L2C仮想アドレスを対応するL1UC/L2UC仮想アドレスに変換しS442、変換後のアドドレスを返しS443、動作が終了となる。関数の呼び出し元のタスク29および当該タスク29と同一のプロセスに属する他のタスク29は、S443により返されたアドレスと、引数sizeで指定されたメモリ領域をPUBLIC状態のメモリ領域として使用することができる。このように、第5の実施形態によれば、MAPに、同一のプロセスに属するタスクにL1C/L2Cのreadonlyアクセスが許可されるFROZENPUBLIC状態を加えるようにしたので、同一のプロセスに属する複数のタスクが同時にL1CおよびL2Cを利用したreadを行うことができる。したがって、プロセス内のタスク間でのデータの授受を高速に行うことができるようになる。さらに、EXTERNAL状態を経由することなくPUBLIC状態から直接FROZENPUBLIC状態に遷移させることができるので、同一のプロセス内でデータを共有したい場合、第4の実施形態よりもさらに簡単にデータの共有を実現することができるようになる。第6の実施形態第6の実施形態によれば、第2の実施形態のMAPに、UMPUBLIC状態から遷移可能で、同一のプロセスに属するタスクが読み出しアクセスできるUMFROZENPUBLIC状態が追加されて構成されるMAPを備えている。第6の実施形態のマルチコアプロセッサシステムの構成は、状態遷移関数26に含まれる関数の内容を除いて第2の実施形態と等しいので、状態遷移関数26に含まれる関数を除く構成についての重複する説明を省略する。図50は、第6の実施形態のMAPを説明する図である。第5の実施形態のMAPは、g~lにおいて説明した第2の実施形態のMAPに次に説明するUMFROZENPUBLIC状態が追加されたものとなっている。pUMFROZENPUBLIC状態この状態は、UMPUBLIC状態から遷移でき、同一プロセス内の全てのタスク29でL1C/L2Cによるreadonlyアクセスが可能である。第6の実施形態の状態遷移関数26は、15~28において説明した関数に加えて、さらに次の2つの関数を含んでいる。35freezeumpublicmemoryこれは、先頭アドレスaddr、引数sizeで指定されるUMPUBLIC状態のメモリ領域をUMPUBLIC状態からUMFROZENPUBLIC状態に遷移させる関数である。UMPUBLIC状態でアクセスが許可されたプロセスに属するタスク29のみがこの関数を呼び出すことができる。36meltumfrozenpublicmemoryこれは先頭アドレスaddr、引数sizeで指定されるUMFROZENPUBLIC状態のメモリ領域をUMFROZENPUBLIC状態からUMPUBLIC状態に遷移させる関数である。次に、第6の実施形態の状態遷移関数26に含まれる各関数の動作を説明する。ここでは、freezeumpublicmemory関数およびmeltumfrozenpublicmemory関数の動作のみを説明する。図51は、freezeumpublicmemory関数の動作を説明するフローチャートである。UMPUBLIC状態のメモリ領域を指定して、当該UMPUBLIC状態のメモリ領域に対するread/writeアクセスが許可されたプロセスに属するタスク29が、freezeumpublicmemory関数を呼び出すと、freezeumpublicmemory関数は、指定されたメモリ領域の先頭アドレスを返しS451、動作が終了となる。freezeumpublicmemory関数の呼び出し元のタスク29および当該タスク29と同一のプロセスに属する他のタスク29は、S451により返されたアドレスと、引数sizeで指定されたメモリ領域をFROZENUMPUBLIC状態のメモリ領域として使用することができる。図52は、meltumfrozenpublicmemory関数の動作を説明するフローチャートである。タスク29がmeltumfrozenpublicmemory関数を呼び出すと、meltumfrozenpublicmemory関数は、キャッシュ/メモリ管理部28を用いて、指定されたメモリ領域の内容が載っている、当該タスク29が属するプロセスのL1C22のキャッシュラインを無効化するS461。そして、meltumfrozenpublicmemory関数は、指定されたメモリ領域の先頭アドレスを返しS462、動作が終了となる。関数の呼び出し元のタスク29および当該タスク29と同一のプロセスに属する他のタスク29は、S462により返されたアドレスと、引数sizeで指定されたメモリ領域をUMPUBLIC状態のメモリ領域として使用することができる。このように、第6の実施形態によれば、MAPに、同一のプロセスに属するタスクにL1C/L2Cのreadonlyアクセスが許可されるUMFROZENPUBLIC状態を加えるようにしたので、同一のタスクに属する複数のタスクが同時にL1CおよびL2Cを利用したreadを行うことができる。したがって、同一のプロセス内のタスク間でのデータの授受を高速に行うことができるようになる。さらに、UMEXTERNAL状態を経由することなくUMPUBLIC状態から直接UMFROZENPUBLIC状態に遷移させることができるので、1つのプロセス内のタスク間でデータを共有したい場合、第3の実施形態よりもさらに簡単にデータの共有を実現することができるようになる。このように本発明の第1~第6の実施形態によれば、クラスタ型のマルチコアプロセッサシステム1においてキャッシュL1C22、L2C24の一貫性をソフトウェアで維持することができるようになる。本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。