9

私はOSに依存しないロックレスキューを書いていますが、これまでのところうまく機能していますが、メモリ管理に小さな問題があります。そのgccの問題なのか私のものなのかわかりません。問題:要素がリストに追加されるとメモリが増加しますが、要素がリストから削除されると(free(elementPointer);)メモリ使用量は変更されません。

しかし、私がpthreadを使用する場合、N個のプロデューサーとM個のコンシューマー (1<N<20, 1<M<20)のメモリ使用量は常に約10 mbであるため(約10kkの要素を追加および削除しようとする場合)、freeが機能しているように見えます。

そして面白いことに、VS 2010(同じコード、スレッドなし)では、無料で正常に動作し、メモリが解放されます(タスクマネージャーを監視)。

テストを行い、1kkの要素を追加し、すべてを追加した後、すべての要素を1つずつ削除しました(スレッドなし)。

Linux-0.08秒

Windows〜57秒

Linux(無料なし)-0.07秒

Windows(無料なし)-0.9秒

では、問題は、スレッドが使用されていないのにLinuxCでメモリが解放されないのはなぜかということです。必要に応じてコードを投稿できます。

GCCバージョン:4.4.3

4

3 に答える 3

11

多くのオペレーティングシステムでfree()は、メモリをOSで再び使用できるようにするのではなく、への新しい呼び出しに対して「のみ」使用しmalloc()ます。これが、外部でメモリ使用量が減少することはない理由ですが、スレッド化によって新しい割り当ての数を増やすと、メモリが再利用されるため、合計使用量が上限を超えません。

于 2012-11-05T12:29:36.227 に答える
8

Mallocは、メモリをオペレーティングシステムに戻す必要はありません。UNIXライクなシステムでのほとんどのmalloc実装はそれを行いません。特に小さいオブジェクトサイズの場合。

これは、パフォーマンス上の理由から行われます。

これが潜在的に不明確であることに気づきました。「malloc」とは、malloc関数に関連するサブシステム全体を意味します。malloc、free、realloc、calloc、およびlibcが実装する可能性のある特別な関数です。

于 2012-11-05T12:29:49.037 に答える
5

物事を単純化しすぎるために、動的メモリ割り当てで機能している2つのメモリマネージャがあります。OSメモリマネージャプロセスメモリマネージャ(複数存在する場合があります)です。OSメモリマネージャは、メモリの「大きなチャンク」を個々のプロセスメモリマネージャに割り当てます。各ProcessMemoryManagerは、割り当てられたセグメントと「解放されたセグメント」を追跡します。Process Memory Managerは、後でより多くのメモリを割り当てる必要がある場合に備えて、保持する方が効率的であるため、解放されたセグメントをOSMemoryManagerに返しません。

于 2012-11-05T13:43:11.280 に答える