论文部分内容阅读
JavaScript是一门被广泛应用于客户端浏览器的轻量级脚本语言,自发明以来,JavaScript发展迅速,目前几乎所有的网页都有使用JavaScript。Node.js是JavaScript运行时环境,使得JavaScript可以被用以在服务器端开发规模化的网络应用。然而,由于JavaScript被设计为单线程语言,Node.js和底层的V8虚拟机也是单线程,因此不支持并行编程,这使得开发者想要提升应用的性能变得困难。与此同时,持久内存作为一种新的内存和存储结构,在服务端应用开发方面展现出了积极的前景。目前,脚本语言基于持久内存的并行编程支持相关的研究工作还比较少。在本文中,我们提出一个叫SPMP的并行编程模型,它是在Node.js下共享持久内存的JavaScript支持。在SPMP模型中,我们首先设计实现了一个PersistentArrayBuffer(PAB)对象,其功能类似Node中的ArrayBuffer对象,以二进制数据缓冲区的方式访问和管理内存。不同之处在于,PAB由于访问机制的设计,可以用于管理持久内存。在使用SPMP处理并发任务时,每个进程需要在自己的地址空间中维护一个PAB对象,用以进行持久内存的分配、管理和访问。多个进程可以通过他们的PAB对象映射到同一内存区域的方式实现持久内存共享,进而基于共享内存实现进程间通信。为了保证多进程并发的高效性和负载均衡,我们设计了三种不同的并行机制,以适用于不同的场景。对于并发编程中常见的一致性控制问题,我们进行原子化操作的相关设计,避免写冲突、重复写、死锁等问题的发生。除了支持持久内存之外,SPMP模型也可以在常见的RAM和硬盘的存储结构中,保障内存数据的持久性。我们将SPMP模型和拓展内存语义模型(EMS,Node.js并行编程最新的研究成果)在两个数据密集型任务上进行实验对比,实验结果证明,在数据流实验上,SPMP比EMS快100到300倍,而在复杂的并发任务比如词频统计上,由于独特的内存分配管理策略设计,SPMP快两倍左右。