什么是多线程,什么是多线程编程?
1 基本概括2 主要介绍
2.1 线程池的概念
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。
线程池内部结构 :
1.线程池管理器:负责线程创建、销毁、添加任务等;
2.工作线程: 线程池创建的正在工作的线程;
3.任务队列( BlockingQueue ):线程满了之后,可以放到任务队列中,起到一定的缓冲;
4.任务:要求实现统一的接口,方便处理和执行;
2.2 线程池的优点
可以将任务的提交和执行策略解耦,便于统一管理任务执行策略,好维护,比如延时执行,设置等 待时间,超时自动失败等。
2.提高性能,用已创建的线程执行任务,减少创建和销毁线程的开销。
3.约束最大线程并发数,防止无止境创建线程造成性能变差以及程序死掉。
4.活跃线程数、最大线程数等参数可配置,方便进行性能调优。
2.3 线程池的状态
线程池的5种状态:Running、ShutDown、Stop、Tidying、Terminated。
线程池各个状态切换框架图:
1.RUNNING
状态说明:线程池处在RUNNING状态时,能够接收新任务,以及对已添加的任务进行处理。
状态切换:线程池的初始化状态是RUNNING。换句话说,线程池被一旦被创建,就处于RUNNING状态,并且线程池中的任务数为0!
2.SHUTDOWN
状态说明:线程池处在SHUTDOWN状态时,不接收新任务,但能处理已添加的任务。
状态切换:调用线程池的shutdown()接口时,线程池由RUNNING -> SHUTDOWN。
3.STOP
状态说明:线程池处在STOP状态时,不接收新任务,不处理已添加的任务,并且会中断正在处理的任务。
状态切换:调用线程池的shutdownNow()接口时,线程池由(RUNNING or SHUTDOWN ) -> STOP。
4.TIDYING
状态说明:当所有的任务已终止,ctl记录的”任务数量”为0,线程池会变为TIDYING状态。当线程池变为TIDYING状态时,会执行钩子函数terminated()。terminated()在ThreadPoolExecutor类中是空的,若用户想在线程池变为TIDYING时,进行相应的处理;可以通过重载terminated()函数来实现。
状态切换:当线程池在SHUTDOWN状态下,阻塞队列为空并且线程池中执行的任务也为空时,就会由 SHUTDOWN -> TIDYING。
当线程池在STOP状态下,线程池中执行的任务为空时,就会由STOP -> TIDYING。
5.TERMINATED
状态说明:线程池彻底终止,就变成TERMINATED状态。
状态切换:线程池处在TIDYING状态时,执行完terminated()之后,就会由 TIDYING -> TERMINATED。
2.4 线程池的使用场景
使用的场景:
1、需要大量的线程来完成任务,且完成任务的时间比较短。 WEB服务器完成网页请求这样的任务,使用线程池技术是非常合适的。因为单个任务小,而任务数量巨大,你可以想象一个热门网站的点击次数。 但对于长时间的任务,比如一个Telnet连接请求,线程池的优点就不明显了。因为Telnet会话时间比线程的创建时间大多了。
2、对性能要求苛刻的应用,比如要求服务器迅速响应客户请求。
3、接受突发性的大量请求,但不至于使服务器因此产生大量线程的应用。突发性大量客户请求,在没有线程池情况下,将产生大量线程,虽然理论上大部分操作系统线程数目最大值不是问题,短时间内产生大量线程可能使内存到达极限,并出现"OutOfMemory"的错误。
不使用线程池的场景:
1、如果需要使一个任务具有特定优先级
2、如果具有可能会长时间运行(并因此阻塞其他任务)的任务
3、如果需要将线程放置到单线程单元中(线程池中的线程均处于多线程单元中)
2.5 线程池的使用步骤
2.6 ThreadPoolExecutor类
2.4.1 参数说明
corePoolSize:表示核心线程池的大小。当提交一个任务时,如果当前核心线程池的线程个数没有达到 corePoolSize,则会创建新的线程来执行所提交的任务,即使当前核心线程池有空闲的线程。如果当前核心线程池的线程个数已经达到了 corePoolSize,则不再重新创建线程。如果调用了prestartCoreThread()或者 prestartAllCoreThreads(),线程池创建的时候所有的核心线程都会被创建并且启动。maximumPoolSize:表示线程池能创建线程的最大个数。如果当阻塞队列已满时,并且当前线程池线程个数没有超过 maximumPoolSize 的话,就会创建新的线程来执行任务。keepAliveTime:空闲线程存活时间。如果当前线程池的线程个数已经超过了 corePoolSize,并且线程空闲时间超过了 keepAliveTime 的话,就会将这些空闲线程销毁,这样可以尽可能降低系统资源消耗。 unit:时间单位。为 keepAliveTime 指定时间单位。workQueue:阻塞队列。用于保存任务的阻塞队列,关于阻塞队列可以看这篇文章。可以使用ArrayBlockingQueue, LinkedBlockingQueue, SynchronousQueue, PriorityBlockingQueue。 threadFactory:创建线程的工程类。可以通过指定线程工厂为每个创建出来的线程设置更有意义的名字,如果出现并发问题,也方便查找问题原因。 handler:饱和策略。当线程池的阻塞队列已满和指定的线程都已经开启,说明当前线程池已经处于饱和状态了,那么就需要采用一种策略来处理这种情况。采用的策略有这几种:AbortPolicy: 直接拒绝所提交的任务,并抛出RejectedExecutionException异常;CallerRunsPolicy:只用调用者所在的线程来执行任务;DiscardPolicy:不处理直接丢弃掉任务;DiscardOldestPolicy:丢弃掉阻塞队列中存放时间最久的任务,执行当前任务
2.4.2 工作队列workQueue
该线程池中的任务队列:维护着等待执行的Runnable对象
当所有的核心线程都在干活时,新添加的任务会被添加到这个队列中等待处理,如果队列满了,则新建非核心线程执行任务
常用的workQueue类型:
SynchronousQueue:这个队列接收到任务的时候,会直接提交给线程处理,而不保留它,如果所有线程都在工作怎么办?那就新建一个线程来处理这个任务!所以为了保证不出现<线程数达到了maximumPoolSize而不能新建线程>的错误,使用这个类型队列的时候,maximumPoolSize一般指定成Integer.MAX_VALUE,即无限大LinkedBlockingQueue:这个队列接收到任务的时候,如果当前线程数小于核心线程数,则新建线程(核心线程)处理任务;如果当前线程数等于核心线程数,则进入队列等待。由于这个队列没有最大值限制,即所有超过核心线程数的任务都将被添加到队列中,这也就导致了maximumPoolSize的设定失效,因为总线程数永远不会超过corePoolSizeArrayBlockingQueue:可以限定队列的长度,接收到任务的时候,如果没有达到corePoolSize的值,则新建线程(核心线程)执行任务,如果达到了,则入队等候,如果队列已满,则新建线程(非核心线程)执行任务,又如果总线程数到了maximumPoolSize,并且队列也满了,则发生错误DelayQueue:队列内元素必须实现Delayed接口,这就意味着你传进去的任务必须先实现Delayed接口。这个队列接收到任务时,首先先入队,只有达到了指定的延时时间,才会执行任务
2.4.3 ThreadPoolExecutor的策略
当一个任务被添加进线程池时:
线程数量未达到corePoolSize,则新建一个线程(核心线程)执行任务线程数量达到了corePools,则将任务移入队列等待队列已满,新建线程(非核心线程)执行任务队列已满,总线程数又达到了maximumPoolSize,就会由 RejectedExecutionHandler抛出异常
2.4.4 可创建的线程池
1.可缓存线程池: CachedThreadPool
a.没有最大线程数限制,想创建多少就创建多少
b.有空闲线程就用空闲线程,没有就创建新线程
c.复用空闲线程能减少一部分重复创建销毁的开销
2. 定长线程池:FixedThreadPool
a.用来控制线程最大并发数。
b.如果没有空闲线程,剩下的任务会在队列等待有空闲线程执行。
3.支持定时和周期反复执行的定长线程池:ScheduledThreadPool
4.单线程的线程池:SingleThreadExecutor
线程池里只有一个线程,按照队列的出入规则来串行执行任务,例如先进先出。
2.4.5 拒绝策略
一般我们创建线程池时,为防止资源被耗尽,任务队列都会选择创建有界任务队列,这种模式下如果出现任务队列已满且线程池创建的线程数达到你设置的最大线程数时,这时就需要你指定ThreadPoolExecutor的RejectedExecutionHandler参数即合理的拒绝策略,来处理线程池"超载"的情况。ThreadPoolExecutor自带的拒绝策略如下:
1、AbortPolicy策略:该策略会直接抛出异常,阻止系统正常工作;
2、CallerRunsPolicy策略:如果线程池的线程数量达到上限,该策略会把任务队列中的任务放在调用者线程当中运行;
3、DiscardOledestPolicy策略:该策略会丢弃任务队列中最老的一个任务,也就是当前任务队列中最先被添加进去的,马上要被执行的那个任务,并尝试再次提交;
4、DiscardPolicy策略:该策略会默默丢弃无法处理的任务,不予任何处理。当然使用此策略,业务场景中需允许任务的丢失;
2.4.6 关键方法分析
1 private boolean addWorker(Runnable firstTask, boolean core)
此方法用于新增线程池的Worker对象。由于一些条件的限制,此方法并不总是能执行成功。具体的执行情况如下:
1 如果当前线程池处于STOP、TIDYING和TERMINATED中的任一状态,不执行新增Worker操作,返回false;
2 以下描述的是线程池处于SHUTDOWN状态的情况:
参数firstTask不为null,也就是说有新任务的提交,不执行新增Worker操作,返回false;
参数firstTask为null,并且当前任务队列为空,不执行新增Worker操作,返回false;
3 以下描述的是线程池处于RUNNING状态的情况:
线程池中Worker的数量已到达能够容纳的最大值CAPACITY,不执行新增Worker操作,返回false;
准备新增的为核心Worker,并且线程池中Worker的数量已到达最大值corePoolSize,不执行新增Worker操作,返回false;
准备新增的为非核心Worker,并且线程池中Worker的数量已到达最大值 maximumPoolSize,不执行新增Worker操作,返回false。
成功将新建的Worker放入Worker集合后,会启动Worker对象内部的线程,此方法执行是否成功以这个线程是否启动为准,若线程启动的标志为false,则说明新增Worker的操作失败,要做新增Worker失败处理。
addWorkerFailed方法用于处理新增Worker失败的情况,会执行下面三步操作:
新增Worker逻辑已经创建了一个Worker对象,那么此方法就要负责从Worker集合中移除这个Worke 对象;
将线程池Worker集合大小减1,通过CAS进行操作,自旋直到减成功;
调用tryTerminate方法,尝试停止线程池,能否停止成功以tryTerminate的执行为准(尝试性的停止)。
2 private boolean addWorker(Runnable firstTask, boolean core)
getTask是个比较重要的方法,它负责从任务队列中获取任务。
getTask方法有两种返回数据:
1 null
2 返回null,则预示着执行此方法的Worker将会被从Worker集合中移除;
3 队列任务
getTask() == null
出现getTask() == null的情况如下:
线程池中Worker的总数大于maximumPoolSize;线程池已停止(STOP、TIDYIING和TERMINATEDR任意一种);线程池已关闭(SHUTDOWN),并且任务队列为空;线程池Worker的总数已经超过corePoolSize或者allowCoreThreadTimeOut设置为true,上一次获取任务已经超时,当前的Worker不是最后一个或者是最后一个Worker并且任务队列为空。
3 public void shutdown()
外部通过调用shutdown方法来关闭线程池,此方法执行的步骤为:
第一步:检查是否有关闭权限; 第二步:将线程池状态转移为SHUTDOWN(循环通过CAS更新,直至成功);
第三步:中断空闲的Worker; 第四步:调用onShutdown方法; 第五步:调用tryTerminate尝试终止线程池。
4 public List shutdownNow()
外部通过调用shutdownNow方法来立即关闭线程池,此方法执行的步骤为:
第一步:检查是否有关闭权限;
第二步:将线程池状态转移为STOP(循环通过CAS更新,直至成功);
第三步:中断所有的Worker;
第四步:将任务队列中的任务转移出来;
第五步:调用tryTerminate尝试终止线程池。
第六步:返回转移出来的任务列表。
3 简单用例
3.1 ThreadFactory对线程池中创建的线程进行记录与命名
public class ThreadPool { private static ExecutorService pool; public static void main( String[] args ) { //自定义线程工厂 pool = new ThreadPoolExecutor(2, 4, 1000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(5), new ThreadFactory() { public Thread newThread(Runnable r) { System.out.println("线程"+r.hashCode()+"创建"); //线程命名 Thread th = new Thread(r,"threadPool"+r.hashCode()); return th; } }, new ThreadPoolExecutor.CallerRunsPolicy()); for(int i=0;i<10;i++) { pool.execute(new ThreadTask()); } }}public class ThreadTask implements Runnable{ public void run() { //输出执行线程的名称 System.out.println("ThreadName:"+Thread.currentThread().getName()); }}
3.2 创建可缓存线程池CachedThreadPool
//开始下载private void startDownload(final ProgressBar progressBar, final int i) { mCachedThreadPool.execute(new Runnable() { @Override public void run() { int p = 0; progressBar.setMax(10);//每个下载任务10秒 while (p < 10) { p++; progressBar.setProgress(p); Bundle bundle = new Bundle(); Message message = new Message(); bundle.putInt("p", p); //把当前线程的名字用handler让textview显示出来 bundle.putString("ThreadName", Thread.currentThread().getName()); message.what = i; message.setData(bundle); mHandler.sendMessage(message); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }); }
4 线程会常见的问题
1 使用线程池比手动创建线程好在哪里?2 线程池的各参数的含义?3 线程池有哪 4 种拒绝策略?4 有哪 6 种常见的线程池?什么是 Java8 的 ForkJoinPool?5 线程池常用的阻塞队列有哪些?6 为什么不应该自动创建线程池?7 合适的线程数量是多少?CPU 核心数和线程数的关系?8 如何根据实际需要,定制自己的线程池?9 如何正确关闭线程池?shutdown 和 shutdownNow 的区别?10 线程池实现“线程复用”的原理?
常见出现的问题会在后面的文章讨论,想一起讨论学习的朋友可以点下关注,会持续更新,文章有帮助的话可以收藏,转发,有什么补充可以在下面评论,谢谢!
以上内容就是小编分享的关于什么是多线程的上下文切换.jpg”/>
网友提问:
什么是多线程,什么是多线程的上下文切换?
处理器几核几线程是什么意思?
优质回答:
我们在选购电脑的时候,经常会听到一些“几核几线程CPU”的术语,比如四核八线程,八核十六线程之类的,那么这个所谓的几个核心和线程都是什么意思呢?请看下面介绍。
CPU的“几核几线程”是什么意思?
一、CPU核心介绍
CPU的核心数是指内部拥有几个物理内核,每个内核都可以当做一个单核CPU来看待,双核CPU就相当于有两套硬件资源组合在了一个盒子里面,这个核心数理解起来还是挺容易的,比较难理解的是线程数,请看下面。
二、CPU线程介绍
CPU拥有几线程原本是和核心数相对应的,即CPU有几个核心就有几个线程,但英特尔公司在2002年发布了一种超线程技术,它是通过特殊的硬件指令将一个CPU内核模拟成两个逻辑核心来使用,这样在处理一些多线程任务时,可以实现数据的并行处理,大大的提高运算效率,使CPU的性能发挥的更加彻底。但模拟出来的核心毕竟不是真正的物理核心,总体性能还是不如真正的多核心CPU。
三、通俗的理解CPU核心和线程
上面所说可能并不是那么好理解,我们下面再以一种通俗的方式让大家加深了解一下,请看下面:
我们可以把CPU核心比喻成一套维修工具,里面有万用表、螺丝刀、扳手等,拥有几个核心就代表有拥有几套工具,而线程数则代表是几个人干活,正常情况下是一个人拿一套工具干活,资源都是独立的。
而超线程技术则相当于是两个人使用一套工具干活,一个人使用螺丝刀,一个人使用扳手,资源是共享的,这样下来工作效率就提高了不少,但有时候也会出现两个人同时使用螺丝刀的现象,这就需要一个人用完另一个人再去使用,会有一定的等待时间,所以总体的效率虽然要高于一个人使用一套工具干活,但还是比不上两个人各配一套工具来的快。
看完上面的解释,应该能明白核心和线程的意思了吧,需要说明的是,超线程还需要主板、系统以及应用软件的支持才能发挥作用,而我们一般的上网大多都是单线程的,所以超线程技术的应用范围有限,大多集中在图形或视频处理等专业领域。
其他网友观点
前面的回答没有精确说明什么是线程、内核和处理器,以及它们之间的关系。所以,硬核补充一发。
线程属于程序的概念范畴,为了让程序能同时做很多事情,实现很多功能,比如浏览器既要能下载程序,又要能播放视频,同时我们还喜欢随时暂停视频播放、下载。简单说,要让程序能同时做很多事。
为此,现在的程序在设计时都被分成了多个线程(Thread),一个线程完成一个功能,上面说到的浏览器一般有三个线程,可以完成三个功能:下载程序、播放视频、用户界面。
处理器执行这些程序时,在操作系统的指挥下,会隔一段时间切换到新的线程,减少用户等待。由于处理器运行速度很快,线程切换的时间很短,因此我们常常感觉不到线程切换时的停滞感。
上图中直升机的螺旋桨旋转够快时,我们看到的是一个盘面,而不是几片桨叶;处理器运行速度很快时,我们也感觉不到线程切换的停滞感,体验到的是丝滑般流畅。
但这种多线程的执行是通过软件也就是操作系统来实现的,如果不经过操作系统下命令(调度),让处理器自己来完成这个工作,速度会更快,效率也会更高,于是硬件多线程诞生了。
硬件多线程里的代表性技术是同时多线程(即Simultaneous Multi Threading,简称SMT),工作原理是处理器同时发射多个线程的指令,这些指令可以并行乱序执行。
上面的话听起来有点晦涩,我打个比方:
硬件同时多线程技术(SMT)相当于快递分拣站一位身手灵活的小哥哥(CPU),可以一次抓取三四个包裹,然后快速将包裹分发给柜台前的张三、李四、王五等用户。
如果是软件多线程的话,需要快递分拣站经理站在小哥哥(CPU)旁边,告诉小哥哥该怎么做:抓三四个包裹,分给张三,分给李四,分给王五,每一步都需要下命令,小哥哥不能自主做决定,虽然能同时分发几个包裹,但效率明显没有硬件同时多线程高。
单线程更容易理解,张三李四王五在快递站外排队,小哥哥(CPU)发完张三的包裹,张三领着包裹出门后,李四才能进来领,王五依此类推。
Intel(英特尔)也有SMT技术,一个内核可以同时出理两个线程,模拟两个内核工作。模拟出的这两个内核被英特尔称为逻辑处理器。
我手头用着的笔电CPU为i5-5200U,有两个内核,利用SMT技术,可以模拟出4个逻辑处理器,即可以同时处理4个线程。
在市场宣传上,英特尔为自己的SMT技术取了个很拽的品牌名字“超线程”(Hyper Thread),这是一种市场推广方法。
在手机显示屏领域也有类似操作,三星电子生产的AMOLED屏幕,品牌名叫“SuperAMOLED”,它不是一种新的显示屏,而是一种品牌叫法。
我们要知道,硬件同时多线程技术是为了压榨处理器的潜能,还是离不开通过提升处理器的频率来提高执行速度,但频率一高,处理器的功耗也会上升。
既然处理器频率不能无限提高,那么提升性能的方法就只剩下增加内核的数量了。
这个思路并不复杂,单核是单打独斗,讲究单兵高素质,属于个人英雄主义,多核拼的是人多力量大,单兵素质稍低,但合起来性能也很可观,打的是人民战争。
现在的内核数量,在消费端CPU,一般是4到6个,而在服务器CPU上,内核数量可以轻松超过20个。
那么,内核和处理器有什么关系呢?
完整的处理器包含了内核、缓存、内存控制器、I/O(输入输出控制)等部件,可见,内核是处理器的一个“零部件”,处理器则是一个完整的产品,两者关系可以简单看作发动机和汽车的关系。
最后,说一个规律性的现象,同一架构下,内核数多的处理器,最高频率往往不高,内核数少的处理器,频率往往较高,这是为什么?欢迎在评论区留言。
其他网友观点
处理器几核极几线程是什么意思?
这个处理器每年都发布不同型号,不管是英特尔还是AMD都会有他中高低端处理器,其中决定处理器的关键参数就是几核几线程,比如我们常见的双核四线程,四核八线程,八核十二线程,六十四核一百二十八线程,但是很多小伙伴没有搞明白这个几核和几线程到底是个什么关系,到底是那个参数重要,接下来我就和小伙伴们讨论一下这个看似简单但是又有很多人不知道的问题。
我这个人不喜欢给小伙伴们讲太多书面理论,必定说的越专业大家越听不懂,通俗易懂的来说估计大家更能接受,这个CPU中的几核知道是物理核心数量,几核就是几个物理核心数量,这个核心数量越多那么代表电脑可以同时处理很多任务,这就好比是工厂里面的工人,一个工人就是一个物理核心,然后CPU就把这些工人安排到不同工作岗位上面去工作,四核就是四个工人安排不同岗位去工作,八核就是8个工人安排去不同岗位去工作,相比之下是不是8个工人比四个工人的生产效率更高,但是于此同时八个工人也比四个工人消耗更大,所以大家可以看到物理核心数量越多那么他的功耗自然也就越高,他们所占领的位置也就越大,那么这里问题来了是不是核心数量越多就一定越强,其实这个就不一定了,理论上来说核心数量越多他可以同时运行的程序就越多,但是于此同时功耗也会增加,所以一般来说核心数量越多的CPU他的主频一般都不会太高,尤其是像至强系列处理器动不动就是几十核,但是为了让其稳定运行一般都不会有太高的频率,所以英特尔和AMD也会根据不同的用户群体来推出不同性能的CPU。
接下来我们就来说说线程数量,这个线程数量就是英特尔和AMD虚拟化的核心数量,也就是说在原来的物理核心上面在利用自己的超线程技术在虚拟一个出来,这样就可以在不增加核心数量的同时又可以提高其性能,但是大家要明白这个虚拟出来的核心和物理核心在速度上面是有非常大的差距,不过处理速度会大大增加,这就好比以前四个人在流水线上工作,一个人两只手他只能干一份活,现在利用某种技术手段让原本只有两只手变成四只手干两个人活,这样一来在不给工厂增加负担的情况下还提高了生产效率何乐不为呢?除此之外这个超线程技术也是为了解决物理核心占地的问题,要知道CPU本身的就不大,他不可能让你自由发挥不然你要上上几百个核心那这颗CPU他的有多大,于此同时他的功耗该如何解决,你得用多大的散热器和多大功率的电源,你总不能看到CPU有盆那么大吧,所以某种意义上来说线程就是为了解决这个问题的。
如果总结起来来说几核就是有几个物理核心,几线程就是在物理核心的基础上又虚拟了几个核心数量,这就相当于一个人一开始只有一双手,但是后面经过某种特殊改造让你变成四个手,这样一来原本只能干一件事现在同一个人可以同时干两件事,不过这个性能方面他是不可能达到一加一等于二的,虽说多出来两只手是可以多干一个人的活,但是大家不要忘了他是一个人也就是说他是一个物理核心,他的能力也是有限的,想要虚拟的核心和物理核心一样那基本上是不可能的,这就好比一个人四只手对挑战两个人四只手,试问你这一个人能打的过吗?所以对于高端玩家来说建议还是先选择物理核心数量,然再参考线程数量,对于家用来说一般六核就够用了,至于线程数量一般上了六核以上有个六线程也就完全可以满足了,不过只要物理核心增加了线程数量自然也会跟着一起增加,其实道理就这么简单。
不过这里我要提醒一下大家这个看CPU不能只看物理核心和线程数量,一定要结合发布年代,制作工艺,尤其是英特尔八代以后和AMD锐龙系列发布后,前后几代的差距非常大,大家可以看看八代的i3都和七代i5一个起跑线了,所以我们一定要要结合发布年代,主频,缓存大小综合来评定,说白了CPU核心数量越多那么他可以同时处理的任务就越多,线程数量越多就是在物理核心处理的基础上再出提升工作效率,换句话说就是想把一个人改造成三头六臂,让一个人可以干两个人甚至更多的活,只不过线程是依附在核心数量上面的,好了关于这个问题我就说这么多了,不知道小伙伴是怎么理解这个问题的呢?
其他网友观点
你好,处理器的几核指的就是处理器中有几个核心,多线程就是利用超线程技术(超线程技术就是利用特殊的硬件指令把两个逻辑内核模拟成两个物理芯片,让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和软件,减少了cpu的闲置时间,提高的cpu的运行效率。)允许超线程运行后,在操作系统中看到的cpu数量是实际物理cpu数量的两倍,就是1个cpu可以看到两个,两个可以看到四个。 假如一颗cpu有两个核心,支持超线程技术,我们便称之为双核四线程 一般来说,物理cpu个数×每颗核数就应该等于逻辑cpu的个数
其他网友观点
我们在组装电脑选购硬件的时候,大多数的人群更在乎CPU的性能,除了考虑架构、工艺、单核性能等,还需要考虑核心和线程数量,CPU从早期的单核,发展到现在的双核、多核,除了核心数量之外,还有线程数量。那么CPU核数和线程数有什么用?什么意思?下面装机之家科普一下CPU核数和线程的关系与区别,来学习一下吧。
CPU核数和线程数知识
CPU核数和线程数什么意思?
处理器的核心数一般指的就是物理核心数,也称之为内核,双核就是包括2个独立的CPU核心单元组,而四核就是包括4个独立的CPU核心单元组,是处理各种数据的中心计算单元,多核心的处理器能够有效进步CPU的多任务功能,或者说减少CPU的占用率,进步计算功率。
一般一个核心对应了一个线程,而intel开发出了超线程技术,1个核心能够做到2个线程计算,而6个核心则能够做到12个线程,超线程技术的好处就是无需增加物理核心就可以明显的进步CPU多线程功能,毕竟增加物理核心是需要占据非常大的核心面积,成本也随之增加。而线程数是一种逻辑的概念,说白了就是虚拟出的CPU核心数,现在无论是intel还是AMD都具备超线程技术。
CPU核数和线程数
举个例子,CPU可以想象成是一个银行,CPU核心就相当于柜员,而线程数就相当于开通了几个窗口,柜员和窗口越多,那么同时办理的业务就越多,速度也就越快。
通常情况下,一个柜员对应的是一个窗口,通过超线程技术相当于一个柜员管理着两个窗口,使用左右手同时办理两个窗口的业务,大大提高了核心的使用效率,增加了办理业务的速度。
CPU核数和线程数有什么用?
多核心和多线程的作用主要是为了满足各类程序多任务需求,核心数和线程数量越多,那么越有利同时运行多个程序,CPU能够并行处理多个任务数量,说白点就是核心数和线程数量越多,越适合多开软件或者游戏,打开的任务越多,除了多开程序,还有渲染需求,核数和线程数越多,越有利。
如何查看CPU核数和线程数?
我们在设备管理下查看的CPU是核数+线程数总和,所以如果想要查看具体几个核心几个线程,我们还可以使用其它的方法来查看。以Win10系统为例,我们将鼠标指针移动至任务栏空白处并右键之后选择“任务管理器”,如下图所示。
在任务管理器中,我们查看内核就是物理核心,逻辑处理器就是线程,如下是四核四线程的一款处理器,此外我们还可以借助CPU-Z或者鲁大师来查看核心数量和线程数量。
以上就是装机之家分享的CPU核数和线程的关系与区别知识,其实通俗来说,线程是通过超线程技术将物理核心虚拟出来核心,希望能够帮助到大家。