>_DEVELOP

ヘッダー画像1
ヘッダー画像2
ヘッダー画像3

$ sudo learn –daily –append >> ~/brain/tech.log

WebWorkerとWasmにおけるスレッドとメモリ空間の共有仕組み — CPU視点での理解

はじめに

JavaScriptのシングルスレッド制約を突破する手段としてWebWorkerがあり、WebAssembly(Wasm)は高性能計算をブラウザ上で実現する技術です。

両者はマルチスレッドやメモリ共有の観点で密接に関係しますが、実態はCPUのメモリ管理やキャッシュモデルに深く依存しています。


1. CPUとメモリ空間の基本概念

  • CPUコアとスレッド
    物理CPUコアは複数のスレッドを持つことが多く、スレッドはCPUのレジスタやキャッシュを用いて処理を実行します。
  • メモリ空間
    プログラムが参照するメモリは仮想アドレス空間で管理され、OSやランタイムがこれを物理メモリにマッピングします。
  • キャッシュの整合性
    複数スレッドが同じ物理メモリを操作する場合、各CPUコアのキャッシュ間で整合性が保たれる必要があります。

2. JavaScriptのシングルスレッドとWebWorker

  • JavaScriptは基本的にメインスレッド1つで動作します。UIスレッドをブロックしないためWebWorkerで並列処理を行う。
  • WebWorkerは完全に独立したスレッドであり、独自のメモリ空間(スクリプトコンテキスト)を持つ。
  • メインスレッドとWorker間はメッセージパッシングで通信。

3. WebAssemblyと共有メモリ

  • WebAssemblyはバイナリ実行形式で、基本的には線形メモリ(連続したバイト配列)を使う。
  • SharedArrayBuffer(SAB) を用いることで、この線形メモリを複数スレッド間で共有できる。
  • WasmはSABにアクセスしつつAtomics APIでメモリの整合性・同期を取る。

4. WebWorker + Wasmのスレッド・メモリ共有モデル

  • 複数のWebWorkerが1つのSharedArrayBufferを共有し、それをWasmモジュールが操作する。
  • これにより複数スレッドが同一線形メモリにアクセスし、協調処理が可能に

5. なぜGPUはここで無関係なのか?

  • GPUはCPUとは異なる専用プロセッサで、通常は独立したメモリ空間(VRAM)を持つ。
  • WebWorkerやWasmのスレッド・メモリ共有はCPUのメモリ空間内で完結。
  • WebGPUやWebGLを介してGPUを使う場合は別のAPIとメモリモデルが関与し、今回の話とは層が異なる。

6. まとめ:CPU視点で見たWebWorker+Wasmのメモリ共有

項目 特徴
WebWorker 独立スレッド、独立メモリ空間(基本はコピー通信)
SharedArrayBuffer 複数スレッドで共有可能な連続メモリ領域
Wasm 高性能バイナリ、線形メモリでSABを操作可能
Atomics API メモリの同期・排他制御を可能にし、CPUキャッシュ整合を担保
CPUコア・キャッシュ 複数スレッドが同メモリを扱う際のハードウェア側基盤
GPU 別プロセッサで独自メモリを持ち、今回の共有メモリとは非関係

図解