4

mipsアセンブリ、特にSPIMシミュレーターのヒープを手動で管理するにはどうすればよいですか?

sbrk syscallを使用すると、ヒープは0x10040000から始まります。

li $t0, 1

li $s0, 9

syscall

sw $t0, ($s0) # 1 located at 0x10040000

それで、sbrkへの呼び出しはあなたが次の空きメモリスロットを取り戻すことを保証しませんか?たとえば、単一の4バイトスペースに対してsbrkを呼び出した場合、SPIMはアドレス0x10040000-0x10040003を割り当てる可能性があります。ただし、別の4バイトスペースの2回目の呼び出しは、前の4バイトの割り当てとは無関係である可能性がありますか?したがって、どのメモリスロットが割り当てられているかを追跡するためにデータ構造が必要ですか?最後に、メモリマネージャは、特定のデータ構造によって追跡されるアドレス間にある空き領域を特定することにより、sbrkへの呼び出しの数を減らしようとしますか?

4

1 に答える 1

6

実際のシステムでは、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

于 2012-02-08T07:13:30.430 に答える