リエントラント

問題

応用情報技術者平成24年秋期 午前問8

リアルタイムシステムにおいて,複数のタスクから並行して呼び出された場合に,同時に実行する必要がある共用ライブラリのプログラムに要求される性質はどれか。

  • リエントラント
  • リカーシブ
  • リユーザブル
  • リロケータブル

答え

リエントラント

解説

リエントラント

リエントラント: reentrant / re-entrant、再入可能)およびリエントランシー: reentrancy / re-entrancy、再入可能性)とは、あるプログラムサブルーチンの実行を完了する前に、割り込みなどにより、同じプログラムやサブルーチンを実行しても安全だという性質を指す。割り込みは分岐や呼び出しなどの内部的な動きによって生じる場合もあるし、ハードウェア割り込みシグナルなどの外部の動きによって生じる場合もある。割り込みの実行を完了後に、割り込み前の実行に影響を与えずに継続できる。

出典: フリー百科事典『ウィキペディア(Wikipedia)』

例えば、ある関数を2つのスレッドが同時に呼び出したとすると、同じローカル変数に2つのスレッドがアクセスして計算してしまい、結果がおかしなことになる可能性があります。

こういったことが起こらないようにしたのが、リエントラントなプログラムになります。

Pythonの例です。

こちらを参照しています。

リエントラントではないコード

g = 1

def f1():
  g = g + 2;
  return g;

def f2():
  return f1() + 2;

もし、2つの並行して走っているスレッドがgにアクセスすると、その結果はそれぞれのスレッドの実行時間によって異なってしまいます。

リエントラントなコード

def f(i): 
   return i + 2 

def h(i): 
   return f(i) + 2; 

リカーシブ

リカーシブ(recursive 再帰的)とは、関数が自分自身を呼び出します。

以下は、pythonのフィボナッチ数列の再帰による実装の例です。

def fib(n):
    """フィボナッチ数列"""
    if n <= 1:
        return n
    return fib(n-1) + fib(n-2)

リユーザブル

リユーザブル(reusable 再使用可能)な関数は、 文脈的にはこういった意味だと思われますが… 良く使われる言葉ではないと思われます。

何度でも同じように使える関数という程度の理解で良いと思います。

リロケータブル

リロケータブル(再配置可能)という形容詞は、プログラムの属性を示し、メモリ上の何処に配置しても差し支えなく動作できる性質を指して言う。そのようなバイナリリロケータブルバイナリと言う。殊に、バイナリプログラム、実行形式と呼ばれるアプリケーションプログラムや、ライブラリ、モジュールで、この属性の有無が問題となる。

出典: フリー百科事典『ウィキペディア(Wikipedia)』

端的にどういったことを意味しているのかは、こちらの例が非常にわかりやすいです。

1.
メモリのどこに置いても良い。(再配置可能プログラム)
#(アドレス)
#8000 MOV eax,80
#8002 jmp (-2) 2個前へ

2.
メモリの場所が指定。
#(アドレス)
#8000 MOV eax,80
#8002 jmp (8000) #8000へ