本來LZ是打算好好研究一下JVM源碼的,不過想來想去,LZ覺得應該先了解計算機系統的原理,再去研究JVM源碼的精妙。因此LZ決定潛下心來好好研究下計算機系統原理,這是一個漫長的過程,因為《深入理解計算機系統》這本書很厚,而且這種書一般看起來速度不會太快。因此LZ打算做好每一個階段的記錄,有興趣的猿友可以跟著LZ一起看下,了解計算機系統的運行原理其實是很有必要的。
計算機是由硬件和軟件組成的,這兩個部分共同協作完成程序的運行。這兩部分如何協作完成程序的運行,是本系列的重點。
信息的表示說到底就是位加上下文。舉個小例子,比如11011101這一串二進制,在表示整數的時候它表示221,但是如果放在JAVA的class文件當中,它可能代表一個JVM的指令。
對於一個簡單的C語言程序來說,一般要經過預處理器、編譯器、匯編器和鏈接器的處理,才能被翻譯成一段可執行的二進制文件。
比如對於一個簡單的C語言程序,如下。
#include <stdio.h> int main() { printf("hello,world\n"); }
我們保存在hello.c當中,那麼它的翻譯過程如下。
程序的運行由解釋器負責,它將逐個解釋最終生成的二進制文件並執行。
查看本欄目
首先,我們來看下計算機中硬件的大致分布,如下圖。
其中有幾個非常重要的部分,一一看下都是什麼作用。
總線:貫穿整個系統的是一組電子管道(其實就是傳輸數據的線路),也就是總線。總線傳送的是字,字的大小與系統相關,比如在32位操作系統當中,一個字是4個字節。
I/O設備:I/O設備是系統與外部聯系的通道。I/O設備(鍵盤、鼠標、顯示器等)由控制器(USB控制器)或者適配器(圖形適配器,也就是顯卡)與I/O總線相連,兩者的區別在於一個是主板上的芯片組,一個是主板插槽上的卡。
主存:它是計算機中的一個臨時存儲設備,在處理器執行程序的時候,主存就是臨時存放數據的地方。物理上來說,它是由動態隨即存取存儲器芯片組成,邏輯上來說,它是一組連續的字節數組,每一個字節都有唯一的地址。
處理器:全稱中央處理單元,是解釋存儲在主存中指令的引擎。處理器的核心是一個程序計數器,它在整個計算機運行的期間都會指向一個主存中的一個內存地址,而地址當中則是一個計算機指令。處理器所做的,就是不停的執行程序計數器所指向的每一條指令。處理器所做的操作是圍繞主存、寄存器文件以及算術/邏輯單元進行的,這裡面處理器做的最多的動作就是加載(從主存將數據復制到寄存器)、存儲(從寄存器將數據復制到主存)、操作(將兩個寄存器的內容復制到算術/邏輯單元進行操作,結果會再次復制到寄存器)以及跳轉(改變程序計數器當中的內容)。
處理器當中提到的是指令集結構,不過實際當中指令集的實現是非常復雜的,這麼做的目的是為了加速CPU的運算速度。我們可以這樣去區分指令集機構以及微體系結構,指令集結構是指令集的抽象描述,而微體系結構則是這個抽象描述的某一個具體實現,類似於JAVA虛擬機與JAVA虛擬機實現的關系。
計算機是由軟件與硬件組成的,而硬件又包括了總線、I/O設備、主存以及處理器,其中信息是由位以及上下文表示的,而信息則是從I/O設備以位的形式通過總線進入主存,然後由處理器從主存將信息取出處理。
一個程序的執行,是經歷了預處理器、編譯器、匯編器以及鏈接器的處理之後,才最終成為可執行的文件。當程序成為可執行文件時就已經保存在了磁盤上,具體的執行過程在下一章再總結。
作者:zuoxiaolong(左潇龍)
出處:博客園左潇龍的技術博客--http://www.cnblogs.com/zuoxiaolong