プログラムを複数で使う:再入可能とは?

AIの初心者
先生、『再入可能』ってどういう意味ですか?プログラムの特性のひとつらしいんですが、よく分かりません。

AI専門家
そうですね。『再入可能』とは、複数の仕事から同時に呼び出されても、それぞれの仕事をきちんと並行して処理できる性質のことです。たとえば、たくさんの人が同時に同じ電卓を使いたいとします。それぞれが好きな計算をしても、ちゃんと答えが返ってくる電卓が『再入可能』な電卓です。

AIの初心者
なるほど。でも、同時に複数の計算をしたら、答えが混ざったりしないんですか?

AI専門家
良い質問ですね。再入可能なプログラムは、それぞれの仕事のための領域をきちんと分けて管理しています。だから、同時に複数の仕事が来ても、それぞれの計算は混ざることなく、正しい答えが返ってくるんです。
再入可能とは。
複数の仕事から同時に呼び出されても、それぞれの仕事を支障なく同時に進めることができるコンピュータープログラムの性質について説明します。
再入可能という性質

何度も使えるという考え方は、複数の利用者や複数の処理の流れが同時に同じプログラムを呼び出しても、それぞれが正しく動くことを意味します。まるで各利用者ごとに専用のプログラムがあるかのように、お互いに邪魔することなく、それぞれの処理を進めることができます。
この性質を「再入可能」と言い、再入可能なプログラムは資源を有効に使えるため、現代の計算機システムにとって重要です。
たとえば、よく使われる例として、計算機の動作全体を管理する基本部分(オペレーティングシステムのカーネル)や、様々なプログラムで共通して使われる部品のようなプログラム(ライブラリ関数)があります。これらは多くが再入可能になるように作られています。
なぜ再入可能であることが重要なのかというと、複数のプログラムが同時にシステムの資源を使えるようにすることで、システム全体の性能を上げることができるからです。もしプログラムが再入可能でないと、ある利用者がプログラムを使っている間、他の利用者は待たなければなりません。これは、計算機の資源を有効に使えていない状態と言えます。
再入可能にするためには、プログラムの中で値を保存する場所の使い方に注意深く配慮する必要があります。それぞれの利用者や処理の流れが、自分専用の保存場所を持っているように設計することで、他の利用者や処理の流れによる変更の影響を受けないようにします。
このような工夫によって、プログラムは複数の利用者から同時に使われても、それぞれが正しく動作し、システム全体の効率を高めることに貢献します。
| 再入可能性 | 説明 | 利点 | 具体例 | 設計時の注意点 |
|---|---|---|---|---|
| 定義 | 複数の利用者や処理の流れが同時に同じプログラムを呼び出しても、それぞれが正しく動く性質。 | 資源の有効活用、システム性能向上 | OSカーネル、ライブラリ関数 | 値の保存場所を各利用者/処理ごとに適切に管理 |
| 重要性 | 複数のプログラムが同時にシステム資源を使えるようにし、システム全体の性能を向上させる。 | 待ち時間の削減、資源の有効活用 | – | – |
再入可能とスレッドセーフ

プログラムを安全に動かす上で、「再入可能」と「糸安全」という二つの大切な考え方があります。どちらも複数の処理の流れが同時にアクセスしても正しく動くことを目指しますが、その方法は違います。
再入可能なプログラムは、基本的にみんなで使う資源には触れません。どうしても触る必要がある時は、順番にアクセスする仕組みを使って、データが壊れないように守ります。例えるなら、図書館の本棚です。誰かが本を借りる時は、貸出カードに記入することで、他の人は同じ本を同時に借りることができません。このようにして、データの一貫性を保ちます。
一方、糸安全なプログラムは、みんなで使う資源へのアクセスを前提としています。複数の糸が同時に資源にアクセスしても、問題が起こらないように、プログラム自体が調整する仕組みを持っています。これは、みんなで使う大きなテーブルで、それぞれが自分の場所を確保して食事をするようなものです。テーブルは共有資源ですが、それぞれが自分の領域を守って食事をするため、お互いに干渉しません。
つまり、再入可能なプログラムは糸安全です。なぜなら、そもそも共有資源にアクセスしないので、複数の糸が同時にアクセスしても問題が発生する余地がないからです。しかし、糸安全なプログラムは必ずしも再入可能ではありません。糸安全なプログラムは、共有資源へのアクセスを制御しますが、再入可能なプログラムのように、共有資源へのアクセス自体を避けているわけではないからです。
このように、共有資源へのアクセスの仕方に注目すると、再入可能と糸安全の違いがはっきりします。再入可能性は、共有資源へのアクセスを避けることで安全性を確保し、糸安全は、共有資源へのアクセスを制御することで安全性を確保します。どちらの方法も、複数の処理の流れが同時にアクセスしても正しくプログラムが動くために必要不可欠なものです。
| 項目 | 再入可能 | 糸安全 |
|---|---|---|
| 共有資源へのアクセス | アクセスしない (例外的にアクセスする場合は排他制御) | アクセスを制御 |
| イメージ | 図書館の本棚 (貸出カードによる排他制御) | 大きなテーブル (各自の領域を確保) |
| 相互関係 | 再入可能 → 糸安全 | 糸安全 ≠ 再入可能 |
再入可能プログラムの設計

