2016-08-30 3 views
1

私はC#経由で本のCLRを通して自分の道を作り続けてきました。私は第28章でI/Oバウンドスレッドについて話しています。I/Oが完了するのを待ってから.NETタスクを続けることができますか?

ここに私が理解していると思います。各スレッドには独自のスタックがあります。あなたが非同期を使用していて、あなたのIOにまで(そしてあなたのIOを含む)待っているとき、システムはデバイスのIRPキューにIO要求パケット(IRP)を送ります。 IO操作が完了すると、完了したIRPはスレッドプールに "戻る"状態に戻り、スレッドプールはリソースをに割り当て、非同期処理がオフの場合はを実行します。

質問:CLRスレッドがIOデバイスに制御を渡すと、そのCLRスレッドはどうなりますか?そのスレッドのスタックはすべてポップされてスレッドプールに返されますか?そして、もしそれが再利用されるようになったら、I/Oが完了するのを待っているプロセス状態の継続に不可欠なスタックではありませんか? IOが完了したときに元のCLRスレッドが(逐次的に)どこにあったのか、コンピュータはどのように知っていますか? をどこで中止したかを知る方法は?

+0

あなたがダウン投票に行く場合は、コメントを残してください!私はそれが良い質問だと思った。 – Trevor

+0

MSDN技術記事を含むドキュメントは、このようなものの内部動作に関する詳細情報を得るのにはるかに良い場所です。特に、あなたが扱っている特定のI/Oデバイスと使用しているAPIに応じて、実際にはWindowsでの非同期I/Oの利用可能なメカニズムがいくつか存在します。 –

+0

最も一般的なシナリオの1つは、IOCPで待機するためにいくつかの少数のスレッドが作成され、専用されるI/O完了ポートを使用することです。このメカニズムを使用すると、単一のスレッドが多数の操作のためにI/O完了を処理できるため、スレッドプールを効率的に使用できます。 –

答えて

1

CPUのどこかにポインタがありますか?「こんにちは、あなたがこのIOをすべて要求したときに、あなたはここでプログラムロジックにいたのですが、ここで再び始める必要がありますか?

いいえ非同期I/Oの再開は、一連のコールバックによって実行されます。 IOCPは.NET I/Oスレッドプールスレッド上で実行される完了ルーチンをコールし、最終的にTaskを完了し、タスクの継続を実行し、asyncメソッドの実行を再開します。詳細については、私のブログ投稿There Is No Threadを参照してください。

asyncのメソッドは、ではありません。は、必ず同じスレッドで再開します。 awaitが特定の状況でどのように再開するかについては、私のブログ投稿Async and Awaitをご覧ください。

+0

スティーブンに感謝します。私は今、待ち受け人と州の機械について読んでいます。私はそれが私が得ようとしているものだと思います。私はこのすべての仕組みの「魔法」を明らかにする。とてもかっこいい。 – Trevor

関連する問題