多核并发之所感

最近买了2007.4期《程序员》杂志,其中有一个多核并发专题,偶在第一时间内翻阅了那些文章,下面摘取了一部分片段观点。

王昕的《多核计算环境的挑战--本地代码的并发》

并发

    在计算机领域中,“并发”意味着系统可以在一定的时间段内同时执行多个计算任务的能力,并且在这些计算过程中,不同的计算任务之间还可以共享部分资源。在传统的定义中,“并发”和另外一个术语--“并行”--之间有着一定的区别("并行"是指:在多个处理器上同时执行相同的任务以便更快地获得结果)。便为了简化术语(并且在现在,大部分人也是如此认为的),在本文中,我们将用“并发”这一词来同时指代这两者。
    并发并不能算是个新鲜的名词,在操作系统的早期发展过程中(大概是上个世纪60年代),人们就意识到CPU的运算速度和外设的速度之间有着很大的区别,为了节省在当时还算是宝贵的CPU运算时间,让CPU不会在外设处理数据时等待着,许多多任务处理机制就被设计和开发出来了。
    构建并发程序的几种机制:进程(Process),线程(Thread),纤程(Fiber)。

真正的并发及"伪"并发  

    根据在同一时刻所运行的计算任务不同,并发可以分为两种:真正的并发与伪并发。在单处理器条件下的传统并发,实质上就是一种伪并发,它是通过操作系统快速地在各个计算任务之间切换从而向用户展示一种“这些计算任务正在被并发执行”的假象,实际上,在某一确定的时间点上,只有一个线程被运行着。而真正的并发则涉及到多个处理器,由于系统中同时存在着多个处理器,那么我们就可以让多个线程在同一时刻同时运行在不同的处理器上。
   
多处理单元下的并发编程与单处理单元下的并发编程之间的区别
  
    在前面我们提到了“真正的并发”以及“伪并发”,它们两者之间的区别也自然导致了针对多核(包括多处理器,在下文中统一使用多核代替)的并发编程与针对单核(单处理器)的并发编程之间存在着一些细微的差别,除了这些“细微”的区别之外,针对单核与多核的并发编程并没有太大的区别。此处,我们所说的“细微”是指站在应用程序开发人员层面上的视角,实际上在底层的操作系统内核及编译器优化这个层面的编写复杂度要远远大于我们开发应用程序的程序员所想象的。
    在多核系统中,有时我们可能会存在着这样一种需求:将某个线程绑定在某个处理器上执行,这样就可以减少一些无谓的线程上下文切换;而这种需求是在单核系统中无法想像的,因为在单核系统中,所有的线程都是运行在同一个处理器之上的。为了达到我们的需求,我们就必须在程序编写过程中手动地为该线程设置其处理器的亲和性。在windows系统中,我们就可以通过调用SetThreadAffinityMask来达到此类效果。
    另外,在多核系统中,有时我们需要在两个处理器之间进行数据同步,由于涉及到处理器内部的高速缓存同步等因素,我们有时可能并不让应用程序进入到内核中等待(或者是我们不希望使用传统的作为内核对象的锁机制),此时我们就可以使用自旋锁(spin lock)来保证数据的同步过程不受竞争的影响。和自旋锁相关的API包括:POSIX中的pthread_spin_init等,以及windows API中的InitializeCriticalSection AndSpinCount等。
    前面我们说过,在应用程序层面上来看,单核并发和多核并发之间并无大的区别。实际上,在AMD给出的建议中也是让程序员尽量去调用操作系统为我们所提供的API来进行并发程序的编写。
    但是,如果我们切换一下视角,把目光放到底层开发人员上时,我们就将得到另外的答案。由于多核与单核在硬件架构上的不同,所以也自然导致直接和硬件打交道的方法也不同。对于操作系统内核来说,它得修改原来的调度程序(scheduler),以保证在多个处理器之间尽量做到负载平衡(load balancing);对于编译器的优化端来说,至少我听说了,Intel准备在其所出品的ICC编译器中,将代码直接编译成可被并发执行的代码,这种做法的激进程度甚至超过了另外一个著名的用于开发编程的API:OpenMP。
--------   
   
《Intel的Geoffrey Lowney院士的访谈》
    多核平台使得多个程序任务的并行执行更加流畅,同时也能更加高效地运行多线程程序。
    对于单个程序来说,只有把程序多线程化才能充分利用多核处理器所提供的硬件并行特性。从这个角度上说,单个软件是否已经很好地并行化的确会影响到多核处理器是否能充分发挥效能。庆幸的是,很多软件开发商的程序都已经是多线程化的了……(例如用于改善用户体验和程序响应速度的GUI程序),如果一个程序本身是很好地多线程化的,那么在多核平台上运行应该可以取得比较好的效果。然而由于不同的多核平台可能在微体系结构上有些差异,针对微体系结构的性能调优应该可以使程序的性能有进一步的提升(比如编译器对应用程序进行编译优化)。   
   

《积极准备,谨慎行动--应对多核革命》
    在多核时代,我们对编程语言的选择也要更加谨慎。无论开发何种项目,相对于C/C++等编译型语言往往是通过平台相关的库来提供多线程支持,C#/JAVA/Python等脚本语言也许是更好的选择,原因在于脚本语言比较高级,一般都提供了对多线程的原生支持。不过PHP/Ruby/Lua等脚本语言就会比较难得到程序员们的宠爱了--因为它们并没有提供内核级的线程支持,它们的多线程是用户级的,甚至不支持线程,用它们编写的多线程程序仍然无法完全利用多核优势。
  ============================ 

       从上面可以看出,多核并发编程,对于我们大多数应用程序的开发人员来说,影响并不是很大的,毕竟在很多程序开发中早已广泛使用多线程技术了。影响甚大的是操作系统级别及编译器级别的底层开发,而中国在这个层次开发方面,是较少的,所以在中国近期内影响也不会多么的严重,并不像网络或杂志制造的那种“狼来了”的感觉。

     只是在多核计算时代相对于单核时代的多线程开发,如果数据同步控制不好的程序会更容易被暴露出来。
     

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值