日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

计算机程序是怎样运行的-hello world程序运行原理

發(fā)布時(shí)間:2025/3/21 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算机程序是怎样运行的-hello world程序运行原理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

關(guān)于《深入理解計(jì)算機(jī)系統(tǒng)

“這本書的中譯名為深入理解計(jì)算機(jī)系統(tǒng),我非常,十分,以及百分之一百二十地不滿意。我這么說(shuō)的原因在于這個(gè)譯法完全扭曲了書的本意。如果直譯原書名,應(yīng)該是類似于以程序員的視角理解計(jì)算機(jī)系統(tǒng),何來(lái)深入二字??赡茉趪?guó)內(nèi)編輯看來(lái),這是講系統(tǒng)的,用C和匯編語(yǔ)言的,因此很深入,但我認(rèn)為這只能說(shuō)明國(guó)內(nèi)技術(shù)氛圍的淺薄。因?yàn)槭聦?shí)上,這是一本入門級(jí)別的書,這本書其實(shí)并不深入,它談?wù)摰膬?nèi)容還是相對(duì)比較淺的。但不代表淺薄,寫一本面向初學(xué)者的好書往往是非常困難的,因此無(wú)論是SICP還是CSAPP,它的作者都是頂尖學(xué)府的教授,結(jié)合多年教學(xué)經(jīng)驗(yàn)而寫出來(lái)的。

CMU把這本書作為“Introduction?to?Computer?System”課程的教材,是面向計(jì)算機(jī)專業(yè)低年級(jí)學(xué)生的計(jì)算機(jī)系統(tǒng)介紹(導(dǎo)論),可能這些學(xué)生只是剛剛了解如何使用一門高級(jí)語(yǔ)言——Java進(jìn)行編程,對(duì)于計(jì)算機(jī)系統(tǒng)的工作方式等話題可謂一點(diǎn)都沒(méi)有接觸過(guò),而CSAPP對(duì)讀者的背景也只要求是一些編程經(jīng)驗(yàn)而已。這本書的話題覆蓋面很廣,從計(jì)算機(jī)的基本組成,二進(jìn)制數(shù)據(jù)表示方式,到機(jī)器級(jí)別的指令,CPU工作方式,存儲(chǔ)結(jié)構(gòu)和優(yōu)化,操作系統(tǒng)的虛擬內(nèi)存管理,程序運(yùn)行方式,I/O,網(wǎng)絡(luò)、到(較底層)程序性能優(yōu)化和并行程序開(kāi)發(fā)等等。所以,它其實(shí)覆蓋了計(jì)算機(jī)組成原理操作系統(tǒng)等許多課程的內(nèi)容,其中的許多話題都能再次展開(kāi),繼續(xù)深入,都能再變成一本,甚至N本經(jīng)典。事實(shí)上,在高年級(jí)的計(jì)算機(jī)專業(yè)課程設(shè)置中,都會(huì)有更加縱向的內(nèi)容出現(xiàn)。” ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ——摘自Jeffrey?Zhao博文

老趙的這一番話,深深的觸動(dòng)了我,確實(shí),這本書用怎么說(shuō)呢,并不是深入,而是涉及的知識(shí)比較廣,但又都是廣大程序猿不得不知道的知識(shí),下面我們就來(lái)慢慢品嘗這本書吧。工作之余,學(xué)習(xí)學(xué)習(xí),總是好的。言歸正傳,接下來(lái),享讀《Computer?Systems:?A?Programmer’s?Perspective》的中hello world程序都干了些啥。

?

1.信息在計(jì)算機(jī)的中表示

當(dāng)我們輸入以下程序,編譯運(yùn)行,計(jì)算機(jī)從屏幕輸出hello,?world。整個(gè)過(guò)程計(jì)算機(jī)都怎么運(yùn)作的呢?

#include?<stdio.h>

int?main()

{

printf("hello,?world\n");

}

我們知道,信息在計(jì)算機(jī)中都是用01表示的。計(jì)算機(jī)通過(guò)這些位信息以及上下文來(lái)解讀這些0/1。也即:計(jì)算機(jī)中的信息=+上下文。

我們輸入的hello程序就是由0、1組成的序列,將這些位8位組織成一個(gè)字節(jié),每個(gè)字節(jié)用來(lái)表示一個(gè)文本字符。ASCII碼給出了一種字符與數(shù)字的一一對(duì)應(yīng)關(guān)系。

hello,?world程序以字節(jié)方式存放于文件中,如下圖所示。其每個(gè)字符對(duì)應(yīng)一個(gè)數(shù)字,具體可參考ASCII碼表。

1?Hello?world程序的ASCII碼表示

2.將程序翻譯成機(jī)器可讀的格式

因?yàn)槲覀冚斎氲膆ello,?world程序是人可讀的,機(jī)器并不能直接識(shí)別它們。我們需要把這些文字翻譯成機(jī)器可執(zhí)行的二進(jìn)制文件。這一部分的工作是由編譯系統(tǒng)完成的。編譯系統(tǒng)由預(yù)處理器、編譯器、匯編器、連接器四部分組成。以hello,?world程序?yàn)槔?#xff0c;各部分共同完成將源文件編譯成二進(jìn)制可執(zhí)行文件。各個(gè)部分完成的具體工作如下:

