深化了解与运行多线程技术 (深化了解是什么意思)
为什么要经常使用多线程
创立线程有几种方式?
创立线程有四种方式:
繁难成功
publicclassThreadTest{publicstaticvoidmn(String[]args){Threadthread=newMyThread();thread.start();}}classMyThreadextendsThread{@Overridepublicvoidrun(){System.out.println("关注群众号:一安未来");}}
publicclassThreadTest{publicstaticvoidmain(String[]args){MyRunnablemyRunnable=newMyRunnable();Threadthread=newThread(myRunnable);thread.start();}}classMyRunnableimplementsRunnable{@Overridepublicvoidrun(){System.out.println("关注群众号:一安未来");}}
publicclassThreadTest{publicstaticvoidmain(String[]args)throwsExecutionException,InterruptedException{MyThreadCallablemc=newMyThreadCallable();FutureTask<Integer>ft=newFutureTask<>(mc);Threadthread=newThread(ft);thread.start();System.out.println(ft.get());}}classMyThreadCallableimplementsCallable{@OverridepublicStringcall()throwsException{return"关注群众号:一安未来";}}
publicclassThreadTest{publicstaticvoidmain(String[]args)throwsException{ThreadPoolExecutorexecutorOne=newThreadPoolExecutor(5,5,1,TimeUnit.MINUTES,newArrayBlockingQueue<Runnable>(20),newCustomizableThreadFactory("Yian-Thread-pool"));executorOne.execute(()->{System.out.println("关注群众号:一安未来");});//封锁线程池executorOne.shutdown();}}
线程和进程的区别
线程和进程是操作系统中关键的概念,都是操作系统资源调配的基本单位,但它们有一些关键的区别。
Runnable和Callable有什么区别
volatile作用,原理
关键用于申明变量,以批示该变量或许会被多个线程同时访问,从而防止编译器启动一些优化,确保线程之间能够正确地读写共享变量。volatile提供了一种轻量级的同步机制,但它并不能替代synchronized,由于它无法处置复合操作的原子性疑问。
作用:
原理:
volatile的成功原理触及到CPU的缓存分歧性和内存屏障(MemoryBarrier)的概念。
synchronized的成功原理以及锁优化
假设synchronized作用于代码块,反编译可以看到两个指令:monitorenter、monitorexit,JVM经常使用monitorenter和monitorexit两个指令成功同步;假设作用synchronized作用于方法,反编译可以看到ACCSYNCHRONIZED标志,JVM经过在方法访问标识符(flags)中参与ACCSYNCHRONIZED来成功同步配置。
monitor监督器
操作系统的管程(monitors)是概念原理,ObjectMonitor是它的原理成功。
图片
在虚构机(HotSpot)中,Monitor(管程)是由ObjectMonitor成功的,其关键数据结构如下:
ObjectMonitor(){_header=NULL;_count=0;//记载个数_waiters=0,_recursions=0;_object=NULL;_owner=NULL;_WaitSet=NULL;//处于wait形态的线程,会被参与到_WaitSet_WaitSetLock=0;_Responsible=NULL;_succ=NULL;_cxq=NULL;FreeNext=NULL;_EntryList=NULL;//处于期待锁block形态的线程,会被参与到该列表_SpinFreq=0;_SpinClock=0;OwnerIsThread=0;}
JavaMonitor的上班机理
图片
对象与monitor关联
图片
MarkWord是用于存储对象自身的运转时数据,如哈希码(HashCode)、GC分代年龄、锁形态标志、线程持有的锁、倾向线程ID、倾向期间戳等。
图片
重量级锁,指向互斥量的指针。其实synchronized是重量级锁,也就是说Synchronized的对象锁,MarkWord锁标识位为10,其中指针指向的是Monitor对象的起始地址。
在JDK1.6之前,synchronized的成功间接调用ObjectMonitor的enter和exit,这种锁被称之为重量级锁。从JDK6开局,HotSpot虚构机开发团队对Java中的锁启动优化,如参与了顺应性自旋、锁消弭、锁粗化、轻量级锁和倾向锁等优化战略,优化了synchronized的性能。
线程有哪些形态
图片
CountDownLatch与CyclicBarrier区别
CountDownLatch和CyclicBarrier都用于让线程期待,到达必定条件时再运转。关键区别是:
图片
多线程环境下的伪共享
现代计算机计算模型:
图片
也正是由于缓存行的存在,就造成了伪共享疑问,如图所示:
图片
假定数据a、b被加载到同一个缓存行。
Fork/Join框架
Fork/Join框架是Java7提供的一个用于并行口头义务的框架,是一个把大义务宰割成若干个小义务,最终汇总每个小义务结果后失掉大义务结果的框架。
Fork/Join框架须要了解两个点,「分而治之」和「上班窃取」。
分而治之
图片
上班窃取
图片
ThreadLocal原理
ThreadLocal的内存结构图:
图片
内存暴露疑问:指程序中灵活调配的堆内存由于某种要素没有被监禁或许无法监禁,形成系统内存的糜费,造成程序运转速度减慢或许系统奔溃等重大结果。内存暴露沉积将会造成内存溢出。
ThreadLocal的内存暴露疑问普通思考和Entry对象有关,ThreadLocal::Entry被弱援用所润色。JVM会将弱援用润色的对象在下次渣滓回收中肃清掉。这样就可以成功ThreadLocal的生命周期和线程的生命周期解绑。但实践上并不是经常使用了弱援用就会出现内存暴露疑问,思考上方几个环节:
图片
当ThreadLocalRef被回收了,由于在Entry经常使用的是强援用,在CurrentThread还存在的状况下就存在着抵达Entry的援用链,无法肃清掉ThreadLocal的内容,同时Entry的value也雷同会被保管;也就是说就算经常使用了强援用依然会出现内存暴露疑问。
图片
当ThreadLocalRef被回收了,由于在Entry经常使用的是弱援用,因此在下次渣滓回收的时刻就会将ThreadLocal对象肃清,这个时刻Entry中的KEY=null。但是由于ThreadLocalMap中任然存在CurrentThreadRef这个强援用,因此Entry中value的值任然无法肃清。还是存在内存暴露的疑问。
AQS成功原理
AbstractQueuedSynchronizer(AQS)是Java中用于构建同步器的基础框架。它提供了一个灵敏的、可重用的同步器成功,可以用来构建各种同步工具,如ReentrantLock、Semaphore、CountDownLatch等。AQS的外围现实是基于FIFO期待队列,经过形态(state)来治理线程的同步。
外围原理:
ReentrantLock解析:
图片
图片
高低文切换
图片
什么是多线程、多进程?
■什么是多线程:多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。 线程是在同一时间需要完成多项任务的时候被实现的。 使用线程的好处有以下几点:·使用线程可以把占据长时间的程序中的任务放到后台去处理·用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度·程序的运行速度可能加快·在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较游泳了。 在这种情况下我们可以释放一些珍贵的资源如内存占用等等。 ====■什么是多进程:进程是程序在计算机上的一次执行活动。 当你运行一个程序,你就启动了一个进程。 显然,程序是死的(静态的),进程是活的(动态的)。 进程可以分为系统进程和用户进程。 凡是用于完成操作系统的各种功能的进程就是系统进程,它们就是处于运行状态下的操作系统本身;用户进程就不必我多讲了吧,所有由你启动的进程都是用户进程。 进程是操作系统进行资源分配的单位。 在Windows下,进程又被细化为线程,也就是一个进程下有多个能独立运行的更小的单位。 在同一个时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态,这便是多任务。 现代的操作系统几乎都是多任务操作系统,能够同时管理多个进程的运行。 多任务带来的好处是明显的,比如你可以边听mp3边上网,与此同时甚至可以将下载的文档打印出来,而这些任务之间丝毫不会相互干扰。 那么这里就涉及到并行的问题,俗话说,一心不能二用,这对计算机也一样,原则上一个CPU只能分配给一个进程,以便运行这个进程。 我们通常使用的计算机中只有一个CPU,也就是说只有一颗心,要让它一心多用,同时运行多个进程,就必须使用并发技术。 实现并发技术相当复杂,最容易理解的是“时间片轮转进程调度算法”,它的思想简单介绍如下:在操作系统的管理下,所有正在运行的进程轮流使用CPU,每个进程允许占用CPU的时间非常短(比如10毫秒),这样用户根本感觉不出来CPU是在轮流为多个进程服务,就好象所有的进程都在不间断地运行一样。 但实际上在任何一个时间内有且仅有一个进程占有CPU。 如果一台计算机有多个CPU,情况就不同了,如果进程数小于CPU数,则不同的进程可以分配给不同的CPU来运行,这样,多个进程就是真正同时运行的,这便是并行。 但如果进程数大于CPU数,则仍然需要使用并发技术。 在Windows中,进行CPU分配是以线程为单位的,一个进程可能由多个线程组成,这时情况更加复杂,但简单地说,有如下关系: 总线程数<= CPU数量:并行运行 总线程数> CPU数量:并发运行 并行运行的效率显然高于并发运行,所以在多CPU的计算机中,多任务的效率比较高。 但是,如果在多CPU计算机中只运行一个进程(线程),就不能发挥多CPU的优势。 这里涉及到多任务操作系统的问题,多任务操作系统(如Windows)的基本原理是:操作系统将CPU的时间片分配给多个线程,每个线程在操作系统指定的时间片内完成(注意,这里的多个线程是分属于不同进程的).操作系统不断的从一个线程的执行切换到另一个线程的执行,如此往复,宏观上看来,就好像是多个线程在一起执行.由于这多个线程分属于不同的进程,因此在我们看来,就好像是多个进程在同时执行,这样就实现了多任务,真绕口.
求多线程的全面解释和用途。
什么是多线程?在计算机编程中,一个基本的概念就是同时对多个任务加以控制。 许多程序设计问题都要求程序能够停下手头的工作,改为处理其他一些问题,再返回主进程。 可以通过多种途径达到这个目的。 最开始的时候,那些掌握机器低级语言的程序员编写一些“中断服务例程”,主进程的暂停是通过硬件级的中断实现的。 尽管这是一种有用的方法,但编出的程序很难移植,由此造成了另一类的代价高昂问题。 中断对那些实时性很强的任务来说是很有必要的。 但对于其他许多问题,只要求将问题划分进入独立运行的程序片断中,使整个程序能更迅速地响应用户的请求。 最开始,线程只是用于分配单个处理器的处理时间的一种工具。 但假如操作系统本身支持多个处理器,那么每个线程都可分配给一个不同的处理器,真正进入“并行运算”状态。 从程序设计语言的角度看,多线程操作最有价值的特性之一就是程序员不必关心到底使用了多少个处理器。 程序在逻辑意义上被分割为数个线程;假如机器本身安装了多个处理器,那么程序会运行得更快,毋需作出任何特殊的调校。 根据前面的论述,大家可能感觉线程处理非常简单。 但必须注意一个问题:共享资源!如果有多个线程同时运行,而且它们试图访问相同的资源,就会遇到一个问题。 举个例子来说,两个进程不能将信息同时发送给一台打印机。 为解决这个问题,对那些可共享的资源来说(比如打印机),它们在使用期间必须进入锁定状态。 所以一个线程可将资源锁定,在完成了它的任务后,再解开(释放)这个锁,使其他线程可以接着使用同样的资源。 多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。 线程是在同一时间需要完成多项任务的时候实现的。 线程定义英文:Thread 每个正在系统上运行的程序都是一个进程。 每个进程包含一到多个线程。 进程也可能是整个程序或者是部分程序的动态执行。 线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。 也可以把它理解为代码运行的上下文。 所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。 通常由操作系统负责多个线程的调度和执行。 线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程. 线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU。 使用线程的好处·使用线程可以把占据长时间的程序中的任务放到后台去处理 ·用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度 ·程序的运行速度可能加快 ·在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。 在这种情况下可以释放一些珍贵的资源如内存占用等等。 还有其他很多使用多线程的好处,这里就不一一说明了。 一些线程模型的背景可以重点讨论一下在Win32环境中常用的一些模型。 ·单线程模型在这种线程模型中,一个进程中只能有一个线程,剩下的进程必须等待当前的线程执行完。 这种模型的缺点在于系统完成一个很小的任务都必须占用很长的时间。 ·块线程模型(单线程多块模型STA) 这种模型里,一个程序里可能会包含多个执行的线程。 在这里,每个线程被分为进程里一个单独的块。 每个进程可以含有多个块,可以共享多个块中的数据。 程序规定了每个块中线程的执行时间。 所有的请求通过Windows消息队列进行串行化,这样保证了每个时刻只能访问一个块,因而只有一个单独的进程可以在某一个时刻得到执行。 这种模型比单线程模型的好处在于,可以响应同一时刻的多个用户请求的任务而不只是单个用户请求。 但它的性能还不是很好,因为它使用了串行化的线程模型,任务是一个接一个得到执行的。 ·多线程块模型(自由线程块模型) 多线程块模型(MTA)在每个进程里只有一个块而不是多个块。 这单个块控制着多个线程而不是单个线程。 这里不需要消息队列,因为所有的线程都是相同的块的一个部分,并且可以共享。 这样的程序比单线程模型和STA的执行速度都要块,因为降低了系统的负载,因而可以优化来减少系统idle的时间。 这些应用程序一般比较复杂,因为程序员必须提供线程同步以保证线程不会并发的请求相同的资源,因而导致竞争情况的发生。 这里有必要提供一个锁机制。 但是这样也许会导致系统死锁的发生。 进程和线程都是操作系统的概念。 进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。 线程是进程内部的一个执行单元。 系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。 主执行线程终止了,进程也就随之终止。 每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。 用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。 一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源,所以线程间的通讯非常方便,多线程技术的应用也较为广泛。 多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。 要说明的一点是,目前大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。 由此可见,如果两个非常活跃的线程为了抢夺对CPU的控制权,在线程切换时会消耗很多的CPU资源,反而会降低系统的性能。 这一点在多线程编程时应该注意。 Win32 SDK函数支持进行多线程的程序设计,并提供了操作系统原理中的各种同步、互斥和临界区等操作。 Visual C++ 6.0中,使用MFC类库也实现了多线程的程序设计,使得多线程编程更加方便。 [1]多线程在里如何工作?在本质上和结构来说,是一个多线程的环境。 有两种主要的多线程方法是所提倡的:使用ThreadStart来开始你自己的进程,直接的(使用)或者间接的(比如,或者调用BeginInvoke)使用ThreadPool类。 一般来说,你可以手动为长时间运行的任务创建一个新的线程,另外对于短时间运行的任务尤其是经常需要开始的那些,进程池是一个非常好的选择。 进程池可以同时运行多个任务,还可以使用框架类。 对于资源紧缺需要进行同步的情况来说,它可以限制某一时刻只允许一个线程访问资源。 这种情况可以视为给线程实现了锁机制。 线程的基类是。 所有线程通过CLI来进行管理。 ·创建线程: 创建一个新的Thread对象的实例。 Thread的构造函数接受一个参数: Thread DummyThread = new Thread( new ThreadStart(dummyFunction) ); ·执行线程: 使用Threading命名空间里的start方法来运行线程: (); ·组合线程: 经常会出现需要组合多个线程的情况,就是当某个线程需要其他线程的结束来完成自己的任务。 假设DummyThread必须等待DummyPriorityThread来完成自己的任务,只需要这样做: () ; ·暂停线程: 使得线程暂停给定的秒 (<Time in Second>); ·中止线程: 如果需要中止线程可以使用如下的代码: (); ·同步 经常会遇到需要在线程间进行同步的情况,下面的代码给出了一些方法: using System; using ; namespace SynchronizationThreadsExample { class SynchronizationThreadsExample { private int counter = 0; static void Main( ) { SynchronizationThreadsExample STE = new SynchronizationThreadsExample(); ( ); } public void ThreadFunction ( ) { Thread DummyThread = new Thread( new ThreadStart(SomeFunction)) ; =true; = First Thread; ( ); (Started thread , ); Thread DummyPriorityThread = new Thread( new ThreadStart(SomeFunction) ); =true; = Second Thread; ( ); (Started thread , ); ( ); ( ); } public void SomeFunction( ) { try { while (counter < 10) { int tempCounter = counter; tempCounter ++; (1); counter = tempCounter; ( Thread . SomeFunction: ++counter); } } catch (ThreadInterruptedException Ex) { ( Exception in thread +); } finally { ( Thread Exiting. +); } } } } ·使用Interlock C#提供了一个特殊的类叫做interlocked,就是提供了锁机制的实现,可以加入如下的代码实现锁机制: (ref counter); ·使用锁 这是为了锁定代码关键区域以进行同步,锁定代码如下: lock (this){ Some statements ;} ·使用Monitor 当有需要进行线程管理的时候可以使用: (this); 其他也有一些方法进行管理,这里就不一一提及了。 线程的缺点 线程自然也有缺点,以下列出了一些: ·如果有大量的线程,会影响性能,因为操作系统需要在他们之间切换; ·更多的线程需要更多的内存空间 ·线程会给程序带来更多的bug,因此要小心使用 ·线程的中止需要考虑其对程序运行的影响 ·通常块模型数据是在多个线程间共享的,需要一个合适的锁系统替换掉数据共享多线程在JAVA里面的应用Java对多线程的支持是非常强大的,他屏蔽掉了许多的技术细节,让我们可以轻松的开发多线程的应用程序。 Java里面实现多线程,有2个方法1 继承 Thread类class MyThread extends Thread { public void run() { // 这里写上线程的内容 } public static void main(String[] args) { // 使用这个方法启动一个线程 new MyThread()(); } }2 实现 Runnable接口class MyThread implements Runnable{ public void run() { // 这里写上线程的内容 } public static void main(String[] args) { // 使用这个方法启动一个线程 new Thread(new MyThread())(); } } 一般鼓励使用第二种方法,因为Java里面只允许单一继承,但允许实现多个接口。 第二个方法更加灵活。 实际意义一个采用了多线程技术的应用程序可以更好地利用系统资源。 其主要优势在于充分利用了CPU的空闲时间片,可以用尽可能少的时间来对用户的要求做出响应,使得进程的整体运行效率得到较大提高,同时增强了应用程序的灵活性。 更为重要的是,由于同一进程的所有线程是共享同一内存,所以不需要特殊的数据传送机制,不需要建立共享存储区或共享文件,从而使得不同任务之间的协调操作与运行、数据的交互、资源的分配等问题更加易于解决。 [2]线程同步在多线程应用中,考虑不同线程之间的数据同步和防止死锁。 当两个或多个线程之间同时等待对方释放资源的时候就会形成线程之间的死锁。 为了防止死锁的发生,需要通过同步来实现线程安全。 在Visual 中提供了三种方法来完成线程的同步。 (1)代码域同步使用Monitor类可以同步静态/实例化的方法的全部代码或者部分代码段。 (2)手工同步可以使用不同的同步类(诸如WaitHandle, Mutex, ReaderWriterLock, ManualResetEvent, AutoResetEvent 和Interlocked等)创建自己的同步机制。 这种同步方式要求你自己手动的为不同的域和方法同步,这种同步方式也可以用于进程间的同步和解除由于对共享资源的等待而造成的死锁。 (3)上下文同步使用SynchronizationAttribute为ContextBoundObject对象创建简单的,自动的同步。 这种同步方式仅用于实例化的方法和域的同步。 所有在同一个上下文域的对象共享同一个锁。 [3] 虽然多线程能给大家带来好处,但是也有不少问题需要解决。 例如,对于像磁盘驱动器这样独占性系统资源,由于线程可以执行进程的任何代码段,且线程的运行是由系统调度自动完成的,具有一定的不确定性,因此就有可能出现两个线程同时对磁盘驱动器进行操作,从而出现操作错误;又例如,对于银行系统的计算机来说,可能使用一个线程来更新其用户数据库,而用另外一个线程来读取数据库以响应储户的需要,极有可能读数据库的线程读取的是未完全更新的数据库,因为可能在读的时候只有一部分数据被更新过。 使隶属于同一进程的各线程协调一致地工作称为线程的同步。 MFC提供了多种同步对象,下面我们只介绍最常用的四种: 临界区(CCriticalSection) 事件(CEvent) 互斥量(CMutex) 信号量(CSemaphore) 通过这些类,可以比较容易地做到线程同步。 [4]Intel的多线程技术:HT定义超线程(HT)是英特尔所研发的一种技术,于2002年发布。 超线程的英文是HT技术,全名为Hyper-Threading,中文又名超线程。 超线程技术原先只应用于Xeon处理器中,当时称为Super-Threading。 之后陆续应用在Pentium 4中,将技术主流化。 早期代号为Jackson。 特点通过此技术,英特尔成为第一间公司实现在一个实体处理器中,提供两个逻辑线程。 之后的Pentium D纵使不支援超线程技术,但就集成了两个实体核心,所以仍会见到两个逻辑线程。 超线程的未来发展,是提升处理器的逻辑线程,英特尔有计划将8核心的处理器,加以配合超线程技术,使之成为16个逻辑线程的产品。 英特尔表示,超线程技术让(P4)处理器增加5%的裸晶面积,就可以换来15%~30%的效能提升。 但实际上,在某些程式或未对多执行绪编译的程式而言,超线程反而会降低效能。 除此之外,超线程技术亦要操作系统的配合,普通支援多处理器技术的系统亦未必能充分发挥该技术。 例如Windows 2000,英特尔并不鼓励使用者在此系统中利用超线程。 原先不支援多核心的Windows XP Home Edition却支援超线程技术。 AMD:下一代处理器考虑多线程技术Bulldozer“推土机”近日据相关消息透露,在HotChips会议上,AMD宣布下一代代号为Bulldozer“推土机”的处理器架构将采用单核多线程技术(multi-threadingtechnology),类似于Intel著名的超线程技术. AMD没有透露有关其多线程能力和更多的细节,只说推土机处理器将在2011年推出,支持单核多线程技术.不过,AMD的做法和Intel的 HT是不同的,更类似于Sun的同步多线程技术(SimultaneousMulti-Threading),由1个物理核心扩展到4个线程.“推土机扩展出的单核心多线程技术和Intel的超线程采用的是不同方式.”AMD的代表PatConway也证实了这一点. 有趣的是,早些时候AMD还表示暂不考虑SMT或其他多线程技术,并将它应用在当下的处理器中.然而,AMD也认同步多线程是未来处理器产品大幅提升性能的必要特征. 推土机是AMD下一代微架构的处理器,事实上,它将是AMD自2003年后第一次对处理器架构进行重大改变.预计新一代的处理器将提供远高于目前产品的高性能,同时也加入SSE5指令集. 首款推土机系列桌面处理器代号为Orochi,将会拥有超过4个以上的处理器核心,8M以上的缓存并支持DDR3内存,基于32nm工艺.服务器版处理器代号为Valencia和Interlagos,这两款处理器将会拥有6、8以及12个处理器核心. AMD至今从未采用过同步多线程(SMT)也就是Intel所称的超线程技术。 虽然这样的技术在当年的P4时代显得并无实际用途,但到了现在,越发普及的多线程环境让超线程重新焕发了青春。 发展前景以目前的应用环境来看,超线程技术可以让一些特定应用程序显著提速达10到15%。 除了Intel的在Nehalem、Atom等中引入的超线程,无论IBM的Power系列,Sun的T1/T2/Rock系列等处理器架构都应用了类似的SMT同步多线程技术,用少量的晶体管带来大幅度的多线程性能提升。 一位AMD工程师日前向媒体坦诚,不支持单核多线程技术让Opteron处理器看起来性能比不上Intel的低端Xeon。 据称,AMD内部高层已经承认,没有早早引入此类技术是一项技术选择上的失误。 不过,AMD副总裁兼服务器工作站业务总经理Patrick Patla接受采访时,并没有明确透露单核多线程技术的未来,而是继续重申已经公布的Opteron路线图:“如果你看一下我们路线图以及我们在多线程处理器市场的表现就会知道,我们相信每条线程都拥有完整的核心是目前的最佳选择。 2010年,我们就会推出12核处理器,2011年16核。 我们相信未来几年内我们就能够完善支持48或64线程环境,让我们来看看2012到2013年会带来些什么吧。 ” 既然2011年才是16核,那么2012到2013直接跳跃到48甚至64核似乎并不是那么正常。 另外,Patrick Patla前面句句都在讲“核”,而到了后面又变成了“线程”,似乎就在暗示到时AMD可能会采纳单核多线程技术。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。