Linux多核并行编程关键技术是什么

  介绍

本篇内容主要讲解“Linux多核并行编程关键技术是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux多核并行编程关键技术是什么”吧!

<>强多核并行编程的背景

  在摩尔定律失效之前,提升处理器性能通过主频提升,硬件超线程等技术就能满足应用需要。随着主频提升慢慢接近撞上光速这道墙,摩尔定律开始逐渐失效,多核集成为处理器性能提升的主流手段。现在市面上已经很难看到单核的处理器,就是这一发展趋势的佐证。要充分发挥多核丰富的计算资源优势,多核下的并行编程就不可避免,Linux内核就是一典型的多核并行编程场景。但多核下的并行编程却挑战多多。

  <强>多核并行编程的挑战

  目前主流的计算机都是冯诺依曼架构,即共享内存的计算模型,这种过程计算模型对并行计算并不友好。下图是一种典型的计算机硬件体系架构。

癓inux多核并行编程关键技术是什么"

  这种架构中,有如下设计特点:

  ·多个CPU核改善处理器的计算处理能力;

  ·多级缓存改善CPU访问主存的效率;

  ·各个CPU都有本地内存(NUMA(非一致性内存访问)),进一步改善CPU访问主存的效率;

  ·存储缓冲区模块改善缓存写由于应答延迟而造成的写停顿问题;

  ·队列失效模块改善使无效应答的时延,把使无效命令放入队列后就立即发送应答;

  外设DMA支持直接访问主存,改善CPU使用效率;

  这些硬件体系设计特点也引入很多问题,最大的问题就是缓存一致性问题和乱序执行问题。

  缓存一致性问题由缓存一致性协议MESI解决,MESI由硬件保证,对软件来说是透明的.MESI协议保证所有CPU对单个高速缓存线路中单个变量修改的顺序保持一致,但不保证不同变量的修改在所有CPU上看到的是相同顺序。这就造成了乱序。不仅如此,乱序的原因还有很多:

  ·存储缓冲区引起的延迟处理,会造成乱序;

  ·无效队列引起的延迟处理,会造成乱序;

  ·编译优化,会造成乱序;

  ·分支预测,多流水线等CPU硬件优化技术,会造成乱序;

  ·外设DMA,会造成数据乱序;

  这种情况造成,就连简单的+ +运算操作的原子性都无法保证。这些问题必须采用多核并行编程新的技术手段来解决。

  <强>多核并行编程关键技术

  <强>锁技术

  Linux内核提供了多种锁机制,如自旋锁,信号量,互斥量,读写锁,顺序锁等。各种锁的简单比较如下,具体实现和使用细节这里就不展开了,可以参考《Linux内核设计与实现》等书的相关章节。

  ·自旋锁,不休眠,无进程上下文切换开销,可以用在中断上下文和临界区小的场合;

  ·信号量,会休眠,支持同时多个并发体进入临界区,可以用在可能休眠或者长的临界区的场合;

  ·互斥量,类似与信号量,但只支持同时只有一个并发体进入临界区;

  ·读写锁,支持读并发,写写/读写间互斥,读会延迟写,对读友好,适用读侧重场合;

  ·顺序锁,支持读并发,写写/读写间互斥,写会延迟读,对写友好,适用写侧重场合;

  锁技术虽然能有效地提供并行执行下的竞态保护,但锁的并行可扩展性很差,无法充分发挥多核的性能优势。锁的粒度太粗会限制扩展性,粒度太细会导致巨大的系统开销,而且设计难度大,容易造成死锁。除了并发可扩展性差和死锁外,锁还会引入很多其他问题,如锁惊群,活锁,饥饿,不公平锁,优先级反转等。不过也有一些技术手段或指导原则能解决或减轻这些问题的风险。

  ·按统一的顺序使用锁(锁的层次),解决死锁问题;

  ·指数后退,解决活锁/饥饿问题;

  ·范围锁(树状锁),解决锁惊群问题;

  ·优先级继承,解决优先级反转问题;

  <强>原子技术

  原子技术主要是解决缓存不一致性和乱序执行对原子访问的破坏问题。主要的原子原语有:

  ACCESS_ONECE():只限制编译器对内存访问的优化;

  障碍():只限制编译器的乱序优化;

  smb_wmb():写内存屏障,刷新存储缓冲区,同时限制编译器和CPU的乱序优化;

  smb_rmb():读内存屏障,刷新无效队列,同时限制编译器和CPU的乱序优化;

Linux多核并行编程关键技术是什么