基本情報技術者 2015年 春期 午前(科目A) 問07
問題文
再入可能プログラムの特徴はどれか。
選択肢
ア:主記憶上のどこのアドレスに配置しても、実行することができる。
イ:手続の内部から自分自身を呼び出すことができる。
ウ:必要な部分を補助記憶装置から読み込みながら動作する。主記憶領域の大きさに制限があるときに、有効な手法である。
エ:複数のタスクからの呼出しに対して、並行して実行されても、それぞれのタスクに正しい結果を返す。(正解)
🔒 解説は解答すると表示されます
再入可能プログラム【午前解説】
正解の理由
正解:エ
再入可能(reentrant)なプログラムやルーチンは、複数のタスクや割り込みハンドラなどから同時に呼び出されても、それぞれ独立して正しい結果を返します。これは主に以下の理由によります。
再入可能(reentrant)なプログラムやルーチンは、複数のタスクや割り込みハンドラなどから同時に呼び出されても、それぞれ独立して正しい結果を返します。これは主に以下の理由によります。
- 共有して書き換える静的領域を持たない(あるいはアクセス制御が不要)
- ローカル変数をスタックに置き、再入時に干渉しない
- コード自体が読み取り専用で自己書換えをしない
よって「複数のタスクからの呼出しに対して、並行して実行されても、それぞれのタスクに正しい結果を返す」説明が再入可能の定義に合致します。
解法ステップ
- 問題文のキーワードを確認:「複数のタスク」「並行して」「それぞれ正しい結果」→並行性・同時実行を示す。
- 各選択肢を概念に対応付ける(再配置、再帰、ロード方式、再入可能)。
- 再入可能の定義を思い出す:割り込みや並列呼出しに耐えられるかを基準に判定。
- 該当する選択肢を選ぶ:並行呼出しで正しい結果を返すのは再入可能(エ)。
選択肢別の誤答解説
- ア: 主記憶上のどこのアドレスに配置しても実行できる → 再配置可能(relocatable)の説明であり再入可能とは異なります。
- イ: 手続の内部から自分自身を呼び出すことができる → 再帰(recursive)の定義で、再入可能とは別概念です。
- ウ: 必要な部分を補助記憶装置から読み込みながら動作する → オーバーレイやオンデマンド読み込み(仮想記憶、スワップ)の説明であり、再入性を示していません。
- エ: 複数のタスクからの呼出しに対して、並行して実行されても、それぞれのタスクに正しい結果を返す → これが再入可能の正しい定義です。
よくある誤解
- 再入可能=位置に依存しない(再配置可能)と混同する。配置可能性は再配置可能の概念であり別物です。
- 再入可能=再帰可能と誤解する。再帰は自己呼び出しを指すが、再入可能は同時並行呼出しの安全性を指します。
- 再入可能=スレッドセーフと思い込む。スレッドセーフはロックで保護して正しく動くことを指し、ロックは割り込み内で使えないため必ずしも再入可能ではありません。
補足コラム
再入可能な関数を作るための具体的注意点:静的変数やグローバルの書き換えを避ける、関数内で共有バッファを使わず呼び出し側が用意したバッファを使う、標準ライブラリでも非再入可能な関数(例:strtok)は避ける。
C言語での例:
C言語での例:
/* 非再入可能例(静的変数を使う) */
char *bufptr;
char *non_reentrant(const char *s) {
bufptr = malloc(100); /* 共有状態を変更するため再入不可 */
/* 省略 */
return bufptr;
}
/* 再入可能例(呼び出し側バッファを使用) */
void reentrant_func(const char *s, char *out, size_t out_sz) {
/* ローカル変数のみ使用し、outは呼び出し側が用意 */
snprintf(out, out_sz, "result:%s", s);
}
割り込みハンドラではロックが使えない場合があるため、割り込み経由で呼ばれる関数は特に再入可能であることが要求されます。
FAQ
Q1: 再入可能とスレッドセーフは同じですか?
A1: 同じではありません。スレッドセーフはロック等で整合性を保てば良い場合が多く、再入可能は割り込みや同時実行でもロックなしに安全に動作することを意味します。
A1: 同じではありません。スレッドセーフはロック等で整合性を保てば良い場合が多く、再入可能は割り込みや同時実行でもロックなしに安全に動作することを意味します。
Q2: 再帰関数は自動的に再入可能ですか?
A2: 自動的には違います。再帰は自己呼び出しであり、ローカル変数だけを使えば再入可能になり得ますが、共有状態を使えば再入不可になります。
A2: 自動的には違います。再帰は自己呼び出しであり、ローカル変数だけを使えば再入可能になり得ますが、共有状態を使えば再入不可になります。
Q3: 標準ライブラリは再入可能ですか?
A3: 全てが再入可能とは限りません。例えばstrtokは非再入可能で、strtok_rのような再入可能版が用意されている関数もあります。
A3: 全てが再入可能とは限りません。例えばstrtokは非再入可能で、strtok_rのような再入可能版が用意されている関数もあります。
関連キーワード: 再入可能、再配置、再帰、オーバーレイ、割り込み、スレッド安全、再入不可能関数

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

