palloc

palloc

PostgreSQLにおける、メモリ確保のルーチン。C標準ライブラリのmallocに相当する。mallocとは異なり、メモリ確保に失敗した場合は呼び出し元にNULLを返さず、エラー報告処理へジャンプする。

実体は、SQLの実行モデルに最適化するためにmallocをラッピングしている。これにより、

  1. メモリ確保のオーバーヘッドを抑制
  2. メモリのフラグメンテーションを抑制
  3. メモリ解放忘れによるメモリリークを抑制

という効果がある。

SQLの実行ではツリー状のデータ構造が処理されるため、それぞれの処理におけるメモリデータの生存時間はツリーを下るにつれて短くなる。この性質のため、まず大きな処理単位でメモリが確保され、この中から小さな処理に移るにつれてメモリを分割し、その処理が終了する毎にこの小さなメモリ単位を一括して解放する。この解放作業はPostgreSQLが行うため、処理内でpallocを実行するプログラムがたとえpfreeを怠ったとしても、システムとしてはメモリリークを防ぐことができる。つまり、言語実装におけるGCのような働きを持つ。

上で述べられるメモリ単位のことをMemoryContextと呼び、ソースコードレベルではグローバル変数として以下のコンテキストが用意されている。

  • TopMemoryContext
  • PostmasterContext
  • CacheMemoryContext
  • MessageContext
  • TopTransactionContext
  • CurTransactionContext
  • PortalContext
  • ErrorContext

メモリ領域の確保だけでなく、その領域を0で初期化するpalloc0も用意されている。