1

私は大学の課題のために malloc 関数を書いています。これが私のアイデアの基本的なレイアウトです。

1) 前のノード、次のノードへのポインター、およびサイズと空席の char を含むノード構造体を定義します。ヒープ内の各領域には、この情報を含む隠しノードが含まれます。

2) マロック関数。最初のノードから始めて、空き状況をチェックする各ノードをループします。ノードが空いていて十分に大きい場合、ノードを含まない領域の先頭への ptr を返します。使用可能なスペースがない場合は、sbrk を使用して、要求されたスペースとノードのスペースを割り当てます。

3)無料機能。parameter-sizeof(struct node) として渡されたポインターに移動し、空きを空に設定します。次に、リストの先頭から始めて、隣接する空きスペースをマージしながらリストをトラバースします。

このアプローチはどのように聞こえますか? 私の主な関心事は、リンクされたリストを実際に開始することです。たとえば、割り当てを開始する前に sbrk を使用してノードを作成し、ptr をグローバル変数として格納する必要がありますか? その場合、malloc 関数がドライバー プログラムによって呼び出されるようにする前に、最初のノードを初期化するにはどうすればよいですか?

前もって感謝します。誰かに私のコードを書くように頼んでいるのではなく、私のアイデアに関する洞察と提案を提供するだけです。

4

1 に答える 1

2
  1. ノードが割り当てられている間、すべての簿記情報をノードに保持することは避けます。ブロックの先頭には最小限の情報 (通常はブロック サイズのみ) があればよいのですが、それ以上はありません。
  2. 空きブロックと割り当てられたブロックを別々に追跡するので、空きブロックを検索するときに、既に使用されているブロックで時間を無駄にすることはありません。
  3. フリー リストを 2 つの部分に分けて、ブロックを遅延結合します。つまり、割り当て元の空きリストを 1 つと、保持領域としての 2 つ目のリストを用意します。ユーザーが free を呼び出したら、ブロックを保留エリアにリンクするだけです。割り当てに使用しているリストが少なくなり始めたら、保留領域内のブロックをアドレスでソートしてから、割り当ての空きリストとマージします。次に、リストをたどり、隣接するブロックをマージします。
  4. システムからより多くのスペースを割り当てるために sbrk (またはその他のもの) を呼び出す必要がある場合は、現在の割り当て要求を満たすのに十分なスペースを割り当てないでください。代わりに、かなり大きなブロック (たとえば、1 メガバイト) を割り当ててから、それを分割して要求を満たし、残りをブロックとして空きリストに追加します。一度 sbrk に行かなければならないほどメモリが不足している場合は、次の数回の呼​​び出しで同じことが起こる可能性があります。リクエストも。

3 番目の基本的な考え方は、隣接するブロックを見つける可能性を高めるために、合体をできるだけ長く行わないようにすることです。いくつかの隣接ブロックが空いています。

于 2012-07-06T04:46:03.697 に答える