計算機系統之一計算機系統漫遊

 

做爲一個程序員,若是深刻了解這些組件是如何工做的,以及這些組件是如何影響程序的正確性和性能的,以此來提升本身的技能,能夠推薦<深刻理解計算機系統>這本書,本系列也是做者在參讀了這本書後的一些我的理解和對概念的認識,也能夠當作個人我的筆記,但願對你有所幫助html

 

代碼無國界node

 

計算機系統是由硬件和軟件組成的,他們共同工做來運行應用程序.雖然系統的具體實現方式隨着時間的變化而變化,可是系統內在的概念卻沒有改變.全部的計算機系統否有相似的硬件和軟件組件,並且都執行這類似的功能.程序員

1 #include <stdio.h>
2 int main () {
3   printf("hello world");  
4 }

這是一段c語言的源程序(源文件),在這裏命名爲hello.cshell

 

源程序實際上就是由值0和1組成的位(bit)序列,8個位被組織成一組,成爲字節.   而每一個字節表示程序中某個文本字符windows

大部分的現代系統都使用ASCII標準來表示文本字符,這中方式實際上就是用一個惟一的單字節大小的整數值來表示每一個字符,數組

做爲一個Java程序員天天接觸最多的就是UTF-8 ,一開始也會迷糊,爲了更好的理解他們之間的關係,推薦幾篇博客:網絡

ASCII、Unicode、GBK和UTF-8字符編碼的區別聯繫  性能

ASCII,Unicode和UTF-8編碼

 hello.c程序以字節的方式存儲在文件中.每一個字節都有一個整數值,而這個整數值則對應某個字符,spa

\如,第一個字節整數是35,ASCII標準中他對應的字符是"#",以此類推

像hello.c這樣只有ASCII字符構成的文件成爲文本文件,而其餘文件稱爲二進制文件

hello.c表達了一個基本思想-->系統中的全部信息(磁盤文件,存儲器中的程序和用戶的數據,網絡下載上傳的數據)都是由一串位表示

區分不一樣的數據對象的惟一方法就是咱們讀到這些數據對象時的上下文.  在不一樣上下文中,一個一樣的字節序列多是一個整數,浮點數,機器指令等等..  

關於這個上下文具體是什麼樣子的,下面系類會繼續跟進,先保留點懸念,嘿嘿....

 

接下類將hello.c源程序用編譯系統翻譯成可執行的目標文件hello,存入磁盤,可使用shell(外殼)將文件名輸入進去執行.

其實這個使用shell執行文件可能你們並不陌生,跟windows系統下的dos差很少,

瞭解nodejs的朋友可能知道,在windows下打開cmd,輸入node回車,而後寫入console.log("Holleworld")回車就會執行並打印出"hello world"同樣的

那麼什麼是shell呢,shell是一個命令行解釋器,他輸出一個提示符,等待輸入一個命令行,而後執行這個命令行

好比,在windows下輸入tasklist /svc 打印出正在執行的程序列表

 

 

講了這麼多,下面來點硬件知識的乾貨

系統硬件的組成

 

 1.總線

貫穿整個系統的是一組電子管道,稱做總線,他攜帶信息字節並負責在各個部件間傳遞

一般總線被設計成傳送定長字節塊,也就是字(word).

字中的字節數(即字長)是一個基本的系統參數,在各個系統中的狀況都不盡相同.如今大多數機器字長有4個字節(32位),有8個字節(64位)

2.I/O設備

輸入/輸出(I/O)設備是系統與外部世界的聯繫通道.個人圖例系統中的I/O設備:

用戶輸入設備-->鼠標鍵盤;

用戶輸出設備-->顯示器;

長期存儲數據和程序的磁盤驅動設備;

每一個I/O設備都有一個控制器或者適配器I/O總線相連,而控制器和適配器之間的主要區別在於他們的封裝方式不一樣

控制器是置於I/O設備自己的或者系統的主印製電路板(一般成爲主板上的芯片組)

適配器則是一塊插在主板插槽上的卡

不管如何他們的功能都是在I/O總線和I/O設備之間傳遞信息

3.主存

主存是一個臨時存儲設備,又叫主存儲器,他由存儲體,控制線路,地址寄存器,數據寄存器,地址譯碼電路5個部分組成;做用是用來存放程序和程序處理的數據;通俗的來說,你也能夠把他理解爲內存,有了他,計算機纔有了記憶

物理上來說,主存是由一組 動態隨機存取存儲器(DRAM)芯片組成;從邏輯上來說,存儲器是一個線性的字節數組,每一個字節都有其惟一的地址(即數組索引),這些地址是由零開始的,通常來講,組成程序的每條機器指令都由不一樣數量的字節構成

 

4.處理器

中央處理單元(CPU),簡稱處理器,是解釋(或執行)存儲在主存中指令的引擎.

處理器的核心是一個字長的存儲設備(或寄存器),成爲程序計數器(PC),在任什麼時候刻,PC都指向主存中的某條機器語言指令(即含有該條指令的地址)

從系統通電到斷電,處理器一直在不斷的執行程序計數器的指令,再更新程序計數器,使其指向下一個指令;處理器看上去是按照一個很是簡單的指令執行模型來操做的,這個模型是由指令集結構決定的;在這個模型中,指令按照嚴格的順序執行,而執行一條指令包含執行一系列的步驟.處理器從PC指向的存儲器處讀取指令,解釋指令中的位,執行指令指示的簡單操做,而後更新PC,使其指向下一個指令,而這個指令並不必定與存儲器中剛剛執行的指令相鄰

這樣的簡單操做並很少,並且操做都是圍繞主存,寄存器文件和算數/邏輯單元(一下簡稱ALU)執行的

寄存器文件是一個小的存儲設備,由一些1字長的寄存器組成,每一個寄存器都有惟一的名字

ALU計算新的數據和地址值,下面舉個簡單的例子,CPU在指令的要求下可能執行一下操做:

加載:把一個字節或者一個字從主存複製到寄存器,以覆蓋寄存器原來的內容

存儲:把一個字節或者一個字從寄存器複製到主存的某個位置,以覆蓋這個位置上原有的內容

操做:把兩個寄存器的內容複製到ALU,ALU對這兩個字作算數操做,並將結果存放到一個寄存器中,以以覆蓋寄存器原有的內容

跳轉:從指令自己抽取一個字,並將這個字複製到程序計數器中(PC),以覆蓋PC中原有的值

 

處理器看上去只是他的指令集結構的簡單實現,可是實際上如今的處理器使用了很是複雜的機制來加速程序的執行,所以能夠這樣區分指令集和微體系結構

指令集結構是描述每條機器代碼的指令的效果

爲體系結構描述的是處理器實際上如何實現的

 

如今跳回開始,在shell中執行hello文件

置於cpu內部運行細節,本身體會吧

相關文章
相關標籤/搜索