私は自分のメモリアロケータを書いています。私の考えが正しければ、コード、スタック、データ、ヒープなどのさまざまなセクションを含む、0 から 1 GB までのカーネルのアドレス空間と 1 から 4 までのユーザー空間があります。
- プログラムの実行中にヒープセクションのサイズと位置を変更することはできませんか?
- サイズと位置を取得するにはどうすればよいですか?
- ヒープ領域を取得した後は、自分の判断でメモリを割り当てるだけですよね。
私は自分のメモリアロケータを書いています。私の考えが正しければ、コード、スタック、データ、ヒープなどのさまざまなセクションを含む、0 から 1 GB までのカーネルのアドレス空間と 1 から 4 までのユーザー空間があります。
なぜあなたはこれについて心配するのですか?
libc 風のアロケータを作成している場合は、sbrk
and/orを使用mmap
してカーネルからメモリを予約します。これらのシステム コールのどちらでも、ヒープが配置される場所を気にする必要はありません。
malloc
libc の/ calloc
/をインストルメント化する場合realloc
は、さらに簡単です。アロケーター関数でラップするだけです。
はい、アロケータはカーネルにメモリを要求することでヒープを効果的に管理します。通常、 の場合と同様にbrk
、その位置はデータ セグメントの末尾にあり、アドレスが増加するにつれて大きくなります (または、mmap などでページ サイズの倍数で割り当てられます)。
アロケータはサイズを管理します。ヒープの位置は、アロケーターに関する限り関係ありませんが、それを知っている位置にあります。
アロケータは、カーネルからメモリを効果的に要求します。そのメモリを取得すると、適切と思われる方法でプログラムに配布できます。
ヒープを定義するアロケータです。カスタム アロケーターがあり、すべてのメモリ クライアントがすべてのメモリを返したと判断した場合、そのヒープを削除するか、メモリ要求を提供する新しいヒープを作成することは完全に有効です。
アロケータ自体がヒープを定義するため、そのサイズと位置を認識している必要があります。独自のアロケータで OS アロケータの責任を奪うことについて話している場合は、OS アロケータを使用してメモリのブロックを取得し、それを独自のアロケータのヒープとして使用することによってのみこれを行う必要があります。
繰り返しますが、アロケータがメモリ ブロックを所有すると、それを自由に使用できます。別のアロケータによって管理され、その空きプールにあるメモリを単純に取得して、重大な潜在的な結果なしに使用することはできません。