2

多くの組み込みシステムでは、メモリの断片化が懸念事項です。特に、長期間(数か月、数年など)実行されるソフトウェアの場合。多くのプロジェクトでは、解決策は、malloc/freeやnew/deleteなどの動的メモリ割り当てを使用しないことです。グローバルメモリは可能な限り使用され、頻繁に割り当ておよび割り当て解除されるタイプのメモリプールは、動的なメモリ管理の使用を回避するための優れた戦略です。

組み込みLinuxでは、これはどのように対処されますか?多くのライブラリがダイナミックメモリを使用しているようです。OSがメモリの断片化を防ぐために使用するメカニズムはありますか?ヒープを定期的にクリーンアップしますか?または、組み込み環境でこれらのライブラリを使用することを避ける必要がありますか?

4

3 に答える 3

2

少なくともlog(M / m)係数の断片化を回避できる非移動メモリアロケータはありません。ここで、M =最大のオブジェクト要求のサイズ、m =最小のサイズです(これは古典的な結果です。ロブソンへ、1971年)。

私はリアルタイムシステムプログラミング(エアバスを含む)を行う人々と協力しており、あなたが言うように、彼らはプールを使用する代わりに、動的メモリ割り当ての使用を慎重に避けています。

ただし、OSとメモリの割り当てには大きな違いがあります。プログラマーに公開されている動的メモリ割り当ては、ライブラリの一部であり、OSとはほとんど関係がありません(メモリのソースとしての場合を除く)。Linux自体は、独自の内部目的のためにスラブベースのメモリアロケータを使用します。組み込みLinuxも同じことをすると思いますが、よくわかりません。

于 2011-01-17T18:57:57.707 に答える
2

それはあなたがどのようにメモリを使うかに依存します。

Linuxはほとんどの場合、仮想メモリを使用します。この場合、アプリケーションはメモリを連続したメモリブロックと見なします。基盤となるカーネルは、仮想メモリと物理メモリ間のすべての手動マッピングを実行するため、処理する必要はありません。物理的には、メモリが分散する可能性がありますが、アプリケーションはそれを認識しません。

では、本当に連続した物理メモリが必要な場合はどうでしょうか。これは、DMAや、ハードウェアからのその他の厳しい要件を実行する場合によく発生します。その場合、特定の物理メモリを指すメモリページを割り当てることができます。ただし、これは標準以外の例外として作成する必要があります。

ほとんどのドライバー(「リアルタイム」ドライバーを除く)がユーザースペースに接続されるようにシステムを設計しました。そうすれば、ユーザースペースのすべての利点(より多くのライブラリ、言語)を取得し、バグがある場合にカーネルを強制終了せず、使用可能な仮想メモリを利用できます。

于 2011-02-01T19:41:55.787 に答える
1

IMHOは、どちらの場合でも、断片化が少ないメモリ割り当てアルゴリズムを検索できます。また、メモリ要件を測定した後、このアルゴリズムまたはメモリ割り当ての実装を構成します。

まずはTLSFをお勧めします。

于 2011-01-17T14:54:02.370 に答える