日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/4/15 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 04-程序计数器(PC计数器) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

程序計數器

介紹

JVM中的程序計數寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存儲指令相關的現場信息。CPU只有把數據裝載到寄存器才能夠運行。

這里,并非是廣義上所指的物理寄存器,或許將其翻譯為PC計數器(或指令計數器)會更加貼切(也稱為程序鉤子),并且也不容易引起一些不必要的誤會。JVM中的PC寄存器是對物理PC寄存器的一種抽象模擬。

它是一塊很小的內存空間,幾乎可以忽略不記。也是運行速度最快的存儲區域。

在JVM規范中,每個線程都有它自己的程序計數器,是線程私有的,生命周期與線程的生命周期保持一致。

任何時間一個線程都只有一個方法在執行,也就是所謂的當前方法。程序計數器會存儲當前線程正在執行的Java方法的JVM指令地址;或者,如果是在執行native方法,則是未指定值(undefned)。可以理解為行號指示器。

它是程序控制流的指示器,分支、循環、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器來完成。字節碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的字節碼指令。

它是唯一一個在Java虛擬機規范中沒有規定任何outotMemoryError情況的區域。

作用

PC寄存器用來存儲指向下一條指令的地址,也即將要執行的指令代碼。由執行引擎讀取下一條指令。


注意:后續我們主要關注GC和OOM(outotMemory)。對于GC,只有堆區和方法區存在GC機制;對于OOM,只有PC寄存器不存在OOM。因此,只有PC寄存器既不需要GC機制,也不會出現OOM。

代碼演示

我們首先寫一個簡單的代碼

/**程序計數器 */ public class PCRegisterTest {public static void main(String[] args) {int i = 10;int j = 20;int k = i + j;} }

然后將代碼進行編譯成字節碼文件,我們再次查看 ,發現在字節碼的左邊有一個行號標識,它其實就是指令地址,用于指向當前執行到哪里。

0: bipush 10 2: istore_1 3: bipush 20 5: istore_2 6: iload_1 7: iload_2 8: iadd 9: istore_3 10: return

通過PC寄存器,我們就可以知道當前程序執行到哪一步了

使用PC寄存器存儲字節碼指令地址有什么用呢?

因為CPU需要不停的切換各個線程,這時候切換回來以后,就得知道接著從哪開始繼續執行。

JVM的字節碼解釋器就需要通過改變PC寄存器的值來明確下一條應該執行什么樣的字節碼指令。

PC寄存器為什么被設定為私有的?

我們都知道所謂的多線程在一個特定的時間段內只會執行其中某一個線程的方法,CPU會不停地做任務切換,這樣必然導致經常中斷或恢復,如何保證分毫無差呢?為了能夠準確地記錄各個線程正在執行的當前字節碼指令地址,最好的辦法自然是為每一個線程都分配一個PC寄存器,這樣一來各個線程之間便可以進行獨立計算,從而不會出現相互干擾的情況。

由于CPU時間片輪限制,眾多線程在并發執行過程中,任何一個確定的時刻,一個處理器或者多核處理器中的一個內核,只會執行某個線程中的一條指令。

這樣必然導致經常中斷或恢復,如何保證分毫無差呢?每個線程在創建后,都會產生自己的程序計數器和棧幀,程序計數器在各個線程之間互不影響。

CPU時間片

CPU時間片即CPU分配給各個程序的時間,每個線程被分配一個時間段,稱作它的時間片。

在宏觀上:我們可以同時打開多個應用程序,每個程序并行不悖,同時運行。

但在微觀上:由于只有一個CPU,一次只能處理程序要求的一部分,如何處理公平,一種方法就是引入時間片,每個程序輪流執行。


注意:

  • 并行 VS 串行
  • 并發

并發(concurrent)指的是多個程序可以同時運行的現象,更細化的是多進程可以同時運行或者多指令可以同時運行。但這不是重點,在描述并發的時候也不會去扣這種字眼是否精確,并發的重點在于它是一種現象。并發描述的是多進程同時運行的現象。但實際上,對于單核心CPU來說,同一時刻只能運行一個進程。所以,這里的"同時運行"表示的不是真的同一時刻有多個進程運行的現象,這是并行的概念,而是提供一種功能讓用戶看來多個程序同時運行起來了,但實際上這些程序中的進程不是一直霸占CPU的,而是執行一會停一會。

所以,并發和并行的區別就很明顯了。它們雖然都說是"多個進程同時運行",但是它們的"同時"不是一個概念。并行的"同時"是同一時刻可以多個進程在運行(處于running),并發的"同時"是經過上下文快速切換,使得看上去多個進程同時都在運行的現象,是一種OS欺騙用戶的現象。

總結

以上是生活随笔為你收集整理的04-程序计数器(PC计数器)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。