00:00
那关于这个PP寄存器的使用呢,其实前面呢,我们基本上把这内容呢,都已经讲清楚了,包括大家呢,对PP寄存器呢,应该有一个比较直观的理解了,那最后呢,我们回答两个常见的问题,那如果呢,你在面试当中问到这样的问题的话呢,呃,应该能够呃给他很顺利的答出来啊,那首先呢,看第一个问题,注意呢,我这两个放在一起了,它其实是一个问题啊,大家看一下说使用这个PC寄存器的话呢,存储字节码指定地址有什么用呢?呃,第二个呢,就是说为什么使用PC寄存器来记录记录当前线程的执行地址呢?诶,大家能不能发现这是一个问题啊。那这也是我们两个问题中的一个啊,这不是说这就是俩问题了,就跟说呃,有女朋友有什么好处呢?下一个问题说为什么要有女朋友?大家想想是不是一个问题啊?啊,我就自问自答了啊,是的,这是一个问题啊,那你也可以想想为什么要有女朋友呢?啊,嗯,那我们来看一下这个这个问题啊,说咱们为什么要用PC寄存器来记录当前线程的地址呢?你看这其实这个事很浅谈啊,也很好回答大家如果刚才这个都理解了,那就很容易打这个问题了,这咱们说CPU啊,它在不停的切换各个线程。
01:11
啊,那切换回来以后呢,咱们得知道呢,我该继续从哪开始,对吧,我该继续从哪开始,所以呢,我们需要用这个呃,PC计算器来记录一下,诶到底执行到哪了,你看我右边这有这个图,咱们呢,呃,这是执行引擎,或者我们说这是CPU也可以啊呃,执行引擎的话,我们需要转换成机器指令,机器指令呢来调用CPU,那我们的CPU的话呢,现在。一个CPU,呃,咱不叫一个CPU一个核,一个CPU的核啊,它呢分别呢去先后执行我们这个线程ABC就是并行的,就是说叫并行,其实是并发的在执行啊,就是快速的去切换AB和C啊,那这时候呢,我们A呢,就是CPU呢,在执行A的过程当中,执行了一半,我们就切换到B这了,那这时候我得知道A执行到哪了,所以这时候呢,我们就需要用这个PC启轮器呢来做一个记录,方便呢,我们这个CPU呢,在回来执行A的时候呢,得知道下一条指令应该从哪开始。
02:08
哎,这就是我们说需要记录当前线程执行地址的一个原因啊,需要明确一下下一个该执行哪一条自建码指令了啊,这就我们所说的第一个问题啊,啊第二问题说呢,PC计算器或者叫成品计数器说为什么被设定为叫线程私有的?啊,就是每个线程一份,那这个问题其实也非常的呃,好回答哈,这个咱们简单来画一下,我这呢,比如说放三个线程。哎,这是一个现场。嗯,这一个线程,然后呢,再来一个线程。再来一个现场。这是我们三个线程,这三个线程的话呢,就依次呢,向下执行,那我们现在呢,是通过这个叫CPU。这个CPU的话呢,咱们就理解成是这个一个核了啊,这一个CPU的话呢,去执行这三个线程,看似从宏观上来看呢,看似三个线程像是并行的在执行,实际上是并发的。
03:09
因为呢,他们先后被我们这一个核呢去执行,那么对于第一个线程这个,咱们这个我就简单的称为它就要线程123了。嗯,这个呢是二。嗯,这个呢,我们叫一个线程三。哎,整体的往上移一下。这呢是三个线程,然后这三个线程的话呢,比如说我们这个线程一呢,现在是被我们的这个CPU呢执行了,那执行以后我们专门有一个呃叫这个PC寄存器啊,比如说它执行到了第呃第五行代码啊呃,就是执行该执行第五行代码了啊这PC寄存里边记录的是下一个要执行的这个指令的一个地址,诶我这呢是五,然后当它这个还还没执行完呢,我们现在又切换到这个线程二了,那线程二的话呢,呃,如果说我们不是说每个线程一份,那就意味着他们仨呢,比如说要共用这一个五,哎,本来这个五呢是记录咱们这个线程一的啊,这个执行到该执行第五行代码了,你现在执行这二,那这二的话呢,执行到比如说第七行代码了,它现在又转化为执行这个线程三,那你要把这个五改成七的话。
04:28
诶,我们把这个五呢完全给覆盖掉了啊,诶那就转换成线程三,那转换过来三以后,执行了一段时间以后,我们CPU呢又切换为线程一了,那我一该从哪开始呢?呃,你刚才的这个五已经被覆盖掉了,呃这就不行了是吧?所以呢,我们不可能说让这个PC吸能器呢说呃共享几个线程共享它了,必须呢每人一份,哎你那个呢是五,你记录你的下一条指定的位置,哎,然后呢,我们再来一个位置呢,这个叫七。来来记录你自己的这个位置,然后呢,这个三的话呢,我们也得给它存一份,因为有可能呢,它也没有执行完,比如我们这写个17就跳转为执行这个五了,就像刚才我们说的这个事儿啊,到三的时候呢,三也没执行完,到第该第17这个行的这个指令地址了,然后就被切换成向量一了,一看哦,接着从五执行啊,它就接着执行,然后呢,呃,线程一还没执行完呢,又切换成这个线程三了,知道呢,该从17执行了,诶是这样的,所以呢,我们需要呢,每一个线程都给它单独的啊,记录一下它当前的一个地址值。
05:34
呃,是这样的原因啊,所以这里边的五七十七,诶这个咱们就理解成是它的。诶,叫寄存器的一个各自的地址值,嗯,这个我稍微的设置一下啊。哎,整成个虚线,这呢就是他们各自的PC寄存器的地址值。哎,各自呢来记录各自的,哎这样就可以了啊行,那这个事儿呢,我们就把它呢,就解释清楚了啊,你看这里边写的也很清楚啊,说为了能够准确的记录各个线程正在执行的当前世解码指令的地址,最好办法呢就每人一份。
06:14
哎,就这样子啊,好了,这就过了啊,嗯,然后接着呢,我们来看一下,这里提到了一个叫PC,呃,这个CPU的一个时间片哈,那我们刚才在举例呢,也是假设只有一个核,这一个核呢,去分配我们这三个线程去执行啊,那么呃,这里边呢,就提到了我们这个一个抢占式的这样一个策略啊,就是当我们这个具体的线程,我们说这个CPU分配吧,或者你反过来说这个线程呢,去抢占我们的CPU的执行权也可以啊。那CPU的话呢,在如果我们只有一个核的话呢,有三个线程,那在一个时间段之内,实际上呢,只能有一个线程在执行。啊,然后执行完一段以后呢,再去执行其他的线程,因为CPU呢主频非常高,快速的去切换这三个线程,让我们感觉呢,像是并发的在执行,注意呢,是像是并发的在执行,但这个实际上呢,还是这个这个。
07:10
并,呃,不是看着像是并行的在执行,说错了啊,看着像是并行的在执行,但实际上呢,它是一个并发的过程。啊,这里边儿大家需要明白这个并行并发的一个区别啊。哎,这个并行并发一开始时也经常容易整迷糊哈,呃整整呢就迷糊了啊,这个并行的话呢,你注意它的一个对应的呢,叫做串行,那这样就不容易整混了,串行呢,就是比如说有几个人,大家呢,就是呃排一队啊,依次呢去通过一个走廊,那你或者说呢,就是大家排成一个队,这是一个线程,这个线程啊,这又是一个线程,排成一个队,依次呢,被咱们这个CPU执行,执行完一个再执行另一个,这呢就叫做串行。那叫串行,就是同一个时间点之内,它或者叫时间段之内只有一个线程在执行啊串行,然后这个并行的话呢,那就是这几个线程,你可以理解为呢,就是同时的都在执行。
08:09
哎,同时都在执行一个时间点上一截切面啊,有三个都在执行,这叫并行串行,并行整清楚这个并发的话呢,你可以理解成针对于咱们线程和CPU执行这块呢,就可以列解成一个核,它呢快速的去切换几个线程,让他们依次执行,看着像是并行,其实是并发。诶,后面呢,我们也会讲到这个垃圾回收器当中的这个并行与并发,那么并行是什么意思呢?呃,当然呢,在垃圾回收器当中也有串行的概念,串行的意思呢,就是我们说的用户线程和垃圾回收线程,这个它俩不能同时执行,那么串行呢,就是我们的垃圾回收线程只有一条,诶,所以这叫串行,那并行的话呢,就是我们的垃圾回收线程呢,可以有多条,诶,可以并行的去执行,但是这个时候呢,我们的用户线程就是我们正在执行程序的这个应用程序的这个线程呢,就必须得是一个停止的状态啊,这是一个叫并行和串行的,诶垃圾回收器的概念,那么并发呢,并发就是说我们的垃圾回收线程和用户线程是可以呃这个同时执行的,那注意这时候的同时呢,它不一定是并行的哈,也可能是交替执行啊,但是总之呢,这个并发执行的话呢,它不会使得我们的用户线程呢,出现stop the word的情况啊,这呢就是垃圾回收。
09:32
气啊,到时候我们再讲的并行和并发的概念,哎,大家呢,先了解一下就行啊,后边咱们还会专门讲。
我来说两句