
はじめに
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 | 別プロセッサで独自メモリを持ち、今回の共有メモリとは非関係 |
図解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
+--------------------------------------------------------------+ | CPU (複数コア) | | +------------------+ +------------------+ +------------------+ | | | コア0 (WebWorker) | | コア1 (WebWorker) | | コア2 (メインスレッド) | | | | - 独立スレッド | | - 独立スレッド | | - JS実行 | | | | - ローカルキャッシュ | | - ローカルキャッシュ | | - ローカルキャッシュ | | | +------------------+ +------------------+ +------------------+ | | \ | / | | \ | / | | \ | SharedArrayBuffer (共有線形メモリ) | | +------------------------------------------------+ | | | 共有メモリ空間 | | | +------------------------------------------------+ | | (Atomics APIで同期制御) | +--------------------------------------------------------------+ ※ GPUは独立したVRAMとGPUコアを持つため、この図には含まれない。 |