注:這里LZ是文章的作者 zuoxiaolong(左瀟龍)趋惨,本文摘自http://www.cnblogs.com/zuoxiaolong
本來LZ是打算好好研究一下JVM源碼的桅打,不過想來想去胡岔,LZ覺得應該先了解計算機系統(tǒng)的原理淹禾,再去研究JVM源碼的精妙。因此LZ決定潛下心來好好研究下計算機系統(tǒng)原理,這是一個漫長的過程,因為《深入理解計算機系統(tǒng)》這本書很厚裕偿,而且這種書一般看起來速度不會太快。因此LZ打算做好每一個階段的記錄痛单,有興趣的猿友可以跟著LZ一起看下嘿棘,了解計算機系統(tǒng)的運行原理其實是很有必要的。
計算機的組成
計算機是由硬件和軟件組成的旭绒,這兩個部分共同協(xié)作完成程序的運行鸟妙。這兩部分如何協(xié)作完成程序的運行,是本系列的重點挥吵。
信息的表示
信息的表示說到底就是位加上下文重父。舉個小例子,比如11011101這一串二進制忽匈,在表示整數(shù)的時候它表示221房午,但是如果放在JAVA的class文件當中,它可能代表一個JVM的指令脉幢。
程序的編譯
對于一個簡單的C語言程序來說歪沃,一般要經(jīng)過預處理器嗦锐、編譯器嫌松、匯編器和鏈接器的處理,才能被翻譯成一段可執(zhí)行的二進制文件奕污。
比如對于一個簡單的C語言程序萎羔,如下。
#include
int main(){
printf("hello,world\n");
}
我們保存在hello.c當中碳默,那么它的翻譯過程如下贾陷。
程序的運行
程序的運行由解釋器負責,它將逐個解釋最終生成的二進制文件并執(zhí)行嘱根。
計算機的硬件組成
首先髓废,我們來看下計算機中硬件的大致分布,如下圖该抒。
其中有幾個非常重要的部分慌洪,一一看下都是什么作用。
總線:貫穿整個系統(tǒng)的是一組電子管道(其實就是傳輸數(shù)據(jù)的線路),也就是總線冈爹∮抗ィ總線傳送的是字,字的大小與系統(tǒng)相關频伤,比如在32位操作系統(tǒng)當中恳谎,一個字是4個字節(jié)。
I/O設備:I/O設備是系統(tǒng)與外部聯(lián)系的通道憋肖。I/O設備(鍵盤因痛、鼠標、顯示器等)由控制器(USB控制器)或者適配器(圖形適配器岸更,也就是顯卡)與I/O總線相連婚肆,兩者的區(qū)別在于一個是主板上的芯片組,一個是主板插槽上的卡坐慰。
主存:它是計算機中的一個臨時存儲設備较性,在處理器執(zhí)行程序的時候,主存就是臨時存放數(shù)據(jù)的地方结胀。物理上來說赞咙,它是由動態(tài)隨即存取存儲器芯片組成,邏輯上來說糟港,它是一組連續(xù)的字節(jié)數(shù)組攀操,每一個字節(jié)都有唯一的地址。
處理器:全稱中央處理單元秸抚,是解釋存儲在主存中指令的引擎速和。處理器的核心是一個程序計數(shù)器,它在整個計算機運行的期間都會指向一個主存中的一個內存地址剥汤,而地址當中則是一個計算機指令颠放。處理器所做的,就是不停的執(zhí)行程序計數(shù)器所指向的每一條指令吭敢。處理器所做的操作是圍繞主存碰凶、寄存器文件以及算術/邏輯單元進行的,這里面處理器做的最多的動作就是加載(從主存將數(shù)據(jù)復制到寄存器)鹿驼、存儲(從寄存器將數(shù)據(jù)復制到主存)欲低、操作(將兩個寄存器的內容復制到算術/邏輯單元進行操作,結果會再次復制到寄存器)以及跳轉(改變程序計數(shù)器當中的內容)畜晰。
處理器當中提到的是指令集結構砾莱,不過實際當中指令集的實現(xiàn)是非常復雜的,這么做的目的是為了加速CPU的運算速度凄鼻。我們可以這樣去區(qū)分指令集機構以及微體系結構腊瑟,指令集結構是指令集的抽象描述面哼,而微體系結構則是這個抽象描述的某一個具體實現(xiàn),類似于JAVA虛擬機與JAVA虛擬機實現(xiàn)的關系扫步。
本章小結
計算機是由軟件與硬件組成的魔策,而硬件又包括了總線、I/O設備河胎、主存以及處理器闯袒,其中信息是由位以及上下文表示的,而信息則是從I/O設備以位的形式通過總線進入主存游岳,然后由處理器從主存將信息取出處理政敢。
一個程序的執(zhí)行,是經(jīng)歷了預處理器胚迫、編譯器喷户、匯編器以及鏈接器的處理之后,才最終成為可執(zhí)行的文件访锻。當程序成為可執(zhí)行文件時就已經(jīng)保存在了磁盤上褪尝,具體的執(zhí)行過程在下一章再總結。