计算机原理之程序是怎么运行的
計算機的組成
????? 計算機是由硬件和軟件組成的,這兩個部分共同協作完成程序的運行。這兩部分如何協作完成程序的運行,是本系列的重點。
?
信息的表示
????? 信息的表示說到底就是位加上下文。舉個小例子,比如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設備以位的形式通過總線進入主存,然后由處理器從主存將信息取出處理。
?????? 一個程序的執行,是經歷了預處理器、編譯器、匯編器以及鏈接器的處理之后,才最終成為可執行的文件。當程序成為可執行文件時就已經保存在了磁盤上,具體的執行過程在下一章再總結。
?
Hello world的執行
?????? 我們以linux系統為例,當我們執行一個簡單的打印字符串的C程序時,我們需要在命令行輸入./hello以及回車去執行該程序。在整個執行過程中,計算機主要做了三件事,或者說經歷了三個階段來完成程序的運行。
?
1、linux的外殼掃描用戶輸入的字符
?????? 當我們在鍵盤輸入./hello時,linux的外殼程序(也就是命令行)會掃描我們輸入的字符,將這些字符一一讀入到寄存器當中,然后再一一放入主存。換句話說,./hello這幾個字符是經過了CPU中的寄存器從而到達了主存。下面LZ將這一過程的圖示畫出來。
?
2、加載hello文件的代碼以及數據到主存
?????? 這一過程的觸發是在我們按下回車的那一刻,此時系統會將存儲在磁盤上的hello文件加載到主存,而此過程會利用一種叫做存儲器存取的技術,使得數據不通過寄存器直接到達主存。下圖是這一過程的圖示。
?
?
3、根據主存中代碼的指令執行程序
?????? 在代碼以及程序所需要的數據加載到主存后,CPU就開始從main函數的起始位置,依次執行代碼中的指令。由于我們的代碼只是簡單的輸出“hello world”這樣的字符串,因此系統只是將這個字符串依次加載到寄存器,然后傳輸到顯示器終端顯示。這個過程如下圖。
?
總結?:本章只是簡單的介紹了一下hello程序的執行過程,我們可以簡單的這么理解,hello程序的執行,其實就是將數據和代碼加載到主存,并由CPU從主存獲取指令從而執行的過程。
?
原文鏈接:http://www.cnblogs.com/zuoxiaolong/archive/2013/09/20/computer1.html
總結
以上是生活随笔為你收集整理的计算机原理之程序是怎么运行的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gcc交叉编译的实现
- 下一篇: 指令和数据都用二进制代码存放在内存中,从