JP2013003793A - マルチコアプロセッサシステムおよびマルチコアプロセッサ - Google Patents
マルチコアプロセッサシステムおよびマルチコアプロセッサ Download PDFInfo
- Publication number
- JP2013003793A JP2013003793A JP2011133546A JP2011133546A JP2013003793A JP 2013003793 A JP2013003793 A JP 2013003793A JP 2011133546 A JP2011133546 A JP 2011133546A JP 2011133546 A JP2011133546 A JP 2011133546A JP 2013003793 A JP2013003793 A JP 2013003793A
- Authority
- JP
- Japan
- Prior art keywords
- state
- memory
- memory area
- core
- function
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Withdrawn
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
- G06F12/0806—Multiuser, multiprocessor or multiprocessing cache systems
- G06F12/0815—Cache consistency protocols
- G06F12/0837—Cache consistency protocols with software control, e.g. non-cacheable data
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Memory System Of A Hierarchy Structure (AREA)
Abstract
【課題】キャッシュの一貫性をソフトウェアで維持することができるクラスタ型のマルチコアプロセッサシステムを得ること。
【解決手段】メモリ領域は、1次キャッシュおよび2次キャッシュをともに使用する第1のアクセスによる読み書きが許可され、1つのタスクに独占的な使用権が与えられている第1の状態と、2次キャッシュのみ使用する第2のアクセスによる読み書きが許可され、1つのプロセスに独占的な使用権が与えられている第2の状態と、キャッシュを使用しない第3のアクセスによる読み書きが許可され、全てのプロセスに使用権が与えられている第3の状態とを容認する。カーネル部は、第1の状態から第2の状態に遷移させるとき、1次キャッシュを2次キャッシュにライトバックし、第2の状態から第3の状態に遷移させるとき、2次キャッシュをメモリ領域にライトバックする。
【選択図】図3
【解決手段】メモリ領域は、1次キャッシュおよび2次キャッシュをともに使用する第1のアクセスによる読み書きが許可され、1つのタスクに独占的な使用権が与えられている第1の状態と、2次キャッシュのみ使用する第2のアクセスによる読み書きが許可され、1つのプロセスに独占的な使用権が与えられている第2の状態と、キャッシュを使用しない第3のアクセスによる読み書きが許可され、全てのプロセスに使用権が与えられている第3の状態とを容認する。カーネル部は、第1の状態から第2の状態に遷移させるとき、1次キャッシュを2次キャッシュにライトバックし、第2の状態から第3の状態に遷移させるとき、2次キャッシュをメモリ領域にライトバックする。
【選択図】図3
Description
本発明の実施形態は、マルチコアプロセッサシステムおよびマルチコアプロセッサに関する。
情報処理の中核となるプロセッサには、常に性能向上が期待されている。処理性能を向上させるためのひとつの手法として、プロセッサコアをクラスタ化することが挙げられる。
また、従来から、チップ面積および消費電力の増加を抑制するために、キャッシュの一貫性を維持する機能をハードウェア機構ではなくソフトウェアで実装する技術の開発が求められている。
坪井芳郎、太田裕、山下高廣著、"東芝の次世代SoC「Venezia」ホモジニアス・マルチコアを採用"、日経エレクトロニクス、日経BP社、2008年6月30日、第981号、p.111、113−114
本発明の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はバスを介して接続されている。なお、夫々の構成要素をバスではなくメッシュなど他のネットワークトポロジーによって夫々接続するように構成してもよい。
図1は、本発明の第1の実施形態のマルチコアプロセッサシステムの構成を示すブロック図である。
マルチコアプロセッサシステム1は、マルチコアプロセッサ2と、メモリ3とを備えている。マルチコアプロセッサ2およびメモリ3はバスを介して接続されている。なお、夫々の構成要素をバスではなくメッシュなど他のネットワークトポロジーによって夫々接続するように構成してもよい。
メモリ3は、例えばRAM(Random Access Memory)により構成される。メモリ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のロード元は、プログラムを予め格納したROM(Read Only Memory)などにより構成される不揮発性メモリ領域や外部記憶装置などであってよい。以下、カーネルプログラム32をカーネル32と略して表現する。
マルチコアプロセッサ2は、コア(プロセッサコア)21を複数備える。夫々のコア21はL1キャッシュ(L1C)22を備えている。また、マルチコアプロセッサ2は、複数(図1では2個)のクラスタ25を備え、夫々のコア21は複数のクラスタ25のうちの何れかに属する。夫々のクラスタ25は、メモリ3側にL2キャッシュ(L2C)24を備えており、L2C24には、同一クラスタ25に属するコア21がクラスタ内バスで共通接続されている。即ち、夫々のコア21は、L1C22およびL2C24の2段のキャッシュを介してメモリ3にアクセスすることができるようになっている。なお、クラスタ内の各構成要素をバスではなくメッシュなどの他のネットワークトポロジーによって夫々接続するように構成してもよい。
また、L1C22とL2C24との間には、仮想アドレスを物理アドレスに変換するアドレス変換ユニット(ATU)23がコア21毎に設けられている。コア21は、アクセス先を特定する情報として仮想アドレスを使用し、L1C22にアクセス先がヒットしなかった場合は当該仮想アドレスがATU23により物理アドレスに変換されてL2C24またはメモリ3に伝達される。
このことは、各コア21のメモリマップは、ATU23によってメモリ3にマッピングすることができるようになっていることを意味する。即ち、ATU23により、同一の物理アドレス空間上のメモリ領域に仮想アドレス空間上の複数のメモリ領域を重複して割り当てることができることができる。第1の実施形態においては、物理アドレス空間上のメモリ領域に仮想アドレス空間上の複数のメモリ領域を重複して割り当てて、当該重複して割り当てられた仮想アドレス空間上の複数のメモリ領域のうちのどのメモリ領域にアクセスするかによって当該アクセスにキャッシュ(L1C22、L2C24)を使用するか否かを選択できるようになっている。
図2は、ATU23によるメモリマッピングの一例を説明する図である。なお、ここでは、説明を簡単にするために、メモリマッピングの対象コアは2個とし、2個のコア21を区別するために符号の後にアルファベットの添え字a、bを付すこととする。
図示するように、コア21aのATU23は、コア21aの仮想アドレス0x0000_0000〜0x3FFF_FFFFを、物理アドレス0x0000_0000〜0x3FFF_FFFFにL1C22、L2C24の双方を経由する設定(以下L1C/L2Cと表記する)でマッピングし、仮想アドレス0x4000_0000〜0x7FFFF_FFFFを同じ物理アドレス0x0000_0000〜0x3FFFF_FFFFに、L1C22を経由せず、かつL2C24を経由する設定(以下L1UC/L2Cと表記する)でマッピングしている。また、クラスタ25間で共有するメモリ領域として、仮想アドレス0x8000_0000〜0x8FFF_FFFFまでを物理アドレス0xA000_0000〜0xAFFF_FFFFにL1C/L2Cでマッピングし、仮想アドレス0x9000_0000〜0x9FFF_FFFFまでを同じ物理アドレス0xA000_0000〜0xAFFF_FFFFにL1UC/L2Cでマッピングし、仮想アドレス0xA000_0000〜0xaFFF_FFFFまでを同じ物理アドレス0xA000_0000〜0xAFFF_FFFFに、L1C22、L2C24の双方を経由しない設定(以下L1UC/L2UCと表記する)でマッピングしている。
また、コア21bのATU23は、コア21bの仮想アドレス0x0000_0000〜0x5FFF_FFFFを、物理アドレス0x4000_0000〜0x9FFF_FFFFにL1C/L2Cでマッピングし、仮想アドレス0x6000_0000〜0xBFFF_FFFFを同じ物理アドレス0x4000_0000〜0x9FFFF_FFFFに、L1UC/L2Cでマッピングしている。また、クラスタ25間で共有するメモリ領域として、仮想アドレス0xC000_0000〜0xCFFF_FFFFまでを物理アドレス0xA000_0000〜0xAFFF_FFFFにL1C/L2Cでマッピングし、仮想アドレス0xD000_0000〜0xDFFF_FFFFまでを同じ物理アドレス0xA000_0000〜0xAFFF_FFFFにL1UC/L2Cでマッピングし、仮想アドレス0xE000_0000〜0xEFFF_FFFFまでを同じ物理アドレス0xA000_0000〜0xAFFF_FFFFに、L1UC/L2UCでマッピングしている。
物理アドレス0xA000_0000〜0xAFFF_FFFFのメモリ領域には、コア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)の一貫性を保つために、次に説明するメモリアクセスプロトコル(Memory Access Protocol;MAP)が定義されている。
図3は、第1の実施形態のMAPを説明する図である。図示するように、第1の実施形態のMAPによれば、INVALID状態、PRIVATE状態、PUBLIC状態、PROTECTED状態、EXTERNAL状態、およびUNMANAGED状態の、6つの属性が定義されている。
(a)INVALID状態
この状態は、タスクに対するメモリ領域の割り当てが可能である。割り当て前、および解放後のメモリ領域がこの状態に属する。この状態のメモリ領域にはタスクからは一切アクセスできない。
(b)PRIVATE状態
この状態は、この状態に遷移させたタスクのみがL1C/L2Cでのread/writeアクセスを許可されている。このアクセスは、L1C/L2Cで物理メモリにマッピングされた仮想アドレスに対して行うことにより実現される。
(c)PUBLIC状態
この状態は、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をまたぐことはできないものとする。
(d)PROTECTED状態
この状態は、同一のプロセスに属するこの状態に遷移させる要求を行った1以上のタスクがL1C/L2Cでのreadアクセスを許可されている。この状態のメモリ領域にはwriteアクセスは一切出来ない。
(e)EXTERNAL状態
この状態は、クラスタ25をまたぐ全てのタスクがL1UC/L2UCでのread/writeアクセスを許可されている。このアクセスは、L1UC/L2UCで物理メモリにマッピングされた仮想アドレスに対して行うことにより実現される。
(f)UNMANAGED状態
この状態は、カーネル32の管理下にない状態、すなわちメモリ3が備えるメモリ領域のうちのカーネル管理領域31を除く部分である。カーネル32はこの状態のメモリ領域におけるキャッシュの一貫性を管理しないため、このメモリ領域をタスクが利用する場合は、キャッシュの一貫性をタスク側で責任を持って保たなければならない。
(a)INVALID状態
この状態は、タスクに対するメモリ領域の割り当てが可能である。割り当て前、および解放後のメモリ領域がこの状態に属する。この状態のメモリ領域にはタスクからは一切アクセスできない。
(b)PRIVATE状態
この状態は、この状態に遷移させたタスクのみがL1C/L2Cでのread/writeアクセスを許可されている。このアクセスは、L1C/L2Cで物理メモリにマッピングされた仮想アドレスに対して行うことにより実現される。
(c)PUBLIC状態
この状態は、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をまたぐことはできないものとする。
(d)PROTECTED状態
この状態は、同一のプロセスに属するこの状態に遷移させる要求を行った1以上のタスクがL1C/L2Cでのreadアクセスを許可されている。この状態のメモリ領域にはwriteアクセスは一切出来ない。
(e)EXTERNAL状態
この状態は、クラスタ25をまたぐ全てのタスクがL1UC/L2UCでのread/writeアクセスを許可されている。このアクセスは、L1UC/L2UCで物理メモリにマッピングされた仮想アドレスに対して行うことにより実現される。
(f)UNMANAGED状態
この状態は、カーネル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における各状態間の遷移を行うためのAPI(Application Programming Interface)であって、メモリアロケータ27およびキャッシュ/メモリ管理部28と協働してカーネル部として機能する。状態遷移関数26は、次に示す14個の関数を含む。
(1)allocate_private_memory(size_t size)
これは、INVALID状態のメモリ領域から引数“size”で指定されるPRIVATE状態のメモリ領域を確保する関数である。
(2)free_private_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるPRIVATE状態のメモリ領域を解放する関数である。この関数により解放されたメモリ領域はINVALID状態となる。
(3)allocate_public_memory(size_t size)
これは、INVALID状態のメモリ領域から引数“size”で指定されるPUBLIC状態のメモリ領域を確保する関数である。
(4)free_public_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるPUBLIC状態のメモリ領域を解放する関数である。この関数により解放されたメモリ領域はINVALID状態となる。
(5)allocate_external_memory(size_t size)
これは、INVALID状態のメモリ領域から引数“size”で指定される引数のEXTERNAL状態のメモリ領域を確保する関数である。
(6)free_external_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるEXTERNAL状態のメモリ領域を解放する関数である。この関数により解放されたメモリ領域はINVALID状態となる。
(7)open_private_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるPUBLIC状態のメモリ領域をからPUBLIC状態からPRIVATE状態に遷移させる関数である。
(8)close_private_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるPRIVATE状態のメモリ領域をPRIVATE状態からPUBLIC状態に遷移させる関数である。
(9)open_protected_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるPUBLIC状態のメモリ領域をPUBLIC状態からPROTECTED状態に遷移させる関数である。
(10)close_protected_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるPROTECTED状態のメモリ領域をPROTECTED状態からPUBLIC状態に遷移させる関数である。
(11)open_public_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるEXTERNAL状態のメモリ領域をEXTERNAL状態からPUBLIC状態に遷移させる関数である。
(12)close_public_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるPUBLIC状態のメモリ領域をPUBLIC状態からEXTERNAL状態に遷移させる関数である。
(13)enter_memory_access_protocol(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUNMANAGED状態のメモリ領域をUNMANAGED状態からINVALID状態に遷移させる関数である。
(14)leave_memory_access_protocol(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるINVALID状態のメモリ領域をINVALID状態からUNMANAGED状態に遷移させる関数である。
これは、INVALID状態のメモリ領域から引数“size”で指定されるPRIVATE状態のメモリ領域を確保する関数である。
(2)free_private_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるPRIVATE状態のメモリ領域を解放する関数である。この関数により解放されたメモリ領域はINVALID状態となる。
(3)allocate_public_memory(size_t size)
これは、INVALID状態のメモリ領域から引数“size”で指定されるPUBLIC状態のメモリ領域を確保する関数である。
(4)free_public_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるPUBLIC状態のメモリ領域を解放する関数である。この関数により解放されたメモリ領域はINVALID状態となる。
(5)allocate_external_memory(size_t size)
これは、INVALID状態のメモリ領域から引数“size”で指定される引数のEXTERNAL状態のメモリ領域を確保する関数である。
(6)free_external_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるEXTERNAL状態のメモリ領域を解放する関数である。この関数により解放されたメモリ領域はINVALID状態となる。
(7)open_private_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるPUBLIC状態のメモリ領域をからPUBLIC状態からPRIVATE状態に遷移させる関数である。
(8)close_private_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるPRIVATE状態のメモリ領域をPRIVATE状態からPUBLIC状態に遷移させる関数である。
(9)open_protected_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるPUBLIC状態のメモリ領域をPUBLIC状態からPROTECTED状態に遷移させる関数である。
(10)close_protected_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるPROTECTED状態のメモリ領域をPROTECTED状態からPUBLIC状態に遷移させる関数である。
(11)open_public_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるEXTERNAL状態のメモリ領域をEXTERNAL状態からPUBLIC状態に遷移させる関数である。
(12)close_public_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるPUBLIC状態のメモリ領域をPUBLIC状態からEXTERNAL状態に遷移させる関数である。
(13)enter_memory_access_protocol(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUNMANAGED状態のメモリ領域をUNMANAGED状態からINVALID状態に遷移させる関数である。
(14)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)は、タスク29により呼び出され、enter関数(enter_memory_access_protocol)およびleave関数(leave_memory_access_protocol)はカーネル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は、allocate_private_memory関数の動作を説明するフローチャートである。タスク29がallocate_private_memoryを呼び出すと、allocate_private_memory関数は、メモリアロケータ27を用いて、INVALID状態のメモリ領域のうちから引数“size”で指定されたサイズの連続したメモリ領域を割り当て可能か否かを判定する(S1)。連続したINVALID状態の領域がなく、メモリ領域の割り当てが可能でない場合(S1、No)、allocate_private_memory関数はNULLを返し(S2)、動作が終了となる。メモリ領域の割り当てが可能である場合(S1、Yes)、allocate_private_memory関数は、メモリ領域をメモリアロケータ27を用いて呼び出し元のタスク29に割り当てて(S3)、割り当てられたメモリ領域の先頭アドレスをタスク29に返し(S4)、動作が終了となる。呼び出し元のタスク29は、S4により返されたアドレスと、引数“size”で指定されたメモリ領域をPRIVATE状態のメモリ領域として認識することができる。
図7は、free_private_memory関数の動作を説明するフローチャートである。タスク29がfree_private_memory関数を呼び出すと、free_private_memory関数は、キャッシュ/メモリ管理部28を用いて、L1C22のうちの、先頭アドレス“addr”、引数“size”で指定されたメモリ領域が載っているキャッシュラインを無効化する(S11)。そして、free_private_memory関数は、メモリアロケータ27を用いて、先頭アドレス“addr”、引数“size”で指定されたメモリ領域を解放し(S12)、動作が終了となる。
図8は、allocate_public_memory関数の動作を説明するフローチャートである。タスク29がallocate_public_memory関数を呼び出すと、allocate_public_memory関数は、INVALID状態のメモリ領域のうちから引数“size”で指定されたサイズの連続したメモリ領域を割り当て可能か否かを判定する(S21)。メモリ領域の割り当てが可能でない場合(S21、No)、allocate_public_memory関数はNULLを返し(S22)、動作が終了となる。メモリ領域の割り当てが可能である場合(S21、Yes)、allocate_public_memory関数は、メモリアロケータ27を用いてメモリ領域を呼び出し元のタスク29に割り当てて(S22)、当該割り当てられたメモリ領域の先頭アドレスをL1UC/L2C仮想アドレスに変換し(S24)、変換後のアドレスをタスク29に返す(S25)。そして、動作が終了となる。呼び出し元のタスク29と同じプロセスに属する他のタスク29は、S25により返されたアドレスと、引数“size”で指定されたメモリ領域をPUBLIC状態のメモリ領域として認識することができる。
図9は、free_public_memory関数の動作を説明するフローチャートである。タスク29がfree_public_memory関数を呼び出すと、free_public_memory関数は、指定されたアドレス“addr”(L1UC/L2C仮想アドレス)を、対応するL1C/L2C仮想アドレスに変換する(S31)。そして、free_public_memory関数は、キャッシュ/メモリ管理部28を用いて、変換後のアドレスを先頭とし、引数“size”で指定されたメモリ領域を解放し(S32)、動作が終了となる。
図10は、allocate_external_memory関数の動作を説明するフローチャートである。タスクがallocate_external_memory関数を呼び出すと、allocate_external_memory関数は、INVALID状態のメモリ領域のうちから引数“size”で指定されたサイズの連続したメモリ領域を割り当て可能か否かを判定する(S41)。メモリ領域の割り当てが可能でない場合(S41、No)、allocate_external_memory関数はNULLを返し(S42)、動作が終了となる。メモリ領域の割り当てが可能である場合(S41、Yes)、allocate_external_memory関数は、メモリアロケータ27を用いてメモリ領域を呼び出し元のタスク29に割り当てて(S43)、キャッシュ/メモリ管理部28を用いて、L2C24における当該割り当てられたメモリ領域が載っているキャッシュラインを無効化する(S44)。そして、allocate_external_memory関数は、当該割り当てられたメモリ領域の先頭アドレスをL1UC/L2UC仮想アドレスに変換し(S45)、変換後のアドレスをタスク29に返す(S46)。そして、動作が終了となる。全てのタスク29は、S46により返されたアドレスと、呼び出し元のタスク29により引数“size”で指定されたメモリ領域をEXTERNAL状態のメモリ領域として認識することができる。
なお、呼び出し元のタスク29は、S46により返されたアドレスおよび指定された引数“size”を同一のプロセスに属する他のタスク29および他のプロセスに属するタスク29に通知することによって、全てのタスク29が当該メモリ領域をEXTERNAL状態として認識できるようにしてもよい。また、プロセス間ではATU23のマッピングの設定が異なるため、プロセス間を跨いでアドレスを授受する際に当該アドレスを変換する必要があるが、どのような方法で当該変換を行うようにしてもよい。
図11は、free_external_memory関数の動作を説明するフローチャートである。タスク29がfree_external_memory関数を呼び出すと、free_external_memory関数は、指定されたアドレス“addr”(L1UC/L2UC仮想アドレス)を、対応するL1C/L2C仮想アドレスに変換する(S51)。そして、free_external_memory関数は、メモリアロケータ27を用いて、変換後のアドレスを先頭とし、引数“size”で指定されたメモリ領域を解放し(S52)、動作が終了となる。
図12は、open_private_memory関数の動作を説明するフローチャートである。タスク29がopen_private_memory関数を呼び出すと、open_private_memory関数は、指定されたアドレス“addr”(L1UC/L2C仮想アドレス)を、対応するL1C/L2C仮想アドレスに変換する(S61)。そして、open_private_memory関数は、変換後のアドレスをタスク29に返し(S62)、動作が終了となる。呼び出し元のタスク29は、S62により返されたアドレスと、引数“size”で指定されたメモリ領域をPRIVATE状態のメモリ領域として認識することができる。
図13は、close_private_memory関数の動作を説明するフローチャートである。タスク29がclose_private_memory関数を呼び出すと、close_private_memory関数は、キャッシュ/メモリ管理部28を用いて、指定されたメモリ領域が載っているL1C22のキャッシュラインを無効化して内容をL2C24にライトバックする(S71)。そして、close_private_memory関数は、指定されたアドレス“addr”(L1C/L2C仮想アドレス)を、対応するL1UC/L2C仮想アドレスに変換し(S72)、変換後のアドレスを返し(S73)、動作が終了となる。呼び出し元のタスク29と同じプロセスに属するタスク29は、S73により返されたアドレスと、引数“size”で指定されたメモリ領域をPUBLIC状態のメモリ領域として認識することができる。
図14は、open_protected_memory関数の動作を説明するフローチャートである。タスク29がopen_protected_memory関数を呼び出すと、open_protected_memory関数は、指定されたアドレス“addr”(L1UC/L2C仮想アドレス)を、対応するL1C/L2C仮想アドレスに変換する(S81)。そして、open_protected_memory関数は、変換後のアドレスを返し(S82)、動作が終了となる。呼び出し元のタスク29と同じプロセスに属するタスク29は、S82により返されたアドレスと、引数“size”で指定されたメモリ領域をPUBLIC状態のメモリ領域として認識することができる。
図15は、close_protected_memory関数の動作を説明するフローチャートである。タスク29がclose_protected_memory関数を呼び出すと、close_protected_memory関数は、キャッシュ/メモリ管理部28を用いて、先頭アドレス“addr”、引数“size”で指定されたメモリ領域が載っているL1C22のキャッシュラインを無効化する(S91)。そして、close_protected_memory関数は、指定されたアドレス“addr”(L1C/L2C仮想アドレス)を、対応するL1UC/L2C仮想アドレスに変換する(S92)。そして、close_protected_memory関数は、変換後のアドレスを返し(S93)、動作が終了となる。呼び出し元のタスク29と同じプロセスに属するタスク29は、S93により返されたアドレスと、引数“size”で指定されたメモリ領域をPUBLIC状態のメモリ領域として認識することができる。
図16は、open_public_memory関数の動作を説明するフローチャートである。タスク29がopen_public_memory関数を呼び出すと、open_public_memory関数は、指定されたアドレス“addr”(L1UC/L2UC仮想アドレス)を、対応するL1UC/L2C仮想アドレスに変換する(S101)。その後、open_public_memory関数は、変換後のアドレスを返し(S102)、動作が終了となる。呼び出し元のタスク29と同じプロセスに属するタスク29は、S102により返されたアドレスと、引数“size”で指定されたメモリ領域をPUBLIC状態のメモリ領域として認識することができる。
図17は、close_public_memory関数の動作を説明するフローチャートである。タスク29がclose_public_memory関数を呼び出すと、close_public_memory関数は、キャッシュ/メモリ管理部28を用いて、先頭アドレス“addr”、引数“size”で指定されたメモリ領域が載っているL2C24のキャッシュラインに対し、内容のメモリ領域へのライトバックと無効化とを実行する(S111)。そして、close_public_memory関数は、指定されたアドレス“addr”(L1UC/L2C仮想アドレス)を、対応するL1UC/L2UC仮想アドレスに変換する(S112)。そして、close_public_memory関数は、変換後のアドレスを返し(S113)、動作が終了となる。全てのタスク29は、S113により返されたアドレスと、呼び出し元のタスク29により引数“size”で指定されたメモリ領域をEXTERNAL状態のメモリ領域として認識することができる。
図18は、enter_memory_access_protocol関数の動作を説明するフローチャートである。カーネル32がenter_memory_access_protocol関数を呼び出すと、enter_memory_access_protocol関数は、メモリアロケータ27を用いて、先頭アドレス“addr”、引数“size”で指定されたUNMANAGED状態のメモリ領域をカーネル管理領域31に加える(S121)。そして、enter_memory_access_protocol関数は、当該カーネル管理領域31に加えられたメモリ領域の先頭アドレスをカーネル32に返し(S122)、動作が終了となる。カーネル32は、当該カーネル管理領域31に加えられたメモリ領域を未割り当て状態(すなわちINVALID状態)のメモリ領域として認識する。
図19は、leave_memory_access_protocol関数の動作を説明するフローチャートである。カーネル32がleave_memory_access_protocol関数を呼び出すと、leave_memory_access_protocol関数は、メモリアロケータ27を用いて、先頭アドレス“addr”、引数“size”で指定されたINVALID状態のメモリ領域をカーネル管理領域31から除外する(S131)。そして、leave_memory_access_protocol関数は、当該カーネル管理領域31から除外したメモリ領域の先頭アドレスをカーネル32に返し(S132)、動作が終了となる。当該カーネル管理領域31から除外されたメモリ領域はUNMANAGED状態、すなわちカーネル32が管理しない状態となる。
次に、以上のように動作する状態遷移関数26を用いてメモリ領域の状態遷移を行う例を説明する。図20は、プロセス内でメモリ領域を共有する場合の状態遷移の例を説明するフローチャートである。
初めに、メモリ領域の状態は、UNMANAGED状態となっている(S141)。そして、カーネル32からenter_memory_access_protocol関数が呼ばれることにより、当該メモリ領域はUNMANAGED状態からINVALID状態に遷移する(S142)。次に、あるプロセス内のタスク29間でデータを共有するために、そのプロセス内の1つのタスク29からallocate_public_memory関数が呼び出され、当該メモリ領域がINVALID状態からPUBLIC状態に遷移する(S143)。次に、そのプロセス内の1つのタスク29がopen_private_memory関数を呼ぶことにより、当該メモリ領域はPRIVATE状態に遷移して、当該open_private_memory関数の読み出し元のタスク29によりL1C/L2Cでread/writeアクセスされる(S144)。この間、他のタスク29からのアクセスは許可されないため、アクセスは適切に行われる。
アクセスが終了すると、open_private_memory関数の呼び出し元のタスク29によるclose_private_memoyty関数の呼び出しにより、当該メモリ領域はPUBLIC状態に戻される(S145)。この時、そのメモリ領域に対応するL1C22のキャッシュラインは適切にL2C24に書き戻されたのち無効化される。PUBLIC状態となった当該メモリ領域に対しては、L1UC/L2C仮想アドレスによってプロセス内のどのタスク29もread/writeが許される(S146)。その後、そのプロセス内のタスク29がopen_protected_memory関数を呼び出すことによって、当該メモリ領域がPROTECTED状態に遷移され、open_protected_memory関数の呼び出し元のタスク29によるL1C/L2Cのreadアクセスが行われる(S147)。アクセスが終了すると、open_protected_memory関数を呼び出したタスク29によるclose_protected_memory関数の呼び出しにより、当該メモリ領域はPUBLIC状態に戻される(S148)。この時、そのメモリ領域に対応するL1C22のキャッシュラインは適切に無効化される。
そして、同一のプロセス内のタスク29がfree_public_memory関数を呼び出すことによって、当該メモリ領域はINVALID状態に遷移する(S149)。そして、カーネル32がleave_memory_access_protocol関数を呼び出して、当該メモリ領域がUNMANAGED状態となり(S150)、一連の動作が終了となる。
図21は、プロセス間でメモリ領域を共有する場合の状態遷移の例を説明するフローチャートである。初めに、メモリ領域の状態は、UNMANAGED状態となっている(S161)。そして、カーネル32からenter_memory_access_protocol関数が呼ばれることにより、当該メモリ領域はUNMANAGED状態からINVALID状態に遷移する(S162)。次に、あるタスク29からプロセス間でデータを共有するためにallocate_external_memory関数が呼び出され、当該メモリ領域は、L2C24の対応するキャッシュラインが無効化された後、INVALID状態からEXTERNAL状態に遷移する(S163)。この状態ではどのプロセスのどのタスクもL1UC/L2UC仮想アドレスによってread/writeアクセスが許される(S164)。ただし、そのアクセスに使用するL1UC/L2UC仮想アドレスは、前述したように、プロセスごとに異なる。
その後、あるプロセスの1つのタスク29が、そのプロセス内の共有目的に占有して使うために、open_public_memory関数を呼び出すと、当該メモリ領域はPUBLIC状態に遷移する(S165)。この状態では、open_public_memory関数の呼び出し元のタスク29が属するプロセス内のすべてのタスク29がL1UC/L2C仮想アドレスによるread/writeアクセスを許される(S166)。その後、そのプロセス内の1つのタスク29が当該メモリ領域を占有して使うためにopen_private_memory関数を呼び出すと、当該メモリ領域はPRIVATE状態に遷移する(S167)。この状態では、open_private_memory関数の呼び出し元のタスク29だけがL1C/L2C仮想アドレスによるread/writeアクセスを許可される。アクセス終了後、open_private_memory関数の呼び出し元のタスク29がclose_private_memory関数を呼ぶと、当該メモリ領域はPUBLIC状態に戻される(S168)。この時、そのメモリ領域に対応するL1C22のキャッシュラインが適切にL2C24に書き戻されたのち、無効化される。
その後、そのプロセス内のタスク29がopen_protected_memory関数を呼び出すことによって、当該メモリ領域はPROTECTED状態に遷移し、open_protected_memory関数の呼び出し元のタスク29によるL1C/L2Cのreadアクセスが行われる(S169)。アクセスが終了すると、open_protected_memory関数の呼び出し元のタスク29によるclose_protected_memory関数の呼び出しにより、当該メモリ領域はPUBLIC状態に戻される(S170)。この時、そのメモリ領域に対応するL1C22のキャッシュラインが適切に無効化される。
その後、プロセスによる占有使用が終了すると、そのプロセスの1つのタスク29がclose_public_memory関数を呼び出すことによって、当該メモリ領域はEXTERNAL状態に戻される(S171)。この時、そのメモリ領域に対応するL2C24のキャッシュラインが適切にメモリ3に書き戻されたのち、無効化される。そして、いずれかのタスクからfree_external_memory関数が呼び出されると、当該メモリ領域はINVALID状態に遷移する(S172)。そしてカーネル32からleave_memory_access_protocol関数が呼び出されると、当該メモリ領域は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キャッシュを有効としたアクセスしか許可されない物理メモリ領域においてキャッシュの一貫性を保つことができる。
第1の実施形態によれば、シャドー領域を持つ物理メモリ領域においてキャッシュの一貫性を保つことができるようになる。これに対して、第2の実施形態によれば、シャドー領域を持たず、アクセスする際にはL1キャッシュおよびL2キャッシュを有効としたアクセスしか許可されない物理メモリ領域においてキャッシュの一貫性を保つことができる。
なお、第2の実施形態のマルチコアプロセッサシステムの構成は、状態遷移関数26に含まれる関数の内容を除いて第1の実施形態と等しいので、状態遷移関数26に含まれる関数を除く構成についての重複する説明を省略する。
図22は、第2の実施形態のMAPを説明する図である。第2の実施形態のMAPによれば、UM_INVALID状態、UM_PRIVATE状態、UM_PUBLIC状態、UM_PROTECTED状態、UM_EXTERNAL状態、およびUNMANAGED状態の、6つの属性が定義されている。
(g)UM_INVALID状態
この状態は、カーネル32によるメモリ領域の割り当てが可能である。メモリ割り当て前、メモリ解放後のメモリ領域がこの状態に属する。タスクからは一切アクセスできない。
(h)UM_PRIVATE状態
この状態は、この状態に遷移させたタスクのみがL1C/L2Cでのread/writeアクセスを許可される。このアクセスは、L1C/L2Cで物理メモリ領域にマッピングされた仮想アドレスに対して行うことにより実現される。
(i)UM_PUBLIC状態
この状態は、ATU23のマッピングの設定が同一のタスク間、すなわち同一のプロセスに属するタスク間でデータを共有している。ただし、この状態のメモリ領域に対して直接アクセスすることは許されない。同一のプロセスに属するタスクのみ、この状態のメモリをUM_PRIVATE状態もしくはUM_PROTECTED状態に遷移させた後に、アクセスが許される。
(j)UM_PROTECTED状態
この状態は、同一のプロセスに属するこの状態に遷移させる要求を行った1以上のタスクがL1C/L2Cでのreadアクセスを許可されている。この状態のメモリ領域に対するwriteアクセスは許されない。
(k)UM_EXTERNAL状態
この状態は、すべてのタスクがデータを共有している。ただし、この状態のメモリ領域に対して直接アクセスすることは許されない。タスクは、UM_PUBLIC状態に遷移させた後、そのタスクと同じメモリアドレスマッピングを持つタスクがUM_PRIVATE状態、もしくはUM_PUBLIC状態に遷移させた後に、アクセスが許される。
(l)UNMANAGED状態
この状態は、第1の実施形態における同名の状態と同じである。
(g)UM_INVALID状態
この状態は、カーネル32によるメモリ領域の割り当てが可能である。メモリ割り当て前、メモリ解放後のメモリ領域がこの状態に属する。タスクからは一切アクセスできない。
(h)UM_PRIVATE状態
この状態は、この状態に遷移させたタスクのみがL1C/L2Cでのread/writeアクセスを許可される。このアクセスは、L1C/L2Cで物理メモリ領域にマッピングされた仮想アドレスに対して行うことにより実現される。
(i)UM_PUBLIC状態
この状態は、ATU23のマッピングの設定が同一のタスク間、すなわち同一のプロセスに属するタスク間でデータを共有している。ただし、この状態のメモリ領域に対して直接アクセスすることは許されない。同一のプロセスに属するタスクのみ、この状態のメモリをUM_PRIVATE状態もしくはUM_PROTECTED状態に遷移させた後に、アクセスが許される。
(j)UM_PROTECTED状態
この状態は、同一のプロセスに属するこの状態に遷移させる要求を行った1以上のタスクがL1C/L2Cでのreadアクセスを許可されている。この状態のメモリ領域に対するwriteアクセスは許されない。
(k)UM_EXTERNAL状態
この状態は、すべてのタスクがデータを共有している。ただし、この状態のメモリ領域に対して直接アクセスすることは許されない。タスクは、UM_PUBLIC状態に遷移させた後、そのタスクと同じメモリアドレスマッピングを持つタスクがUM_PRIVATE状態、もしくはUM_PUBLIC状態に遷移させた後に、アクセスが許される。
(l)UNMANAGED状態
この状態は、第1の実施形態における同名の状態と同じである。
カーネル管理領域31に含まれるメモリ領域は、UM_INVALID状態、UM_PRIVATE状態、UM_PUBLIC状態、UM_PROTECTED状態、またはUM_EXTERNAL状態のうちの何れか1つの状態となっている。UM_INVALID状態は、UM_PUBLIC状態との間、UM_PRIVATE状態との間、およびUM_EXTERNAL状態との間で相互に遷移することができる。また、UM_PUBLIC状態は、UM_PRIVATE状態との間、UM_EXTERNAL状態との間、およびUM_PROTECTED状態との間で相互に遷移することができる。カーネル管理領域31内では、UM_INVALID状態、UM_PRIVATE状態、UM_PUBLIC状態、UM_PROTECTED状態またはUM_EXTERNAL状態の定義に基づくメモリアクセスおよび状態間の遷移ルールが守られることにより、キャッシュの一貫性が保たれる。
なお、第2の実施形態においても、UNMANAGED状態とUM_INVALID状態との間が遷移可能となっており、これによりカーネル管理領域31を動的に増減させることができる。
第2の実施形態の状態遷移関数26は、上述に定義される各状態間の遷移を行うためのAPI(Application Programming Interface)である。状態遷移関数26は、次に示す14個の関数を含む。
(15)allocate_um_private_memory(size_t size)
これは、引数“size”で指定されるUM_PRIVATE状態のメモリ領域を確保する関数である。
(16)free_um_private_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_PRIVATE状態のメモリ領域を解放する関数である。
(17)allocate_um_public_memory(size_t size)
これは、引数“size”で指定されるのUM_PUBLIC状態のメモリ領域を確保する関数である。
(18)free_um_public_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_PUBLIC状態のメモリ領域を解放する関数である。
(19)allocate_um_external_memory(size_t size)
これは、引数“size”で指定されるのUM_EXTERNAL状態のメモリ領域を確保する関数である。
(20)free_um_external_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_EXTERNAL状態のメモリ領域を解放する関数である。
(21)open_um_private_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_PUBLIC状態のメモリ領域をUM_PUBLIC状態からUN_PRIVATE状態に遷移させる関数である。
(22)close_um_private_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_PRIVATE状態のメモリ領域をUM_PRIVATE状態からUM_PUBLIC状態に遷移させる関数である。
(23)open_um_protected_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_PUBLIC状態のメモリ領域をUM_PUBLIC状態からUM_PROTECTED状態に遷移させる関数である。
(24)close_um_protected_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_PROTECTED状態のメモリ領域をUM_PROTECTED状態からUM_PUBLIC状態に遷移させる関数である。
(25)open_um_public_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_EXTERNAL状態のメモリ領域をUM_EXTERNAL状態からUM_PUBLIC状態に遷移させる関数である。
(26)close_um_public_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_PUBLIC状態のメモリ領域をUM_PUBLIC状態からUM_EXTERNAL状態に遷移させる関数である。
(27)enter_um_memory_access_protocol(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUNMANAGED状態のメモリ領域をUNMANAGED状態からUM_INVALID状態に遷移させる関数である。
(28)leave_um_memory_access_protocol(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_INVALID状態のメモリ領域をUM_INVALID状態からUNMANAGED状態に遷移させる関数である。
これは、引数“size”で指定されるUM_PRIVATE状態のメモリ領域を確保する関数である。
(16)free_um_private_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_PRIVATE状態のメモリ領域を解放する関数である。
(17)allocate_um_public_memory(size_t size)
これは、引数“size”で指定されるのUM_PUBLIC状態のメモリ領域を確保する関数である。
(18)free_um_public_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_PUBLIC状態のメモリ領域を解放する関数である。
(19)allocate_um_external_memory(size_t size)
これは、引数“size”で指定されるのUM_EXTERNAL状態のメモリ領域を確保する関数である。
(20)free_um_external_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_EXTERNAL状態のメモリ領域を解放する関数である。
(21)open_um_private_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_PUBLIC状態のメモリ領域をUM_PUBLIC状態からUN_PRIVATE状態に遷移させる関数である。
(22)close_um_private_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_PRIVATE状態のメモリ領域をUM_PRIVATE状態からUM_PUBLIC状態に遷移させる関数である。
(23)open_um_protected_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_PUBLIC状態のメモリ領域をUM_PUBLIC状態からUM_PROTECTED状態に遷移させる関数である。
(24)close_um_protected_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_PROTECTED状態のメモリ領域をUM_PROTECTED状態からUM_PUBLIC状態に遷移させる関数である。
(25)open_um_public_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_EXTERNAL状態のメモリ領域をUM_EXTERNAL状態からUM_PUBLIC状態に遷移させる関数である。
(26)close_um_public_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_PUBLIC状態のメモリ領域をUM_PUBLIC状態からUM_EXTERNAL状態に遷移させる関数である。
(27)enter_um_memory_access_protocol(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUNMANAGED状態のメモリ領域をUNMANAGED状態からUM_INVALID状態に遷移させる関数である。
(28)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)は、タスク29により呼び出され、enter関数(enter_um_memory_access_protocol)およびleave関数(leave_um_memory_access_protocol)はカーネル32自身により呼び出される。
次に、第2の実施形態の状態遷移関数26に含まれる各関数の動作を説明する。なお、第2の実施形態の説明においては、シャドー空間を持たない物理メモリ領域には、L1C/L2Cでアクセス可能に設定されている仮想アドレス空間上のメモリ領域のみが割り当てられる。当該仮想アドレス空間上のメモリ領域におけるアドレスをL1C/L2C仮想アドレスと略記する。
図23は、allocate_um_private_memory関数の動作を説明するフローチャートである。タスク29がallocate_um_private_memory関数を呼び出すと、allocate_um_private_memory関数は、メモリアロケータ27を用いて、メモリアロケータ27を用いて、UM_INVALID状態のメモリ領域のうちから引数“size”で指定されたサイズの連続したメモリ領域を割り当て可能か否かを判定する(S181)。連続したUM_INVALID状態の領域がなく、メモリ領域の割り当てが可能でない場合(S181、No)、allocate_um_private_memory関数はNULLを返し(S182)、動作が終了となる。メモリ領域の割り当てが可能である場合(S181、Yes)、allocate_um_private_memory関数は、メモリアロケータ27を用いてメモリ領域を呼び出し元のタスク29に割り当てて(S183)、当該割り当てられたメモリ領域の先頭アドレスをタスク29に返す(S184)。そして、動作が終了となる。呼び出し元のタスク29は、S184により返されたアドレスと、引数“size”で指定されたメモリ領域をUM_PRIVATE状態のメモリ領域として認識することができる。
図24は、free_um_private_memory関数の動作を説明するフローチャートである。タスク29がfree_um_private_memory関数を呼び出すと、free_um_private_memory関数は、キャッシュ/メモリ管理部28を用いて、L1C22のうちの、先頭アドレス“addr”、引数“size”で指定されたメモリ領域が載っているキャッシュラインを無効化する(S191)。そして、free_um_private_memory関数は、メモリアロケータ27を用いて、先頭アドレス“addr”、引数“size”で指定されたメモリ領域を解放し(S192)、動作が終了となる。
図25は、allocate_um_public_memory関数の動作を説明するフローチャートである。タスク29がallocate_um_public_memory関数を呼び出すと、allocate_um_public_memory関数は、メモリアロケータ27を用いて、UM_INVALID状態のメモリ領域のうちから引数“size”で指定されたサイズの連続したメモリ領域を割り当て可能か否かを判定する(S201)。メモリ領域の割り当てが可能でない場合(S201、No)、allocate_um_public_memory関数はNULLを返し(S202)、動作が終了となる。メモリ領域の割り当てが可能である場合(S201、Yes)、allocate_um_public_memory関数は、メモリアロケータ27を用いてメモリ領域を呼び出し元のタスク29に割り当てて(S203)、当該割り当てられたメモリ領域の先頭アドレスをタスク29に返す(S204)。そして、動作が終了となる。呼び出し元のタスク29と同じプロセスに属するタスク29は、S204により返されたアドレスと、から引数“size”で指定されたメモリ領域をUM_PUBLIC状態のメモリ領域として認識することができる。
なお、呼び出し元のタスク29は、S204により返されたアドレスおよび指定された引数“size”を同一のプロセスに属する他のタスク29に通知することによって、同一のプロセスに属する他のタスク29が当該メモリ領域をUM_PUBLIC状態として認識できるようにしてもよい。
図26は、free_um_public_memory関数の動作を説明するフローチャートである。タスク29がfree_um_public_memory関数を呼び出すと、free_um_public_memory関数は、メモリアロケータ27を用いて、指定されたメモリ領域を解放し(S211)、動作が終了となる。
図27は、allocate_um_external_memory関数の動作を説明するフローチャートである。タスク29がallocate_um_external_memory関数を呼び出すと、allocate_um_external_memory関数は、メモリアロケータ27を用いて、UM_INVALID状態のメモリ領域のうちから引数“size”で指定されたサイズの連続したメモリ領域を割り当て可能か否かを判定する(S221)。メモリ領域の割り当てが可能でない場合(S221、No)、allocate_um_external_memory関数はNULLを返し(S222)、動作が終了となる。モリ領域の割り当てが可能である場合(S221、Yes)、allocate_um_external_memory関数は、メモリアロケータ27を用いてメモリ領域を呼び出し元のタスク29に割り当てる(S223)。そして、キャッシュ/メモリ管理部28を用いて、L2C24における当該割り当てられたメモリ領域が載っているキャッシュラインを無効化する(S224)。そして、allocate_um_external_memory関数は、当該割り当てられたメモリ領域の先頭アドレスをタスク29に返し(S225)、動作が終了となる。全てのタスク29は、S225により返されたアドレスと、呼び出し元のタスク29により引数“size”で指定されたメモリ領域をUM_EXTERNAL状態のメモリ領域として認識することができる。
なお、呼び出し元のタスク29は、S225により返されたアドレスおよび指定された引数“size”を同一のプロセスに属する他のタスク29および他のプロセスに属するタスク29に通知することによって、全てのタスク29が当該メモリ領域をUM_EXTERNAL状態として認識できるようにしてもよい。また、プロセス間ではATU23のマッピングの設定が異なるため、プロセス間を跨いでアドレスを授受する際に当該アドレスを変換する必要があるが、どのような方法で当該変換を行うようにしてもよい。
図28は、free_um_external_memory関数の動作を説明するフローチャートである。タスク29がfree_um_external_memory関数を呼び出すと、free_um_external_memory関数は、メモリアロケータ27を用いて、指定されたメモリ領域を解放し(S231)、動作が終了となる。
図29は、open_um_private_memory関数の動作を説明するフローチャートである。タスク29がopen_um_private_memory関数を呼び出すと、open_um_private_memory関数は、指定されたメモリ領域の先頭アドレスをタスク29に返し(S241)、動作が終了となる。呼び出し元のタスク29は、S241により返されたアドレスと、引数“size”で指定されたメモリ領域をUM_PRIVATE状態のメモリ領域として認識することができる。
図30は、close_um_private_memory関数の動作を説明するフローチャートである。タスク29がclose_um_private_memory関数を呼び出すと、close_um_private_memory関数は、キャッシュ/メモリ管理部28を用いて、指定されたメモリ領域が載っているL1C22のキャッシュラインを無効化して内容をL2C24にライトバックするとともに当該キャッシュラインを無効化する(S251)。そして、close_um_private_memory関数は、指定されたメモリ領域の先頭アドレスを返し(S252)、動作が終了となる。呼び出し元のタスク29と同じプロセスに属するタスク29は、S252により返されたアドレスと、引数“size”で指定されたメモリ領域をUM_PUBLIC状態のメモリ領域として認識することができる。
図31は、open_um_protected_memory関数の動作を説明するフローチャートである。タスク29がopen_um_protected_memory関数を呼び出すと、open_um_protected_memory関数は、指定されたメモリ領域の先頭アドレスを返し(S261)、動作が終了となる。呼び出し元のタスク29と同じプロセスに属するタスク29は、S261により返されたアドレスと、引数“size”で指定されたメモリ領域をUM_PUBLIC状態のメモリ領域として認識することができる。
図32は、close_um_protected_memory関数の動作を説明するフローチャートである。タスク29がclose_um_protected_memory関数を呼び出すと、close_um_protected_memory関数は、キャッシュ/メモリ管理部28を用いて、指定されたメモリ領域が載っているL1C22のキャッシュラインを無効化する(S271)。そして、close_um_protected_memory関数は、指定されたメモリ領域の先頭アドレスを返し(S272)、動作が終了となる。呼び出し元のタスク29と同じプロセスに属するタスク29は、S272により返されたアドレスと、引数“size”で指定されたメモリ領域をUM_PUBLIC状態のメモリ領域として認識することができる。
図33は、open_um_public_memory関数の動作を説明するフローチャートである。タスク29がopen_um_public_memory関数を呼び出すと、open_um_public_memory関数は、指定されたメモリ領域の先頭アドレスを返し(S281)、動作が終了となる。呼び出し元のタスク29と同じプロセスに属するタスク29は、S281により返されたアドレスと、引数“size”で指定されたメモリ領域をUM_PUBLIC状態のメモリ領域として認識することができる。
図34は、close_um_public_memory関数の動作を説明するフローチャートである。タスク29がclose_um_public_memory関数を呼び出すと、close_um_public_memory関数は、キャッシュ/メモリ管理部28を用いて、指定されたメモリ領域の内容が載っているL2C24のキャッシュラインのメモリ領域へのライトバックと無効化とを実行する(S291)。そして、close_um_public_memory関数は、指定されたメモリ領域の先頭アドレスを返し(S292)、動作が終了となる。全てのタスク29は、S292により返されたアドレスと、呼び出し元のタスク29により引数“size”で指定されたメモリ領域をUM_EXTERNAL状態のメモリ領域として認識することができる。
図35は、enter_um_memory_access_protocol関数の動作を説明するフローチャートである。カーネル32がenter_um_memory_access_protocol関数を呼び出すと、enter_um_memory_access_protocol関数は、メモリアロケータ27を用いて、指定されたUNMANAGED状態のメモリ領域をカーネル管理領域31に加える(S301)。そして、enter_um_memory_access_protocol関数は、当該カーネル管理領域31に加えられたメモリ領域の先頭アドレスをカーネル32に返し(S302)、動作が終了となる。カーネル32は、当該カーネル管理領域31に加えられたメモリ領域を未割り当て状態(すなわちUM_INVALID状態)のメモリ領域として認識する。
図36は、leave_um_memory_access_protocol関数の動作を説明するフローチャートである。カーネル32がleave_um_memory_access_protocol関数を呼び出すと、leave_um_memory_access_protocol関数は、メモリアロケータ27を用いて、指定されたUM_INVALID状態のメモリ領域をカーネル管理領域31から除外する(S311)。そして、leave_um_memory_access_protocol関数は、当該カーネル管理領域31から除外したメモリ領域の先頭アドレスをカーネル32に返し(S312)、動作が終了となる。当該カーネル管理領域31から除外されたメモリ領域はUNMANAGED状態、すなわちカーネル32が管理しない状態となる。
次に、以上のように動作する状態遷移関数26を用いてメモリ領域の状態遷移を行う例を説明する。図37は、プロセス内でメモリ領域を共有する場合の状態遷移の例を説明するフローチャートである。
初めに、メモリ領域の状態はUNMANAGED状態となっている(S321)。そして、カーネル32からenter_um_memory_access_protocol関数が呼ばれることにより、当該メモリ領域はUNMANAGED状態からUM_INVALID状態に遷移する(S322)。次に、あるプロセス内の一つのタスク29から、そのプロセス内のタスク29でデータを共有するためにallocate_um_public_memory関数を呼ぶことにより、当該メモリ領域はUM_INVALID状態からUM_PUBLIC状態に遷移する(S323)。次に、そのプロセスに属する1つのタスク29は、open_um_private_memory関数を呼ぶことにより、当該メモリ領域がUM_PRIVATE状態に遷移し、open_um_private_memory関数を呼び出したタスク29によってL1C/L2Cでread/writeアクセスされる(S324)。この間、他のタスク29からのアクセスは許可されないため、アクセスは適切に行われる。
アクセスが終了すると、当該メモリ領域は、open_um_private_memory関数を呼び出したタスク29によるclose_um_private_memory関数の呼び出しによりUM_PUBLIC状態に戻される(S325)。この時、L1C22の当該メモリ領域に対応するキャッシュラインは適切にL2C24に書き戻されたのち無効化される。UM_PUBLIC状態のメモリに対しては、そのままの状態でのアクセスが禁止される。その後、そのプロセス内の別のタスク29がopen_um_protected_memory関数を呼び出すことによって、当該メモリ領域は、UM_PROTECTED状態に遷移し、open_um_protected_memory関数を呼び出したタスク29により、L1C/L2Cのreadアクセスが行われる(S326)。アクセスが終了すると、open_um_protected_memory関数を呼び出したタスク29によるclose_um_protected_memory関数の呼び出しにより、当該メモリ領域はUM_PUBLIC状態に戻される(S327)。この時、L1C22の当該メモリ領域に対応するキャッシュラインは適切に無効化される。
そして、同一のプロセス内のタスク29がfree_um_public_memory関数を呼び出すことによってメモリ開放が行われ、当該メモリ領域はUM_INVALID状態に遷移する(S328)。そして、カーネル32がleave_memory_access_protocol関数を呼び出して、当該メモリ領域がUNMANAGED状態となり(S329)、一連の動作が終了となる。
図38は、プロセス間でメモリ領域を共有する場合の状態遷移の例を説明するフローチャートである。初めに、メモリ領域の状態は、UNMANAGED状態となっている(S331)。そして、カーネル32からenter_um_memory_access_protocol関数が呼ばれることにより、当該メモリ領域はUNMANAGED状態からUM_INVALID状態に遷移する(S332)。次に、あるタスク29からプロセス間でデータを共有するためにallocate_um_external_memory関数が呼び出され、当該メモリ領域は、L2C24の対応するキャッシュラインが無効化された後、UM_INVALID状態からUM_EXTERNAL状態に遷移する(S333)。この状態ではどのプロセスのどのタスクもアクセスが禁止される。
その後、あるプロセスの1つのタスク29が、そのプロセス内の共有目的に占有して使うために、open_um_public_memory関数を呼び出すと、当該メモリ領域はUM_PUBLIC状態に遷移する(S334)。この状態でも依然として、そのプロセス内のすべてのタスクからのアクセスは禁止である。その後、そのプロセス内の一つのタスク29が当該メモリ領域を占有して使うためにopen_um_private_memory関数を呼び出すと、当該メモリ領域はUM_PRIVATE状態に遷移する(S335)。この状態ではopen_um_private_memory関数の呼び出し元のタスクだけがL1C/L2C仮想アドレスによるread/writeアクセスを許可される。アクセス終了後、open_um_private_memory関数の呼び出し元のタスク29がclose_um_private_memory関数を呼ぶと、当該メモリ領域はUM_PUBLIC状態に戻される(S336)。この時、そのメモリ領域に対応するL1C22のキャッシュラインが適切にL2C24に書き戻されたのち、無効化される。
その後、そのプロセス内のタスク29がopen_um_protected_memory関数を呼び出すことによって、当該メモリ領域はUM_PROTECTED状態に遷移し、open_um_protected_memory関数の呼び出し元のタスク29によるL1C/L2Cのreadアクセスが行われる(S337)。アクセスが終了すると、open_um_protected_memory関数の呼び出し元のタスク29による、close_um_protected_memory関数の呼び出しにより、当該メモリ領域はUM_PUBLIC状態に戻される(S338)。この時、そのメモリ領域に対応するL1C22のキャッシュラインが適切に無効化される。
その後、プロセスによる占有使用が終了すると、そのプロセスの1つのタスク29がclose_um_public_memory関数を呼び出すことによって、当該メモリ領域はUM_EXTERNAL状態に戻される(S339)。この時、そのメモリ領域に対応するL2C24のキャッシュラインが適切にメモリ3に書き戻されたのち、無効化される。
次に、別のプロセスがそのメモリ領域のアクセスを行うために、そのプロセスの中のいずれかのタスク29がopen_um_public_memory関数を呼び出して、当該メモリ領域をUM_PUBLIC状態に遷移させる(S340)。ただし、UM_EXTERNAL状態のメモリを指すアドレスは、プロセス毎に異なるので、その対応は別途管理する必要がある。その後そのプロセス内のタスク29が当該メモリ領域を適宜UM_PRIVATE状態、UM_PROTECTED状態に遷移させて必要なアクセスを行い(S341)、アクセスが終了したら、UM_PUBLIC状態に戻す(S342)。プロセスでのアクセスが終了したら、当該プロセスのうちの1つのタスク29はclose_um_public_memory関数を呼び出して、当該メモリ領域をUM_EXTENAL状態に戻す(S343)。そして、いずれかのタスク29からfree_external_memory関数が呼び出されると、メモリ解放が行われ、当該メモリ領域はUM_INVALID状態に遷移する(S344)。そしてカーネル32からleave_memory_access_protocol関数が呼び出されると、当該メモリ領域はUNMANAGED状態となり(S345)、動作が終了となる。
このように、第2の実施形態によれば、メモリ領域は、L1C/L2Cのアクセスによるread/writeが許可され、1つのタスク29に独占的な使用権が与えられているUM_PROVATE状態と、read/writeが禁止され、1つのプロセスに独占的な使用権が与えられているUM_PUBLIC状態と、read/writeが禁止され、全てのタスク29(すなわち全てのプロセス)に使用権が与えられているUM_EXTERNAL状態と、を容認する。そして、UM_PRIVATE状態とUM_PUBLIC状態との間、およびUM_PUBLIC状態とUM_EXTERNAL状態との間の遷移を行うカーネル部を備え、カーネル部は、UM_PRIVATE状態からUM_PUBLIC状態に遷移させるとき、対応するL1C22をL2C24にライトバックし、UM_PUBLIC状態からUM_EXTERNAL状態に遷移させるとき、対応するL2C24を前記メモリ領域にライトバックする、ように構成した。夫々1次キャッシュを備える複数のコアが2次キャッシュを共有してクラスタを形成するマルチコアプロセッサを備えるマルチコアプロセッサシステムにおいて、シャドー領域を持たないメモリ3においても、1次キャッシュ、2次キャッシュ、およびメモリ3の記憶内容の一貫性を保ったまま、タスク29間、プロセス間、およびクラスタ間でメモリ3の当該メモリ領域を共有できるようになる。
また、カーネル部は、UM_PRIVATE状態、UM_PUBLIC状態またはUM_EXTERNAL状態と、何れのコア21にも割り当てられていないUM_INVALID状態との間で遷移を行うようにしたので、特定のタスク29、特定のプロセス、または全プロセスに対するメモリ領域の割り当てを行うことができる。
また、カーネル部は、UM_PUBLIC状態と、L1C/L2Cのread onlyアクセスが許可され、同一のプロセスに属する要求した1以上のタスク29に使用権が与えられているUM_PROTECTED状態との間で遷移を行うようにしたので、単一タスクからのメモリ読み出しを高速化することができる。
なお、第2の実施形態は、状態遷移関数26に第1の実施形態において説明した(1)〜(14)の項目の関数を加えることによって、シャドー領域を備えるメモリ領域とシャドー領域を有さないメモリ領域との両方を備えるメモリ3を有するマルチコアプロセッサシステムにも適用することができるようになる。
また、第2の実施形態は、夫々複数のコア21を備える複数のクラスタ25を有するマルチコアプロセッサ2だけでなく、複数のコア21を備えるクラスタ25を1つのみ備えるマルチコアプロセッサにも適用することができる。
(第3の実施形態)
第2の実施形態で説明したメモリアクセスプロトコルにおいては、プロセス間共有のために利用するメモリについて、UM_EXTERNAL状態のままではどのプロセス内のタスクからもアクセスが禁止される。アクセスするためには、いずれかのプロセス内のタスクがUM_PUBLIC状態を経て、UM_PRIVATE状態もしくはUM_PROTECTED状態に遷移させる必要がある。その間、その他のプロセス内のタスクは一切アクセスが許されない。これは、プロセス間で共通に参照したいread onlyのデータがある場合に、複数のプロセスから同時にアクセスすることが許されないという厳しい制約となる。第3の実施形態は、この制約を緩和するために、第2の実施形態のMAPに更に状態を追加している。
第2の実施形態で説明したメモリアクセスプロトコルにおいては、プロセス間共有のために利用するメモリについて、UM_EXTERNAL状態のままではどのプロセス内のタスクからもアクセスが禁止される。アクセスするためには、いずれかのプロセス内のタスクがUM_PUBLIC状態を経て、UM_PRIVATE状態もしくはUM_PROTECTED状態に遷移させる必要がある。その間、その他のプロセス内のタスクは一切アクセスが許されない。これは、プロセス間で共通に参照したいread onlyのデータがある場合に、複数のプロセスから同時にアクセスすることが許されないという厳しい制約となる。第3の実施形態は、この制約を緩和するために、第2の実施形態のMAPに更に状態を追加している。
なお、第3の実施形態のマルチコアプロセッサシステムの構成は、状態遷移関数26に含まれる関数の内容を除いて第2の実施形態と等しいので、状態遷移関数26に含まれる関数を除く構成についての重複する説明を省略する。
図39は、第3の実施形態のMAPを説明する図である。第3の実施形態のMAPは、(g)〜(l)において説明した第2の実施形態のMAPに、次に説明するUM_FROZEN_EXTERNAL状態が追加されたものとなっている。
(m)UM_FROZEN_EXTERNAL状態
この状態は、UM_EXTERNAL状態から遷移でき、あるプロセス内のタスクでread onlyアクセスが可能である。あるプロセスがUM_FROZEN_EXTERNAL状態にしたメモリ領域を対象に、別のプロセスが重ねてUM_FROZEN_EXTERNAL状態に遷移させる事も許される。複数のプロセスがこの状態にしたメモリ領域は、それらすべてのプロセスがUM_EXTERNAL状態に戻す動作を行うまで、UM_FROZEN_EXTERNAL状態に留まる。
(m)UM_FROZEN_EXTERNAL状態
この状態は、UM_EXTERNAL状態から遷移でき、あるプロセス内のタスクでread onlyアクセスが可能である。あるプロセスがUM_FROZEN_EXTERNAL状態にしたメモリ領域を対象に、別のプロセスが重ねてUM_FROZEN_EXTERNAL状態に遷移させる事も許される。複数のプロセスがこの状態にしたメモリ領域は、それらすべてのプロセスがUM_EXTERNAL状態に戻す動作を行うまで、UM_FROZEN_EXTERNAL状態に留まる。
第3の実施形態の状態遷移関数26は、(15)〜(28)において説明した関数に加えて、さらに次の2つの関数を含んでいる。
(29)freeze_um_external_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_EXTERNAL状態またはUM_FROZEN_EXTERNAL状態のメモリ領域を呼び出し元のタスク29および当該タスク29と同一のプロセスに属するタスク29がUM_FROZEN_EXTERNAL状態のメモリ領域として使用できるようにする関数である。
(30)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状態に遷移する。
(29)freeze_um_external_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_EXTERNAL状態またはUM_FROZEN_EXTERNAL状態のメモリ領域を呼び出し元のタスク29および当該タスク29と同一のプロセスに属するタスク29がUM_FROZEN_EXTERNAL状態のメモリ領域として使用できるようにする関数である。
(30)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状態に遷移する。
なお、第3の実施形態は、UM_FROZEN_EXTERNAL状態となっているメモリ領域および当該メモリ領域をUM_FROZEN_EXTERNAL状態のメモリ領域として使用中のプロセスの数をタスク29およびカーネル32から認識できるようになっているものとする。一例を挙げると、UM_FROZEN_EXTERNAL状態となっているメモリ領域を特定する情報(例えば先頭の物理アドレスおよびサイズ)と当該メモリ領域をUM_FROZEN_EXTERNAL状態のメモリ領域として使用中のプロセスの識別子の一覧とを対応づけたテーブルがメモリ3内に用意され、当該テーブルはタスク29およびカーネル32から参照される。
次に、第3の実施形態の状態遷移関数26に含まれる各関数の動作を説明する。(15)〜(28)において説明した関数の動作は第2の実施形態と同じであるので説明を省略し、freeze_um_external_memory関数およびmelt_um_frozen_external_memory関数の動作のみを説明する。
図40は、freeze_um_external_memory関数の動作を説明するフローチャートである。タスク29がfreeze_um_external_memory関数を呼び出すと、freeze_um_external_memory関数は、指定されたメモリ領域の先頭アドレスを返し(S351)、動作が終了となる。freeze_um_external_memory関数の呼び出し元のタスク29および当該タスク29と同一のプロセスに属するタスク29は、S351により返されたアドレスと、引数“size”で指定されたメモリ領域をUM_FROZEN_EXTERNAL状態のメモリ領域として使用することができる。
図41は、melt_um_frozen_external_memory関数の動作を説明するフローチャートである。タスク29がmelt_um_frozen_external_memory関数を呼び出すと、melt_um_frozen_external_memory関数は、キャッシュ/メモリ管理部28を用いて、指定されたメモリ領域の内容が載っているL1C22のキャッシュラインを無効化する(S361)。そして、melt_um_frozen_external_memory関数は、指定されたメモリ領域を同一クラスタ25内の他のプロセスが使用しているか否かを判定する(S362)。同一クラスタ25内に当該メモリ領域を使用しているプロセスが存在しない場合(S362、No)、melt_um_frozen_external_memory関数は、キャッシュ/メモリ管理部28を用いて、当該指定されたメモリ領域の内容が載っているL2C24のキャッシュラインを無効化し(S363)、当該指定されたメモリ領域の先頭アドレスを返し(S364)、動作が終了となる。同一クラスタ25内に当該メモリ領域を使用しているプロセスが存在する場合(S362、Yes)、S363の動作がスキップされる。全てのタスク29は、S363により返されたアドレスと、引数“size”で指定されたメモリ領域をUM_FROZEN_EXTERNAL状態のメモリ領域として使用しているプロセスが残っていない場合、当該メモリ領域をUM_EXTERNAL状態として認識することができる。
次に、以上のように動作する状態遷移関数26を用いてメモリ領域の状態遷移を行う例を説明する。図42は、複数のプロセスからread onlyアクセスをするための状態遷移の例を説明するフローチャートである。
図42のS371〜S373は、図38のS331〜S333と同じ処理が実行される。そして、UM_EXTERNAL状態となったメモリ領域を指定して、あるプロセス(プロセスA)に属するタスク29がfreeze_um_external_memory関数を呼ぶと、当該指定されたメモリ領域はUM_FROZEN_EXTERNAL状態となり、プロセスAに属するすべてのタスク29が当該メモリ領域にread onlyでアクセスすることが許可される(S374)。次いで、プロセスAとは異なるプロセスBに属するタスク29が、当該メモリ領域を指定してfreeze_um_external_memory関数を呼ぶと、プロセスAに加えて、プロセスBに属するすべてのタスク29が当該メモリ領域にread onlyでアクセスすることが許可される(S375)。このメモリ領域を指定する際の仮想アドレスは、プロセス毎に異なる。したがって、プロセス毎の仮想アドレスの対応付けは別途管理が必要である。
続いて、プロセスAともプロセスBとも異なるプロセスCに属するタスク29が、当該メモリ領域を指定してfreeze_um_external_memory関数を呼ぶと、プロセスAおよびプロセスBに加えて、プロセスCに属するすべてのタスク29も当該メモリ領域にread onlyでアクセスすることが許可される(S376)。
その後、プロセスBがアクセスを終了してプロセスBに属するタスク29がmelt_um_frozen_external_memory関数を呼ぶと、プロセスBに属する全てのタスク29は当該メモリ領域へのアクセスが禁止される(S377)。このとき、プロセスBに属するコア21のL1C22から対応するキャッシュラインが無効化される。また、プロセスAおよびプロセスCが共にプロセスBと異なるクラスタ25に属する場合は、L2C24も無効化される。この時点ではプロセスBの他に当該メモリ領域をUM_FROZEN_EXTERNAL状態として使用しているプロセスがあるので、S377の処理の後も当該メモリ領域の状態は依然としてUM_FROZEN_EXTERNAL状態として認識される。
続いて、プロセスAがアクセスを終了してプロセスAに属するタスク29がmelt_um_frozen_external_memory関数を呼ぶと、プロセスAに属する全てのタスク29は当該メモリ領域へのアクセスが禁止される(S378)。このとき、プロセスAに属するコア21のL1C22から対応するキャッシュラインが無効化される。また、プロセスCがプロセスBと異なるクラスタ25に属する場合は、L2C24も無効化される。この時点ではプロセスAの他に当該メモリ領域をUM_FROZEN_EXTERNAL状態として使用しているプロセスがあるので、S378の処理の後も当該メモリ領域の状態は依然としてUM_FROZEN_EXTERNAL状態として認識される。
続いて、プロセスCがアクセスを終了してプロセスCに属するタスク29がmelt_um_frozen_external_memory関数を呼ぶと、プロセスCに属する全てのタスク29は当該メモリ領域へのアクセスが禁止され、他に当該メモリ領域をUM_FROZEN_EXTERNAL状態として使用しているプロセスが無いので、当該メモリ領域はUM_EXTERNAL状態に遷移する(S379)。この際、プロセスCに属するコア21のL1C22およびプロセスCが属するクラスタ25のL2C24から対応するキャッシュラインが無効化される。
その後、S344およびS345と同じ処理がS380およびS381において実行され、一連の動作が終了となる。
このように、第3の実施形態によれば、要求した1つ以上のプロセスにL1C/L2Cのread onlyアクセスが許可されるUM_FROZEN_EXTERNAL状態をMAPに加えるようにしたので、シャドー領域を有さないメモリ領域においても、複数のプロセスが同時にキャッシュを利用したreadを行うことができる。したがって、プロセス間でのデータの授受が簡単になる。また、同時に、単一のプロセス内のデータの授受も簡単になる。
(第4の実施形態)
第3の実施形態によれば、第2の実施形態のMAPにUM_FROZEN_EXTERNAL状態を加えたるようにしたが、第4の実施形態によれば、第1の実施形態のMAPに同様の状態が追加されて構成されるMAPを備えている。
第3の実施形態によれば、第2の実施形態のMAPにUM_FROZEN_EXTERNAL状態を加えたるようにしたが、第4の実施形態によれば、第1の実施形態のMAPに同様の状態が追加されて構成されるMAPを備えている。
第4の実施形態のマルチコアプロセッサシステムの構成は、状態遷移関数26に含まれる関数の内容を除いて第1の実施形態と等しいので、状態遷移関数26に含まれる関数を除く構成についての重複する説明を省略する。
図43は、第4の実施形態のMAPを説明する図である。第4の実施形態のMAPは、(a)〜(f)において説明した第1の実施形態のMAPに以下に示す状態が追加されたものとなっている。
(n)FROZEN_EXTERNAL状態
この状態は、EXTERNAL状態から遷移でき、あるプロセス内のタスクでL1C/L2Cによるread onlyアクセスが可能である。あるプロセスがFROZEN_EXTERNAL状態にしたメモリ領域を対象に、別のプロセスが重ねてFROZEN_EXTERNAL状態に遷移させる事も許される。複数のプロセスがこの状態にしたメモリ領域は、それらすべてのプロセスがEXTERNAL状態に戻す動作を行うまで、FROZEN_EXTERNAL状態に留まる。
(n)FROZEN_EXTERNAL状態
この状態は、EXTERNAL状態から遷移でき、あるプロセス内のタスクでL1C/L2Cによるread onlyアクセスが可能である。あるプロセスがFROZEN_EXTERNAL状態にしたメモリ領域を対象に、別のプロセスが重ねてFROZEN_EXTERNAL状態に遷移させる事も許される。複数のプロセスがこの状態にしたメモリ領域は、それらすべてのプロセスがEXTERNAL状態に戻す動作を行うまで、FROZEN_EXTERNAL状態に留まる。
第4の実施形態の状態遷移関数26は、(1)〜(14)において説明した関数に加えて、さらに次の2つの関数を含んでいる。
(31)freeze_external_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるEXTERNAL状態またはFROZEN_EXTERNAL状態のメモリ領域を呼び出し元のタスク29および当該タスク29と同一のプロセスに属する他のタスク29がFROZEN_EXTERNAL状態のメモリ領域として使用できるようにする関数である。
(32)melt_frozen_external_memory(void *addr, size_t size)
これは先頭アドレス“addr”、引数“size”で指定されるFROZEN_EXTERNAL状態として使用していたメモリ領域をFROZEN_EXTERNAL状態からEXTERNAL状態に戻す関数である。FROZEN_EXTERNAL状態のメモリ領域を使用していたプロセスが複数存在する場合には、当該複数のプロセスの全てからこの関数が呼び出されたときに、対象のメモリ領域がFROZEN_EXTERNAL状態からEXTERNAL状態に遷移する。
(31)freeze_external_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるEXTERNAL状態またはFROZEN_EXTERNAL状態のメモリ領域を呼び出し元のタスク29および当該タスク29と同一のプロセスに属する他のタスク29がFROZEN_EXTERNAL状態のメモリ領域として使用できるようにする関数である。
(32)melt_frozen_external_memory(void *addr, size_t size)
これは先頭アドレス“addr”、引数“size”で指定されるFROZEN_EXTERNAL状態として使用していたメモリ領域をFROZEN_EXTERNAL状態からEXTERNAL状態に戻す関数である。FROZEN_EXTERNAL状態のメモリ領域を使用していたプロセスが複数存在する場合には、当該複数のプロセスの全てからこの関数が呼び出されたときに、対象のメモリ領域がFROZEN_EXTERNAL状態からEXTERNAL状態に遷移する。
なお、第4の実施形態においても、第3の実施形態と同様に、タスク29およびカーネル32は、FROZEN_EXTERNAL状態となっているメモリ領域および当該メモリ領域をFROZEN_EXTERNAL状態のメモリ領域として使用中のプロセスの数を認識できるようになっているものとする。
次に、第4の実施形態の状態遷移関数26に含まれる各関数の動作を説明する。ここでは、freeze_external_memory関数およびmelt_frozen_external_memory関数の動作をのみ説明する。
図44は、freeze_external_memory関数の動作を説明するフローチャートである。タスク29がfreeze_external_memory関数を呼び出すと、freeze__external_memory関数は、指定されたL1UC/L2UC仮想アドレスを対応するL1C/L2C仮想アドレスに変換する(S391)。そして、freeze__external_memory関数は、変換後のアドレスを返し(S392)、動作が終了となる。freeze_external_memory関数の呼び出し元のタスク29および当該タスク29と同一のプロセスに属する他のタスク29は、S392により返されたアドレスと、引数“size”で指定されたメモリ領域をFROZEN_EXTERNAL状態のメモリ領域として使用することができる。
図45は、melt_frozen_external_memory関数の動作を説明するフローチャートである。タスク29がmelt_frozen_external_memory関数を呼び出すと、melt_frozen_external_memory関数は、キャッシュ/メモリ管理部28を用いて、指定されたメモリ領域の内容が載っているL2C24のキャッシュラインを無効化する(S401)。そして、melt_frozen_external_memory関数は、指定されたメモリ領域を同一クラスタ25内の他のプロセスが使用しているか否かを判定する(S402)。同一クラスタ25内に当該メモリ領域を使用しているプロセスが存在しない場合(S402、No)、melt_frozen_external_memory関数は、キャッシュ/メモリ管理部28を用いて、当該指定されたメモリ領域の内容が載っているL2C24のキャッシュラインを無効化する(S403)。そして、melt_frozen_external_memory関数は、当該指定されたメモリ領域の先頭アドレス(L1C/L2C仮想アドレス)を対応するL1UC/L2UC仮想アドレスに変換し(S404)、変換後のアドレスを返し(S405)、動作が終了となる。同一クラスタ25内に当該メモリ領域を使用しているプロセスが存在する場合(S402、Yes)、S403の動作がスキップされる。全てのタスク29は、S405により返されたアドレスと、引数“size”で指定されたメモリ領域をFROZEN_EXTERNAL状態のメモリ領域として使用しているプロセスが残っていない場合、当該メモリ領域をEXTERNAL状態として認識することができる。
次に、以上のように動作する状態遷移関数26を用いてメモリ領域の状態遷移を行う例を説明する。図46は、複数のプロセスからread onlyアクセスをするための状態遷移の例を説明するフローチャートである。
初めに、メモリ領域の状態は、UNMANAGED状態となっている(S411)。そして、カーネル32からenter_memory_access_protocol関数が呼ばれることにより、当該メモリ領域はUNMANAGED状態からINVALID状態に遷移する(S412)。次に、あるタスク29からプロセス間でデータを共有するためにallocate_external_memory関数が呼び出され、結果として当該メモリ領域は、L2C24の対応するキャッシュラインが無効化された後、INVALID状態からEXTERNAL状態に遷移する(S413)。この状態ではどのプロセスのどのタスクもL1UC/L2UCのアクセスが許可される。
そして、EXTERNAL状態となったメモリ領域を指定して、あるプロセス(プロセスA)に属するタスク29がfreeze_external_memory関数を呼ぶと、当該指定されたメモリ領域はFROZEN_EXTERNAL状態となり、プロセスAに属するすべてのタスク29が当該メモリ領域にL1C/L2Cでread onlyアクセスを行うことが許可される(S414)。プロセスA以外のプロセスに属するタスク29は、L1UC/L2UCのread onlyアクセスが許可される。
次いで、プロセスAとは異なるプロセスBに属するタスク29が、当該メモリ領域を指定してfreeze_external_memory関数を呼ぶと、プロセスAに加えて、プロセスBに属するすべてのタスク29が当該メモリ領域にL1C/L2Cでread onlyアクセスを行うことが許可される(S415)。このメモリ領域を指定する際の仮想アドレスは、プロセス毎に異なる。したがって、プロセス毎の仮想アドレスの対応付けは別途管理が必要である。
続いて、プロセスAともプロセスBとも異なるプロセスCに属するタスク29が、当該メモリ領域を指定してfreeze_external_memory関数を呼ぶと、プロセスAおよびプロセスBに加えて、プロセスCに属するすべてのタスク29も当該メモリ領域にL1C/L2Cでread onlyアクセスを行うことが許可される(S416)。
その後、プロセスBがアクセスを終了してプロセスBに属するタスク29がmelt_frozen_external_memory関数を呼ぶと、プロセスBに属する全てのタスク29は当該メモリ領域へのL1C/L2Cでのアクセスが禁止され、L1UC/L2UCのread onlyアクセスが許可される(S417)。このとき、プロセスBに属するコア21のL1C22から対応するキャッシュラインが無効化される。また、プロセスAおよびプロセスCが共にプロセスBと異なるクラスタ25に属する場合は、L2C24も無効化される。この時点ではプロセスBの他に当該メモリ領域をFROZEN_EXTERNAL状態として使用しているプロセスがあるので、S417の処理の後も当該メモリ領域の状態は依然としてFROZEN_EXTERNAL状態として認識される。
続いて、プロセスAがアクセスを終了してプロセスAに属するタスク29がmelt_frozen_external_memory関数を呼ぶと、プロセスAに属する全てのタスク29は当該メモリ領域へのL1C/L2Cでのアクセスが禁止され、L1UC/L2UCのread onlyアクセスが許可される(S418)。このとき、プロセスAに属するコア21のL1C22から対応するキャッシュラインが無効化される。また、プロセスCがプロセスBと異なるクラスタ25に属する場合は、L2C24も無効化される。この時点ではプロセスAの他に当該メモリ領域をFROZEN_EXTERNAL状態として使用しているプロセスがあるので、S418の処理の後も当該メモリ領域の状態は依然としてFROZEN_EXTERNAL状態として認識される。
続いて、プロセスCがアクセスを終了してプロセスCに属するタスク29がmelt_frozen_external_memory関数を呼ぶと、プロセスCに属する全てのタスク29は当該メモリ領域へのL1C/L2Cでのアクセスが禁止され、他に当該メモリ領域をUM_FROZEN_EXTERNAL状態として使用しているプロセスが無いので、当該メモリ領域はEXTERNAL状態に遷移する(S419)。すなわち、全てのタスク29は、当該メモリ領域へのL1UC/L2UCのread/writeアクセスが許可される。この際、プロセスCに属するコア21のL1C22およびプロセスCが属するクラスタ25のL2C24から対応するキャッシュラインが無効化される。
その後、図21のS172およびS173と同じ処理がS420およびS421において実行され、一連の動作が終了となる。
このように、第4の実施形態によれば、MAPに、要求した1つ以上のプロセスにL1C/L2Cのread onlyアクセスが許可されるFROZEN_EXTERNAL状態を加えるようにしたので、複数のプロセスが同時にL1CおよびL2Cを利用したreadを行うことができる。したがって、プロセス間でのデータの授受を高速に行うことができるようになる。また、同時に、単一のプロセス内のデータの授受も高速に行うことができる。
(第5の実施形態)
第5の実施形態によれば、第1の実施形態のMAPに、PUBLIC状態から遷移可能で、同一のプロセスに属するタスクが読み出しアクセスできるFROZEN_PUBLIC状態が追加されて構成されるMAPを備えている。
第5の実施形態によれば、第1の実施形態のMAPに、PUBLIC状態から遷移可能で、同一のプロセスに属するタスクが読み出しアクセスできるFROZEN_PUBLIC状態が追加されて構成されるMAPを備えている。
第5の実施形態のマルチコアプロセッサシステムの構成は、状態遷移関数26に含まれる関数の内容を除いて第1の実施形態と等しいので、状態遷移関数26に含まれる関数を除く構成についての重複する説明を省略する。
図47は、第5の実施形態のMAPを説明する図である。第5の実施形態のMAPは、(a)〜(f)において説明した第1の実施形態のMAPに次に説明するFROZEN_PUBLIC状態が追加されたものとなっている。
(o)FROZEN_PUBLIC状態
この状態は、PUBLIC状態から遷移でき、同一プロセス内の全てのタスク29でL1C/L2Cによるread onlyアクセスが可能である。
(o)FROZEN_PUBLIC状態
この状態は、PUBLIC状態から遷移でき、同一プロセス内の全てのタスク29でL1C/L2Cによるread onlyアクセスが可能である。
第5の実施形態の状態遷移関数26は、(1)〜(14)において説明した関数に加えて、さらに次の2つの関数を含んでいる。
(33)freeze_public_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるPUBLIC状態のメモリ領域をPUBLIC状態からFROZEN_PUBLIC状態に遷移させる関数である。PUBLIC状態でアクセスが許可されたプロセスに属するタスク29のみがこの関数を呼び出すことができる。
(34)melt_frozen_public_memory(void *addr, size_t size)
これは先頭アドレス“addr”、引数“size”で指定されるFROZEN_PUBLIC状態のメモリ領域をFROZEN_PUBLIC状態からPUBLIC状態に遷移させる関数である。
(33)freeze_public_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるPUBLIC状態のメモリ領域をPUBLIC状態からFROZEN_PUBLIC状態に遷移させる関数である。PUBLIC状態でアクセスが許可されたプロセスに属するタスク29のみがこの関数を呼び出すことができる。
(34)melt_frozen_public_memory(void *addr, size_t size)
これは先頭アドレス“addr”、引数“size”で指定されるFROZEN_PUBLIC状態のメモリ領域をFROZEN_PUBLIC状態からPUBLIC状態に遷移させる関数である。
次に、第5の実施形態の状態遷移関数26に含まれる各関数の動作を説明する。ここでは、freeze_public_memory関数およびmelt_frozen_public_memory関数の動作のみを説明する。
図48は、freeze_public_memory関数の動作を説明するフローチャートである。PUBLIC状態のメモリ領域を指定して、当該PUBLIC状態のメモリ領域にL1UC/L2Cのread/writeアクセスが許可されたプロセスに属するタスク29が、freeze_public_memory関数を呼び出すと、freeze_public_memory関数は、指定されたメモリ領域の先頭アドレス(L1UC/L2C仮想アドレス)を対応するL1C/L2C仮想アドレスに変換する(S431)。そして、freeze_public_memory関数は、変換後のアドレスを返し(S432)、動作が終了となる。freeze_public_memory関数の呼び出し元のタスク29および当該タスク29と同一のプロセスに属する他のタスク29は、S432により返されたアドレスと、引数“size”で指定されたメモリ領域をFROZEN_PUBLIC状態のメモリ領域として使用することができる。
図49は、melt_frozen_public_memory関数の動作を説明するフローチャートである。タスク29がmelt_frozen_public_memory関数を呼び出すと、melt_frozen_public_memory関数は、キャッシュ/メモリ管理部28を用いて、当該タスク29が属するプロセスが属するL1C22の、指定されたメモリ領域の内容が載っているキャッシュラインを無効化する(S441)。そして、melt_frozen_public_memory関数は、指定されたメモリ領域の先頭アドレス(L1C/L2C仮想アドレス)を対応するL1UC/L2UC仮想アドレスに変換し(S442)、変換後のアドドレスを返し(S443)、動作が終了となる。関数の呼び出し元のタスク29および当該タスク29と同一のプロセスに属する他のタスク29は、S443により返されたアドレスと、引数“size”で指定されたメモリ領域をPUBLIC状態のメモリ領域として使用することができる。
このように、第5の実施形態によれば、MAPに、同一のプロセスに属するタスクにL1C/L2Cのread onlyアクセスが許可されるFROZEN_PUBLIC状態を加えるようにしたので、同一のプロセスに属する複数のタスクが同時にL1CおよびL2Cを利用したreadを行うことができる。したがって、プロセス内のタスク間でのデータの授受を高速に行うことができるようになる。
さらに、EXTERNAL状態を経由することなくPUBLIC状態から直接FROZEN_PUBLIC状態に遷移させることができるので、同一のプロセス内でデータを共有したい場合、第4の実施形態よりもさらに簡単にデータの共有を実現することができるようになる。
(第6の実施形態)
第6の実施形態によれば、第2の実施形態のMAPに、UM_PUBLIC状態から遷移可能で、同一のプロセスに属するタスクが読み出しアクセスできるUM_FROZEN_PUBLIC状態が追加されて構成されるMAPを備えている。
第6の実施形態によれば、第2の実施形態のMAPに、UM_PUBLIC状態から遷移可能で、同一のプロセスに属するタスクが読み出しアクセスできるUM_FROZEN_PUBLIC状態が追加されて構成されるMAPを備えている。
第6の実施形態のマルチコアプロセッサシステムの構成は、状態遷移関数26に含まれる関数の内容を除いて第2の実施形態と等しいので、状態遷移関数26に含まれる関数を除く構成についての重複する説明を省略する。
図50は、第6の実施形態のMAPを説明する図である。第5の実施形態のMAPは、(g)〜(l)において説明した第2の実施形態のMAPに次に説明するUM_FROZEN_PUBLIC状態が追加されたものとなっている。
(p)UM_FROZEN_PUBLIC状態
この状態は、UM_PUBLIC状態から遷移でき、同一プロセス内の全てのタスク29でL1C/L2Cによるread onlyアクセスが可能である。
(p)UM_FROZEN_PUBLIC状態
この状態は、UM_PUBLIC状態から遷移でき、同一プロセス内の全てのタスク29でL1C/L2Cによるread onlyアクセスが可能である。
第6の実施形態の状態遷移関数26は、(15)〜(28)において説明した関数に加えて、さらに次の2つの関数を含んでいる。
(35)freeze_um_public_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_PUBLIC状態のメモリ領域をUM_PUBLIC状態からUM_FROZEN_PUBLIC状態に遷移させる関数である。UM_PUBLIC状態でアクセスが許可されたプロセスに属するタスク29のみがこの関数を呼び出すことができる。
(36)melt_um_frozen_public_memory(void *addr, size_t size)
これは先頭アドレス“addr”、引数“size”で指定されるUM_FROZEN_PUBLIC状態のメモリ領域をUM_FROZEN_PUBLIC状態からUM_PUBLIC状態に遷移させる関数である。
(35)freeze_um_public_memory(void *addr, size_t size)
これは、先頭アドレス“addr”、引数“size”で指定されるUM_PUBLIC状態のメモリ領域をUM_PUBLIC状態からUM_FROZEN_PUBLIC状態に遷移させる関数である。UM_PUBLIC状態でアクセスが許可されたプロセスに属するタスク29のみがこの関数を呼び出すことができる。
(36)melt_um_frozen_public_memory(void *addr, size_t size)
これは先頭アドレス“addr”、引数“size”で指定されるUM_FROZEN_PUBLIC状態のメモリ領域をUM_FROZEN_PUBLIC状態からUM_PUBLIC状態に遷移させる関数である。
次に、第6の実施形態の状態遷移関数26に含まれる各関数の動作を説明する。ここでは、freeze_um_public_memory関数およびmelt_um_frozen_public_memory関数の動作のみを説明する。
図51は、freeze_um_public_memory関数の動作を説明するフローチャートである。UM_PUBLIC状態のメモリ領域を指定して、当該UM_PUBLIC状態のメモリ領域に対するread/writeアクセスが許可されたプロセスに属するタスク29が、freeze_um_public_memory関数を呼び出すと、freeze_um_public_memory関数は、指定されたメモリ領域の先頭アドレスを返し(S451)、動作が終了となる。freeze_um_public_memory関数の呼び出し元のタスク29および当該タスク29と同一のプロセスに属する他のタスク29は、S451により返されたアドレスと、引数“size”で指定されたメモリ領域をFROZEN_UM_PUBLIC状態のメモリ領域として使用することができる。
図52は、melt_um_frozen_public_memory関数の動作を説明するフローチャートである。タスク29がmelt_um_frozen_public_memory関数を呼び出すと、melt_um_frozen_public_memory関数は、キャッシュ/メモリ管理部28を用いて、指定されたメモリ領域の内容が載っている、当該タスク29が属するプロセスのL1C22のキャッシュラインを無効化する(S461)。そして、melt_um_frozen_public_memory関数は、指定されたメモリ領域の先頭アドレスを返し(S462)、動作が終了となる。関数の呼び出し元のタスク29および当該タスク29と同一のプロセスに属する他のタスク29は、S462により返されたアドレスと、引数“size”で指定されたメモリ領域をUM_PUBLIC状態のメモリ領域として使用することができる。
このように、第6の実施形態によれば、MAPに、同一のプロセスに属するタスクにL1C/L2Cのread onlyアクセスが許可されるUM_FROZEN_PUBLIC状態を加えるようにしたので、同一のタスクに属する複数のタスクが同時にL1CおよびL2Cを利用したreadを行うことができる。したがって、同一のプロセス内のタスク間でのデータの授受を高速に行うことができるようになる。
さらに、UM_EXTERNAL状態を経由することなくUM_PUBLIC状態から直接UM_FROZEN_PUBLIC状態に遷移させることができるので、1つのプロセス内のタスク間でデータを共有したい場合、第3の実施形態よりもさらに簡単にデータの共有を実現することができるようになる。
このように本発明の第1〜第6の実施形態によれば、クラスタ型のマルチコアプロセッサシステム1においてキャッシュ(L1C22、L2C24)の一貫性をソフトウェアで維持することができるようになる。
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
1 マルチコアプロセッサシステム、2 マルチコアプロセッサ、3 メモリ、21 コア、22 L1キャッシュ(L1C)、23 ATU、24 L2キャッシュ(L2C)、25 クラスタ、26 状態遷移関数、27 メモリアロケータ、28 キャッシュ/メモリ管理部、29 タスク、31 カーネル管理領域、32 カーネルプログラム(カーネル)、33 ユーザプログラム。
Claims (20)
- メモリ領域を備えるメモリと、
複数のプロセッサコアと、前記複数のプロセッサコア毎に対応する複数の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に記載のマルチコアプロセッサ。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2011133546A JP2013003793A (ja) | 2011-06-15 | 2011-06-15 | マルチコアプロセッサシステムおよびマルチコアプロセッサ |
US13/238,662 US8762647B2 (en) | 2011-06-15 | 2011-09-21 | Multicore processor system and multicore processor |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2011133546A JP2013003793A (ja) | 2011-06-15 | 2011-06-15 | マルチコアプロセッサシステムおよびマルチコアプロセッサ |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2013003793A true JP2013003793A (ja) | 2013-01-07 |
Family
ID=47354677
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2011133546A Withdrawn JP2013003793A (ja) | 2011-06-15 | 2011-06-15 | マルチコアプロセッサシステムおよびマルチコアプロセッサ |
Country Status (2)
Country | Link |
---|---|
US (1) | US8762647B2 (ja) |
JP (1) | JP2013003793A (ja) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US12007894B2 (en) | 2019-09-20 | 2024-06-11 | Lg Energy Solution, Ltd. | Battery management apparatus and method |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7971255B1 (en) * | 2004-07-15 | 2011-06-28 | The Trustees Of Columbia University In The City Of New York | Detecting and preventing malcode execution |
CN105224246B (zh) * | 2015-09-25 | 2018-11-09 | 联想(北京)有限公司 | 一种信息以及内存配置方法和装置 |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5530832A (en) | 1993-10-14 | 1996-06-25 | International Business Machines Corporation | System and method for practicing essential inclusion in a multiprocessor and cache hierarchy |
US7469321B2 (en) | 2003-06-25 | 2008-12-23 | International Business Machines Corporation | Software process migration between coherency regions without cache purges |
US8683139B2 (en) | 2006-10-31 | 2014-03-25 | Hewlett-Packard Development Company, L.P. | Cache and method for cache bypass functionality |
US8103830B2 (en) * | 2008-09-30 | 2012-01-24 | Intel Corporation | Disabling cache portions during low voltage operations |
US8589629B2 (en) * | 2009-03-27 | 2013-11-19 | Advanced Micro Devices, Inc. | Method for way allocation and way locking in a cache |
JP2011003072A (ja) | 2009-06-19 | 2011-01-06 | Toshiba Corp | マルチコアプロセッサシステム |
-
2011
- 2011-06-15 JP JP2011133546A patent/JP2013003793A/ja not_active Withdrawn
- 2011-09-21 US US13/238,662 patent/US8762647B2/en not_active Expired - Fee Related
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US12007894B2 (en) | 2019-09-20 | 2024-06-11 | Lg Energy Solution, Ltd. | Battery management apparatus and method |
Also Published As
Publication number | Publication date |
---|---|
US20120324167A1 (en) | 2012-12-20 |
US8762647B2 (en) | 2014-06-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10552337B2 (en) | Memory management and device | |
KR102268722B1 (ko) | 데이터 액세스 장치 및 그것의 동작 방법 | |
JP5121896B2 (ja) | マルチコアプロセッサシステムおよびマルチコアプロセッサ | |
JP6982468B2 (ja) | メモリシステムおよび制御方法 | |
US9612973B2 (en) | Using shared virtual memory resources for performing memory-mapping | |
US6505286B1 (en) | User specifiable allocation of memory for processes in a multiprocessor computer having a non-uniform memory architecture | |
JP5931196B2 (ja) | I/oノード及び複数の計算ノードに備えられたキャッシュメモリの制御方法 | |
US20100235598A1 (en) | Using Domains for Physical Address Management in a Multiprocessor System | |
US20100235580A1 (en) | Multi-Domain Management of a Cache in a Processor System | |
US20150309842A1 (en) | Core Resource Allocation Method and Apparatus, and Many-Core System | |
TW201917584A (zh) | 記憶體系統及控制方法 | |
US10162757B2 (en) | Proactive cache coherence | |
US20120159115A1 (en) | Software architecture for service of collective memory and method for providing service of collective memory using the same | |
US9208088B2 (en) | Shared virtual memory management apparatus for providing cache-coherence | |
JP2013003793A (ja) | マルチコアプロセッサシステムおよびマルチコアプロセッサ | |
US10365947B2 (en) | Multi-core processor including a master core performing tasks involving operating system kernel-related features on behalf of slave cores | |
CN115269450A (zh) | 内存协同管理***和方法 | |
US9772776B2 (en) | Per-memory group swap device | |
JP2011003072A (ja) | マルチコアプロセッサシステム | |
JP2017146895A (ja) | オペレーティングシステム、プログラミングシステム及びメモリ割り当て方法 | |
KR20120124743A (ko) | 멀티-코어 기반의 가상화 환경에서 캐쉬 일관성을 제어하는 장치 및 방법 | |
CN115794368A (zh) | 业务***、内存管理方法及装置 | |
JP5196249B2 (ja) | キャッシュメモリを利用するためのメモリシステム、その方法及びそのプログラム | |
JP2017058738A (ja) | 情報処理装置および画像形成装置 | |
CN104932990B (zh) | 一种高速缓冲存储器中数据块的替换方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A300 | Application deemed to be withdrawn because no request for examination was validly filed |
Free format text: JAPANESE INTERMEDIATE CODE: A300 Effective date: 20140902 |