問題タブ [green-threads]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
multithreading - 非同期とスケジューリング - ライブラリが最下位レベルでのブロックを回避するにはどうすればよいですか?
私はしばらくの間、すべての魔法がどのように発生するかについてあまり考慮せずに、さまざまな同時実行構造を使用してきましたが、最近ますます不安になっています。
この感じを改善するために、私は async が内部でどのように機能するかを調べてきました。非同期と言うとき、この場合はユーザーランド/グリーンスレッド/協調マルチタスクを指していますが、一部の概念は、スケジューラとワーカーが関与する限り、従来の OS 管理スレッドにも適用されると思います。
ワーカーが自分自身を一時停止して他のワーカーを実行させる方法はわかりましたが、ノンブロッキング ライブラリ コードの最下位レベルでは、以前に一時停止されたワーカーのジョブがいつ完了し、そのワーカーをウェイクアップするかをスケジューラーがどのように認識しているのでしょうか。
たとえば、ある種の非同期ブロックでワーカーを起動し、通常はブロックされる操作 (HTTP 要求、SQL クエリ、その他の I/O など) を実行すると、呼び出しコードが非同期であっても、その操作 (ライブラリ コード) 非同期フレームワークでうまくプレイするか、それを使用する目的を効果的に無効にして、内部で実行されたブロッキング呼び出しを待機している間、スケジューラーが他の待機操作を呼び出すのをブロックしました (関数の色は何ですか)。非ブロッキング呼び出しコードを完成させます。
これで、他の非同期ライブラリ コードを呼び出す非同期コードが得られたので、もう一度自問自答しています。非同期ライブラリ コードは、操作を一時停止して再開するタイミングをどのように認識しているのでしょうか。
HTTP リクエストを送信し、先に進み、後で戻って結果を確認するという考えは、概念的にではなく、実装の観点から考えると奇妙です。
TCP パケットを送信して残りのプログラム実行を続行し、後で戻って結果が配信されたかどうかを確認するなど、部分的な操作をどのように実行しますか。何に配信?ソケット?
今、私たちは別のレイヤーの深さになり、ソケット選択を使用してスレッドの作成とブロックを回避していますが、繰り返します...
- それらのソケットはどのように操作を開始し、完了する前に移動し、select はデータが利用可能になったことをどのように認識しますか?
- バイトが無限ループで配信されたかどうかを確認するためにバッファを継続的にチェックし、配信されていない場合は先に進んでいますか?
とにかく - ここで私がどこに向かっているのかわかると思います....
動機付けの例として主に HTTP に焦点を当てましたが、同じ質問が通常のブロック操作にも当てはまります。
以下は、このトピックの調査中に役立ち、この質問に情報を提供したリソースの一部です。
David Beazley の優れたビデオBuild Your Own Asyncでは、コールバックを起動し、待機キューでスリープして実行を中断するスケジューラの簡単な実装について説明しています。このビデオは非常に有益であることがわかりましたが、非同期スリープを使用することでスケジューラが解放されて他のワーカーを実行できるようになることを示しているという点で、少し短く終わります。それ自体はノンブロッキングである必要があるため、スケジューラとうまく連携します。
ノンブロッキング IO は内部でどのように機能するか- これにより理解が深まりましたが、まだいくつかの不確実性が残っています。
java - ユーザーレベルのスレッドがブロックされたときの「ピアスレッド」のブロックに関する混乱
私はスレッドとプロセスの違いについて読んでいましたが、文字通りオンラインのどこでも、1つの違いはあまり説明なしで一般的に書かれています:
プロセスがブロックされた場合、残りのプロセスは実行を継続できます。ユーザー レベルのスレッドがブロックされると、そのピア スレッドもすべてブロックされます。
私には意味がありません。スケジューラがブロックされたスレッドと準備完了/実行可能なスレッドを切り替えることができない場合、同時実行の意味は何でしょうか。与えられた理由は、OS は特定の親プロセスのさまざまなスレッドを区別しないため、それらすべてを一度にブロックするためです。
親プロセスのメモリ空間内でのみ有効であっても、最近のすべての OS にはスレッド ID を持つスレッド制御ブロックがあるため、非常に説得力がないと思います。Galvin のオペレーティング システムの本にある例のように、スペル チェック スレッドが何らかのオンライン辞書に接続できない場合に、入力を処理しているスレッドをブロックしたくありません。
私がこの概念を間違って理解しているか、これらの Web サイトはすべて、何年にもわたって古いスレッドの違いをコピーしただけです。さらに、Galvin のような本や、スレッドが議論されている William Stalling の COA の本には、この声明を見つけることができません。
これらは、ステートメントを見つけたリソースです。