2017-05-27 8 views
7

はdlmallocアルゴリズムの詳細な説明である:http://g.oswego.edu/dl/html/malloc.htmldlmallocはどのようにしてチャンクを融合させますか?ここ

dlmallocチャンクは、チャンク内のスペースの量についての情報を含むいくつかのメタデータによってbookendedれます。二つの連続した空きチャンクは今空き領域のバイト数がレポートをブロックする必要がありますどのように多くの私たちはブロックAにブロックBを合体したいような場合には

[metadata | X bytes free space | metadata ][metadata | X bytes free space | metadata] 
       Block A          Block B 

のように見えるかもしれませんか?

私は今合体ブロックのように見えるので、それは、2X + 2 size(metadata) bytesされるべきだと思う:

[metadata | X bytes free space metadata metadata X bytes free space | metadata] 

しかし、これが正しい場合、私はメタデータが2X bytesを報告しますと言う教科書を持っているので、私は、思ったんだけどがなくても、メタデータを上書きできる余分なスペースが含まれています。

答えて

1

あなた自身が答えをlooking at the sourceで見ることができます。図を確認するには、line 1876から始めてください。メタデータは、size_tの符号なし整数で、エイリアシングによってアクセスされるのはstruct malloc_chunk (line 1847です)。フィールドprev_sizeは前のチャンクのサイズで、sizeはこのサイズです。 には、struct malloc_chunk自体のサイズが含まれています。これは、コードが32ビットまたは64ビットのアドレッシング用にコンパイルされているかどうかによって、ほぼすべてのマシンで8または16バイトになります。

「通常のケース」合体コードは、line 3766から始まります。合体を追跡するために使用する変数sizeは、チャンクのサイズです。

そう - そう - 彼は、前後のチャンクのサイズを追加したとき、あなたが疑われるように、コードブロックに/* consolidate backward *//* consolidate forward */をマークし、彼は暗黙のうちにstruct malloc_chunkのサイズを追加しています。

これはあなたの解釈が正しいことを示しています。私の期待は、教科書の作者が、チャンクサイズ(メタデータを含む)とユーザーに割り当てられたメモリブロックのサイズとの違いについてちょっと疑問に思っていたことです。ちなみに、mallocline 3397でこの相違を処理します。

おそらくもっと大きな教訓は、何かを学ぼうとしているときには、最初の手元にまっすぐに行く機会を逃さないでください。

関連する問題