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