论文部分内容阅读
基于共享地址空间的多线程是有效利用多核资源的重要方式。并发线程对一些共享数据的竞争,成为影响应用性能瓶颈之一。严重的共享地址空间竞争,限制了大量的多线程程序的性能。此外,在一些多线程的流处理应用中,共享队列的同步方式也极大地限制了此类应用的可伸缩性和性能。本文提出了一个线程模型 PMthreads(private virtual memory threads),旨在完全消除线程间的地址空间竞争。基于课题组已有的生产-消费共享内存模型,本文在PMthreads中设计和实现了多线程流式编程模型PMPL(PMthreads Pipeline),旨在解决流式应用可伸缩性差的问题。本文的主要贡献如下:1、详细分析了地址空间竞争影响应用性能的原因,以及共享队列同步方式的缺陷。本文通过实验以及性能分析工具发现,保护共享地址空间的全局读写锁是导致多线程程序性能下降的主要原因。本文进一步分析了粗粒度锁、细粒度锁、原子指令以及无锁化在同步共享队列上的各自缺陷。2、提出了一个基于隔离地址空间的线程模型,并且在Linux上实现了一个保持共享变量语义的原型系统PMthreads。为了完全消除线程间的地址空间竞争,PMthreads给每一个线程一个隔离的地址空间。通过自定义字符设备驱动和开发 IAmalloc(isolated address space malloc)堆分配器,PMthreads 保持了线程共享变量语义,并且PMthreads采用Pthreads接口以支持现有的Pthreads程序。3、在PMthreads上,本文设计和实现了线程之间可以高效传递数据的流式编程模型PMPL。基于生产-消费共享内存模型,本文在PMthreads上设计和实现了 PMPL,并且设计和实现了简单易用的发送和接收接口。4、在32核机器上对PMthreads和PMPL分别进行了性能评估。本文使用了 Phoenix和PARSEC中的10个测试程序评估了 PMthreads的性能。在32核下,实验结果表明:对于虚拟内存密集型应用,PMthreads相对于Pthreads性能提升了 2.17倍~3.19倍;PMthreads对NUMA的亲和性要优于Pthreads;以dedup流式应用为例,PMPL相对于使用共享队列的方式性能提升了 7.51倍。本文提出的PMthreads可以提升虚拟内存密集型多线程应用的可伸缩性和性能,并且Pthreads多线程程序可以无修改地调用PMthreads。同时本文提出的PMPL为程序员提供了一种简单高效的方式在线程之间传递数据,也使得流式多线程应用可以高可伸缩地执行。