3

特定のプロジェクト(基本的にC / C ++の多くの組み込みアプリケーション)では、次のように動的割り当てを管理しています。

  • 初期化中に(必要に応じて)大量のメモリを取得します。この領域は、そのアプリケーションのヒープとして指定されます。
  • さまざまなルーチンにまたがるすべての動的割り当ては、割り当てとメンテナンス(割り当ての追跡とデバッグ)用に設計されたラッパーを介して、このメモリ内で行われます。

質問:

Q1:プライベートヒープ管理を持つという上記の設計の利点。

Q2:C、Linux APIに、以前に割り当てられたチャンク内で動的割り当てを行うためのインターフェイスを提供する組み込み関数はありますか?調べてみましたが、把握できませんでした

Q3:Q2に記載されているオプションが利用できない場合。Q2で述べた目的をどのように達成できるかについての考え。

4

2 に答える 2

2

あなたが言っているように、基本的にC/C++の多くの組み込みアプリケーションは、定義したように動的メモリを取得するために異なるアプローチを使用しています。

私はそれが基本的に少ないメモリの利用可能性と適切な使用のために行われたと思います。

動的メモリ割り当てのために malloc() または calloc() 関数が c でどのように機能するかを理解しようとすると、確かに答えが得られます。私は少しbtを次のように説明できます... それ(malloc)が実際に行うことは、空きメモリのリンクされたリストを維持することですが、最初は空きリストは空です。最初の malloc() が呼び出されると、sbrk() を呼び出して、空きリスト用の新しいメモリ チャンクを取得します。このメモリは分割されるため、一部はユーザーに返され、残りはフリー リストに戻されます。フリー リストの先頭であるグローバル変数 malloc_head が存在します。malloc() が呼び出されると、そのリストで十分な大きさのメモリを探します。見つかった場合は、リンクされたリストからそのメモリを削除し、ユーザーに返します。free() が呼び出されると、メモリはリンク リストに戻されます。ここで、効率を高めるために、空きリストに要求されたものよりもはるかに大きなメモリのチャンクがある場合、次に、そのチャンクを 2 つのチャンクに分割します。1 つはリクエストのサイズ (8 の倍数にパディングされます) で、残りの部分です。残りは空きリストに入れられ、要求のサイズがユーザーに返されます。

詳細については、http://web.eecs.utk.edu/~huangj/cs360/360/notes/Malloc2/lecture.html http://web.eecs.utk.edu/~huangj/cs360/360 を参照してください 。 /notes/Malloc1/lecture.html

質問1->最初の質問の利点は、メモリの節約とより効率的な方法での割り当てである可能性があります。これは、その方法を実装しているプロジェクトに依存します。

question2-> C で組み込みライブラリや API を見たことがありません。

question3->独自の API の実装については、指定されたリンクと C の R&K の本を参照する必要があります。この本はより詳細に説明しています。

于 2012-11-29T12:26:28.607 に答える
2

Q1:

  1. Performance - after the heap has been allocated (normally done during initialization), all future allocations from it are extremely fast, it's mainly just a bit of pointer arithmetic inside the heap.
  2. Fragmentation - single allocation of large memory chunk prevents memory fragmentation due to multiple allocs/deallocs.
  3. Control - having all memory available makes the system more robust. This can be important in situations where allocation failure is unacceptable.

Preallocated memory is closely related to the concept of look-aside lists.

Q2:

I'm not aware of such API in C but in C++ there's actually built-in operator that can assist with implementation - see Placement new. Such utility should be fairly easy to implement in C as well.

Q3:

For example (very high-level):

  1. Allocate the memory.
  2. Create a heap structure of free space chunks inside the memory (initially it will contain a single chunk representing the entire memory).
  3. Create a heap structure of occupied chunks of memory (initially it will be empty).
  4. On allocation - traverse the heap and find chunk of appropriate size; remove it from the heap and populate with the new data. Calculate the remaining memory in the chunk and reinsert it into the heap. The occupied chunk insert into the heap of occupied chunks.
  5. On freeing - remove the chunk from the occupied chunks heap and insert it into the free memory heap.
于 2012-11-29T12:43:11.647 に答える