連続メモリの競合を回避する
- 更新日2025-02-20
- 5分で読める
LabVIEWは、従来のテキストベース言語では一般的にユーザが考慮しなければならないメモリ処理を自動的に行います。たとえば、配列や文字列に新しいデータを追加すると、LabVIEWはそれらの新しいデータ用のメモリを自動的に割り当てます。不要になったデータは、LabVIEWによりメモリから自動的に割り当て解除されます。ただし、LabVIEWを使用する際には、メモリに関して以下の考慮事項を念頭に置いてください。
- メモリを割り当てるとジッタが発生する場合があります。
- RTターゲットがメモリ不足になることがあります。
- RTターゲットが連続メモリ不足になることがあります。連続メモリは、プロセスに割り当てられる1組の連続したメモリアドレスです。(NI Linux Real-Time) NI Linux Real-Timeターゲットにはメモリ管理ターゲットがあるため、連続メモリ不足になる可能性が低くなります。
メモリの使用に注意を払ったVIを設計する
RTターゲット用にメモリの使用に注意したVIを設計する際は、以下の推奨事項を参照してください。
- 配列を作成するときは、予想される最大サイズのメモリスペースを事前に割り当てる必要があります。
- RTターゲットで使用するためにLabVIEWクラスを定義する際、大きな配列や文字列など、メモリを多く消費するデフォルト値の使用を避けます。RTターゲットでLabVIEWクラスを使用する際に、「メモリ解放要求」関数がメモリを割り当ててしまう場合があることに注意します。クラスのデフォルト値に大きな配列や文字列などの大きな可変サイズのデータストラクチャが含まれ、アプリケーションのクラスインスタンスの値ではより小さな配列や文字列が設定されていると、「メモリ解放要求」関数はデータをデータタイプのデフォルト値にリセットするため、メモリを割り当てることになります。
連続メモリの競合の例
以下の図は、アプリケーションで最大配列サイズに十分な空き容量を割り当てておかなかったために、連続メモリの競合が発生した場合を示しています。
RTターゲットを再起動またはリセットすると、RTOSとRTエンジンがメモリにロードされます。RTエンジンは、使用可能なメモリでRTターゲットVIを実行し、データを保存します。
ArrayMaker.viが配列1を作成します。配列1のすべての要素はメモリ内で連続している必要があります。配列1で使用されたメモリと同じ容量の連続メモリが、RTOSによって予約されます。
VIを一旦停止して再開し、同じサイズまたはそれ以下の配列を使用する場合、RTOSは配列を前回と同じメモリアドレスに割り当てます。図3では、ArrayMaker.viが配列2を作成します。RTOSは、これまで配列1が使用していた予約メモリ容量に配列2を作成します。配列2は配列1に割り当てられたメモリ容量に収まる小さいサイズなので、連続メモリの競合は起こりません。配列1で使用された余分な連続メモリは、予約メモリ容量に残ります。
ArrayMaker.viの3回目の実行、または別のVIの実行によって予約メモリスペースよりサイズが大きい配列が作成された場合、RTエンジンはそれを格納できる連続メモリを確保する必要があります。図4では、ArrayMaker.viによって前回よりもサイズが大きい配列3が別のスペースに作成されています。ArrayMaker.viの実行が停止しても、RTエンジンの実行は継続するため、割り当て済みのメモリは解放されません。ArrayMaker.viの4回目の実行で配列3よりも大きい配列が作成されると、エラーが発生します。これは、メモリが断片化しているため、配列の作成に必要な連続メモリ領域が確保できないことが原因です。
図4のような連続メモリの競合が起きないようにするために、想定される最大サイズの配列スペースを事前に割り当ててメモリ領域を予約することができます。