GNU/Linux >> Linux の 問題 >  >> Linux

malloc/free はシステムコールですか、それとも libc が提供するライブラリルーチンですか?

多くの場合、mallocfree 低レベルの仮想メモリ割り当てサービスを使用し、mmap や munmap (およびおそらく sbrk) などのシステム コールを使用して、一度に複数のページ (またはメガバイト) を割り当てています。多くの場合 malloc 以前の再利用を好む free d メモリ空間 (関連する場合)。ほとんどの malloc 実装では、「大きい」割り当てと「小さい」割り当てなどにさまざまな異なる戦略が使用されます...

仮想アドレス空間は制限される可能性があることに注意してください。 setrlimit(2) で。 Linux で pmap(1) および proc(5) を使用して、プロセスの仮想アドレス空間について詳しく知ることができます (例:/proc/self/maps あなた自身のものまたは /proc/1234/maps - pmap 1234 も コマンド - pid 1234 のプロセス用)。

GNU libc ソース コードを調べたり、他の C 標準ライブラリ (musl-libc など) のソース コードを調べたり、malloc について読んだりできます。 他の実装を選択するか、独自の実装を実装するか、strace を使用して実験的に調べてください。

syscalls の man ページ (つまり syscalls(2)) とファイル <asm/unistd.h> を読んでください。 システムコールのリスト。

非常に高速な malloc

C 標準は malloc について非常に曖昧であると強く信じています そして free .以下の関数は、標準の文字 (ただし、精神ではない) を尊重していると確信しています:

 /* politically incorrect, but very probably standard conforming */
 void *malloc (size_t sz) { if (sz>0) errno = ENOMEM; return NULL; }
 void free(void*ptr) { }

もちろん、calloc をコーディングします。 と realloc

GNU libc は、独自の malloc のフックを提供します 関数 (そしておそらく、Boehm のガベージ コレクターを透過的に使用することもできます)。これらのフックは廃止される可能性があり、非標準です。

GNU libc を使用している場合は、malinfo(3) と malloc_stat(3) および関連する関数も調べてください。


mallocfree 各 C 実装によって実装される標準 C ライブラリ関数です。

C 標準では、これらの関数の動作方法と期待される動作のみが定義されています。それらがどのように実装されるかは、各実装に委ねられています。

つまり、使用する実装の実装の詳細です。

(「実装」は、コンパイラ、リンカー、ランタイム ライブラリ、およびおそらくその他のいくつかのもので構成されます。)


Linux
  1. Nagios XI レビュー (無料の Nagios コアと Nagios XI)

  2. malloc(0) は何を返しますか?

  3. .so.2 ファイルとは何ですか?

  1. free() で malloc メモリを OS に戻すように強制する

  2. アセンブリ (yasm) コードから 64 ビット Linux で C 標準ライブラリ関数を呼び出せない

  3. Ubuntu で C 標準ライブラリ関数のマニュアル ページをインストールする方法は?

  1. DebianLinuxでlibcライブラリのバージョンを確認する方法

  2. LinuxにNcursesライブラリをインストールする方法

  3. ベスト5の無料のオープンソースライブラリ管理ソフトウェア