並行性、並列性、非同期、ノンブロッキングとその概念
(black7375.tistory.com)簡単な用語整理から始めて、グラフィックス、半導体まで幅広く扱ってみました。
- 用語
- 並行性 / 並列性
- 非同期 / ノンブロッキング
- プリエンプティブ / 非プリエンプティブ
- オペレーティングシステムとプロセッサ
- オペレーティングシステム
- プロセッサ
- コルーチンとファイバー
- ファイバー
- コルーチン
- ジェネレーター、Async/Await、継続
- ジェネレーター
- Async / Await
- 継続
- PromiseとFuture
- I/Oマルチプレクシング
- マルチプレクシング
- ソケット
- I/Oモデル
- リングバッファ、最新のI/Oモデル、LMAX Disruptor
- リングバッファ
- 最新のI/Oモデル
- LMAX Disruptor
- 同期プリミティブ
- 必要性
- スレッドセーフ
- スピンロック
- ミューテックス
- セマフォ
- STM
- GIL
- 他のスクリプト言語のアプローチとReactor/Proactorパターン
- Ractor (Ruby)
- Node.js (Reactorパターン)
- Proactorパターン
- CSPとアクター
- CSP
- アクター
- グリーンスレッド、goroutine、そして最新の非同期ランタイム技術
- グリーンスレッド
- 最新のCSPランタイム
- 最新のアクターランタイム
- 並列性
- SIMDとパイプライニング
- OpenMP & MPI
- 最新の並列技法
- ラムダアーキテクチャ
- GPU
- パイプラインとシェーダー
- モニター
- バッファリング
- 垂直同期
- フレームペーシングとビームレーシング
- コンポジター
- グラフィックス API / ライブラリ
- その他のチップ
- 概要
- DSP
- FPGA
- TPU
- 参考
10件のコメント
この言い方を数多くのブログでまったく同じように繰り返しているのを見かけるのですが、元の出典がどこなのか気になっています。
ほとんどのブログは互いに互いを参照するのに忙しく、原文を推測することができませんでした。かろうじて見つけたのは IBM の AIO 文書 だけなのですが、これはカーネル I/O に限定して語られているものではないかと思いまして。さらに、この区分法自体にも議論があると聞きました。
権威ある判断基準なのでしょうか?
まず、同期/非同期は回路寄りの考え方をベースにするとよさそうです。
同期回路はタイミングのためにクロックを使い、非同期はイベントや他の入力によってトリガーされる方式ですね。
つまり、非同期APIも同様にコールバックなどによってトリガーされる方式と定義しても無理はないと思います。
https://developer.mozilla.org/en-US/docs/…
ブロッキング/ノンブロッキングAPIは、処理を必ず待たなければならないかどうか、という点を定義とするのが適切です。
ただし、待たないためには呼び出した関数が制御権を持つ実装である必要があるため、そのように説明される傾向が強いようですね。
https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/
簡潔に済ませようとして省略していましたが、この内容も追加で入れてみようと思います.
おっしゃっていることにはすべて同意します。しかし、この2つの基準軸を四分円の断面として描くべきなのか、描けるのか、適切に区別できるのかについては、やはりまだ確信が持てません。私には、Blocking と Sync は概念的に90%ほど文脈を共有しているように感じられます。Non-Blocking と Async も同様です。
Blocking-SyncとNon-Blocking-Asyncは一緒に使われることが多いですが、区別が必要な場合があります。Blocking-Async:selectのような I/O マルチプレクシングNon-Blocking-Sync: データのポーリング (polling)そのため、私はむしろ区別して使うのが適切だと考えています。
挙げてくださった例についての理解がほとんどないので、いまひとつ共感しにくいのかもしれません。
https://incredible-larva.tistory.com/entry/IO-Multiplexing-Topabogi-1部 この記事では、次のように説明しています:
これについては、どのようなご意見をお持ちなのか気になります。実のところ私はこの時点で、もはやこの 2x2 の区分法は無意味だと感じました。ドメインごとに、また観点ごとに解釈が分かれているようなので。
この部分は、上でご同意いただいたコールバックによるトリガー方式なので、あえて区別・定義するなら Blocking-Async と呼ぶのが適切だと思います。
見方によっては曖昧に見える場合もあると思います。
ただし、ポーリングは確実な例ですが、
https://en.wikipedia.org/wiki/Polling_(computer_science)
ポーリングの場合は、データが準備できたかを繰り返し確認するため、Sync-Blocking の適切な例です.
わあ、良い資料をありがとうございます。
興味深く読みました!
スクロールしても終わりがありませんね、すごいです。
似たようなテーマを扱う『7つの並行モデル』という書籍も、一度くらい読んでみる価値がありそうです。
目次を比べてみると似ていますね
良い本のようです