5

私は自分のマシンで sbrk(1) を使用して試してみましたが、4096 バイトのページ サイズをテストするために意図的に範囲外に書き込みました。しかし、malloc(1) を呼び出すと、135152 バイトにアクセスした後に SEGV を取得します。これは、1 ページ サイズよりもはるかに大きい値です。malloc がライブラリ関数であり、実装に依存していることは知っていますが、最終的に sbrk を呼び出すことを考えると、なぜ複数のページ サイズが得られるのでしょうか。誰かがその内部作業について教えてもらえますか?

私のオペレーティング システムは ubuntu 14.04 で、アーキテクチャは x86 です。

更新: malloc が、データを保持するのに十分な大きさの空きリスト ブロックにアドレスを返すためかどうか疑問に思っています。しかし、そのアドレスはヒープの途中にある可能性があるため、ヒープの上限に達するまで書き込みを続けることができます。

4

2 に答える 2

4

mallocパフォーマンス上の理由から、メモリを大きなブロックに割り当てます。後続の の呼び出しでmallocは、オペレーティング システムに多数の小さなブロックを要求する代わりに、大きなブロックからメモリを取得できます。これにより、必要なシステム コールの数が削減されます。

この記事から:

プロセスがメモリを必要とする場合、brk() または sbrk() システム コールを使用して、ヒープの上限を前方に移動することにより、いくらかの余地が作成されます。システム コールは CPU 使用率が高いため、brk() を呼び出してメモリの大きなチャンクを取得し、必要に応じてそれを分割して小さなチャンクを取得することをお勧めします。これはまさに malloc() が行うことです。多数の小さな malloc() リクエストを少数の大きな brk() 呼び出しに集約します。これにより、パフォーマンスが大幅に向上します。

/ の代わりに/をmalloc使用してメモリを割り当てる最新の実装もありますが、それ以外の場合は上記が依然として当てはまります。mmapbrksbrk

于 2015-12-13T10:33:01.100 に答える