プログラミング
Linuxはmalloc()を呼び出すと何をするのか?
What Linux does when you malloc()? (medium.com)
要約
Linuxカーネルがmalloc()システムコールを処理する際の内部動作について解説する記事です。malloc()は、プログラムがメモリを要求する際に使用される標準ライブラリ関数ですが、カーネルレベルでは、要求されたメモリをどのように割り当て、管理しているのかを掘り下げています。具体的には、仮想メモリ管理、ページング、スワップなどのメカニズムが関わってきます。
全文翻訳
malloc()は、C言語でメモリを動的に割り当てるための標準ライブラリ関数です。しかし、malloc()が呼び出されると、実際にはカーネルレベルで何が起こっているのでしょうか?
malloc()の背後にある概念
malloc()は、プログラムが実行時にメモリを要求するためのインターフェースです。しかし、メモリの実際の割り当てと管理は、オペレーティングシステム(OS)のカーネルが行います。
カーネルの役割
Linuxカーネルは、プログラムからのメモリ要求を処理するために、仮想メモリ管理システムを使用しています。このシステムは、物理メモリを抽象化し、各プロセスに独自の仮想アドレス空間を提供します。
メモリ割り当てのプロセス
1. プログラムがmalloc()を呼び出すと、標準Cライブラリ(glibcなど)がこれをインターセプトします。
2. ライブラリは、カーネルにメモリを要求するために、brk()またはmmap()システムコールを発行します。
- brk(): プログラムのデータセグメントの終端を移動させ、ヒープ領域を拡張します。
- mmap(): 新しいメモリ領域を仮想アドレス空間にマッピングします。これは、より大きなブロックや、ファイルマッピングなどに使用されます。
3. カーネルは、要求されたメモリを仮想アドレス空間内で割り当てます。この時点では、物理メモリはまだ割り当てられていない場合があります。
4. プログラムが割り当てられたメモリにアクセスしようとすると、ページフォールトが発生する可能性があります。
5. ページフォールトが発生すると、カーネルは、その仮想アドレスに対応する物理メモリページを割り当て、それをメモリにロードします。
仮想メモリとページング
Linuxは、仮想メモリとページングを使用してメモリを効率的に管理します。仮想メモリは、各プロセスに連続したアドレス空間を提供しますが、実際には物理メモリの断片にマッピングされます。ページングは、メモリを固定サイズの「ページ」に分割し、仮想ページと物理ページをマッピングするメカニズムです。
malloc()とカーネルの相互作用
malloc()は、直接カーネルと対話するわけではありません。標準ライブラリが、カーネルのシステムコール(brk()やmmap())を介してメモリ要求をカーネルに伝達します。カーネルは、これらの要求を処理し、仮想アドレス空間の管理、物理メモリの割り当て、および必要に応じたページングを行います。
まとめ
malloc()が呼び出されると、標準ライブラリがカーネルのシステムコールを介してメモリを要求します。カーネルは、仮想メモリ管理、ページング、および物理メモリの割り当てを通じて、要求されたメモリをプロセスに提供します。このプロセスは、プログラムがメモリを必要とする際に、OSがどのように効率的にリソースを管理しているかを示しています。