14
Async DeepDive before de:code 2016.05.23 DE:CODE 前夜祭 KOUJI MATSUI (@KEKYO2)

Async deepdive before de:code

Embed Size (px)

Citation preview

AsyncDeepDivebefore de:code2016.05.23 DE:CODE前夜祭 KOUJI MATSUI (@KEKYO2)

自己紹介

けきょ (@kekyo2, www.kekyo.net)

ロードバイク乗り

Microsoft MVP for Visual Studio and Development Technology

認定スクラムマスター・スクラムプロダクトオーナー

Center CLRオーガナイザー

C#, F#, IL, C++

アジェンダ

なぜ非同期処理が必要なのか、上から下までをやります

細部はきりがないので、質問があれば随時受けます

こんな非同期処理のコード

非同期処理の実現には、ワーカースレッドを使うのか?

ワーカースレッドを使わない高いパフォーマンス

ユーザーモード

User mode thread context

Event Object

カーネルモード

User mode thread context

デバイス応答

Interrupt handler context

Come back Salmon

どのプロセスに戻せばいいのか?どのスレッドに戻せばいいのか?

DPC context(Unknown thread)

Event Object

I/O Completion port

Thread pool

再びユーザーモード I/O completion portManaged thread

(Main/other)Thread pool

CPS (Task.ContinueWith)

Worker thhreadcontext

I/O完了ポート

ここに至るまでの間、基本的にワーカースレッドは全て解放され、ハードウェア駆動による処理だけが実行されている(→完全にハードウェアオフロードされている)

だから完全に非同期処理でコードを実現すると、高パフォーマンスが得られる。いかにワーカースレッドを「使わないか」が鍵。

カーネルイベントオブジェクトでI/O処理の完了が通知され、.NET ThreadPoolからI/O完了ポートを使ってワーカースレッドが割り当てられて実行される。

という事は:

Task.Run() 使ったら負け

Task.Wait(), Task.Result使ったら負け

Async.RunSyncronosly使ったら負け

ご清聴ありがとうございました!スライドはブログに上げます◦ http://www.kekyo.net/

Async訪ねて3000里◦ Async訪ねて3000里 (1): ユーザーモードのターン

Async訪ねて3000里 (2): ファイルシステム・パーティションマネージャ・物理ディスクデバイスドライバAsync訪ねて3000里 (3): ハードウェア割り込みとDPCAsync訪ねて3000里 (4): I/Oの完了とAPCAsync訪ねて3000里 (5): TaskCompletionSourceでTaskの継続へAsync訪ねて3000里 (6): I/O完了ポートによるワーカースレッドの運用

Asyncの基礎◦ これからの「async/await」の話をしよう

http://www.slideshare.net/kekyo/asyncawait-41353786◦ async/awaitダークサイドis何

http://www.slideshare.net/kekyo/asyncawait-is