ソフトウェア

【応用情報】プログラムの主記憶管理と再入可能などのプログラムの特性について解説

この記事では応用情報で出題されるフラグメンテーションガーベージコレクション再入可能などのプログラムの特性についてIT初心者にも分かりやすく解説します。

フラグメンテーションとガーベージコレクション

  • 可変区画方式の場合、主記憶装置にプログラムをロード→解放を繰り返すことで、中途半端にメモリ領域が空いてしまい、合計としては十分なメモリ領域があるのに、プログラムをロード出来ないという状態になってしまうことがある。これをフラグメンテーションと呼ぶ。
  • フラグメンテーションが発生したとき、中途半端に空いた領域を一つにまとめることで、十分なメモリ領域を獲得できるようにする。これをガーベージコレクションと呼ぶ。

再使用可能プログラム

  • 再使用可能(リユーザブル)なプログラムは主記憶装置にロードしたプログラムを再ロードすることなく実行しても正しい結果が得られる。
  • 再使用可能なプログラムはプログラムの最初か最後に変数を初期化する。

再入可能プログラム

  • 再入可能(リエントラント)なプログラムは複数のプログラムから呼び出されても、それぞれ正しい結果を返す。
  • 再入可能プログラムは再使用可能プログラムでもある。

再配置可能プログラム

  • 再配置可能(リロケータブル)なプログラムは主記憶装置のどこに配置しても実行可能。

再帰的プログラム

  • 再帰的(リカーシブ)なプログラムは自分自身を呼び出す。

応用情報ではフラグメンテーションとガーベージコレクション、プログラムの特性である再使用可能、再入可能、再配置可能、再帰的に関する問題が出題されます。是非最後までご覧ください。

プログラムは主記憶装置へロードする

私たちが使うプログラムは、普段、補助記憶装置に記録されており、プログラムを実行する時は主記憶装置へロードしてから実行します。CPUは主記憶装置に置いてある命令を実行しますからね。

主記憶装置上のどこにプログラムをロードするのか、を決める方式は色々あるのですが、代表的なものに固定区画方式可変区画方式があります。

固定区画方式では、その名の通り、主記憶を固定の長さで区切り、そこにプログラムをロードします。一方、可変区画方式では、プログラムの大きさに合わせてサイズを区切ります。

プログラムはロードした順に実行が終了するとは限りません。例えば、プログラムA→プログラムBの順番でロードしたものの、先にプログラムBの実行が終了する、なんてこともあり得ます。

そのため、可変区画方式の場合、中途半端に主記憶装置の区画が空く場合があります。
中途半端に区画が空いてしまうと、容量的には他のプログラムをロード出来るが、区画的にロード出来ないという状況になることがあります。この中途半端に出来た区画をフラグメンテーションと呼びます。

フラグメンテーションが発生したとき、ロードされているプログラムを再配置することで、空き領域をまとめる必要があります。これをガーベージコレクションと呼びます。

再使用可能(リユーザブル)

主記憶装置に一度ロードして実行したプログラムを、再ロードすることなく実行しても正しい結果になるようなプログラムを再使用可能なプログラムと呼びます。
再使用可能なプログラムはプログラムの最初か最後に変数を初期化しておく必要があります。変数の初期化をすることで、再ロードせずとも、前回の結果を引継がないで処理でき、毎回正しい結果が得られます。

再入可能(リエントラント)

同時に複数のタスクから呼び出されても、お互いに干渉することなく、正しい結果が得られるようなプログラムを再入可能なプログラムと呼びます。
再入可能なプログラムの多くは再使用可能なプログラムです。再ロードしなくても正しい結果が得られるからこそ、複数同時に呼び出されても問題ないわけです。

再配置可能(リロケータブル)

主記憶装置のどのアドレスに配置しても実行可能なプログラムを再配置可能なプログラムと呼びます。CPUがプログラム中の命令を実行するとき、処理対象とするデータや次に実行する命令が主記憶装置のどこに格納されているか、アドレスを指定します。アドレスを指定するときに、「アドレス:0005」の命令を次に実行!という風にするのではなく、「プログラムの先頭アドレスから100足したアドレス」の命令を次に実行!という風に指示します。こうすると、プログラムをどのアドレスに格納してもOKになります。

再帰的(リカーシブ)