l?預(yù)處理器:根據(jù)以#開(kāi)頭的命令,修改源程序。如根據(jù)#include?<stdio.h>行,預(yù)處理器讀取系統(tǒng)頭文件stdio.h中的內(nèi)容,代替此行內(nèi)容。源程序經(jīng)過(guò)預(yù)處理后,得到另一個(gè)c程序,此程序通常以.i為后綴保存。

l?編譯器:將預(yù)處理后的.i文件轉(zhuǎn)換成匯編程序。編譯器將不同的高級(jí)語(yǔ)言(c語(yǔ)言,C++語(yǔ)言)轉(zhuǎn)換成嚴(yán)格一致的匯編語(yǔ)言格式進(jìn)行輸出。匯編語(yǔ)言以標(biāo)準(zhǔn)的文本格式確切的描述每機(jī)器語(yǔ)言指令。編譯器得到的文件通常以.s為后綴保存。

l?匯編器:將匯編語(yǔ)言(.s文件)翻譯成機(jī)器語(yǔ)言指令,并將這些指令打包成一種可定位目標(biāo)程序格式。匯編后得到的文件即為二進(jìn)制文件,通常以.o為后綴。

l?鏈接器:hello,?world程序中調(diào)用過(guò)printf函數(shù),它是一個(gè)c標(biāo)準(zhǔn)庫(kù)里的函數(shù)。Printf函數(shù)存放在一個(gè)名為printf.o的單獨(dú)預(yù)編譯的文件中。而這個(gè)文件必須以適當(dāng)?shù)姆绞讲⑷氲轿覀兊某绦蛑?#xff0c;這個(gè)工作由鏈接器完成。將外部的.o文件并入后,得到一個(gè)完整的hello,?world可執(zhí)行文件??蓤?zhí)行文件加載到存儲(chǔ)器后,由系統(tǒng)復(fù)制執(zhí)行。

2?編譯系統(tǒng)

linux系統(tǒng)上,輸入編譯命令行:

Viidiot>gcc?hello.c?-o?hello

將執(zhí)行上圖所示的四個(gè)步驟,得到可執(zhí)行二進(jìn)制文件hello

3.處理器讀取并解釋存儲(chǔ)在存儲(chǔ)器中的指令

Shell:命令行解釋器,為用戶提供了一只與系統(tǒng)打交道的方式。它等待用戶的輸入,當(dāng)用戶輸入一行命令后,shell先判斷它是不是一個(gè)shell內(nèi)置命令,如果不是,shell會(huì)假定用戶輸入為一個(gè)可執(zhí)行文件的名字,從而去加載并執(zhí)行該文件。因此,當(dāng)我們通過(guò)編譯系統(tǒng)將源文件編譯成可執(zhí)行二進(jìn)制文件后,在shell中輸入我們得到的可執(zhí)行二進(jìn)制文件名,shell將其從磁盤中加載到存儲(chǔ)器(注:我們的可執(zhí)行文件是存放在磁盤上的),并通過(guò)處理器進(jìn)行解釋執(zhí)行,得到最終的結(jié)果,輸出到終端(顯示器)上進(jìn)行顯示。自此,我們的hello,?world程序完成了其生命周期。

4.計(jì)算機(jī)系統(tǒng)硬件結(jié)構(gòu)

為了弄清楚hello,?world運(yùn)行時(shí),系統(tǒng)究竟發(fā)生了什么,我們先來(lái)了解下一個(gè)典型的計(jì)算機(jī)硬件結(jié)構(gòu)。

圖3?典型的計(jì)算機(jī)硬件構(gòu)成

CPU:中央處理器???ALU:算術(shù)/邏輯運(yùn)算單元??PC:程序計(jì)數(shù)器??USB:統(tǒng)一串行接口】

?

下面簡(jiǎn)單說(shuō)一下各個(gè)部件在系統(tǒng)中所起的作用。

總線:在各個(gè)部件之間傳輸數(shù)據(jù)?,F(xiàn)在的總線寬度一般為32位或者64位,即一次傳輸?shù)臄?shù)據(jù)為4字節(jié)或者8字節(jié)。

I/O設(shè)備:IO設(shè)備是系統(tǒng)與外界通信的通道,如鼠標(biāo),鍵盤,顯示器都是典型的IO設(shè)備。

主存儲(chǔ)器:簡(jiǎn)稱主存,是處理器執(zhí)行程序時(shí)用于臨時(shí)存放程序及其數(shù)據(jù)。主存由一組動(dòng)態(tài)隨機(jī)存儲(chǔ)器芯片組成。

處理器:解釋執(zhí)行存儲(chǔ)在主存中的指令。其內(nèi)部包含一個(gè)雙字節(jié)程序計(jì)數(shù)器(PC),任何時(shí)候PC中都存放著接下來(lái)要執(zhí)行的機(jī)器指令在主存中的地址。

