どこsbrk()で詳細を読むことができますか?
それはどのように正確に機能しますか?
面倒なandsbrk()の代わりにどのような状況で使用したいですか?malloc()new()
ところで、拡張は何のためsbrk()ですか?
brk/sbrk の仕様を見てください。
この呼び出しは基本的に、以前の「ブレーク値」を一定量インクリメントすることにより、アプリケーションにさらにメモリを割り当てるよう OS に要求します。この量 (最初のパラメーター) は、アプリケーションが取得する追加のメモリの量です。
ほとんどの初歩的な malloc 実装は、sbrk システム コールに基づいて構築され、分割して追跡するメモリ ブロックを取得します。一般に、mmap関数はより良い選択として受け入れられています (これが、dlmalloc のような malloc が #ifdef で両方をサポートする理由です)。
「どのように機能するか」に関しては、最も単純なレベルの sbrk は次のようになります。
uintptr_t current_break; // Some global variable for your application.
// This would probably be properly tracked by the OS for the process
void *sbrk(intptr_t incr)
{
uintptr_t old_break = current_break;
current_break += incr;
return (void*) old_break;
}
最新のオペレーティング システムは、ページをアドレス空間にマップし、割り当てられたメモリの各ブロックに追跡情報を追加するなど、はるかに多くのことを行います。
sbrk はほとんど時代遅れです。最近では、mmap を使用して /dev/zero からいくつかのページをマップします。確かに、malloc やフレンドの代わりに使用するものではなく、それらを実装する方法です。また、もちろん、古いコードとの下位互換性を考慮している posix ベースのオペレーティング システムにのみ存在します。
Malloc と New が面倒すぎる場合は、代わりにガベージ コレクションを検討する必要があります。
この C++ にタグを付けたのに、なぜ new ではなく「面倒な」malloc() を使用するのでしょうか? いずれにせよ、malloc の何が面倒なのかわかりません。内部的にはそうかもしれませんが、なぜ気にするのですか?また、(決定論などの理由で) 気にした場合は、大きなプールを割り当てて、そのプールに独自のアロケーターを実装することができます。もちろん、C++ では new 演算子をオーバーロードしてそれを行うことができます。
sbrk は、C ライブラリを基盤となるシステムの OS メモリ管理に接着するために使用されます。そのため、sbrk() を使用するのではなく、OS 呼び出しを行います。それがどのように機能するかについては、システムに依存します。たとえば、Newlib C ライブラリ (GNU コンパイラを使用する「ベアメタル」組み込みシステムで一般的に使用される) を使用している場合、sbrk を自分で実装する必要があるため、そのような状況でどのように機能するかは、それが達成される限り、あなた次第です。ヒープの拡張または失敗の必要な動作。
リンクからわかるように、それはあまり機能せず、直接使用するのは非常に面倒です.mallocとnewが提供するすべての機能にラップすることになるでしょう.
またはsbrkの代わりに使用することは決してありません。これは移植性がなく、通常、標準 C ライブラリの実装者によって、または使用できない場合にのみ使用されます。それはそのマニュアルページでかなりよく説明されています:mallocfree
説明
brk() は、データ セグメントの末尾を end_data_segment で指定された値に設定します。その値が適切であり、システムに十分なメモリがあり、プロセスが最大データ サイズを超えていない場合 (setrlimit(2) を参照)。
sbrk() は、プログラムのデータ空間をインクリメント バイトだけインクリメントします。sbrk() はシステム コールではなく、単なる C ライブラリ ラッパーです。インクリメント 0 で sbrk() を呼び出すと、プログラム ブレークの現在の位置を見つけることができます。
戻り値
成功すると、brk() はゼロを返し、sbrk() は新しい領域の開始点へのポインターを返します。エラーの場合、-1 が返され、errno が ENOMEM に設定されます。
最後に、mallocandfreeは面倒ではありません。C でメモリを割り当てて解放する標準的な方法です。独自のメモリ アロケータを実装する場合でも、基本としてmallocandを使用するのが最善freeです。一般的なアプローチは、大きなチャンクを割り当てることです。一度にmallocそれからメモリ割り当てを提供します(これは通常、サブアロケータまたはプールが実装するものです)
名前の由来sbrk(またはそのいとこbrk) については、ヒープの終わりが「ブレーク」と呼ばれるポインターによってマークされているという事実に関係している可能性があります。ヒープは BSS セグメントの直後から始まり、通常はスタックに向かって成長します。
これは、malloc が「扱いにくい」という意味によって異なります。sbrk は、通常、独自のメモリ アロケータを実装する場合を除き、直接使用されなくなりました: IE、「new」をオーバーライドする演算子。それでも、malloc を使用して初期メモリを取得する可能性があります。
sbrk() の上に malloc() を実装する方法を確認したい場合は、 http: //web.ics.purdue.edu/~cs354/labs/lab6/ をチェックしてください。
ただし、最新のシステムでは、このインターフェイスに触れないでください。あなたは malloc と new 面倒なことを呼んでいるので、コードに sbrk を安全かつ適切に使用するために必要なすべての経験を持っていないのではないかと思います。