• ベストアンサー

リユーザブル,リエントラント,リロケータブルの具体例

基本情報処理試験に,リユーザブル,リエントラント,リロケータブルの質問がよく出てくるのですが,参考書の具体例が乏しいと思っています.そこで,ちょっと確認させて頂きたいのです. 1 マルチスレッドは,リエントラントだと思っていますが,良いですね? 2 UNIXのforkで作ったプロセスも,リエントラントでよろしいですか? 3 Win,UNIX上で動くアプリケーションは,リロケータブルですよね? 4 リユーザブルの具体例が,よく分りません.教えてください.

質問者が選んだベストアンサー

  • ベストアンサー
  • Sumi-chan
  • ベストアンサー率58% (18/31)
回答No.3

用語をご説明します。 ・「リエントラント」 ・・・再入可能  あるサブルーチンを考えます。そのサブルーチンを実行中に「割り込み」が入り、そのサブルーチンが再び呼び出される場合、「リエントラント」でなくてはなりません。前に実行した中間結果が破壊されてはこまるからです。FORTANはリエントラントではありません。最近の言語はほぼすべてリエントラントに記述可能です。ただし、グローバル変数を多用するとこのかぎりではありません。  具体的には、そのサブルーチンで確保される変数など(コンテキストといいます)がスタック上、または独立した領域に実行単位ごとに確保されなければなりません。C言語では、static宣言した変数が使われるとリロケータブルではなくなります。 ・ マルチスレッド  「スレッド」とはOSで制御される「最小限の実行単位」(数ミリ秒)のことです。複数のスレッドでプロセスまたはタスクが構成されることもあります。マルチスレッドでも、「再入」がなければリエントラントである必要はありません。そのプログラム(AP、OSをとわず)の制御構造に依存します。  「スレッド」はOSのプロセス制御方法に関することで、アドレスに関することではありません。 ・ forkによるプロセス生成  forkで作成したプロセスは親プロセスのコピーですので、OSで管理されるヘッダをのぞき、親プロセスと同一になります。非リエントラント部分はそのままコピーされます。  問題になるのはカーネル部分で、実アドレスに依存するようなケースがあります。別プロセスとはいっても、OSでは同一コンテキストで制御され、リエントラントである必要が多いです。 ・リロケータブル  生成された機械語が配置されるアドレスがどこのアドレス(仮想、実をとわず)にも置ける場合、「リロケータブル」といいます。通常、コンパイラの生成するオブジェクトはリロケータブル(先頭アドレスからの相対アドレスで記述)ですが、実行ファイル(EXE)を作成する際にはなんらかの方法でアドレスを決定する必要があります。「リロケータブルでない」場合、実行するアドレスは固定(例えば:1000番地)でなくてはなりません。しかし、最近のCPUは仮想アドレスで管理され、実アドレスを意識する必要がほとんどないため、リロケータブルかどうかは昔ほど重要でなくなりました。しかし仮想アドレスとはいっても配置されるアドレスが固定というのは非常に制限がきつく、仮想アドレスではリロケータブル、というのが普通です。 ・ Win、UNIX上のアプリケーション  基本的にリロケータブルです。デバイスドライバは応答性能面の理由・制御の容易さの理由からリロケータブルでない場合があります。OSによって状況は異なります。  一般的にAPに近いほどリロケータブル、OSのカーネルに近いほど「非リロケータブル」の可能性がある、と考えてください。 ・ リユーザブル  「再利用可能」と訳されますが、この用語はソフトウェア工学の用語です。「リロケータブル」、「リエントラント」とは趣が異なります。  プログラムは再利用が可能なのは当たり前であり、1回しか使えないプログラムは意味を持ちません。ただし、前回の実行状況に依存して次回の実行結果がかわる・そのモジュールがグローバルな状態遷移を持つ、というのは別次元の議論です。情報処理技術者試験のテキストをあまりみたことないので、すみません。  

その他の回答 (2)

  • driverII
  • ベストアンサー率27% (248/913)
回答No.2

1の方の補足です。 Windowsアプリケーションは基本的にリロケータブルです。 ただしデバイスドライバなど一部のアプリケーションはリロケータブルではありません。

回答No.1

1 それでいいです。 2 forkで作られたプロセスは、もとからコピーされたまったく別個のメモリ空間をもちます。ですから同一のメモリをアクセスすることはなく、リエントラントである必要はありません。 3 Windowsは知りません。UNIXの通常のアプリケーション本体はリロケータブルではありません。グローバル変数や関数は絶対番地で参照されます。ただしダイナミックリンクされるライブラリのオブジェクトはリロケータブルに作られています。 4 情処的な再使用可能という意味では、リエントラントの簡易版ということになるでしょう。外部変数や静的変数を使わない関数はすべてリユーザブルでありリロケータブルです。それらを使っているとしても、実行後あるいは実行前に初期状態にもどすなら、リユーザブルです。atoiはリユーザブルですが、strtokはリユーザブルではありません。printfは・・・微妙ですね。実用上はあまり使わない概念だと思います。

関連するQ&A