2

Linux でメモリを malloc する場合、仕様に従ってゼロ化されることは保証されません。では、代わりに誰のデータを取得しますか?

4

4 に答える 4

5

あなたは「何でも」得ます。プロセスが以前にメモリを割り当てて解放した場合、多くの場合、少なくとも部分的に古いものでいっぱいになります。バグをより明確にするために、特にメモリがガベージでいっぱいになることがあります。取得できないのは、他のプロセスの古いデータです。それは潜在的なセキュリティホールになります。

于 2013-11-03T14:00:54.777 に答える
1

簡単な答え: それはあなたのデータです。(あなたがそれを見た瞬間から)それをどうするかはあなた次第です。

あなたの質問の性質は次のとおりです。以前は誰のデータでしたか? 誰がそこに書いたのですか?追跡データはすでに失われているため、これは簡単な質問ではありません。データ自体を調べるとヒントが得られる場合がありますが、それは単なる当て推量です。

さて、どうして?物理メモリは (論理的に) ページに分割され、MMU (メモリ管理ユニット - CPU の一部) が仮想メモリ内のプロセスにオンデマンドで提供されます。その後、プロセスはページをデータで埋めることができます。プロセスが終了すると、そのメモリ ページは再利用されて使用されなくなり、仮想メモリに存在するメモリ ページが必要になったときに他のプロセスに自由に提供できるようになります。しかし、これらのページは以前に完全に削除されたわけではなく、そのまま提供されています。したがって、新しいプロセスは、前の所有者によって設定されたすべてのビットを認識します。しかし、前の所有者自体の痕跡はすべて失われています...

まだまったく言及malloc()していないことに注意してください。これは、いわゆるメモリ アロケータがこのプロセスにまったく関与しないためです。malloc()物理レベルのメモリページの追跡には関係のない、あなたのプライベートなプロセス中のものです。すべてのプロセスには、使用可能なアドレス空間全体 (4GB 以上) があることに注意してください。マシンにそれほど多くの物理メモリがない場合でも。それが仮想と呼ばれる理由です。また、マシンに 32GB のメモリがある場合でも、10 個のプロセスを生成すると、合計された仮想メモリで物理メモリを超えてしまいます。しかし、に戻るmalloc(): プロセスには、メモリのどの部分を実際に使用し、どの部分を使用しないかを記憶する方法が必要です。もちろん、要件が静的である場合は、この構造はここにあり、その構造はそこにあると言えます。しかし、オンデマンドでメモリ構造を作成しているときはどうでしょうか。ここで、メモリ アロケータ ライブラリ関数 (通常は標準 C ライブラリに既に含まれています) の出番です。使用されているメモリ ブロックを追跡し、未使用のメモリ部分へのポインタを提供できます。しかし、この (仮想) メモリは既に存在します。物理的なページが添付されていない場合もありますが、実際にアクセスしようとすると添付されます。

malloc()また、プロセスがすでに使用していたメモリ領域を示し、free()呼び出しによってもう使用されていないとマークすることもできます。その後、それはまだあなたのデータです。その領域に書き込んでいた場合、これは設定したビットです

そして、私たちは一周しました。

于 2016-09-15T10:11:07.853 に答える
0

何が起こるか、いくつかのオプションがあります。

常にmalloc()s とfree()s を繰り返しているプロセスを想像してみてください。

最初malloc()の s は、OS からより多くのメモリを取得し始めます。このメモリは、ほとんどの場合 0 で満たされています。これを使用して (データを入れて)、最終的に再び解放します。

これで、次のことが起こります。

  • メモリがヒープの最後にあり、 で解放できますsbrk()。これは、解放するのに十分な量がある場合にのみ発生します。これは、解放はパフォーマンスの点で非常にコストがかかるためです。ヒープの最後に解放する必要があるデータの量は、mallopt()オプションに関連していますM_TRIM_THRESHOLD

  • ただし、メモリがすぐに解放されず、空きメモリ ブロックのリストに追加された場合、メモリ (またはその一部) は、後で を呼び出すことによって返される可能性がありますmalloc()。この場合、以前にここに配置したデータをそこから読み取ることができます (そうする意味があれば)。

于 2013-11-03T16:32:48.597 に答える
0

malloc(3)とどちらもfree仮想メモリに関連しており、mmap(2)munmap(2)(そしておそらくsbrk) syscall を使用します。

しかし、これらの syscall を使用すると、どういうわけかコストがかかります。

そのため、以前mallocに -d されたメモリ ゾーンを再利用するように努めてください( & syscallが多すぎるのを避けるため)。そのメモリには任意のデータ (ガベージと呼ばれます) が含まれています。同様に、( を使用して) メモリをカーネルに解放しないでください。ただし、 -d を使用して後で再利用できることを覚えておいてください。 freemmapmunumapfreemunmapfreemalloc

Linux がフリー ソフトウェアであることを利用して、GNU libcまたはMUSL libcmallocでの & の実装を検討してください。free

于 2013-11-03T16:18:19.353 に答える