浅谈关于多线程在CPU上是怎样分布的

转载自:https://baijiahao.baidu.com/s?id=1596431069198213468&wfr=spider&for=pc

关于Java多线程在CPU上分布的问题,首先要明白一点,它与CPU是多核还是双核并没有必然的联系。CPU有时只能执行一个线程,这是因为在多线程并行执行时,CPU可以根据一定的算法来调度和切换线程。一般而言对于多线程的理解可以是CPU根据一定的线程调度算法来切换线程,因此在相应时段,可看作是多个线程在并发执行。但在某一时间点上实际运行的只有一个线程。

在Java多线程中有并发编程和CPU时钟震荡两个关键的问题。我们都知道,在很久以前的DOS系统里,只能执行单任务。而我们现在使用的Windows都可以实现多任务操作,可以一边上网聊天、一边听歌、一边再下载电影等等。那么,操作系统是怎样支持多任务的?每打开一个程序,就意味着启动一个进程,并为其分配相应的内存空间,这样就可以让程序并发运行了。而CPU有时钟频率,即每秒可执行的CPU指令次数,在一个时钟周期内,CPU实际上只能执行一条(或者多条指令)。

操作系统对进程线程进行管理,对每一个进程进行时间分配,然后在每个进程的内部,程序代码自己处理该进程内部线程的时间分配,多个线程相互之间要在很短的时间内进行切换。因此,给人的感觉是多个任务、多个线程是在并发运行的,但实际上,程序的运行还是异步的。

既然是异步运行的,那么则可以理解为CPU的运行方式是串行而非并行,那么我们称之为多线程有什么意义?尚学堂百战程序员陈老师指出,原因还是CPU的运行速度太快了,但是我们I/O的读取速度,网络的传输、数据库的连接等等与CPU运算速度比起来,则是非常慢的。为了充分利用CPU,就可以减少CPU的空闲时间。

多线程的目的在于最大限度的利用CPU资源,在CPU中,主频=外频×倍频,主频越高,一个时钟周期里面完成的指令数也越多,当然cpu的速度也就越快了,以前提高CPU运算速度的方法,就是提高CPU主频,可是随着时间的推移,CPU的主频已经达到了物理极限,很难再提高了。于是为了解决这一问题,多核的CPU才开始逐渐受人青睐。

关于Java多线程有两个重要问题:

首先简单谈谈关于内存方面的问题,在Java中所有变量都储存在主存中,每条线程都有自己的工作内存(Working Memory),工作内存中存储的内容通常是主存中变量的复件。线程对所有变量的操作均在工作内存中进行,线程之间无法相互直接访问,变量传递也都需要在主存完成。线程之间的通信简单而快速,进程之间是相互独立的,如果不依赖网络,进程之间是无法通信的。

其次是关于线程调度的问题,CPU对于各个线程的调度是随机的(分时调度),而在Java中,JVM负责线程的调度,可更好地分配CPU的使用权。对于线程的调度一般有两种模式,分时调度和抢占式调度。分时调度是按照顺序平均分配;抢占调度是按照优先级来进行分配。

以上就是关于多线程在CPU上的分布问题的简单论述,从而帮助大家加深对多线程的理解。

猜你喜欢

转载自blog.csdn.net/qq_29824717/article/details/82561301