对于多线程程序的一些理解

276 阅读4分钟

关于CPU核心数与线程之间的关系

一开始一个CPU只有一个处理核心,后面发展了一个CPU多个核心;本来一个核心一个线程,不过Intel发明了一个核心抛出两个线程,这就是超线程技术。所以有双核4线程的说法。
简言之,一般而言单核CPU就是只有一个线程(不考虑超线程技术),多核对应多个线程。
对于超线程技术的说明,通过此技术,Intel实现在一个实体CPU中,提供两个逻辑线程

CPU最初发展的时候是一个CPU一个处理核心,CPU的性能主要靠提高核心工作频率来提高,由于物理限制,不能把CPU的核心频率无限提高,所以发展出来双核心或多核心的CPU。相当于在一枚处理器上集成多个完整的计算引擎(内核),他们共享缓存,内存,寄存器等。两个核心一起工作需要靠软件的支持。软件要明白怎么把任务分给两个核心让他们一起工作,这样变相的提高了回CPU的处理性能,现在新出的软件都支持多核心了。本来是一个核心一个线程,不过INTEL发明了一个核心跑出两个线程,这叫超线程技术。所以有双核4线程的说法。

参考资料

为什么单核单线程CPU也能提高多线程程序的执行效率

按理说,单核单线程CPU它只是一个并发的执行多线程程序,如抢占式调度,反正按理说就和单线程顺序执行的时间是一样的,那么是如何做到提高程序的执行效率的呢?
说明一下,如果JVM与OS的线程是多对一的关系,那么单核单线程CPU就是无法提高Java程序的执行效率的,所谓多对一的关系这里不展开讲,简言之就是Java程序永远只暴露一个线程给OS调度执行,这种情况就算是多核多线程的CPU也是无法提高Java程序的执行效率的。我们下面要讨论的问题是建立在JVM与OS的线程是多对多的关系。
首先程序的执行效率与执行速度运行时间有关。
单核单线程CPU在运行多线程程序并不能改变程序的执行速度,因为执行速度只和cpu有关的处理能力有关,单核再怎么处理都是一样的,这是我们无法改变的。单核单线程CPU执行多线程程序的时候其实减少的是程序的执行时间,那是如何减少程序的执行时间的呢?通过获取更多的CPU的执行时间来减少程序本来的执行时间,有点绕。什么意思呢?就说是如果你没有获取到CPU的执行时间,那么你这个程序就只能傻等着等到OS调度你这个Java程序,如果你获取到了CPU的执行权那么就会执行程序,我们的目的就是获取到尽可能多的CPU时间。
如果做到获取更多CPU执行时间这点呢?
我们知道,OS的调度是一个分时调度的,且最小执行单位是线程。那么如果我们的JVM与OS的线程是多对多的关系,也就是说一个Java程序同时暴露多个线程给OS调度,那么自然而然,分配的时间就所了,比如单线程的Java程序分时调度分配的时间是3ms一次,那么有3个线程的Java程序分配的时间就变成了9ms,显然获取到了更多的CPU执行时间,那么Java程序傻等的时间变少了,那么程序的执行时间也会变少,程序的执行效率就提高了。
简言之,OS的CPU分配给Java程序的执行时间变多了。
p.s. 如果是多核多线程的CPU,那么就可以并行的执行Java多线程程序,这才是真正的将执行速度提高了。