プログラムの実行中に自分自身を呼び出すことが出来るプログラムを再帰的なプログラムと呼びます。

再帰的の例を見てみましょう。
「1からnまでの整数を足し算した結果を返すプログラム」はこのようになります。

f(n):if n=1 then return 1 else return n+f(n-1)

・n=1の時、f(1)=1
・n=1以外の時、f(n)=n+f(n-1)

n=1以外の時の結果には、f(n-1)と自分自身が含まれていますね。
では、実際に計算してみましょう。n=1~5の時の結果はそれぞれこのようになります。

・n=5のときf(5)=5+f(4)
・n=4のときf(4)=4+f(3)
・n=3のときf(3)=3+f(2)
・n=2のときf(2)=2+f(1)
・n=1のときf(1)=1

f(5)=5+f(4)なので、
f(5)=5+(4+f(3))=9+f(3)=9+(3+f(2))=12+f(2)=12+(2+f(1))=14+f(1)
=14+1=15となります。

このように、処理の中で自分自身を呼び出すような性質を再帰的と言います。

応用情報技術者試験での出題例

令和4年度春期問6

応用情報技術者
午前試験 
令和4年度春期問6

再入可能プログラムの特徴はどれか。

ア 主記憶上のどのアドレスから配置しても,実行することができる。

イ 手続の内部から自分自身を呼び出すことができる。

ウ 必要な部分を補助記憶装置から読み込みながら動作する。主記憶領域の大きさに制限があるときに,有効な手法である。

エ 複数のタスクからの呼出しに対して,並行して実行されても,それぞれのタスクに正しい結果を返す。

正解と解説

正解は”エ”

再入可能プログラムは、複数のタスクから同時に呼び出されてもそれぞれのタスクに正しい結果を返します。よって、答えはエです。

ア 再配置可能プログラムです
イ 再帰的プログラムです
ウ オーバーレイ方式の説明です

令和4年度春期問18

応用情報技術者
午前試験 
令和4年度春期問18

フラグメンテーションに関する記述のうち,適切なものはどれか。

ア 可変長ブロックのメモリプール管理方式では,様々な大きさのメモリ領域の獲得や返却を行ってもフラグメンテーションは発生しない。

イ 固定長ブロックのメモリプール管理方式では,可変長ブロックのメモリプール管理方式よりもメモリ領域の獲得と返却を速く行えるが,フラグメンテーションが発生しやすい。

ウ フラグメンテーションの発生によって,合計として十分な空きメモリ領域があるにもかかわらず,必要とするメモリ領域を獲得できなくなることがある。

エ メモリ領域の獲得と返却の頻度が高いシステムでは,フラグメンテーションの発生を防止するため,メモリ領域が返却されるたびにガーベジコレクションを行う必要がある。

正解と解説

正解は”ウ”

フラグメンテーションとは、プログラムのロードと解放を繰り返すことで、中途半端に主記憶のメモリが空く現象のことです。フラグメンテーションが発生すると、合計としては十分なメモリ容量があるのに、必要なメモリ領域を獲得できないという状態になります。

令和3年度秋期問6

応用情報技術者
午前試験 
令和3年度秋期問6

プログラム特性に関する記述のうち,適切なものはどれか。

ア 再帰的プログラムは再入可能な特性をもち,呼び出されたプログラムの全てがデータを共用する。

イ 再使用可能プログラムは実行の始めに変数を初期化する,又は変数を初期状態に戻した後にプログラムを終了する。

ウ 再入可能プログラムは,データとコードの領域を明確に分離して,両方を各タスクで共用する。

エ 再配置可能なプログラムは,実行の都度,主記憶装置上の定まった領域で実行される。

正解と解説

正解は”イ”

ア 再帰的プログラムは同時に複数のプログラム(と言っても自分自身ですが)から呼び出されるため、再入可能である必要があります。再入可能プログラムは、呼び出されたプログラムごとに独立してデータを持つ必要があります。よって誤りです。

イ 再使用可能プログラムはプログラムの最初か最後に変数を初期化する必要があります。よって正しいです。

ウ 再入可能プログラムはデータ領域をタスク毎に持つ必要があります。よって誤りです。

エ 再配置可能なプログラムは主記憶装置のどこに置いても実行できるプログラムです。よって誤りです。