多核与多线程技术的区别到底在哪里?
毫无疑问的,"多核"、"多线程"此二词已快成为当今处理器架构设计中的两大显学,如同历史战国时代以"儒"、"墨"两大派的显学,只不过当年两大治世思想学派是争得你死我亡,而多核、多线程则是相互兼容并蓄,今日几乎任何处理器都朝同时具有多核多线程的路线发展迈进。
虽然两词到处可见,但可有人知此二者的实际差异?在执行设计时又是以何者为重?到底是该多核优先还是多线程提前?关于此似乎大家都想进一步了解,本文以下试图对此进行个中差异的解说,并尽可能在不涉及实际复杂细节的情形下,让各位对两者的机制观念与差别性有所理解。
行程早于线程
若依据信息技术的发展历程,在软件程序执行时的再细分、再切割的小型化单位上,先是有行程(Process),之后才有线程(Thread),线程的单位比行程更小,一个行程内可以有多个线程,在一个行程下的各线程,都是共享同一个行程所建立的内存寻址资源及内存管理机制,包括执行权阶、内存空间、堆栈位置等,除此之外各个线程自身仅拥有少许因为执行之需的变量自属性,其余都依据与遵行行程所设立的规定。
相对的,程序与程序之间所用的就是不同的内存设定,包括分页、分段等起始地址的不同,执行权阶的不同,堆栈深度的不同等,一颗处理器若执行了A行程后要改去执行B行程,对此必须进行内存管理组态的搬迁、变更,而这个搬迁若是在处理器内还好,若是在高速缓存甚至是系统主存储器时,此种切换、转移程序对执行效能的损伤就非常大,因为完成搬迁、切换程序的相同时间,处理器早就可以执行数十到上千个指令。
两种路线的加速思维
所以,想避免此种切换的效率损耗,可以从两种角度去思考,第一种思考就是扩大到整体运算系统的层面来解决,在一部计算机内设计、配置更多颗的处理器,然后由同一个操作系统同时掌控及管理多颗处理器,并将要执行的程序的各个程序,一个程序喂(也称:发派)给一颗处理器去执行,如此多颗同时执行,每颗处理器执行一个程序,如此就可以加快整体的执行效率。
当然!这种加速方式必须有一个先决条件,即是操作系统在编译时就必须能管控、发挥及运用多行程技术,倘若以单行程的系统组态来编译,那么操作系统就无法管控服务器内一颗以上的处理器,如此就不用去谈论由操作系统负责让应用程序的程序进行同时的多颗同时性的执行派送。
即便操作系统支持多程序,而应用程序若依旧只支持单程序,那情形一样是白搭,操作系统无法对单行程程序再行拆分,依然是只喂入单一颗处理器上去执行,无从加速。
同时用多颗处理器来执行,且每颗处理器执行一个行程,这是一种加速法,另一种加速法则是:尽量不进行内存管理组态的切换,避免切换的效能折损,线程正是在此概念下所出现的产物。
不过,线程也要程序的搭配才能发挥,线程的概念出现与落实已是"C++看消、Java看长"的阶段,所以C++只能通过API呼用的方式来支持与使用多线程,如此必须改写过往的程序才行,改写成有呼用到支持多线程的API才行。相对的,较C++晚问世的Java则是原生支持多线程,不用改写也能发挥及运用多线程的特性及其加速效益。
有了线程后,执行的分割、切割更加细腻,线程机制不仅在多颗处理器的系统内可以加速,在单颗处理器内也一样能获得好处,在多颗处理器的系统上每颗处理器不仅可以单独执行一个程序,当然也可以单独执行一个线程,而在单处理器系统上因为省去内存管理组态的搬迁,所以一样可以加速,很明显的,线程使执行的发派、分配更加细腻与灵活化。
线程的副作用
线程虽有好用的优点,不过它也有副作用的缺点,且此一优缺是一体两面无从分割,缺点是各个线程共享同一组内存管理组态及机制,倘若有一个线程的执行发生错误、瑕疵、或遭入侵等,其余在同一个行程内的每个线程也都会遭受影响、波及,最严重是同一个行程内的一切都错乱、毁坏,由此可知:线程其实是带有若干安全性牺牲的加速法。
此外有人会误会,就字面上而言,多核表示同时间有多颗处理器在执行,每颗处理器可以执行一个行程或一个线程,但是一颗具有多线程能力的处理器并不表示它可以同时执行多个线程,事实上在同一时间内一颗具多线程功效的处理器也依然是执行一个线程而已,只是多线程处理器的内部可以将原有线程的相关信息及变量暂时搁摆,然后去执行其它的线程,执行完后在切换回原来执行到一半的线程,甚至没执行完也可以切换回来,且整个切换过程都在处理器内进行,不用与快取与内存进行搬迁置换,如此以快速换线程执行的方式来加速。
相对于此的,一颗不具多线程能力的
- 展望未来 多核DSP技术不仅仅是小把戏(04-03)
- Windows操作系统多核CPU内核线程管理方法(01-21)
- 嵌入式多媒体多核应用软件设计框架(11-30)
- 多核DSP Bootloader 代码加载方法(01-12)
- 多核处理器设计的要素(01-12)
- 基于多核DSP Bootload代码加载方法研究(01-16)