プログラムを複数回、同時に実行しても問題なく動作するように設計することを「再入可能」と呼びます。このような設計をするには、いくつかの大切な点に注意する必要があります。まず、複数のプログラムから同時にアクセスされる可能性のあるデータ、いわゆる「大域変数」や「静的変数」といったものは、できるだけ使用しないように心がけることが重要です。どうしても使わなければならない場合は、「ロック機構」などを使い、同時にアクセスされるのを防ぐ必要があります。これは、複数の利用者が同時に同じデータを使おうとした場合に起こる、データの破損や予期しない動作を防ぐためです。
次に、プログラムが内部で使うデータは、「スタック領域」と呼ばれる場所に置くようにします。スタック領域は、プログラムを動かす際にそれぞれの処理単位に独立して割り当てられる領域です。例えるなら、それぞれ独立した作業机のようなものです。そのため、複数のプログラムから同時にアクセスされても、データが壊れる心配はありません。これは、同時進行の作業をしても、それぞれの作業机にあるものが混ざったりしないのと同じです。
さらに、外部から受け取ったデータは、そのまま変更するのではなく、まず複製を作ってからその複製を操作するようにします。受け取ったデータを直接変更してしまうと、他のプログラムにも影響が出てしまう可能性があるからです。これは、他の人から借りた書類に直接書き込むのではなく、コピーを取ってから書き込むようにすることで、元の書類を汚さないようにするのと似ています。
これらの点に注意することで、安全で効率の良い、再入可能なプログラムを作成することができるようになります。複数のプログラムが同時に動作するような環境では特に、このような設計が重要になります。
| 再入可能なプログラム設計のポイント | 説明 | 例え |
|---|---|---|
| 大域変数や静的変数の使用を避ける | 複数のプログラムから同時にアクセスされる可能性のあるデータは、ロック機構などで保護する必要がある。 | 複数の利用者が同時に同じデータを使おうとした場合に起こる、データの破損や予期しない動作を防ぐ。 |
| スタック領域の活用 | プログラムが内部で使うデータは、それぞれの処理単位に独立して割り当てられるスタック領域に置く。 | それぞれ独立した作業机のようなもので、同時進行の作業をしても、それぞれの作業机にあるものが混ざったりしない。 |
| 外部データの複製 | 外部から受け取ったデータは、そのまま変更するのではなく、複製を作って操作する。 | 他の人から借りた書類に直接書き込むのではなく、コピーを取ってから書き込むようにすることで、元の書類を汚さないようにする。 |
再入不可の例

複数の処理の流れが同時に同じ資源にアクセスすると、取り返しのつかない問題が起こる可能性があります。これを防ぐためには、資源へのアクセスを順番に制御する必要があります。そうでないと、まるで複数の職人が同時に同じ設計図を書き換えてしまうような混乱が生じ、最終的に何が出来上がるのか分からなくなってしまいます。
例えば、プログラムの中で特定の場所に値を保管しておく場所を考えてみてください。これは、いわば設計図全体の保管庫のようなものです。複数の処理の流れが同時にこの保管庫にアクセスし、値を書き込んだり読み込んだりすると、どの値が最新のものか分からなくなってしまいます。ある処理の流れが値を書き込んでいる途中で、別の処理の流れが古い値を読み込んでしまうかもしれません。これは、まるで複数の職人が同時に設計図を書き換えて、古い情報に基づいて作業を進めてしまうようなものです。結果として、最終的に出来上がるものは意図したものとは全く異なるものになってしまうでしょう。
また、複数の処理の流れが同時に一つの場所に書き込みを行う場合も同様の問題が発生します。例えば、複数の処理の流れが同時に一つのファイルに書き込みを行うと、データが混ざってしまい、ファイルの内容が壊れてしまう可能性があります。これは、複数の職人が同時に同じ設計図に書き込みを行い、線がぐちゃぐちゃになってしまうようなものです。
このような問題を防ぐためには、資源へのアクセスを適切に管理する必要があります。例えば、保管庫に鍵をかけて、一度に一つの処理の流れしかアクセスできないようにする、あるいは書き込みを行う場所に順番待ちの仕組みを導入するなどの方法があります。複数の職人が同時に設計図を書き換えないように、順番に作業を進めるように指示するのと同様です。
複数の処理の流れが同時に実行される環境では、このような資源へのアクセスの制御は特に重要です。適切な制御を行わないと、プログラムの動作が不安定になり、予期しない結果を招く可能性があります。複数の職人が同時に作業を進める場合、作業手順を明確にして、それぞれが独立して作業できる範囲を定めることが、最終的に設計図を完成させるために不可欠です。
再入可能プログラムの利点

