服务器 频道

打开多核软件时代的潘多拉魔盒

三、潘多拉魔盒被最终打开,性能瘟疫再次席卷整个软件世界

    自从2006年AMD率先推出双核处理器后,2006年被普遍认为是多核CPU的普及年。在随后的一年多时间里,多核CPU的主频和核的数量飞数发展。看到这些令人振奋的消息来,很多人都松了一口气,以为这下终于突破困扰已久的CPU主频的限制了。一下从单纯的增加主频跨越到了二维的增加主频和核的数量。通过这种改变,也许可以至少坚持十年。但人们还没有从欢乐的气氛中回过味来,就遇到了新的问题,这次不是硬件,而是软件。

    可能所有编写过软件的人都知道,象使用VB、C#、Delphi等语言或开发工具开发程序是非常容易的,只需要在IDE中新建一个工具,再建几个Form,然后拖上一些控件就可完成一个看似功能非常强大的程序。这些程序也许可以完成非常复杂的功能。它们也许可以在以前传统的单核CPU上运行得非常好。但如果这种程序在新问世的多核CPU上运行,所表现出来的效率并不一定有单核CPU的效率高。这并不是程序中的某些算法不适应多核的环境,而是由于这种程序从根本上只使用了一个主线程来运行(在传统的程序中都是由一个Main函数开始执行程序,然后按顺序执行相应的代码),所以同一个程序实例在同一时间只能运行在一个CPU核上,因此,不管有多少个核,也只能有一个核在发挥作用。

    真是怕什么就来什么,目前世界上所存在的软件绝大多数是基于单线程的,这就意味着虽然多核从理论上可以提高效率,但就现在的大多数软件而言,还无福享受这种待遇。这就象10几年前在DOS时代那漆黑的夜空突然划过一道闪电,而正是这道闪电才劈开了Windows时代的大门。当时基于Windows的软件还不多,Windows之所以拥有现在的局面,是经过了长期的发展才得来的。而现在的多核CPU就和当年的Windows一样,支持多核CPU的软件还不多,要想真正发挥多核CPU的功效,可能还需要一些时间。然而我们也无需这么悲观,现在软件的发展已非从前可比,在过去的十年要完成的事,也许现在几年就可完成。

    然而,为了以上的目标,作为编写软件的核心力量的程序员也必须尽快行动起来。不过值得庆幸的是现在绝大多数语言都支持用于将多核功能发挥到及至的并发(多线程)功能。但程序员必须要改变以前传统的程序设计理念。在传统的CPU上编写程序,也可以使用多线程来处理。但这样使用多线程也只能叫做并发,而不能叫做并行。所谓并发就是指在一个时间段可以同时执行多个任务。大家要注意,这里所说的是“时间段”,而并不是“时间点”。这和并行有着本质的区别。并行是指在一个时间点同时有两个或多个任务同时执行,是真正意义上的同时执行,而并发从微观上看只是单核CPU在一个时间段交替执行不同任务的结果。

    在传统CPU上编写这类并发的程序将会带来更多的危险。如可能由于两个线程互相争夺共享资源而导致死锁。或是多个线程同时读写共享资源的数据会造成共享数据的不一致性。然而这些现象在多核CPU上可以得到一定程度的解决,如死锁问题。如果在双核CPU上运行多线程程序,两个线程来争端CPU资源时,其中一个线程可以使用另外一个CPU核来处理。这样就避免了一次死锁。

    尽管现在可以使用大多数语言来编写多核CPU的程序,但这些对于大多数程序员可能太过复杂了。因此,在最近几年,出现了一些和并发功能溶为一体的语言。使用这些语言可以无需了解多线程技术,就可以设计并实现基于并发的系统。如OpenMP、MPI、CAF等都是这样的语言。

    多核时代的到来已经不可避免,对于广大程序员来说将是一个千载难逢的好机会。只有真正地了解多核及并发的原理,才能真正发挥多核CPU的效率。到那时,多核时代才会进入鼎盛时期。也许到那时,将会开发出更适合多核CPU的开发模式。也许这是我们每一个身在其中的人都应该思考的问题。

0
相关文章