非同期勉強会に参加してきた
先日,C#エンジニア向けの非同期勉強会なるものがあったので参加してきました.
私はC#というよりはC,C++系の人間ですが,非同期処理についてはしょっちゅう実装する機会がありましたので,非同期処理の一般的な話についての知見を深めるために参加しました.
当日の講師の方々はMicrosoft MVPを取られた技術に明るい人ばかりで,すごく豪華な勉強会でした!
以下概要.
以下は講義中のメモ.
* 「.NETにおける非同期処理の歴史」
- 同期 / 非同期
何らかのディスクアクセスを伴う処理だったり,ネットワーク通信をする処理といった重たい処理を実行した時,
同期処理だとその重たい処理が終了するまで他の入力イベントを受け付けないが,
非同期処理だと他の入力処理を受け付けられる
※ 同期処理だとユーザーからはフリーズしたように見えてUI上良くない
非同期処理では,UIスレッド上で起きたイベントは別スレッドに渡されるので,UIスレッドは他のイベントを受け付けられるという仕組み.
重たい仕事が来たら部下に丸投げする上司のようなイメージ!
- APIの変遷
C#のAPIが昔から今までどう進化してきたかのお話.
細かいAPIについてはC#屋さんじゃないのであまり興味がなかったのですが,以下3点は頭に入れた.
1. アプリ開発者から見えるAPIの仕様
2. APIの内部処理の変遷
3. async/await が現状最新
API変遷の歴史としては,
- 愚直にThread立てる時代 ( いちいちThreadを立てるのはコストが高いよね...)
- Thread pool で queueを使ってタスク処理をする
- 非同期プログラミングモデル ( Begin/End** 書き方がかなり複雑で生々しいよね..)
- イベントベースで明確な処理の切り分け!
- タスクベースが .NET4からでてきた!
- Reactive Extensions( 通称RX )
- async/await で同期処理とほぼ同じ書き方で楽ちん!
ちなみにasync/awaitは簡単に書けるらしいけど,昔の非同期処理のAPIを利用した経験のある開発者からすると,「非同期っぽく見えないから頭のなかで頑張って想像しなきゃいけない」という罠があるらしい.
実際にソースコード見てみたけど,APIの見た目が同期処理臭満載で確かに脳内補完必要だわと思いました.
* 「C++/CXの非同期処理まとめ」
- C++11: 今の規格
std::thread, std::asyncなど
コードは大分生々しい
- Lambda式の復習
C++11:
[](){}; // 関数の最小定義
[]]{ }();
C++14: generic lambda
C++17: resumable functions and await
VC2013では入っている
非同期処理によるレスポンスタイムの向上
* 「Windows ストア アプリでスレッド間排他処理(仮)」
話に聞き入ってしまってメモとるの忘れてました..
マルチスレッドプログラミングにおいてよくある失敗談的な話がありました.
中でも印象に残ったのは,「lockは使うな」というロックな主張でした!
元HONDAという経歴もあり,確固とした技術的なバックグラウンドがある方で多くのことを学ばせてもらいました.
* 「非同期処理の基礎知識」
- 基礎
CPUについて
CPU = 演算回路+記憶領域
計算するところと記憶するところ
記憶領域は階層をもつ(早いけど小さい,遅いけど大きい)
- 読み込みの原子性
32bitのCPUが64bitのデータを読み出すときは複数命令に分けて読みだす
- 割り込みのあれこれ
外部ハードウェアから「割り込み信号」が来る
どこで割り込みが入るかわからない
タイマー割り込み
ソフトウェア割り込み
割り込み命令(モード切り替え発生)
カーネルモードに入ればシステム全体のメモリにアクセス
- CPUの高度化
メモリは大容量とスピードが両立しない
記憶領域の階層は多段
キャッシュメモリ,2次キャッシュメモリ,メインメモリ
- マルチコア
コアごとにキャッシュ持っていたりするので,コアをまたいだデータの読み書きは低速
- スレッド
マルチタスク
コンピュータ内で複数のタスクが同時に動作
OSが特権モードを使って強制的にCPUリソースを奪い取る「プリエンプティブ」
⇒ ハードウェアタイマーが割り込みを行う.(モード変更が必要なので結構重たい)
スレッドを建てるコスト,切り替えるコスト
特権モードへの移行,レジスタの保存,スレッドの状態の入れ替え
ほそぼそとしたタスクの処理には向かない
スレッドプール
スレッドを可能な限り使いまわす
プリエンプティブなスレッド数本の上に協調的なタスクキューを用意
ロックフリーなローカルキュー
まとめ
スレッドは高コスト
かわりにスレッドプールの利用
⇔ Taskクラスでは内部的にスレッドプールが走るので利用推奨
- CPUの外の世界は遅い
実行速度がぜんぜん違う
1秒あればCPUは30億命令処理できる
- 2種類の負荷
CPUバウンド:重たい計算
I/Oバウンド:DBアクセス(ディスクアクセス) ⇒ スレッドは不要
I/O完了時のCallback
- 実装において気をつけるポイント:
独立に計算出来ないと,並列化の利益が少ない
double型は小さい値から足していかないと誤差が大きくなる.
数学的に a+b = b+a でも計算機上では誤差が発生することに留意する.
私はC#というよりはC,C++系の人間ですが,非同期処理についてはしょっちゅう実装する機会がありましたので,非同期処理の一般的な話についての知見を深めるために参加しました.
当日の講師の方々はMicrosoft MVPを取られた技術に明るい人ばかりで,すごく豪華な勉強会でした!
以下概要.
2014/05/10 (土) 13:00 - 18:00
非同期勉強会開催
非同期勉強会を開催します!非同期処理はC#5.0から非常にシンプルな記述で出来るようになりました。ただシンプルに記述できるようになったからと言って簡単に書けるとは限りません。そこで、日本中から集まった豪華エキスパートの方々から半日間非同期の話をみっちり聞きまくる非同期Day、非同期勉強会を開催します。これから勉強を始めたい方も、現在勉強中の方も、既にバリバリ使っている方も初心者向けから幅広くセッションを行いますので是非参加してくださいー。
スケジュール
12:45 開場
講師 時間 タイトル/概要 プロフィール 鈴木 孝明 @xin9le 13:00-13:50 「.NETにおける非同期処理の歴史」 .NET Frameworkが登場してから12年、非同期処理の記述方法もC#/.NETと共に進化してきました。この進化の歴史を今一度確認し、それぞれの方法をおさらいしてみましょう。 社会人になってからプログラミングを始めるも、新人研修の担当が某C# MVPという幸運に恵まれたラッキーボーイ。Hokuriku.NETの中心メンバーとして北陸のIT業界を盛り上げるべく鋭意活動中。最近はSignalRが大好き。Microsoft MVP for Visual C# (2012/07-2014/06)。 森理麟@moririring 14:00-14:50 「C#の高速化入門」 高速化の話をメインに非同期とマルチコアとマルチスレッドについての説明を入れながら ゲームプログラマです。C#が好きでスピーカーをしたり、勉強会を開催したりしています。「VSハッカソン倶楽部」の主催です。C#、VS、ハッカソン、自動化、CI、TDD、Unity、リファクタリングが好きです。Microsoft MVP for Visual C#(2013/01-2014/12) 遥佐保(はるかさお)@hr_sao 15:00-15:30 「C++/CXの非同期処理まとめ」 ブログ 出没コミュニティ→Room metro、C++テンプレート完全ガイド読書会 Microsoft MVP for Client Development [Jan,2014 - Dec,2014] 山本 康彦 @biac 15:40-16:30 「Windows ストア アプリでスレッド間排他処理(仮)」 async/awaitでlockは使えない。それじゃ、どう書けばいいのか?実践編 このところ Windows ストア アプリばかりやってます。@IT で「WinRT/Metro TIPS」連載中。昨年出版した「C#によるマルチコアのための非同期/並列処理プログラミング」は、それなりに売れてるらしいです。以前はSIer勤務で業務アプリばかりやってました。もっと以前は自動車の開発やってて、さらに前は大学で自動制御をやってたという、よく分からない人生(笑 岩永信之 @ufcpp 16:40-17:30 「非同期処理の基礎知識」 スレッドの切り替えやデータ競合の回避など、非同期処理に関わるコストやその回避方法を、CPUやOSレベルの話も交えて解説します。 ++C++; の中の人。C# でぐぐれ。 @yone64 17:30-17:35 非同期LT @pocketberserker 17:35-17:40 非同期LT @StoneGuitar777 17:40-17:45 FriendlyLT @moririring 17:45-17:50 次回予定 17:40-18:00 5分間で何かLTしてくれる人を募集します!
以下は講義中のメモ.
* 「.NETにおける非同期処理の歴史」
- 同期 / 非同期
何らかのディスクアクセスを伴う処理だったり,ネットワーク通信をする処理といった重たい処理を実行した時,
同期処理だとその重たい処理が終了するまで他の入力イベントを受け付けないが,
非同期処理だと他の入力処理を受け付けられる
※ 同期処理だとユーザーからはフリーズしたように見えてUI上良くない
非同期処理では,UIスレッド上で起きたイベントは別スレッドに渡されるので,UIスレッドは他のイベントを受け付けられるという仕組み.
重たい仕事が来たら部下に丸投げする上司のようなイメージ!
- APIの変遷
C#のAPIが昔から今までどう進化してきたかのお話.
細かいAPIについてはC#屋さんじゃないのであまり興味がなかったのですが,以下3点は頭に入れた.
1. アプリ開発者から見えるAPIの仕様
2. APIの内部処理の変遷
3. async/await が現状最新
API変遷の歴史としては,
- 愚直にThread立てる時代 ( いちいちThreadを立てるのはコストが高いよね...)
- Thread pool で queueを使ってタスク処理をする
- 非同期プログラミングモデル ( Begin/End** 書き方がかなり複雑で生々しいよね..)
- イベントベースで明確な処理の切り分け!
- タスクベースが .NET4からでてきた!
- Reactive Extensions( 通称RX )
- async/await で同期処理とほぼ同じ書き方で楽ちん!
ちなみにasync/awaitは簡単に書けるらしいけど,昔の非同期処理のAPIを利用した経験のある開発者からすると,「非同期っぽく見えないから頭のなかで頑張って想像しなきゃいけない」という罠があるらしい.
実際にソースコード見てみたけど,APIの見た目が同期処理臭満載で確かに脳内補完必要だわと思いました.
* 「C++/CXの非同期処理まとめ」
- C++11: 今の規格
std::thread, std::asyncなど
コードは大分生々しい
- Lambda式の復習
C++11:
[](){}; // 関数の最小定義
[]]{ }();
C++14: generic lambda
C++17: resumable functions and await
VC2013では入っている
非同期処理によるレスポンスタイムの向上
* 「Windows ストア アプリでスレッド間排他処理(仮)」
話に聞き入ってしまってメモとるの忘れてました..
マルチスレッドプログラミングにおいてよくある失敗談的な話がありました.
中でも印象に残ったのは,「lockは使うな」というロックな主張でした!
元HONDAという経歴もあり,確固とした技術的なバックグラウンドがある方で多くのことを学ばせてもらいました.
次のオンライン資料です https://t.co/9gJAW3ZHWk
#vshtc
— 山本康彦@BluewaterSoft (@biac) 2014, 5月 10
* 「非同期処理の基礎知識」
- 基礎
CPUについて
CPU = 演算回路+記憶領域
計算するところと記憶するところ
記憶領域は階層をもつ(早いけど小さい,遅いけど大きい)
- 読み込みの原子性
32bitのCPUが64bitのデータを読み出すときは複数命令に分けて読みだす
- 割り込みのあれこれ
外部ハードウェアから「割り込み信号」が来る
どこで割り込みが入るかわからない
タイマー割り込み
ソフトウェア割り込み
割り込み命令(モード切り替え発生)
カーネルモードに入ればシステム全体のメモリにアクセス
- CPUの高度化
メモリは大容量とスピードが両立しない
記憶領域の階層は多段
キャッシュメモリ,2次キャッシュメモリ,メインメモリ
- マルチコア
コアごとにキャッシュ持っていたりするので,コアをまたいだデータの読み書きは低速
- スレッド
マルチタスク
コンピュータ内で複数のタスクが同時に動作
OSが特権モードを使って強制的にCPUリソースを奪い取る「プリエンプティブ」
⇒ ハードウェアタイマーが割り込みを行う.(モード変更が必要なので結構重たい)
スレッドを建てるコスト,切り替えるコスト
特権モードへの移行,レジスタの保存,スレッドの状態の入れ替え
ほそぼそとしたタスクの処理には向かない
スレッドプール
スレッドを可能な限り使いまわす
プリエンプティブなスレッド数本の上に協調的なタスクキューを用意
ロックフリーなローカルキュー
まとめ
スレッドは高コスト
かわりにスレッドプールの利用
⇔ Taskクラスでは内部的にスレッドプールが走るので利用推奨
- CPUの外の世界は遅い
実行速度がぜんぜん違う
1秒あればCPUは30億命令処理できる
- 2種類の負荷
CPUバウンド:重たい計算
I/Oバウンド:DBアクセス(ディスクアクセス) ⇒ スレッドは不要
I/O完了時のCallback
- 実装において気をつけるポイント:
独立に計算出来ないと,並列化の利益が少ない
double型は小さい値から足していかないと誤差が大きくなる.
数学的に a+b = b+a でも計算機上では誤差が発生することに留意する.
コメント
コメントを投稿