スレッド通信の背後にある一般的な理論は何ですか? 私はそれがどのように機能するべきかについていくつかの原始的なアイデアを持っていますが、何かがうまくいきません. 割り込みでそれを行う方法はありますか?
5 に答える
実際、これは並行性の問題とまったく同じです。複数の制御スレッドがあり、どのスレッドのどのステートメントがいつ実行されるかは不確定です。つまり、プログラムには多数の潜在的な実行パスがあり、プログラムはそれらすべての下で正しくなければなりません。
一般に、問題が発生する可能性のある場所は、スレッド間で状態が共有されている場合です (昔は「軽量プロセス」とも呼ばれていました)。これは、共有メモリ領域がある場合に発生します。
正確性を確保するために必要なことは、エラーが発生しない方法でこれらのデータ領域が更新されるようにすることです。これを行うには、プログラムの「クリティカル セクション」を特定する必要があります。このセクションでは、シーケンシャル オペレーションを保証する必要があります。それらは、単一の命令またはコード行と同じくらい小さい場合があります。言語とアーキテクチャによってこれらがアトミックであること、つまり中断できないことが保証されている場合、あなたは成功しています。
それ以外の場合は、そのセクションを識別し、何らかのガードを配置します。古典的な方法は、semaphoreを使用することです。これは、一度に 1 つの制御スレッドのみを通過させるアトミック ステートメントです。これらは Edsgar Dijkstra によって発明されたので、名前はオランダ語のPとVに由来します。Pに到達すると、1 つのスレッドのみが続行できます。他のすべてのスレッドはキューに入れられ、実行中のスレッドが関連するV操作に到達するまで待機します。
これらのプリミティブは少し原始的であり、オランダ語の名前はあまり直感的ではないため、より大規模なアプローチが開発されています。
Per Brinch-Hansen はmonitorを発明しました。これは基本的に、アトミックであることが保証された操作を持つ単なるデータ構造です。これらはセマフォで実装できます。モニターは、ほとんど Javasynchronized
ステートメントが基づいているものです。それらは、オブジェクトまたはコード ブロックに特定の動作を持たせます。つまり、一度に 1 つのスレッドしか "中に" 入れることができません。構文は単純です。
可能な他のモデルがあります。Haskell と Erlang は関数型言語であるため、一度変数を作成すると変更できないため、この問題を解決できます。これは当然、同期について心配する必要がないことを意味します。Clojure などの新しい言語の中には、代わりに「トランザクション メモリ」と呼ばれる構造を持っているものがあります。これは基本的に、代入がある場合、代入がアトミックで可逆的であることが保証されることを意味します。
要するに以上です。それについて本当に学ぶには、たとえばAndy Tannenbaum のテキスト のようなオペレーティング システムのテキストを見るのに最適な場所です。
スレッド通信の最も一般的な 2 つのメカニズムは、共有状態とメッセージ パッシングです。
スレッドが通信する最も一般的な方法は、共有データ構造 (通常はキュー) を使用することです。情報をキューに入れるスレッドもあれば、情報を取り出すスレッドもあります。キューは、ミューテックスやセマフォなどのオペレーティング システム機能によって保護されている必要があります。割り込みは関係ありません。
スレッド間で通信するには、オペレーティング システムやランタイムによって提供されるメカニズムを使用する必要があります。スレッドがソケットまたは名前付きパイプを使用して通信する場合、割り込みは暗黙的に使用される可能性がありますが、割り込みは異常に低レベルです。
一般的なパターンは、共有メモリ ブロックを使用して共有状態を実装することです。ブロックからの読み取り時にビジー待機を回避するために、mutex などの OS 提供の同期プリミティブに依存します。スレッドがある場合は、何らかの種類のスケジューラーが既にある必要があることに注意してください (OS のネイティブであるか、言語ランタイムでエミュレートされているかに関係なく)。したがって、このスケジューラーは、必ずしもハードウェア サポートに依存する必要なく、同期オブジェクトと「スリープ」機能を提供できます。
ソケット、パイプ、および共有メモリもプロセス間で機能します。ランタイムによって、同じプロセス内のスレッドの同期を行うための軽量な方法が提供される場合があります。共有メモリは、単一のプロセス内では安価です。また、ランタイムがアトミック メッセージ パッシング メカニズムを提供する場合もあります。
スレッド通信の理論に本当に興味がある場合は、 pi Calculusのような形式を調べることができます。