Renesas Synergy™

FAQ 2000023 : メモリバイトプールの使用に関するFAQ

質問1.メモリバイトプールとは何ですか?
回答
ThreadXのメモリバイトプールは、C標準のヒープに似ていますが、C標準のヒープとは異なり、複数のメモリバイトプールを有することが可能です。
またスレッドは、要求したメモリが確保されるまでプールで、中断することができます。
メモリバイトプールからの割り当ては、従来のmallocコールに似ており、必要なメモリ容量(数バイト以下)が含まれます。
メモリは、第一合致方式でプールから割り当てられます。すなわち、リクエストを満足する最初の空きメモリブロックが使用されます。
このブロックの超過メモリは、新しいブロックに変換されて、空きメモリリストに再配置されます。
この処理は、フラグメンテーションと呼ばれます。
隣接する空きメモリブロックは、その後、容量が十分大きな空きメモリブロックの割り当て探索中に結合して、1つにされます。この処理は、デフラグメンテーションと呼ばれます。
各メモリバイトプールは、公開リソースです。ThreadXでは、メモリバイト処理がISRから呼び出せない場合を除いて、プールの使い方に制限を設けていません。

質問2.メモリバイトプールはどのように生成されるのでしょうか?
回答
メモリバイトプールは、初期化中またはアプリケーションスレッドによるランタイム中に生成されます。
アプリケーション内のメモリバイトプールの数に制限はありません。

質問3.メモリバイトプールの容量は?
回答
メモリバイトプールの割り当て可能なバイト数は、作成時に指定した値より若干少なくなります。
これは、空きメモリ領域を管理するために、ある程度のオーバヘッドが組み込まれるためです。プール内の各空きメモリブロックは、Cポインタ2つに相当するオーバヘッドを必要とします。またプールは、大きな空きブロック1つ、恒久的に割り当てられた小さなブロック1つの、計2つのブロックをメモリ領域の最後に組み込んだ状態で生成されます。この割り当てられたブロックは、割り当てアルゴリズムの性能を高めるために使用されます。その結果、結合中にプール領域の最後を絶えず確認する必要がなくなります。
ランタイム中、一般的にプール内のオーバヘッド量は増大します。奇数のバイト数を割り当てると、次のメモリブロックの位置合わせを適切に行うため、補充されます。
またオーバヘッドは、プールがより断片化されることで増大します。

質問4.のメモリはどこに配置されるのでしょうか?
回答
メモリバイトプール用のメモリ領域は、生成中に指定されます。ThreadXの他のメモリ領域と同じく、ターゲットのアドレス空間内の任意の場所に配置することができます。

これは高い柔軟性をもたらす重要な機能です。
たとえば、ターゲットハードウェアが高速メモリ領域と低速メモリ領域を持っている場合、ユーザは各々にプールを作成することで両方の領域に対するメモリの割り当てを管理することができます。

質問5.スレッドが、使用可能な容量が十分でないバイトプールからメモリを割り当てようとしたらどうなりますか?
回答
アプリケーションスレッドは、プールからメモリバイトを待ちながら中断できます。
連続して使用可能なメモリ容量が十分であれば、中断していたスレッドに要求していたメモリが与えられ、スレッドが再開します。

複数のスレッドが同じメモリバイトプールで中断している場合、中断をはじめた順番(FIFO)でスレッドにメモリが与えられます(スレッドが再開されます)。

ただし、スレッドの中断を解除するバイト解放のコール前に、アプリケーションがtx_byte_pool_prioritizeをコールした場合は、優先的な再開(リザンプション)も可能です。

バイトプールが優先順位を付ける処理によって、中断リストの先頭に最高優先度スレッドが配置され、他の中断スレッドはすべて同じFIFOの順番のままとなります。

質問6.さらに詳しい情報はどこにありますか?
回答
さらに詳しい情報は、ThreadXユーザマニュアルをご参照ください。

©1997-2016 Express Logic, Inc. All rights reserved.本文書と関連するThreadXソフトウェアは、Express Logic, Inc.の独占所有物です。各々にExpress Logic, Inc.の専有情報が含まれています。

 

適用製品

Renesas Synergy™ プラットフォーム
Renesas Synergy™ ソフトウェア
他にご質問がございましたら、リクエストを送信してください