2016-05-21 3 views
0

これは初めてのことですが、brksbrkの正確な違いを簡単な例で教えてください。 2つのいずれかから選択する効率要因はありますか? mallocおよびnewは、内部でbrkまたはsbrkを呼び出します。brkとsbrkの違い

+1

http://man7.org/linux/manage/man2/sbrk.2.html –

答えて

2
int brk(void *addr); 

BRK()は ADDRで指定された値は、その値が妥当である場合、システムは 、十分なメモリを有し、プロセスは、その最大データサイズを超えない場合にデータセグメントの終わりを設定します。

成功すると、brk()はゼロを返します。エラーの場合、-1が返され、errno がENOMEMに設定されます。

void *sbrk(intptr_t increment); 

sbrkの()増分バイトプログラムのデータ空間をインクリメントします。 現在の のプログラムブレークの位置を見つけるために、0のインクリメントでsbrk()を呼び出すことができます。

成功すると、sbrk()は直前のプログラムブレークを返します。 (ブロック が増加した場合、この値は新たに割り当てられたメモリ の開始位置へのポインタになります)。エラーの場合、(void *)-1が返され、errnoは がENOMEMに設定されます。

From linux manual page

0

brksbrkそれをインクリメントし、データ・セグメントの上限を設定します。古代Unixではmalloc/freesbrkであった。例えば、OSXはbrk/sbrkを使用してヒープ割り当てを管理するのではなく、mmap,brk/sbrkが存在しますが、小さなメモリセグメントのエミュレーションだけです。これはLinuxでほぼ同じです(ソースコードはbrk/sbrkからmmapへの移行の歴史を述べています)。

+0

あなたの説明をありがとう。まだ少し混乱している、プロセスが作成されたときにデータセグメントがある限界に固定されている。セグメントがNのサイズを持っている場合brkはNのサイズで上限を設定できます。またはBRkの場合は上限のサイズをN.sbrkインクリメントデータセグメントのサイズより大きく設定できます。事前に感謝 – user3227126

+0

上限はa..limitです。基本的にヒープはありませんので、データセグメントは最小限に抑えられますので、割り当て(brk/sbrkなど)によっては最大限まで増やすことができます。いくつかのシステムの制限を変更できますが、brk/sbrkの目的ではありません。ヒープはデータセグメントが管理される方法です(割り当てと穴はすべてデータセグメントにあります)。 –

+0

ありがとうございました.... Jean-BaptisteYunès – user3227126

関連する問題