2012-04-04 8 views
5

はい、私はコンピュータシステムコースを受講しています。 mallocを実装するためのさまざまな割り当て方式についていくつか質問がありました。 明示的なリストの場合、LIFOのようなスタックを使用してmallocを実装すると、以前に解放されたメモリへのポインタを持つ目的は何ですか?なぜ二重連結リストが必要なのか?単独でリンクされたリストも同様に機能しませんか?Malloc割り当てスキーム

Malloc lecture. 私はこのリンクをオンラインで見つけました。スライド7を見て、私が何を話しているのか見ることができます。

分離リスト割り当て方式を見ているとき、これらのリストは一方向の権利ですか?また、合体メカニズムは正確に何ですか?たとえば、4つの単語が解放されている場合は、周りの空き領域が分離されたリンクリストに挿入される前に、まずそれを結合してみましょうか?または、それぞれの分離リンクリストの '4ワード'セクションに4ワードブロックを挿入するだけですか?

ありがとうございます。

答えて

4

解放されたブロックは常に2つのポインタのための余裕があるので、リストを二重化しないのはなぜですか?合体コードを簡素化するので、リストをトラバースしている間に末尾のポインタを維持する必要はありません。また、リストの終わりが検索を開始するためのヒントがある場合には、どちらの方向にもリストをトラバースすることができます。私が一度見てきた1つのあいまいなシステムは、最後のアクティビティが発生した「中間」にポインタを置いていました。

ブロックを解放するとき。唯一の四つの可能なケースがあります。

  • 空きブロックが空きブロックの後隣接しています。
  • フリーブロックは、フリーブロックであるより前には、に隣接しています。
  • 空きブロックは、その前後の空きブロックの間にあります。
  • 空きブロックが空きブロックに隣接していません。隣接する空きブロックを合体する

目的は以下のとおりです。

  • 正確に確認するために先読みするアロケータに負担をかけず空きブロックの大きさを反映するために、リンクリスト
  • の長さを短くします2つのブロックが隣接している場合

フリー・ブロックを特定の長さのフリー・リストにソートすることはしばしば利点がありますが、ほとんどの実際的な実装では、合体が優先され、alloc()異なるサイズの空きブロックが多数ある場合、異なるサイズのブロックに対する要求が不適切に拒否されることはありません。

+0

私はあなたが何を言っているかを見ていると思いますが、末尾のポインタを維持する必要がないことについてもっと詳しく説明できますか?また、私が空きブロックを呼び出した場合、B.私たちはB-> next-> prev = Bと仮定していますか?これが当てはまらない場合、リンクされたリストがどのように役立つかはわかりません。また、分離リストアロケータでヒープを初期化する最も良い方法は何でしょうか?あなたはいくつかのパターンでページを分割しますか?あなたが指定された無限大カテゴリを打つまで、2ワードの64フリーブロック、4ワードの64フリーブロック、64ワードのフリーブロックを与えますか?あるいは、より良い初期化方法がありますか? – de1337ed

+0

@ de1337ed:どのノードリスト処理コードも書かれていないのですか?それを渦巻きにしてください:ノードをリンクリストに挿入する関数を書いてください。リストをアドレス=ソート順に保つ。単独でリンクしてみてください。そしてそれを二重リンクのために修正してください。 (あなたの質問に答えるために 'B-> next-> prev'は*常に* Bです。そうでなければ、バグがあります。)ヒープを初期化することは、実装者の政策決定の対象となります。 512バイトのブロックはすぐに使用できますか?システムによって異なります。 – wallyk

関連する問題