04-程序计数器(PC寄存器)

简介: JVM中的程序计数寄存器(Program Counter Register)中,Register的命令源于CPU的寄存器,寄存器存储指令的线程信息。CPU只有把数据装载到寄存器才能够运行。

1 PC Register介绍


1.png


JVM中的程序计数寄存器(Program Counter Register)中,Register的命令源于CPU的寄存器,寄存器存储指令的线程信息。CPU只有把数据装载到寄存器才能够运行。


这里,并非是指广义上所指的物理寄存器,获取将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中PC寄存器是对物理PC寄存器的一种抽象模拟。


作用:


PC寄存器用来存储指令指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令。


1.png


  • 它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。
  • 在JVM规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程的生命周期保持一致。
  • 任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的Java方法的JVM指令地址:或者,如果是在执行native方法,则是未指定值(undefined)
  • 它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计算器来完成。
  • 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。
  • 它是唯一一个在Java虚拟机规范中没有规定任何OutOtMemoryError情况的区域。


2 举例说明


public class PCRegisterTest {
  public static void main(String[] args) {
    int i = 10;
    int j = 20;
    int k = i + j;
    String s = "abd";
    System.out.println(i);
    System.out.println(k);
  }
}


反编译:


javap -v PCRegisterTest.class


反编译后结果:


1.png


3 两个常见问题


使用PC寄存器存储字节码指令地址有什么用呢?


为什么使用PC寄存器记录当前线程的执行地址?


因为CPU需要不停的切换各个线程,这时候切换回来以后,就得知道接着从哪开始继续执行。


JVM的字节码解释器就需要通过改变PC寄存器的值来明确下一条应该执行什么样的字节码指令。


1.png


PC寄存器为什么会被设定为线程私有?


我们都知道所谓的多线程在一个特定的时间段内只会执行其中某一个线程的方法,CPU会不停地做任务切换,这样必然导致经常中断或恢复,如何保证分毫无差呢?为了能够准确地记录各个线程正在执行的当前字节码指令地址,最好的办法自然是为每个线程都分配一个PC寄存器,这样一来各个线程之间便可以进行独立计算,从而不会出现相互干扰的情况。


由于CPU时间片轮限制,众多线程在并发执行过程中,任何一个确定的时刻,一个处理器或多核处理器中的一个内核,只会执行某一个线程中的某一条指令。


这样必然导致经常中断或恢复,如何保证分毫误差呢?每个线程在创建后,都会产生自己的程序计数器和栈帧,程序计数器在各个线程之间互不影响。


CPU时间片


CPU时间片即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片。


在宏观上,我们可以同时打开多个应用程序,每个程序并行不悖,同时运行。


但在微观上:由于只有一个CPU,一次只能处理程序要求的一部分,如何处理公平,一种方法就是引入时间片,每个程序轮流执行。

目录
相关文章
|
存储 数据处理 内存技术
寄存器
一、什么是寄存器 寄存器是计算机硬件中的一种存储设备,它用于暂时存储和处理数据。寄存器位于计算机的中央处理器(CPU)内部,通常是由高速的SRAM(静态随机存储器)构成。寄存器具有以下特点: 1. 速度快:寄存器位于CPU内部,与CPU的时钟频率相同,因此访问寄存器的速度非常快,能够在一个时钟周期内完成读取或写入操作。 2. 容量小:由于寄存器是CPU内部的存储设备,其容量相对较小。通常每个寄存器的容量为几个字节或几十个字节,用于存储临时数据、指令和地址等。 3. 数据处理:寄存器可以用于存储和处理数据。CPU可以直接从寄存器中读取数据,并进行运算、逻辑操作等。 4. 寄存器类型:根据不同的功
135 0
|
6月前
|
存储 缓存 编译器
DSP存储器与寄存器管理
DSP存储器与寄存器管理
201 1
|
存储
寄存器介绍
一、寄存器的定义 寄存器是计算机中的一种存储设备,用于暂时存储指令和数据。它位于计算机的中央处理器(CPU)内部,是最快速的存储器之一。寄存器的容量较小,但速度非常快,能够快速读取和写入数据。 二、寄存器的功能 数据存储:寄存器可以暂时存储指令和数据,供CPU进行读取和处理。 数据传输:寄存器可以在CPU内部传输数据,实现不同部件之间的数据交换。 运算操作:寄存器可以进行基本的算术和逻辑运算,支持CPU的运算功能。 地址定位:寄存器可以存储指令和数据的地址信息,帮助CPU准确定位数据的位置。 三、寄存器的类型 通用寄存器:通用寄存器用于存储临时数据,供CPU进行运算操作。 累加寄存器:累
265 0
|
存储 缓存
当执行汇编指令MOV [0001H] 01H时,计算机都做了什么?
今天和几位单位大佬聊天时,讨论到一个非常有趣的问题-当程序执行MOV [0001H], 01H计算机实际上都做了哪些工作?乍一看这个问题平平无奇,CPU只是把立即数01H放在了地址为0001的内存里,但仔细想想这个问题远没有那么简单,由于现代计算机体系中CPU速度比内存要快2到3个个数量级,因此从CPU执行MOV指令,到实际把01H写入内存之间,还有非常漫长而复杂的过程。
|
存储 Java C++
汇编语言、寄存器分类及程序计数器
汇编语言、寄存器分类及程序计数器
144 0
|
vr&ar
8086 寻址方式(一)CPU和主存中的寻址方式
     通常,一条带有操作数的指令要指明两个问题:一是进行什么操作,二是用什么方式寻找操作数的存放地址。我们将寻找操作数存放的地址的方式成为寻址方式。当一条指令带中有多个操作数时,每个操作数的寻址方式可能不同,因此,寻址方式是针对指令中指定的操作数(源操作数或者是目的操作数)而言的。
1700 0
|
计算机视觉
ARM64状态寄存器
状态寄存器
223 0
ARM64状态寄存器
|
存储 缓存 Java
什么是寄存器
Java编译器输出的指令流,基本上是一种基于栈的指令集架构,而与之相对的另外一套常用的指令集架构是基于寄存器的指令集。早期的android,即android4.4之前使用的JVM是Dalvik VM,就是基于寄存器架构的。
什么是寄存器
|
存储 安全 编译器
CPU和寄存器详解
CPU和寄存器详解
861 0
CPU和寄存器详解