計算機的組成html
計算機是由硬件和軟件組成的,這兩個部分共同協做完成程序的運行。這兩部分如何協做完成程序的運行,是本系列的重點。linux
信息的表示數組
信息的表示說到底就是位加上下文。舉個小例子,好比11011101這一串二進制,在表示整數的時候它表示221,可是若是放在JAVA的class文件當中,它可能表明一個JVM的指令。ide
程序的編譯函數
對於一個簡單的C語言程序來講,通常要通過預處理器、編譯器、彙編器和連接器的處理,才能被翻譯成一段可執行的二進制文件。spa
好比對於一個簡單的C語言程序,以下。操作系統
#include <stdio.h>int main() { printf("hello,world\n"); }
咱們保存在hello.c當中,那麼它的翻譯過程以下。命令行
程序的運行 翻譯
程序的運行由解釋器負責,它將逐個解釋最終生成的二進制文件並執行。orm
計算機的硬件組成
首先,咱們來看下計算機中硬件的大體分佈,以下圖。
其中有幾個很是重要的部分,一一看下都是什麼做用。
總線:貫穿整個系統的是一組電子管道(其實就是傳輸數據的線路),也就是總線。總線傳送的是字,字的大小與系統相關,好比在32位操做系統當中,一個字是4個字節。
I/O設備:I/O設備是系統與外部聯繫的通道。I/O設備(鍵盤、鼠標、顯示器等)由控制器(USB控制器)或者適配器(圖形適配器,也就是顯卡)與I/O總線相連,二者的區別在於一個是主板上的芯片組,一個是主板插槽上的卡。
主存:它是計算機中的一個臨時存儲設備,在處理器執行程序的時候,主存就是臨時存放數據的地方。物理上來講,它是由動態隨即存取存儲器芯片組成,邏輯上來講,它是一組連續的字節數組,每個字節都有惟一的地址。
處理器:全稱中央處理單元,是解釋存儲在主存中指令的引擎。處理器的核心是一個程序計數器,它在整個計算機運行的期間都會指向一個主存中的一個內存地址,而地址當中則是一個計算機指令。處理器所作的,就是不停的執行程序計數器所指向的每一條指令。處理器所作的操做是圍繞主存、寄存器文件以及算術/邏輯單元進行的,這裏面處理器作的最多的動做就是加載(從主存將數據複製到寄存器)、存儲(從寄存器將數據複製到主存)、操做(將兩個寄存器的內容複製到算術/邏輯單元進行操做,結果會再次複製到寄存器)以及跳轉(改變程序計數器當中的內容)。
處理器當中提到的是指令集結構,不過實際當中指令集的實現是很是複雜的,這麼作的目的是爲了加速CPU的運算速度。咱們能夠這樣去區分指令集機構以及微體系結構,指令集結構是指令集的抽象描述,而微體系結構則是這個抽象描述的某一個具體實現,相似於JAVA虛擬機與JAVA虛擬機實現的關係。
總結 :計算機是由軟件與硬件組成的,而硬件又包括了總線、I/O設備、主存以及處理器,其中信息是由位以及上下文表示的,而信息則是從I/O設備以位的形式經過總線進入主存,而後由處理器從主存將信息取出處理。
一個程序的執行,是經歷了預處理器、編譯器、彙編器以及連接器的處理以後,才最終成爲可執行的文件。當程序成爲可執行文件時就已經保存在了磁盤上,具體的執行過程在下一章再總結。
Hello world的執行
咱們以linux系統爲例,當咱們執行一個簡單的打印字符串的C程序時,咱們須要在命令行輸入./hello以及回車去執行該程序。在整個執行過程當中,計算機主要作了三件事,或者說經歷了三個階段來完成程序的運行。
一、linux的外殼掃描用戶輸入的字符
當咱們在鍵盤輸入./hello時,linux的外殼程序(也就是命令行)會掃描咱們輸入的字符,將這些字符一一讀入到寄存器當中,而後再一一放入主存。換句話說,./hello這幾個字符是通過了CPU中的寄存器從而到達了主存。下面LZ將這一過程的圖示畫出來。
二、加載hello文件的代碼以及數據到主存
這一過程的觸發是在咱們按下回車的那一刻,此時系統會將存儲在磁盤上的hello文件加載到主存,而此過程會利用一種叫作存儲器存取的技術,使得數據不經過寄存器直接到達主存。下圖是這一過程的圖示。
三、根據主存中代碼的指令執行程序
在代碼以及程序所須要的數據加載到主存後,CPU就開始從main函數的起始位置,依次執行代碼中的指令。因爲咱們的代碼只是簡單的輸出「hello world」這樣的字符串,所以系統只是將這個字符串依次加載到寄存器,而後傳輸到顯示器終端顯示。這個過程以下圖。
總結 :本章只是簡單的介紹了一下hello程序的執行過程,咱們能夠簡單的這麼理解,hello程序的執行,其實就是將數據和代碼加載到主存,並由CPU從主存獲取指令從而執行的過程。
原文連接:http://www.cnblogs.com/zuoxiaolong/archive/2013/09/20/computer1.html