基本情報技術者 2019年 春期 午前(科目A) 問08
問題文
複数のプロセスから同時に呼び出されたときに、互いに干渉することなく並行して動作することができるプログラムの性質を表すものはどれか。
選択肢
ア:リエントラント(正解)
イ:リカーシブ
ウ:リユーザブル
エ:リロケータブル
🔒 解説は解答すると表示されます
リエントラント性【午前解説】
正解の理由
正解はアの「リエントラント」です。リエントラント(再入可能)とは、同一コードが別々の実行コンテキスト(スレッドや割り込みハンドラ、複数プロセス)から同時に呼び出されても内部状態や戻り値が互いに干渉しない性質を指します。具体的には静的変数や共有バッファを持たず、必要なら呼び出し側がバッファを用意する、局所変数のみを使う、または呼び出し毎に状態を保存・復元する設計が求められます。これにより並行実行時に競合やデータ破壊が起きません。
解法ステップ
- 問題文のキーワード「同時に呼び出されたとき」「互いに干渉することなく」を確認する。
- 各選択肢の定義を頭の中で照合する(リエントラント、リカーシブ、リユーザブル、リロケータブル)。
- 「同時呼び出しで状態が干渉しない」性質に最も近い語を選ぶ(=リエントラント)。
- 他の語が示す意味(再帰、再利用、再配置)と区別できることを確認して解答する。
選択肢別の誤答解説
- ア リエントラント — 正解。複数の実行コンテキストが同じコードを同時に呼んでも干渉しない性質を示します。
- イ リカーシブ(recursive) — 誤り。関数が自分自身を呼び出す機能を示す用語で、同時呼び出しに関する性質ではありません。
- ウ リユーザブル(reusable) — 誤り。再利用可能という意味で、モジュール性や汎用性を指しますが並行実行での非干渉性を保証するものではありません。
- エ リロケータブル(relocatable) — 誤り。コードやデータを別のメモリ位置に配置しても動作する性質(再配置可能)で、同時実行や状態の干渉とは無関係です。
よくある誤解
- 「スレッドセーフ=リエントラント」と考える誤解:スレッドセーフは並行実行で正しく動くことだがロックで保護する手法も含み、ロック中は同時実行が待たされる点でリエントラントとは異なります。
- 「再帰可能(recursive)と同じ」と勘違いする:再帰は自身を呼ぶ能力であり、再入可能とは用途が別です。再帰関数が必ずしも共有状態に無依存とは限りません。
- 「再利用可能(reusable)=リエントラント」と混同する:再利用性は設計の観点で広い意味を持ち、並行実行時の安全性を必ずしも保証しません。
補足コラム
リエントラント設計の代表例として、標準ライブラリ関数のうち「非リエントラント」として知られるものがあります(例:スレッド間で共有される静的バッファを返す関数)。これらはリエントラント版(スレッドセーフ版)として、呼び出し側がバッファを渡す実装や、内部でローカルバッファを使う実装に置き換えられることがあります。OSや組込み環境では割り込みハンドラから呼ばれる関数は特にリエントラントであることが求められる場合が多いです。
コード例(C、非リエントラント vs リエントラント):
// 非リエントラント: static バッファを返す(同時呼び出しで競合する)
char* get_temp_str() {
static char buf[128];
strcpy(buf, "temporary");
return buf;
}
// リエントラント: 呼び出し側がバッファを渡す(同時呼び出しでも干渉しない)
char* get_temp_str_r(char *buf, size_t size) {
strncpy(buf, "temporary", size-1);
buf[size-1] = '\0';
return buf;
}
FAQ
Q1: リエントラントとスレッドセーフは同じですか?
A1: 完全には同じではありません。スレッドセーフは「並行実行で正しく動作する」を広く指し、ロック等で同期すればスレッドセーフになりますが、ロックがあると同時実行の意味が変わるため、リエントラント(同時に再入しても安全)とは異なります。
A1: 完全には同じではありません。スレッドセーフは「並行実行で正しく動作する」を広く指し、ロック等で同期すればスレッドセーフになりますが、ロックがあると同時実行の意味が変わるため、リエントラント(同時に再入しても安全)とは異なります。
Q2: 再帰関数は必ずリエントラントですか?
A2: いいえ。再帰関数でも静的変数を使っていればリエントラントではありません。局所変数のみで実装されていれば再帰であってもリエントラントになり得ます。
A2: いいえ。再帰関数でも静的変数を使っていればリエントラントではありません。局所変数のみで実装されていれば再帰であってもリエントラントになり得ます。
Q3: ライブラリ関数がリエントラントかどうかはどう判断しますか?
A3: マニュアルや仕様で「reentrant」や「thread-safe」と明記されているか確認し、内部で静的/共有データを使っている実装は注意が必要です。
A3: マニュアルや仕様で「reentrant」や「thread-safe」と明記されているか確認し、内部で静的/共有データを使っている実装は注意が必要です。
関連キーワード: リエントラント、再入可能、スレッドセーフ、静的変数、ロック、コールスタック、割り込み、再帰、再配置

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

