すのふら

日々の備忘録

再入可能・再帰的・再使用可能・再配置可能について調べる

プログラムをメモリに格納するときの構造と、プログラム自体の性質について調べた。

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

プログラムやサブルーチンが実行中に割り込まれ、その実行が完了する前に再び呼び出され実行されても安全だという性質を指す。
割り込みは分岐や呼び出しなどの内部的な動きによって生じる場合もあるし、ハードウェア割り込みやシグナルなどの外部の動きによって生じる場合もある。割り込んでの呼び出しが完了すれば、割り込まれた呼び出しが実行を継続できる。

直接または間接に再帰可能なサブルーチンはリエントラントである。しかし、グローバル変数が処理の流れの中でしか変化しないことを前提としているサブルーチンはリエントラントではない。

リエントラント - Wikipedia

自分がいつも作っているプログラムだけで考えると、みんな使うような共通処理はサブルーチン化する。

みんな使うので当然様々な処理から実行されるんだけど、そのときにAプログラムは1を返して、BプログラムはAプログラムの結果を持ったままだと1+1で返しちゃうとAプログラムとBプログラムで結果違わない? ってなってしまう。

そういうときは大体グローバル変数とかメモリから解放されない値が原因のバグだったりする。

そういうことがなく、必ず1を返すというのが再入可能。

処理ごとにメモリが確保されて、処理が終わったらちゃんと確保された値がメモリから解放されてるってことだよね。


ハードディスク割り込みについては、処理中にクリックしてCPUに割り込んだ時にクリックしているのにシャットダウンしたらまずいよね、クリックしたら必ずクリックした結果がかえされるべきであるということ。


サブルーチンから自分を呼び出す処理も当然あるので、自分のサブルーチンからまた自分を呼びだせる(再帰可能)。

再入可能の3原則

  • リエントラントなコードは、静的変数やグローバル変数を保持しない。
  • リエントラントなコードは自分のコードを書き換えない。
  • リエントラントなコードは、リエントラントでないプログラムやサブルーチンを呼び出さない。

ということは再帰可能=再入可能と言える。


再帰的(リカーシブル)

再入可能で書いた通り、自分自身を呼び出せること。


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

プログラムはメモリに格納されて処理される。処理が終わるとメモリから解放される。

サブルーチンはメモリに毎回格納して開放するのは無駄なので、メモリに確保したままで複数のプログラムから使えるべき。それが可能なのが再使用可能。

再利用可能ということは再入可能で、再帰的であるといえる。

逆に、メモリを確保したままで複数のプログラムから使えないパターンもある。それは逐次再利用可能という。

ということは逐次再利用可能は再入可能ではない。
逐次再利用可能なプログラムから再入可能なプログラムを別に呼び出せないわけでない。そりゃそうだ。


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

再使用の手前の話。

プログラムをメモリに格納するときに、メモリのアドレス空間のどこに置くのかっていう話がある。

メモリアドレスAではうまく処理されるけど、足し算するためにメモリアドレスAからメモリアドレスBに移動したときにコンパイルエラー。
メモリアドレスAからメモリアドレスCのときは大丈夫みたいなのでは、プログラムとして安全性に欠ける。

そのためどこのメモリに配置してもうまく動くよねっていうのを担保する必要がある。


ざくっと一覧にする

この4つの概念、メモリとプログラムで軸が全然違うが、ざくっと一覧にするとこんな感じか。
f:id:snofra:20180906003753p:plain

再使用可能が△なのは、逐次再使用可能が×で再使用可能が〇だから。
応用情報試験とかで出てくる際の再使用可能は逐次も含んでいる。


参考にしたサイト

再帰的(リカーシブ)・再入可能(リエントラント)・再使用可能・再配置可能 - stacked tip that high

実行プログラムの主記憶配置<ソフトウェアとOS<ハードウェアとソフトウェア<Web教材<木暮

再帰的,再入可能,再使用可能,再配置可能 [徹底研究!情報処理試験]

再入可能、再帰的、再使用可能、再配置可能 : 応用情報技術者試験 - SE娘の剣 -