計算機組成
現在所說的計算機基本上都是馮諾依曼體系的計算機。其核心原理:
馮·諾依曼計算的核心思想是將程序指令和數據以二進制形式存儲存儲在同一存儲器中,并使用相同的數據格式和處理方式來處理它們。這種存儲程序的設計理念使得計算機能夠以可編程的方式執行不同的任務,而不需要對硬件進行物理修改。
在馮·諾依曼計算中,計算機由以下幾個主要組件組成:控制器、運算器、存儲器、輸入設備、輸出設備。
存儲器(Memory):用于存儲程序指令和數據。存儲器被劃分為地址單元,每個單元存儲一個字節的數據。程序和數據按照地址的順序存儲在存儲器中,并通過地址來訪問。算術邏輯單元(Arithmetic Logic Unit,ALU)用于執行算術和邏輯操作控制器(Controller):協調各個組件的操作,控制指令的執行和數據的傳輸。輸入/輸出設備(Input/Output Devices):用于與外部世界進行交互,例如鍵盤、鼠標、顯示器、磁盤驅動器等。
程序是如何加載的
由 馮諾依曼體系,我們知道程序想要執行,必需先加載到計算機的內存中。首先來看一下程序加載過程。這里以 Java 程序為例。
在IDE或者文本編輯器中寫 java 程序,如:
/*** @author shengjk1* @date 10/21/23*/
public class HelloWorld {public static void main(String[] args) {System.out.println("HelloWorld!");}
}
編譯,編譯成 Java 二進制的字節碼
javac HelloWorld.java
編譯后的文件,加載至 JVM 中并執行
java HelloWorld
借助 JVM 的類加載器,將 HelloWorld.Class 加載到 JVM 中
JVM 的內存區域會分為兩種:數據區和指令區
數據區包括:
1. 堆(Heap):堆是 Java 程序運行時動態分配對象的區域。所有通過 new 關鍵字創建的對象都存儲在堆中。堆是 JVM 中最大的一塊內存區域,被所有線程共享。
2. 方法區(Method Area):方法區用于存儲類的元數據信息,包括類的結構、常量池、靜態變量、編譯器優化后的代碼等。方法區也被稱為永久代(Permanent Generation)或元空間(Metaspace)。
3. 棧(Stack):棧用于存儲方法執行時的局部變量、方法參數、方法調用和返回的信息。每個線程在運行時都有自己的棧,稱為線程棧。棧的大小是固定的,并且棧中的數據是按照后進先出(LIFO)的順序進行操作。
4. 本地方法棧(Native Method Stack):本地方法棧類似于棧,但用于執行本地方法(Native Method)的數據和調用信息。
5. PC 寄存器(Program Counter Register):PC 寄存器存儲著當前線程執行的字節碼指令地址。當線程切換時,PC 寄存器的值會保存和恢復。
指令區包括:
指令區用于存儲 Java 程序的字節碼指令。字節碼是 Java 程序的中間表示形式,由編譯器生成。JVM 在指令區中解釋和執行字節碼指令。
如下:
程序在計算機中如何執行
1. 程序計數器(Program Counter,PC)的初始化:JVM通過將程序計數器(PC)的值設置為程序的入口點( 通常就是main方法 )來初始化。程序計數器是一個特殊的寄存器,它存儲下一條要執行的指令的地址。
2. 取指:CPU根據程序計數器中存儲的地址,從存儲器中獲取下一條要執行的指令。
3. 譯碼:CPU對獲取的指令進行解碼,確定其操作類型和所需的操作數。
4. 操作數獲取:如果指令需要操作數,CPU從存儲器或寄存器中獲取操作數的值。指令中的地址或寄存器標識符確定操作數的位置。
5.執行:CPU根據指令的操作類型和操作數執行相應的操作。這可能涉及算術運算、邏輯運算、內存訪問等。
6.結果存儲:執行操作后,CPU將結果存儲在存儲器或寄存器中,以供后續指令使用或輸出到外部設備。
7.更新程序計數器:CPU根據指令的執行情況更新程序計數器的值,以指示下一條要執行的指令的地址。
8.重復執行:重復執行第2步到第7步,直到程序的所有指令都被執行完畢。這樣,程序中的指令按照順序逐條執行,實現了整個程序的功能。