12

C++ でのメモリ管理に役立つ新しい機能を追加するために、独自の動的メモリ管理システムを実装したいと考えています。

Windows (XP) と Linux (Ubuntu) を使用しています。「malloc」や「free」などの機能を実装するには何が必要ですか? 最低レベルのシステムコールを使用する必要があると思います。

Windows の場合、GetProcessHeap、HeapAlloc、HeapCreate、HeapDestroy、および HeapFree という関数を見つけました。

Linux の場合、ヒープ管理用のシステム コールは見つかりませんでした。Linux では、malloc と free はシステム コールですよね。

ありがとう

編集:
C++ はガベージ コレクターを提供しておらず、ガベージ コレクターは低速です。一部の割り当ては簡単に解放できますが、ガベージ コレクターが必要な割り当てもあります。

これらの関数を実装し、新しい機能を追加したいと考えています。
* free() が呼び出されるたびに、ポインターがヒープに属しているかどうかを確認します。
※ごみの回収にご協力ください。割り当てられたブロックに関する情報を保存する必要があります。
* 複数のヒープを使用します (Windows では HeapCreate/HeapDestroy)。割り当てられたブロックを含むヒープ全体をすばやく削除できます。

4

6 に答える 6

16

Linux では、malloc と free はシステム コールではありません。brkmalloc/free は、システム コールを使用してデータ セグメントを拡張および縮小し (可能であれば)、カーネルからメモリを取得し mmapます。いくつかの基本的な情報は、多くの優れた参考文献をここで見つけることができます

于 2010-07-28T22:29:14.810 に答える
5

*nix では、malloc() は C ライブラリ レベルで実装されています。brk()/sbrk() を使用してデータ セグメントを拡大/縮小し、mmap/munmap を使用してメモリ マッピングを要求/解放します。glibc および uClibc で使用される malloc 実装の説明については、このページを参照してください。

于 2010-07-28T22:31:59.937 に答える
4

システム コールを単純にラップしている場合は、標準の malloc を使用してもおそらく何も得られません。それがすべてです。

プログラムの開始時にメモリの単一ブロックを malloc (または HeapAlloc() など) し、これへの割り当てを自分で管理する方が一般的です。定期的にメモリの小さなブロック。

于 2010-07-28T22:30:07.990 に答える
3

brkmallocLinux でとを実装するために使用されるシステム コールfreeです。詳細については、man ページを参照してください。

あなたはすでにWindowsのものを手に入れました。

ここで他の回答を見て、おそらく車輪を再発明していることに注意したいと思います。mallocすでに多くの優れた実装があります。しかし、プログラミングmallocは良い思考練習です -同じことを実装する素敵な宿題 (元は CMU コード) については、こちらをご覧ください。彼らのシェルは、Linux OS が実際に行うよりも少し多くの機能を提供します :-)。

于 2010-07-28T22:27:18.397 に答える
0

ガベージコレクタが遅い

これはまったく意味のない発言です。多くの実用的な状況では、特にマルチスレッドのシナリオで、ガベージ コレクターを使用することでプログラムのパフォーマンスを大幅に向上させることができます。他の多くの状況では、ガベージ コレクターはパフォーマンスの低下を招きます。

于 2010-07-29T05:31:53.753 に答える
0

ポインターについては、 http: //www.dent.med.uni-muenchen.de/~wmglo/malloc-slides.html を試してください。

これは、8 つの異なる malloc/free 実装へのポインターを使用した簡単なパフォーマンス比較です。いくつかの優れた参照統計が、利用可能な実装を改善したかどうかを判断するのに役立つため、良い出発点です。

于 2012-03-19T14:20:13.590 に答える