毫无疑问的,“多核”、“多线程”此二词已快成为当今处理器架构设计中的两大显学,如同历史战国时代以“儒”、“墨”两大派的显学,只不过当年两大治世思想学派是争得你死我亡,而多核、多线程则是相互兼容并蓄,今日几乎任何处理器都朝同时具有多核多线程的路线发展迈进。
虽然两词到处可见,但可有人知此二者的实际差异?在执行设计时又是以何者为重?到底是该多核优先还是多线程提前?关于此似乎大家都想进一步了解,本文以下试图对此进行个中差异的解说,并尽可能在不涉及实际复杂细节的情形下,让各位对两者的机制观念与差别性有所理解。
行程早于线程
若依据信息技术的发展历程,在软件程序执行时的再细分、再切割的小型化单位上,先是有行程(Process),之后才有线程(Thread),线程的单位比行程更小,一个行程内可以有多个线程,在一个行程下的各线程,都是共享同一个行程所建立的内存寻址资源及内存管理机制,包括执行权阶、内存空间、堆栈位置等,除此之外各个线程自身仅拥有少许因为执行之需的变量自属性,其余都依据与遵行行程所设立的规定。
相对的,程序与程序之间所用的就是不同的内存设定,包括分页、分段等起始地址的不同,执行权阶的不同,堆栈深度的不同等,一颗处理器若执行了A行程后要改去执行B行程,对此必须进行内存管理组态的搬迁、变更,而这个搬迁若是在处理器内还好,若是在高速缓存甚至是系统主存储器时,此种切换、转移程序对执行效能的损伤就非常大,因为完成搬迁、切换程序的相同时间,处理器早就可以执行数十到上千个指令。
两种路线的加速思维
所以,想避免此种切换的效率损耗,可以从两种角度去思考,第一种思考就是扩大到整体运算系统的层面来解决,在
一部计算机内设计、配置更多颗的处理器,然后由同一个操作系统同时掌控及管理多颗处理器,并将要执行的程序的各个程序,一个程序喂(也称:发派)给一颗处理器去执行,如此多颗同时执行,每颗处理器执行一个程序,如此就可以加快整体的执行效率。
当然!这种加速方式必须有一个先决条件,即是操作系统在编译时就必须能管控、发挥及运用多行程技术,倘若以单行程的系统组态来编译,那么操作系统就无法管控服务器内一颗以上的处理器,如此就不用去谈论由操作系统负责让应用程序的程序进行同时的多颗同时性的执行派送。
即便操作系统支持多程序,而应用程序若依旧只支持单程序,那情形一样是白搭,操作系统无法对单行程程序再行拆分,依然是只喂入单一颗处理器上去执行,无从加速。
同时用多颗处理器来执行,且每颗处理器执行一个行程,这是一种加速法,另一种加速法则是:尽量不进行内存管理组态的切换,避免切换的效能折损,线程正是在此概念下所出现的产物。
不过,线程也要程序的搭配才能发挥,线程的概念出现与落实已是“C++看消、Java看长”的阶段,所以C++只能通过API呼用的方式来支持与使用多线程,如此必须改写过往的程序才行,改写成有呼用到支持多线程的API才行。相对的,较C++晚问世的Java则是原生支持多线程,不用改写也能发挥及运用多线程的特性及其加速效益。
有了线程后,执行的分割、切割更加细腻,线程机制不仅在多颗处理器的系统内可以加速,在单颗处理器内也一样能获得好处,在多颗处理器的系统上每颗处理器不仅可以单独执行一个程序,当然也可以单独执行一个线程,而在单处理器系统上因为省去内存管理组态的搬迁,所以一样可以加速,很明显的,线程使执行的发派、分配更加细腻与灵活化。
线程的副作用
线程虽有好用的优点,不过它也有副作用的缺点,且此一优缺是一体两面无从分割,缺点是各个线程共享同一组内存管理组态及机制,倘若有一个线程的执行发生错误、瑕疵、或遭入侵等,其余在同一个行程内的每个线程也都会遭受影响、波及,最严重是同一个行程内的一切都错乱、毁坏,由此可知:线程其实是带有若干安全性牺牲的加速法。
此外有人会误会,就字面上而言,多核表示同时间有多颗处理器在执行,每颗处理器可以执行一个行程或一个线程,但是一颗具有多线程能力的处理器并不表示它可以同时执行多个线程,事实上在同一时间内一颗具多线程功效的处理器也依然是执行一个线程而已,只是多线程处理器的内部可以将原有线程的相关信息及变量暂时搁摆,然后去执行其它的线程,执行完后在切换回原来执行到一半的线程,甚至没执行完也可以切换回来,且整个切换过程都在处理器内进行,不用与快取与内存进行搬迁置换,如此以快速换线程执行的方式来加速。
相对于此的,一颗不具多线程能力的处理器,执行一个线程到一半若想改执行另一个线程,就必须将原线程、现线程的相关内容与信息搬迁到快取或内存,然后自快取及内存引入另一个线程,由于此一搬转颇耗时,所以多半选择将原有的线程执行完再引入下一个线程,如此在时间上可能还比较经济。然而无论一线程完整执行后再执行下一个线程,还是进行线程的进出搬迁转移,都不会比具备多线程能力的处理器来的快速有效。
至此我们可以归纳整理:
1.多核、多处理器系统中的每颗处理器(每个核),同时间内可以执行各自不同的行程(或线程)。
2.一颗多线程能力的处理器,无论是支持二线程、四线程、八线程,这些线程都必须是在同一个行程内,所以一颗处理器(一个核)还是只能执行一个行程,双核处理器就能够同时执行两个不同的行程(或线程),四核就可以同时不同的四个行程(或线程)。
3.倘若是执行不支持多线程的程序,其执行上的分拆最多只到行程而未到线程,那么每颗处理器内的多线程功效就无从发挥,而这类的程序历史较长久,相对的原生支持多线程的程序历史较短,不过信息技术的脚步向来进展快速,两种不同层次的支持仅差距数年时间。
产业实际发展可为证明
真的是多核优于、先于多线程吗?关于此可通过产业实际发展做为应证,Sun的UltraSPARC T1处理器(研发代号:Niagara)是八核四线程的设计,但接续的UltraSPARC T2处理器(研发代号:Niagara 2)则是八核八线程的设计,所以是核多、核优先,然后再来拉跋、提升线程的执行。
同样的,IBM为Microsoft Xbox 360所设计的Xenon处理器,是个三核二线程的设计,核数依然是高于线程数,又如
IBM、Sony、Toshiba三家业者合研的Cell处理器,现有第一代的Cell(研发代号:DD1)是九核,组态上是八核媒体(SPE)、一核泛用(PPE),新一代的Cell(研发代号:DD2)也针对PPE的部分进行双线程发展,如此再次表示核比线程重要,当Cell仅进行增一线程的扩展改进时,而非再增一核,即可知这仅是一次小幅的改进。
“多核”、“多线程”之外 还有“多令”、“多机”
最后,且让我们谈谈与多核、多线程不同加速走向的“多令”,“多令”是笔者发明的词,指的是比执行行程(Process)、线程(Thread)更基底层次的执行指令(Instruction),多核的作法是尽可能在同时间内执行多个行程,多令则是尽可能在同时间内执行多个指令,学术上的VLIW与产业上的EPIC皆是多令理念下的架构。
到目前为止多令并非不可行,但仅行于数字信号、图像等处理,绘图芯片、媒体处理器等多实行VLIW架构,然多令在泛用运算上却未见效益,至于科学研究之类的高效运算也倾向使用更高层次的平行:多机(丛集、网格,执行范畴与分配类同于线程、行程),看来多令、多程/线程、多机各有所用,端看运用场合的适切性。