第四点,由于在CMT的每个处理器内核中,多个硬线程会共享核内的某些部件,所以某一个线程的性能会受到其他运行线程的影响,这些影响可以是正面的,也可能是负面的。下面列举了一些典型的情况:
如果一个线程由于内存访问被阻塞了,原本分给它的时间片会立即转让给该核内的其他就绪线程,提升系统的利用率。
如果多个线程都在运行同一个应用程序(这种情况在服务器应用中非常普遍),这些线程能够在片内的L2级缓存中共享代码和数据,并由此获得很多性能增益。
如果同一个内核中的多个硬线程都不曾出现内存或I/O访问阻塞(这在当前的商用服务器应用中非常少见),那么各个线程只能均分该处理器内核的处理能力。
如果一个内核中的某个硬线程不当的刷新了核内的相关缓存以及TLB(注:TLB (Translation Look-aside Buffer)是处理器内部的一片存储区域,用若干个表项存储处理器最近访问过的页面信息,每一项中包括了程序中的虚地址和对应的内存中的绝对地址。由于使用TLB来查询地址可以无需经过传统的地址转换流程,所以能够加速内存访问,提高处理速度),该核内的其他线程可能会因此收到影响而降低性能,这种情况被称作“破坏性共享(Destructive Sharing)”
什么样的程序适合在CMT处理器上运行
CMT处理器适应于追求吞吐量的应用,特别是面向Web和商用事务处理的应用。那么是不是只有基于多线程技术的应用程序才能够利用CMT处理器的特征,提升性能呢?答案并不是这么简单。我们在下面列举了一系列适用于CMT处理器的应用类型。
多线程的本地应用(Native application):这种多线程的应用的特征是具备一定数量的多线程进程,线程之间可以通过共享全局变量进行通讯,通过操作系统对线程的调度让负载在系统中很好的分布。这样的多线程应用包括IBM的Lotus Domino以及Siebel的CRM系统。
多进程应用(Multi-process application):多进程的应用由多个单线程的进程组成,这些进程之间的通讯多使用共享存储(Shared Memory)或者进程间通讯(IPC)的机制。多进程的应用包括:Oracle数据库,SAP,以及PeopleSoft。
Java应用:Java技术为应用提供了支持多线程技术的强有力的保证。一方面,使用Java语言能够非常便捷的开发多线程应用,特别是在Java 5.0中,多线程的开发变得更为简便、直观。另一方面,Java虚拟机本身就是多线程的:JVM中使用多个线程来实现任务的调度和内存的管理。Java应用程序,特别是Java的应用程序服务器,例如Sun公司的Java Application Server,BEA的Weblogic,IBM的WebSphere,Apache的TomCat等,都能够借助CMT技术大幅提高性能。同样,部署在这些应用服务器之上的各种应用也都能够相应的获得性