コンパイルされた実行プログラムはOSのローダにより主記憶に配置され、実行完了後は、プログラムがあった主記憶領域が解放されるのが通常ですが、いろいろな工夫がなされています。
再配置可能(リロケータブル)、再使用可能(リユーザブル)、再入可能(リエントラント)、
主記憶上のどこのアドレスに配置しても,実行することができるプログラムです。
実行プログラムは機械語です。命令やデータの主記憶での位置(アドレス)は、先頭アドレスからの相対アドレスで記述されています。OSはプログラムの先頭位置を置く主記憶でのアドレスをしてロードします。プログラムの実行ではプログラム内の命令やデータは「先頭位置+相対アドレス」に置かれます。
実際には仮想記憶方式が採用されていますので、ブログラムはページ単位でばらばらに置かれるし、ページングが行われるつど絶対アドレスが変化します。現在のページの先頭アドレスをベース(基底)アドレスとして管理することにより、正しく実行できるのです。
通常のプログラム(アプリケーションプログラム)は、リロケータブルなプログラムです。
ところが、デバイスドライバなど、OSに近いプログラムでは、応答性能や制御の容易さの理由から、非リロケータブルにしている場合があります。
プログラムを実行後,そのまま主記憶に置いておきロードし直さずに再び実行するプログラムです。
通常は、プログラムはOSにより主記憶にロードされ、実行が完了したら主記憶から削除されます。しかし、高頻度で使われるプログラムは、実行完了後も主記憶に置いておくほうが効率的です。組み込みシステムの場合は制御系プログラムの多くがリユーザブルです。
リユーザブルプログラムは、特定のプログラムから何度も呼ばれることも、複数のプログラムからも呼ばれることがありますが、同時に呼び出すことはできません(その場合は後述の「リエントラント」になります)。
また、リユーザブルプログラムは、いつでも同じ処理を行うのが前提ですから、実行時に自らのコードを書き換えたり、内部の状態を表す変数などを変更したままにしてはいけません。
複数のプログラムからの呼出しに対して,並行して実行されても,それぞれのプログラムに正しい結果を返すプログラムです。同時に複数立ち上げても互いに干渉しないプログラムだともいえます。
典型的なリエントラントプログラムはサブルーチンです。例えば電卓機能のサブルーチンがプログラムAとプログラムBから同時に呼ばれたとき、Aで入力した結果をBに戻すことのないようにする必要があります。
その方法として、AとBそれぞれにデータ領域を設けて、処理中に混合しないようにするのが一般的です。最近の言語はほぼすべて自動的にリエントラントができるようになっています。また、データ量が多い分野では、サブルーチンの命令あるいはデータに排他制御機能をもたせることもあります。