スタック領域とヒープ管理
スタック領域は、関数の呼出しに伴う戻り先、ローカル変数、退避したレジスタの内容などを後入れ先出しの順で積み上げる記憶領域である。ヒープ領域は、プログラムが実行時に必要な大きさを動的に確保して使う記憶領域であり、不要になった領域を回収して再利用することが管理の要点になる。組込みシステムでは主記憶の容量が限られるため、両者の使用量を見積もり、不正なメモリアクセスを防ぐ対策を立てることが求められる。
スタックの仕組みと再帰呼出し
スタックはLIFO(後入れ先出し)の方式で管理される。再帰呼出しでは、関数が自分自身を呼び出すたびにレジスタやメモリの内容をスタックに保存し、処理の終了時には逆の順序で取り出して呼出し元に戻る。後から呼び出された処理が先に終了するため、最後に格納したものを最初に取り出すLIFOが適合する。 FIFOは先に格納したものを先に取り出す方式であり、LFUとLRUはキャッシュの置換えに用いる方式であるため、再帰の保存には適さない。
ヒープ管理と動的な領域の扱い
ヒープ領域は、使い終えた領域を回収して再び割り当てられるようにすることで維持される。プログラムから参照されなくなったオブジェクトなどが占める領域を回収し、後の割当てに使えるようにする処理をガーベジコレクションという。 空き領域を寄せて連続した領域にまとめる処理はメモリコンパクションであり、ガーベジコレクションとは目的と対象が異なる。
実行中にモジュールを主記憶へ読み込み、モジュール間の参照を結び付けるのは動的リンキングである。 必要になった時点でモジュールを読み込むのは動的ローディングであり、配置位置に応じてアドレスを調整する動的再配置とは区別する必要がある。
スタック使用量の検証と判断
スタックの使用量が確保したサイズに収まるかを検証するには、各関数のスタックフレームのサイズ情報だけでは足りない。呼出し関係(呼出しツリー)が分かれば、同時にスタック上に存在する関数のフレームサイズを呼出し経路ごとに合計し、最大使用量を見積もれる。 再帰呼出しがある場合は、その深さの上限も検証に必要な情報となる。
この節の続き
- メモリ安全性と資源管理
- 実際の場面
- 試験で問われやすい区別
ここまでが冒頭部分です。ログインすると、無料でも1日2節まで全文をお読みいただけます。
アプリでこの節を読む