1.1 使用共享内存的多核系统
2005年,Herb Sutter在Dr. Dobb’s Journal杂志发表了一篇名为“The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software”的文章(www.gotw.ca/publications/ concurrency-ddj.htm)。他在这篇文章中讨论了开发软件时要开始考虑并发性的必要性,提出只有考虑了并发性才能充分发挥微处理器日渐增长的吞吐能力。微处理器厂商不是一味地增加处理器的时钟频率,而是在向处理器中添加更多的内核。软件开发人员再也不能依赖于增加时钟频率带来性能提升的免费午餐了。
当今的很多计算机至少都有一颗双核的微处理器。然而,带有四个内核和八个内核的四核处理器和八核处理器在服务器、高端工作站甚至在高端移动计算机上都非常常见。在单个处理器上具有更多内核的时代正在来临。现代微处理器提供了新型的多核架构。因此,软件设计和编码能够准备好充分发挥这些架构的功能是一件非常重要的事情。Visual C# 2010和.NET Framework 4所生成的各种应用程序运行在一个或多个中央处理单元(central processing units,CPU),即主微处理器上。每一个这种微处理器都可能包含不同数目的内核,每一个内核都可以执行指令。
您可以将多核微处理器想象为在一个单独的封装包内的很多互相连接的微处理器。所有的内核都可以访问主内存,如图1-1所示。因此,这种架构也称为共享内存的多核架构(shared-memory multicore)。这种方式的共享内存很容易导致性能瓶颈。
多核微处理器有很多种不同的复杂微架构,旨在提供更强的并行执行能力,提升整体吞吐量,并减少潜在的瓶颈。同时,多核微处理器还在努力缩减电源消耗,并减少发热量。因此,很多现代的微处理器可以根据工作负载提升或降低每个内核的时钟频率,甚至可以让不在使用中的内核进入睡眠状态。Windows 7和Windows Server 2008 R2还支持一项名为内核暂停(Core Parking)的新功能。当正在使用的内核不多的时候就会启用这项功能,操作系统会使剩下的内核进入睡眠状态。当需要使用这些内核的时候,操作系统又会唤醒这些睡眠的内核。
现代微处理器可以为每个内核使用动态的频率。由于内核不以固定的频率工作,因此很难预测指令序列的性能。例如,Intel Turbo Boost Technology能够提升活动内核的频率。提升一个内核频率的过程也称为超频(overclocking)。
如果一个内核的工作负载非常重,那么这项技术能够让这个内核以更高的频率工作,而其他内核保持空闲状态。如果很多内核的工作负载都非常繁重,那么这些内核将都能够以更高的频率工作,但是不能达到单个内核工作时那么高的频率。微处理器不能让所有的内核长时间超频工作,因为这样会消耗更多的电力,而且温度会迅速上升。所有内核在重负载情况下的平均时钟频率比单个内核能够达到的时钟频率要低。因此,在某些特定的情况下,有一些代码能够在比别的代码更高的频率下运行,这样就使得真实性能的测量变得困难了。