處理器的操作主要是圍繞PCALU、主存來(lái)進(jìn)行運(yùn)作的。處理器首先從PC所指向的主存存儲(chǔ)單元讀取指令,解釋指令中的位,執(zhí)行該指令指示的簡(jiǎn)單操作,然后更新PC寄存器,使其指向下一條要執(zhí)行的指令。CPU會(huì)執(zhí)行的操作有:

加載:把一個(gè)字節(jié)或一個(gè)字從主存復(fù)制到寄存器,覆蓋掉寄存器中原來(lái)的值。

存儲(chǔ):把一個(gè)字節(jié)或一個(gè)從寄存器復(fù)制到主存,并覆蓋主存中原來(lái)的值。

操作:把兩個(gè)寄存器的內(nèi)容復(fù)制到ALUALU對(duì)兩個(gè)字做算術(shù)運(yùn)算后存回其中的一個(gè)寄存器,該寄存器中原來(lái)的值會(huì)被覆蓋。

跳轉(zhuǎn):從cpu執(zhí)行的指令抽取一個(gè)字的內(nèi)容存入PC,覆蓋掉原來(lái)的值,從而改變下一條要執(zhí)行的指令,達(dá)到跳轉(zhuǎn)的目的。

在了解了一些基本的硬件結(jié)構(gòu),以及各個(gè)部分的作用后,我們?cè)賮?lái)看看之前的hello,?world程序的運(yùn)行過(guò)程。

圖4?加載可執(zhí)行文件到主存的過(guò)程

linux系統(tǒng)下,我們?cè)?/span>shell中敲入以下命令

Viidiot>./hello

由于shell沒(méi)有內(nèi)置hello命令,因此shell將我們輸入的hello視為一個(gè)可執(zhí)行文件,從而通過(guò)執(zhí)行一系列機(jī)器指令,將可執(zhí)行文件hello從磁盤復(fù)制到主存,如圖4所示。

注意,如果通過(guò)DMA方式加載程序,則不需要通過(guò)CPU,而是將hello可執(zhí)行文件直接從磁盤復(fù)制到主存,示意圖如圖5

圖5?DMA方式加載程序到主存

?

可執(zhí)行程序加載到主存后,cpu就執(zhí)行hello程序的機(jī)器指令,而這些指令完成的工作便是將”hello,world\n”這幾個(gè)字符從主存中復(fù)制寄存器文件中(register?file),再將其從寄存寄文件中復(fù)制到顯示設(shè)備上進(jìn)行顯示。過(guò)程示意圖如圖6所示。

圖6??cpu執(zhí)行指令,將?“helloworld\n”從內(nèi)存復(fù)制到顯示設(shè)備

至此,helloworld程序的執(zhí)行過(guò)程已經(jīng)完成。

題外話:

從上面的程序?qū)嵗覀兛梢钥吹?#xff0c;程序花費(fèi)了大量的時(shí)間將數(shù)據(jù)從一個(gè)部件復(fù)制到另外一個(gè)部件。程序加載時(shí),將hello程序的機(jī)器指令從磁盤復(fù)制到主存,程序運(yùn)行時(shí),又將其從主存復(fù)制到cpu,最后又從cpu復(fù)制到外部顯示器。將根據(jù)機(jī)械原理,大容量的存儲(chǔ)設(shè)備速度比小容量存儲(chǔ)設(shè)備慢,快速設(shè)備的造價(jià)比慢速設(shè)備的造價(jià)高。對(duì)于計(jì)算機(jī)硬件系統(tǒng),CPU的速度遠(yuǎn)高于主存的速度,而主存的速度遠(yuǎn)高于磁盤,不同部件的速度嚴(yán)重不對(duì)等,從而快的設(shè)備的性能沒(méi)能得到充分發(fā)揮。為解決各類設(shè)備速度不匹配的問(wèn)題,引入了高速緩存設(shè)備來(lái)緩解速度匹配問(wèn)題。如圖7所示,為加入了高速緩存后的系統(tǒng)部分結(jié)構(gòu)。

7?高速緩存存儲(chǔ)器

現(xiàn)代計(jì)算機(jī)為提高系統(tǒng)性能,一般都加入了多級(jí)緩存結(jié)構(gòu)。高速緩存采樣的是靜態(tài)隨機(jī)存儲(chǔ)器硬件(SRAM)技術(shù),速度快于主存(采樣動(dòng)態(tài)隨機(jī)存儲(chǔ)器技術(shù))。如圖8是存儲(chǔ)器結(jié)構(gòu)金字塔,越往上速度越快,造價(jià)也更昂貴。

圖8?存儲(chǔ)器金字塔

作者:Viidiot(阿呆)? 轉(zhuǎn)載請(qǐng)保留作者及鏈接

總結(jié)

以上是生活随笔為你收集整理的计算机程序是怎样运行的-hello world程序运行原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。