SharedArrayBuffer 通信演示 - 跨 Worker 共享内存
关于此工具
工具特性与优势
使用教程
常见问题
术语解释
免责声明
术语表
SharedArrayBuffer
一种可以被多个Web Worker和主线程共享的固定长度二进制数据缓冲区。与普通ArrayBuffer不同,SharedArrayBuffer的底层内存可以被多个线程同时访问。使用SharedArrayBuffer创建的数据视图(如Int32Array、Uint8Array等)需要配合Atomics API进行原子操作,以避免数据竞争问题。SharedArrayBuffer的大小在创建后不可变。
Atomics
JavaScript中提供的原子操作命名空间,用于对SharedArrayBuffer中的数据进行线程安全的读写操作。包含load、store、add、sub、and、or、xor、exchange、compareExchange等算术和逻辑原子操作,以及wait和notify等线程同步方法。所有Atomics操作都是不可中断的,保证了多线程环境下的数据一致性。
Web Worker
浏览器提供的多线程API,允许JavaScript代码在后台线程中运行。Worker线程与主线程之间通过消息传递(postMessage)或共享内存(SharedArrayBuffer)进行通信。Worker线程拥有独立的执行上下文,不能访问DOM,但可以使用大部分JavaScript标准库API。每个Worker都是一个独立的全局作用域。
环形缓冲区
Ring Buffer,一种固定大小的循环队列数据结构。使用两个指针(读指针和写指针)管理数据的读写,当指针到达缓冲区末尾时自动回绕到起始位置。在本工具中,环形缓冲区的元数据(缓冲区大小、读指针、写指针)和数据内容都存储在SharedArrayBuffer中,实现跨线程共享。
生产者-消费者模式
一种经典的并发设计模式,也称为有界缓冲区问题。生产者线程负责生成数据并写入共享缓冲区,消费者线程负责从缓冲区中读取和处理数据。当缓冲区满时生产者阻塞,当缓冲区空时消费者阻塞。该模式广泛应用于消息队列、事件处理、流式数据处理等场景。
原子操作
Atomic Operation,指在执行过程中不可被中断的操作。在多线程环境中,原子操作保证了操作的完整性和一致性——要么操作完全执行,要么完全不执行,不会出现中间状态。Atomics API中的操作如Atomics.add()在底层通过CPU的原子指令(如x86的LOCK前缀)实现,确保了操作的原子性。
数据竞争
Data Race,多线程编程中的一种常见bug。当两个或多个线程同时访问同一内存地址,且至少有一个线程在执行写操作,且没有使用同步机制时,就会发生数据竞争。数据竞争的结果是未定义的,可能导致程序崩溃、数据损坏或产生不可预测的行为。使用Atomics API可以避免SharedArrayBuffer上的数据竞争。
内存屏障
Memory Barrier,又称内存栅栏,是一种CPU指令,用于保证内存操作的顺序性。在多核处理器中,每个核心都有自己的缓存,内存屏障确保一个线程的内存写操作对其他线程可见。Atomics操作在底层隐式地包含了适当的内存屏障,确保了SharedArrayBuffer中数据的跨线程可见性。
背压机制
Backpressure,指当下游消费者处理速度跟不上上游生产者产生速度时,通过某种机制减缓上游生产速率的策略。在生产者-消费者模式中,缓冲区满时生产者阻塞就是一种典型的背压机制。背压可以防止系统过载,保证数据流的稳定性。本工具中通过调节生产者和消费者的速度可以直观地观察到背压的效果。
COOP/COEP
Cross-Origin-Opener-Policy和Cross-Origin-Embedder-Policy是两个HTTP响应头,用于控制跨域资源的隔离级别。启用COOP: same-origin和COEP: require-corp后,页面被隔离在独立的浏览上下文组中,阻止了跨域的Spectre风格攻击。这是现代浏览器要求SharedArrayBuffer必须在启用这些头的页面中使用的原因。
🔧 相关工具