複数の処理の流れから同時に呼び出されても正しく動作するプログラム、すなわち再入可能プログラムには、様々な利点があります。まず、システム資源を有効に活用できるという点が挙げられます。同じプログラムを何度もメモリに読み込む必要がないため、メモリの使用量を削減できます。特に、多くの処理が同時に行われるような、複数の処理を並行して行う環境や、一つの処理を複数の小さな処理に分割して並行して行う環境では、この利点は大きくなります。同じプログラムを何度も読み込む代わりに、一つのプログラムを共有して利用することで、メモリの消費を抑え、システム全体を軽快に動作させることができます。
次に、プログラムの部品化を進めやすく、管理や再利用がしやすくなる点もメリットです。再入可能プログラムは、他のプログラムから独立して動作するように設計されているため、プログラムの一部を部品のように組み合わせて、新たなプログラムを作る際に再利用しやすくなります。また、変更や修正が必要になった場合でも、影響範囲を限定できるため、管理がしやすく、修正にかかる手間や時間を削減できます。これは、開発にかかる費用を抑えることにも繋がります。
さらに、プログラムの誤りを探し出す作業も容易になります。複数の処理の流れから呼び出されても正しく動作するように設計されているため、問題が発生した場合でも、原因を特定しやすい構造になっています。問題が起きた際の状況を再現しやすく、誤りの箇所の特定にかかる時間が短縮されます。
このように、再入可能プログラムは、資源の有効活用、管理の容易さ、誤り発見の容易さなど、多くの利点を持ち、高性能で信頼性の高いシステムを構築する上で重要な役割を果たします。
| 再入可能プログラムの利点 | 説明 |
|---|---|
| システム資源の有効活用 | 同じプログラムを複数回メモリにロードする必要がないため、メモリ使用量を削減。特に並行処理環境で有効。 |
| プログラムの部品化、管理、再利用の容易さ | 独立して動作する設計のため、部品のように組み合わせ、再利用が容易。変更の影響範囲も限定でき、管理、修正の手間を削減。 |
| プログラムの誤り発見の容易さ | 複数の処理から呼び出されても正しく動作する設計のため、問題発生時の原因特定が容易。状況再現も容易で、誤り箇所の特定時間を短縮。 |
まとめ

複数の仕事が同時に行われる現代の計算機環境では、一つの手順が複数の場所から同時に呼び出される状況は珍しくありません。このような状況で正しく動く手順を作るためには、再入可能性という概念を理解する必要があります。再入可能な手順とは、複数の仕事から同時に呼び出されても、それぞれが正しく動き、お互いに悪影響を与えない手順のことです。
例えば、複数の利用者が同時に同じ計算を行う場面を考えてみましょう。もし、その計算手順が再入可能でなければ、一人の利用者の計算が他の利用者の計算結果を書き換えてしまうかもしれません。これは、誤った結果を生み出すだけでなく、システム全体の不安定さにもつながります。一方で、再入可能な手順であれば、それぞれの利用者の計算は独立して行われ、正しい結果が得られます。
再入可能な手順を作るためには、手順内で値を保管する場所に注意が必要です。例えば、手順全体で共有される値を保管する場所を使うと、ある仕事がその値を変更したときに、同時にその手順を呼び出している他の仕事に影響を与えてしまう可能性があります。このような問題を防ぐためには、それぞれの仕事が自分の値を保管する場所を持つように設計する必要があります。
手順同士が共通で使う資源にも注意が必要です。例えば、印刷装置のような資源は、同時に複数の仕事から使われると、出力内容が混ざってしまう可能性があります。このような場合は、資源を使う順番を調整する仕組みが必要です。ある仕事が資源を使っている間は、他の仕事は資源を使えないようにすることで、資源へのアクセスを排他的にし、問題を防ぐことができます。
再入可能性を意識した手順設計は、複雑な計算機環境において、システムの安定性と効率性を高める上で非常に重要です。現代の多くの処理装置は複数の仕事を同時に行うため、再入可能性は手順作成の基本的な考え方と言えるでしょう。
