コメンテーターが上で述べたように、malloc には複数の実装があり、アルゴリズムはこれらの実装ごとに大きく異なる場合があります。これは広大で複雑な領域であり、トピックに関する完全なアイデアを得るには、メモリ管理を読む必要があります。
簡単に言えば、すべての malloc 実装は、カーネルのメモリ管理スキームによってバックアップされています。カーネルは、システム メモリ全体を固定サイズ (4k、8k など) のページとして認識し、すべての割り当てと解放はページ上で行われます。すべてのカーネル実装に存在するメモリ管理サブシステムが存在し、システムで発生するメモリ割り当てと解放全体のアカウンティングを行います。malloc を呼び出すと、最終的にこのメモリ管理サブシステムに到達し、プールから次に利用可能な空きページを探して、要求プロセスに割り当てます。リクエスタにページを渡す前に、ページが使用済みとしてマークされていることを確認し、同じ方法でメモリを解放すると、空きプールにページが追加され、使用済みのマークが解除されます。
一般的な実装では、ユーザー空間自体に最小限のメモリ マネージャー機能が存在します。ユーザー空間プロセス自体は空きプールを維持し、malloc がメモリを要求すると、カーネルに侵入する前に、メモリが利用可能かどうか独自の空きプールを調べます。利用可能な場合は、それをマークアップし、カーネルの助けを借りずに要求を満たします。同様に、メモリを解放すると、解放されたメモリのチャンクはすぐにカーネルの空きプールに戻るのではなく、プロセスの空きプールに留まり、次の malloc がこれを使用できるようになります。
冒頭で述べたように、これは巨大で複雑なトピックであり、インターネット上でこれに関するドキュメントを多数見つけることができます。