69 ポイント 投稿者 alstjr7375 2022-12-28 | 10件のコメント | WhatsAppで共有

簡単な用語整理から始めて、グラフィックス、半導体まで幅広く扱ってみました。

  1. 用語
    • 並行性 / 並列性
    • 非同期 / ノンブロッキング
    • プリエンプティブ / 非プリエンプティブ
  2. オペレーティングシステムとプロセッサ
    • オペレーティングシステム
    • プロセッサ
  3. コルーチンとファイバー
    • ファイバー
    • コルーチン
  4. ジェネレーター、Async/Await、継続
    • ジェネレーター
    • Async / Await
    • 継続
  5. PromiseとFuture
  6. I/Oマルチプレクシング
    • マルチプレクシング
    • ソケット
    • I/Oモデル
  7. リングバッファ、最新のI/Oモデル、LMAX Disruptor
    • リングバッファ
    • 最新のI/Oモデル
    • LMAX Disruptor
  8. 同期プリミティブ
    • 必要性
    • スレッドセーフ
    • スピンロック
    • ミューテックス
    • セマフォ
    • STM
    • GIL
  9. 他のスクリプト言語のアプローチとReactor/Proactorパターン
    • Ractor (Ruby)
    • Node.js (Reactorパターン)
    • Proactorパターン
  10. CSPとアクター
    • CSP
    • アクター
  11. グリーンスレッド、goroutine、そして最新の非同期ランタイム技術
    • グリーンスレッド
    • 最新のCSPランタイム
    • 最新のアクターランタイム
  12. 並列性
    • SIMDとパイプライニング
    • OpenMP & MPI
    • 最新の並列技法
    • ラムダアーキテクチャ
  13. GPU
    • パイプラインとシェーダー
    • モニター
    • バッファリング
    • 垂直同期
    • フレームペーシングとビームレーシング
    • コンポジター
    • グラフィックス API / ライブラリ
  14. その他のチップ
    • 概要
    • DSP
    • FPGA
    • TPU
  15. 参考

10件のコメント

 
roxie 2022-12-31

同期と非同期は、作業完了を誰が確認するのか。
ブロッキングとノンブロッキングは、制御権限があるのか。

この言い方を数多くのブログでまったく同じように繰り返しているのを見かけるのですが、元の出典がどこなのか気になっています。

ほとんどのブログは互いに互いを参照するのに忙しく、原文を推測することができませんでした。かろうじて見つけたのは IBM の AIO 文書 だけなのですが、これはカーネル I/O に限定して語られているものではないかと思いまして。さらに、この区分法自体にも議論があると聞きました。

権威ある判断基準なのでしょうか?

 
alstjr7375 2022-12-31

まず、同期/非同期は回路寄りの考え方をベースにするとよさそうです。
同期回路はタイミングのためにクロックを使い、非同期はイベントや他の入力によってトリガーされる方式ですね。
つまり、非同期APIも同様にコールバックなどによってトリガーされる方式と定義しても無理はないと思います。
https://developer.mozilla.org/en-US/docs/…

ブロッキング/ノンブロッキングAPIは、処理を必ず待たなければならないかどうか、という点を定義とするのが適切です。
ただし、待たないためには呼び出した関数が制御権を持つ実装である必要があるため、そのように説明される傾向が強いようですね。
https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/

簡潔に済ませようとして省略していましたが、この内容も追加で入れてみようと思います.

 
roxie 2023-01-01

おっしゃっていることにはすべて同意します。しかし、この2つの基準軸を四分円の断面として描くべきなのか、描けるのか、適切に区別できるのかについては、やはりまだ確信が持てません。私には、Blocking と Sync は概念的に90%ほど文脈を共有しているように感じられます。Non-Blocking と Async も同様です。

 
alstjr7375 2023-01-01

Blocking-SyncNon-Blocking-Async は一緒に使われることが多いですが、区別が必要な場合があります。

  • Blocking-Async: select のような I/O マルチプレクシング
  • Non-Blocking-Sync: データのポーリング (polling)

そのため、私はむしろ区別して使うのが適切だと考えています。

 
roxie 2023-01-02

挙げてくださった例についての理解がほとんどないので、いまひとつ共感しにくいのかもしれません。

https://incredible-larva.tistory.com/entry/IO-Multiplexing-Topabogi-1部 この記事では、次のように説明しています:

結局のところ、select を要求した user process が return された値を見て、後続処理の有無を判断するということです。予測できない形で流入してくる複数の I/O 要求がまとめて管理されているため、Asynchronous だと見る場合もありますが、結局、実際の個々の I/O 動作は Synchronous な振る舞いを示す、ということです。

これについては、どのようなご意見をお持ちなのか気になります。実のところ私はこの時点で、もはやこの 2x2 の区分法は無意味だと感じました。ドメインごとに、また観点ごとに解釈が分かれているようなので。

 
alstjr7375 2023-01-02

続けて、kernelの応答を待っていると、kernelから結果値の準備ができたというcallbackシグナルが来て、user processが自分のbufferへデータをコピーしてくる様子を示しています。

この部分は、上でご同意いただいたコールバックによるトリガー方式なので、あえて区別・定義するなら Blocking-Async と呼ぶのが適切だと思います。
見方によっては曖昧に見える場合もあると思います。

ただし、ポーリングは確実な例ですが、
https://en.wikipedia.org/wiki/Polling_(computer_science)

ポーリングの場合は、データが準備できたかを繰り返し確認するため、Sync-Blocking の適切な例です.

 
wonkwh 2022-12-29

わあ、良い資料をありがとうございます。

 
kayws426 2022-12-29

興味深く読みました!

 
bus710 2022-12-28

スクロールしても終わりがありませんね、すごいです。
似たようなテーマを扱う『7つの並行モデル』という書籍も、一度くらい読んでみる価値がありそうです。

 
alstjr7375 2022-12-29

目次を比べてみると似ていますね
良い本のようです