実際のシステムでは、sbrkはページ粒度の割り当てを返します。SPIMシミュレーターがそうするかどうかはわかりません(わずかなオンラインドキュメントは、バイト指向の粒度を返すことを示唆しています)。
通常、sbrkシステムコールは「ヒープの終わり」ポインタを設定するだけです。基盤となるOSが認識しているのは、ヒープの開始(sbrkがプログラムの開始時に開始された場所)と現在のヒープの終了ポインターだけです。その範囲内のすべてのメモリは、(OSの観点から)プログラムによって使用されているヒープメモリと見なされます。
(あなたの場合、SPIMシミュレーターはポインターをバンプするために整数を使用すると思います。したがって、暗黙的にすべてのメモリーが連続しており、ブレークは常に増加していると思いますか?)
一般にsbrk上に構築されている「malloc」APIは、単純な連続した成長するメモリ領域以上のものを提供します。優れたmallocライブラリを使用すると、通常、メモリの領域を「空き」としてマークできます(したがって、後続のmalloc呼び出しを満たすために使用できます)。OSは通常、この「無料」について認識していないことに注意してください。Mallocは、空きまたは空きでないメモリを追跡します。一般に、ヒープはOSの観点からは単一の連続した領域であるため、mallocはヒープのこの任意の領域をOSに返すことはできません。
実際のmalloc実装は、割り当て要求とページサイズの不一致に対処する必要があります(通常のsbrkは、ページに揃えられたページサイズの割り当ての倍数のみを返します)。sbrkはきめ細かいため、シミュレーターのケースにはこの問題はありません。
どのメモリが使用されているか、または使用されていないかを追跡するにはメモリが必要であるため、mallocにはある程度のオーバーヘッドがあることに注意してください。一部の実装は、この簿記のほとんどを「空き」メモリに保存するように設計されています(クライアントの見かけのコストを削減します)。mallocをsbrkに一致させるための他の戦略はたくさんあります...(あなたの場合、mallocをsbrkにマッピングし、メモリを割り当てすぎない限り、no-opを解放すると「機能」します...)
これは、私が書き写す忍耐力がないアスキーアートを描く 方法malloc
と関連の概要です: http ://web.eecs.utk.edu/~huangj/cs360/360/notes/Malloc1/lecture.htmlsbrk