0

私は自分のメモリアロケータを書いています。私の考えが正しければ、コード、スタック、データ、ヒープなどのさまざまなセクションを含む、0 から 1 GB までのカーネルのアドレス空間と 1 から 4 までのユーザー空間があります。

  1. プログラムの実行中にヒープセクションのサイズと位置を変更することはできませんか?
  2. サイズと位置を取得するにはどうすればよいですか?
  3. ヒープ領域を取得した後は、自分の判断でメモリを割り当てるだけですよね。
4

2 に答える 2

2

なぜあなたはこれについて心配するのですか?

libc 風のアロケータを作成している場合は、sbrkand/orを使用mmapしてカーネルからメモリを予約します。これらのシステム コールのどちらでも、ヒープが配置される場所を気にする必要はありません。

malloclibc の/ calloc/をインストルメント化する場合reallocは、さらに簡単です。アロケーター関数でラップするだけです。

  1. はい、アロケータはカーネルにメモリを要求することでヒープを効果的に管理します。通常、 の場合と同様にbrk、その位置はデータ セグメントの末尾にあり、アドレスが増加するにつれて大きくなります (または、mmap などでページ サイズの倍数で割り当てられます)。

  2. アロケータはサイズを管理します。ヒープの位置は、アロケーターに関する限り関係ありませんが、それを知っている位置にあります。

  3. アロケータは、カーネルからメモリを効果的に要求します。そのメモリを取得すると、適切と思われる方法でプログラムに配布できます。

于 2012-04-04T10:54:50.220 に答える
1
  1. ヒープを定義するアロケータです。カスタム アロケーターがあり、すべてのメモリ クライアントがすべてのメモリを返したと判断した場合、そのヒープを削除するか、メモリ要求を提供する新しいヒープを作成することは完全に有効です。

  2. アロケータ自体がヒープを定義するため、そのサイズと位置を認識している必要があります。独自のアロケータで OS アロケータの責任を奪うことについて話している場合は、OS アロケータを使用してメモリのブロックを取得し、それを独自のアロケータのヒープとして使用することによってのみこれを行う必要があります。

  3. 繰り返しますが、アロケータがメモリ ブロックを所有すると、それを自由に使用できます。別のアロケータによって管理され、その空きプールにあるメモリを単純に取得して、重大な潜在的な結果なしに使用することはできません。

于 2012-04-04T10:58:55.193 に答える