一文解析容易忽略的嵌入式基礎(chǔ)知識點_第1頁
一文解析容易忽略的嵌入式基礎(chǔ)知識點_第2頁
一文解析容易忽略的嵌入式基礎(chǔ)知識點_第3頁
一文解析容易忽略的嵌入式基礎(chǔ)知識點_第4頁
一文解析容易忽略的嵌入式基礎(chǔ)知識點_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

Word一文解析容易忽略的嵌入式基礎(chǔ)知識點為解決各種問題,人們發(fā)明了不計其數(shù)的機器。(嵌入式)設(shè)備種類繁多,從嵌入火星漫游(機器人)的計算機到為操縱核潛艇導(dǎo)航系統(tǒng)的系統(tǒng),不一而足。馮?諾伊曼在1945年提出第一種計算模型,無論筆記本(電腦)還是電話,幾乎所有計算機都遵循與這種模型相同的(工作原理)。那么你們了解計算機是如何工作的嗎?

本文將討論這些內(nèi)容:◎理解計算機體系結(jié)構(gòu)的基礎(chǔ)知識◎選擇編譯器將代碼轉(zhuǎn)換為計算機可以執(zhí)行的指令◎根據(jù)存儲器層次結(jié)構(gòu)提高數(shù)據(jù)的存儲速度畢竟,在非(程序員)看來,(編程)要像魔法一樣神奇,我們程序員不會這么看。

體系結(jié)構(gòu)

計算機是一種根據(jù)指令操作數(shù)據(jù)的機器,主要由處理器與存儲器兩部分組成。存儲器又稱(RAM)(隨機存取存儲器),用于存儲指令以及需要操作的數(shù)據(jù)。處理器又稱(CPU)(中央處理器),它從存儲器獲取指令與數(shù)據(jù),并執(zhí)行相應(yīng)的計算。接下來,我們將討論這兩部分的工作原理。

存儲器

存儲器被劃分為許多單元,每個單元存儲少量數(shù)據(jù),通過一個數(shù)字地址加以標(biāo)識。在存儲器中讀取或?qū)懭霐?shù)據(jù)時,每次對一個單元進(jìn)行操作。為讀寫特定的存儲單元,必須找到該單元的數(shù)字地址。由于存儲器是一種(電氣)元件,單元地址作為二進(jìn)制數(shù)通過(信號)線傳輸。

二進(jìn)制數(shù)以2為基數(shù)表示,其工作原理如下:

每條信號線傳輸一個比特,以高電壓表示信號“1”,低電壓表示信號“0”,如圖7-1所示。

對于某個給定的單元地址,存儲器可以進(jìn)行兩種操作:獲取其值或存儲新值,如圖7-2所示。存儲器包括一條用于設(shè)置操作模式的特殊信號線。

每個存儲單元通常存儲一個8位二進(jìn)制數(shù),它稱為字節(jié)。設(shè)置為“讀”模式時,存儲器檢索保存在單元中的字節(jié),并通過8條數(shù)據(jù)傳輸線輸出,如圖7-3所示。

設(shè)置為“寫”模式時,存儲器從數(shù)據(jù)傳輸線獲取一個字節(jié),并將其寫入相應(yīng)的單元,如圖7-4所示。

傳輸相同數(shù)據(jù)的一組信號線稱為總線。用于傳輸?shù)刂返?條信號線構(gòu)成地址總線,用于在存儲單元之間傳輸數(shù)據(jù)的另外8條信號線構(gòu)成數(shù)據(jù)總線。地址總線是單向的(僅用于接收數(shù)據(jù)),而數(shù)據(jù)總線是雙向的(用于發(fā)送和接收數(shù)據(jù))。在所有計算機中,CPU與RAM無時無刻不在交換數(shù)據(jù):CPU不斷從RAM獲取指令與數(shù)據(jù),偶爾也會將輸出與部分計算存儲在RAM中,如圖7-5所示。

CPU

CPU包括若干稱為(寄存器)的內(nèi)部存儲單元,它能對存儲在這些寄存器中的數(shù)字執(zhí)行簡單的數(shù)學(xué)運算,也能在RAM與寄存器之間傳輸數(shù)據(jù)。可以指示CPU執(zhí)行以下典型的操作:◎?qū)?shù)據(jù)從存儲位置220復(fù)制到寄存器3;◎?qū)⒓拇嫫?與寄存器1中的數(shù)字相加。CPU可以執(zhí)行的所有操作的集合稱為指令集,指令集中的每項操作被分配一個數(shù)字。計算機代碼本質(zhì)上是表示CPU操作的數(shù)字序列,這些操作以數(shù)字的形式存儲在RAM中。輸入/輸出數(shù)據(jù)、部分計算以及計算機代碼都存儲在RAM中。

通過在RAM中包含重寫部分代碼的指令,代碼甚至可以對自身修改,這是計算機病毒逃避反病毒軟件(檢測)的慣用手法。與之類似,生物病毒通過改變自身的DNA以躲避宿主免疫系統(tǒng)的打擊。

圖7-6取自(Intel)4004操作手冊,顯示了部分CPU指令映射為數(shù)字的方法。隨著制造工藝的發(fā)展,CPU支持的操作越來越多?,F(xiàn)代CPU的指令集極為龐大,但最重要的指令在幾十年前就已存在。

CPU的運行永無休止,它不斷從存儲器獲取并執(zhí)行指令。這個周期的核心是PC寄存器,PC(programcoun(te)r)是“程序計數(shù)器”的簡稱。PC是一種特殊的寄存器,用于保存下一條待執(zhí)行指令的存儲地址。CPU的工作流程如下:(1)從PC指定的存儲地址獲取指令;(2)PC自增;(3)執(zhí)行指令;(4)返回步驟1。PC在CPU上電時復(fù)位為默認(rèn)值,它是計算機中第一條待執(zhí)行指令的地址。這條指令通常是一種不可變的內(nèi)置程序,用于加載計算機的基本功能。

在許多個人計算機中,這種程序稱為B(IOS)(基本輸入輸出系統(tǒng))。

CPU上電后將繼續(xù)執(zhí)行這種“獲取-執(zhí)行”周期直至關(guān)機。然而,如果CPU只能遵循有序、順序的操作列表,那么它與一個花哨的計算器并無二致。CPU的神奇之處在于可以指示它向PC中寫入新值,從而實現(xiàn)執(zhí)行過程的分支,或“跳轉(zhuǎn)”到存儲器的其他位置。這種分支可以是有條件的。以下面這條CPU指令為例:“如果寄存器1等于0,將PC設(shè)置為地址200”。該指令相當(dāng)于:

ifx=0compute_this()elsecompute_that()僅此而已。無論是打開網(wǎng)站、玩計算機游戲抑或編輯(電子)表格,所涉及的計算并無區(qū)別,都是一系列只能對存儲器中的數(shù)據(jù)求和、比較或移動的簡單操作。大量簡單的操作組合在一起,就能表達(dá)復(fù)雜的過程。以經(jīng)典的《太空侵略者》游戲為例,其代碼包括大約3000條機器指令。CPU(時鐘)早在20世紀(jì)80年代,《太空侵略者》就已風(fēng)靡一時。這個游戲在配備2MHzCPU的街機上運行?!?MHz”表示CPU的時鐘,即CPU每秒可以執(zhí)行的基本操作數(shù)。時鐘頻率為200萬赫茲(2MHz)的CPU每秒大約可以執(zhí)行200萬次基本操作。完成一條機器指令需要5到10次基本操作,因此老式街機每秒能運行數(shù)十萬條機器指令。隨著現(xiàn)代(科技)的進(jìn)步,普通的臺式計算機與(智能手機)通常配備2GHzCPU,每秒可以執(zhí)行數(shù)億條機器指令。時至今日,多核CPU已投入大規(guī)模應(yīng)用,如四核2GHzCPU每秒能執(zhí)行近10億條機器指令。展望未來,CPU配備的核心數(shù)量或許會越來越多。CPU體系結(jié)構(gòu)讀者是否思考過,PlayStation的游戲CD為何無法在臺式計算機中運行?(iPhone)應(yīng)用為何無法在Mac中運行?原因很簡單,因為它們的CPU體系結(jié)構(gòu)不同。x86體系結(jié)構(gòu)如今已成為行業(yè)標(biāo)準(zhǔn),因此相同的代碼可以在大部分個人計算機中執(zhí)行。但考慮到節(jié)電的要求,(手機)采用的CPU體系結(jié)構(gòu)有所不同。不同的CPU體系結(jié)構(gòu)意味著不同的CPU指令集,也意味著將指令編碼為數(shù)字的方式各不相同。臺式計算機CPU的指令并非手機CPU的有效指令,反之亦然。32位與64位體系結(jié)構(gòu)第一種CPU是Intel4004,它采用4位體系架構(gòu)。換言之,這種CPU在一條機器指令中可以對最多4位二進(jìn)制數(shù)執(zhí)行求和、比較與移動操作。Intel4004的數(shù)據(jù)總線與地址總線均只有4條。不久之后,8位CPU開始廣為流行,這種CPU用于運行DOS的早期個人計算機。20世紀(jì)八九十年代,著名的便攜式游戲機GameBoy就采用8位處理器。這種CPU可以在一條指令中對8位二進(jìn)制數(shù)進(jìn)行操作。技術(shù)的快速發(fā)展使16位以及之后的32位體系結(jié)構(gòu)成為主導(dǎo)。CPU寄存器隨之增大,以容納32位數(shù)字。更大的寄存器自然催生出更大的數(shù)據(jù)總線與地址總線:具有32條信號線的地址總線可以對232字節(jié)(4GB)的內(nèi)存進(jìn)行尋址。人們對計算能力的渴求從未停止。計算機程序越來越復(fù)雜,消耗的內(nèi)存越來越多,4GB內(nèi)存已無法滿足需要。使用適合32位寄存器的數(shù)字地址對超過4GB內(nèi)存進(jìn)行尋址頗為棘手,這成為64位體系結(jié)構(gòu)興起的動因,這種體系結(jié)構(gòu)如今占據(jù)主導(dǎo)地位。64位CPU可以在一條指令中對極大的數(shù)字進(jìn)行操作,而64位寄存器將地址存儲在海量的存儲空間中:264字節(jié)相當(dāng)于超過170億吉字節(jié)(GB)。大端序與小端序一些計算機設(shè)計師認(rèn)為,應(yīng)按從左至右的順序在RAM與CPU中存儲數(shù)字,這種模式稱為小端序。另一些計算機設(shè)計師則傾向于按從右至左的順序在存儲器中寫入數(shù)據(jù),這種模式稱為大端序。因此,根據(jù)“字節(jié)序”的不同,二進(jìn)制序列1-0-0-0-0-0-1-1表示的數(shù)字也有所不同?!虼蠖诵颍?7+21+20=131◎小端序:20+26+27=193目前的大部分CPU采用小端序模式,但同樣存在許多采用大端序模式的計算機。如果大端序CPU需要解釋由小端序CPU產(chǎn)生的數(shù)據(jù),則必須采取措施以免出現(xiàn)字節(jié)序不匹配。程序員直接對二進(jìn)制數(shù)進(jìn)行操作,在解析來自(網(wǎng)絡(luò))(交換機)的數(shù)據(jù)時尤其需要注意這個問題。雖然目前多數(shù)計算機采用小端序模式,但由于大部分早期的網(wǎng)絡(luò)路由器使用大端序CPU,所以因特網(wǎng)流量仍然以大端序為基礎(chǔ)進(jìn)行標(biāo)準(zhǔn)化。以小端序模式讀取大端序數(shù)據(jù)時將出現(xiàn)亂碼,反之亦然。(模擬)器某些情況下,需要在計算機上運行某些為不同CPU設(shè)計的代碼,以便在沒有iPhone的情況下測試iPhone應(yīng)用,或玩膾炙人口的老式超級任天堂游戲。這是通過稱為模擬器的軟件來實現(xiàn)的。模擬器用于模仿目標(biāo)機器,它假定與其擁有相同的CPU、RAM以及其他硬件。模擬器程序?qū)χ噶钸M(jìn)行解碼,并在模擬機器中執(zhí)行??梢韵胍?,如果兩臺機器的體系結(jié)構(gòu)不同,那么在一臺機器內(nèi)部模擬另一臺機器絕非易事。好在現(xiàn)代計算機的速度遠(yuǎn)遠(yuǎn)超過之前的機器,因此模擬并非無法實現(xiàn)。我們可以利用GameBoy模擬器在計算機中創(chuàng)建一個虛擬的GameBoy,然后就能像使用實際的GameBoy那樣玩游戲。

編譯器

通過對計算機進(jìn)行編程,可以完成核磁共振成像、聲音識別、行星探索以及其他許多復(fù)雜的任務(wù)。值得注意的是,計算機執(zhí)行的所有操作最終都要通過簡單的CPU指令完成,即歸結(jié)為對數(shù)字的求和與比較。而Web瀏覽器等復(fù)雜的計算機程序需要數(shù)百萬乃至數(shù)十億條這樣的機器指令。但我們很少會直接使用CPU指令來編寫程序,也無法采用這種方式開發(fā)一個逼真的三維計算機游戲。為了以一種更“自然”且更緊湊的方式表達(dá)命令,人們創(chuàng)造了編程語言。我們使用這些語言編寫代碼,然后通過一種稱為編譯器的程序?qū)⒚钷D(zhuǎn)換為CPU可以執(zhí)行的機器指令。我們用一個簡單的數(shù)學(xué)類比來解釋編譯器的用途。假設(shè)我們向某人提問,要求他計算5的階乘。5!=?但如果回答者不了解什么是階乘,則這樣提問并無意義。我們必須采用更簡單的操作來重新表述問題。5×4×3×2×1=?不過,如果回答者只會做加法怎么辦?我們必須進(jìn)一步簡化問題的表述。5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5=?可以看到,表達(dá)計算的形式越簡單,所需的操作數(shù)量越多。計算機代碼同樣如此。編譯器將編程語言中的復(fù)雜指令轉(zhuǎn)換為等效的CPU指令。結(jié)合功能強大的外部庫,就能通過相對較少的幾行代碼表示包含數(shù)十億條CPU指令的復(fù)雜程序,而這些代碼易于理解和修改。計算機之父艾倫?圖靈發(fā)現(xiàn),簡單的機器有能力計算任何可計算的事物。如果機器具有通用的計算能力,那么它必須能遵循包含指令的程序,以便:◎?qū)Υ鎯ζ髦械臄?shù)據(jù)進(jìn)行讀寫;◎執(zhí)行條件分支:如果存儲地址具有給定的值,則跳轉(zhuǎn)到程序的另一個點。我們稱具有這種通用計算能力的機器是圖靈完備的。無論計算的復(fù)雜性或難度如何,都可以采用簡單的讀取/寫入/分支指令來表達(dá)。只要分配足夠的時間與存儲空間,這些指令就能計算任何事物。人們最近發(fā)現(xiàn),一種稱為MOV(數(shù)據(jù)傳送)的CPU指令是圖靈完備的。這意味著僅能執(zhí)行MOV指令的CPU與完整的CPU在功能上并無不同:換言之,通過MOV指令可以嚴(yán)格地表達(dá)任何類型的代碼。這個重要概念在于,無論簡單與否,如果程序能采用編程語言進(jìn)行編碼,就可以重寫后在任何圖靈完備的機器中運行。編譯器是一種神奇的程序,能自動將代碼從復(fù)雜的語言轉(zhuǎn)換為簡單的語言。

(操作系統(tǒng))

從本質(zhì)上講,編譯后的計算機程序是CPU指令的序列。如前所述,為臺式計算機編譯的代碼無法在(智能)手機中運行,因為二者采用不同的CPU體系結(jié)構(gòu)。不過,由于程序必須與計算機的操作系統(tǒng)(通信)才能運行,編譯后的程序也可能無法在共享相同CPU架構(gòu)的兩臺計算機中使用。為實現(xiàn)與外界的通信,程序必須進(jìn)行輸入與輸出操作,如打開文件、在屏幕上顯示消息、打開網(wǎng)絡(luò)連接等。但不同的計算機采用不同的(硬件),因此程序不可能直接支持所有不同類型的屏幕、聲卡或網(wǎng)卡。這就是程序依賴于操作系統(tǒng)執(zhí)行的原因所在。借助操作系統(tǒng)的幫助,程序可以毫不費力地使用不同的硬件。程序創(chuàng)建特殊的系統(tǒng)調(diào)用,請求操作系統(tǒng)執(zhí)行所需的輸入/輸出操作。編譯器負(fù)責(zé)將輸入/輸出命令轉(zhuǎn)換為合適的系統(tǒng)調(diào)用。然而,不同的操作系統(tǒng)往往使用互不兼容的系統(tǒng)調(diào)用。例如,與macOS或(Linux)相比,Windows在屏幕上打印信息所用的系統(tǒng)調(diào)用有所不同。因此,在使用x86處理器的Windows中編譯的程序,無法在使用x86處理器的Mac中運行。除針對特定的CPU體系結(jié)構(gòu)外,編譯后的代碼還會針對特定的操作系統(tǒng)。

編譯優(yōu)化

優(yōu)秀的編譯器致力于優(yōu)化它們生成的機器碼。如果編譯器認(rèn)為可以通過修改部分代碼來提高執(zhí)行效率,則會處理。在生成二進(jìn)制輸出之前,編譯器可能嘗試應(yīng)用數(shù)百條優(yōu)化規(guī)則。因此,應(yīng)使代碼易于閱讀以利于進(jìn)行微優(yōu)化。編譯器最終將完成所有細(xì)微的優(yōu)化。例如,一些人對以下代碼頗有微詞。

func(ti)onfactorial(n)

ifn》1

returnfactorial(n-1)*n

else

return1

他們認(rèn)為應(yīng)該進(jìn)行以下修改:

functionfactorial(n)

result←1

whilen》1

result←result*n

n←n-1

returnresult

誠然,在不使用遞歸的情況下執(zhí)行factorial函數(shù)將消耗較少的計算資源,但仍然沒有理由因此而改變代碼?,F(xiàn)代編譯器將自動重寫簡單的遞歸函數(shù),舉例如下。

i←x+y+1

j←x+y

為避免進(jìn)行兩次x+y計算,編譯器將上述代碼重寫為:

t1←x+y

i←t1+1

j←t1

應(yīng)專注于編寫清晰且自解釋的代碼。如果性能出現(xiàn)問題,可以利用分析工具尋找代碼中的瓶頸,并嘗試改用更好的方法計算存在問題的代碼。此外,避免在不必要的微操作上浪費太多時間。但在某些情況下,我們希望跳過編譯,接下來將對此進(jìn)行討論。

腳本語言

某些語言在執(zhí)行時并未被直接編譯為機器碼,這些語言稱為腳本語言,包括(Java)Script、(Python)以及Ruby。在腳本語言中,代碼由解釋器而非CPU執(zhí)行,解釋器必須安裝在運行代碼的機器中。解釋器實時轉(zhuǎn)譯并執(zhí)行代碼,因此其運行速度通常比編譯后的代碼慢得多。但另一方面,程序員隨時都能立即運行代碼而無須等待編譯過程。對于規(guī)模極大的項目,編譯可能耗時數(shù)小時之久。Google(工程師)必須不斷編譯大量代碼,導(dǎo)致程序員“損失”了很多時間(圖7-9)。由于需要保證編譯后的二進(jìn)制文件有更好的性能,Google無法切換到腳本語言。公司為此開發(fā)了Go語言,它的編譯速度極快,同時仍然保持很高的性能。

反(匯編)與逆向工程

給定一個已編譯的計算機程序,無法在編譯之前恢復(fù)其源代碼。但我們可以對二進(jìn)制程序解碼,將用于編碼CPU指令的數(shù)字轉(zhuǎn)換為人類可讀的指令序列。這個過程稱為反匯編。接下來,可以查看這些CPU指令,并嘗試分析它們的用途,這就是所謂的逆向工程。某些反匯編程序?qū)@一過程大有裨益,它們能自動檢測并解釋系統(tǒng)調(diào)用與常用函數(shù)。借由反匯編工具,(黑客)對二進(jìn)制代碼的各個環(huán)節(jié)了如指掌。我相信,許多頂尖的IT公司都設(shè)有秘密的逆向工程實驗室,以便研究競爭對手的軟件。地下黑客經(jīng)常分析Windows、Photoshop、《俠盜獵車手》等授權(quán)程序中的二進(jìn)制代碼,以確定哪部分代碼負(fù)責(zé)驗證軟件許可證。黑客將二進(jìn)制代碼修改,在其中加入一條指令,直接跳轉(zhuǎn)到驗證許可證后執(zhí)行的代碼部分。運行修改后的二進(jìn)制代碼時,它在檢查許可證前獲取注入的JUMP命令,從而可以在沒有付費的情況下運行非法的盜版副本。在秘密的政府情報機構(gòu)中,同樣設(shè)有供安全研究人員與工程師研究iOS、Windows、IE瀏覽器等流行消費者軟件的實驗室。他們尋找這些程序中可能存在的安全漏洞,以防御網(wǎng)絡(luò)攻擊或?qū)Ω邇r值目標(biāo)的入侵。在這類攻擊中,最知名的當(dāng)屬“震網(wǎng)”病毒,它是美國與以色列情報機構(gòu)研制的一種網(wǎng)絡(luò)武器。通過感染控制地下聚變反應(yīng)堆的計算機,“震網(wǎng)”延緩了伊朗核計劃。

開源軟件

如前所述,我們可以根據(jù)二進(jìn)制可執(zhí)行文件分析有關(guān)程序的原始指令,但無法恢復(fù)用于生成二進(jìn)制文件的原始源代碼。在沒有原始源代碼的情況下,即使可以稍許修改二進(jìn)制文件以便以較小的方式破解,實際上也無法對程序進(jìn)行任何重大更改(如添加新功能)。一些人推崇協(xié)作構(gòu)建代碼的方式,因此將自己的源代碼開放供他人修改。“開源”的主要概念就在于此:所有人都能自由使用與修改的軟件?;贚inux的操作系統(tǒng)(如Ubuntu、Fedora與Debian)是開源的,而Windows與macOS是閉源的。開源操作系統(tǒng)的一個有趣之處在于,任何人都可以檢查源代碼以尋找安全漏洞?,F(xiàn)已證實,政府機構(gòu)通過日常消費者軟件中未修補的安全漏洞,對數(shù)百萬平民進(jìn)行利用和監(jiān)視。但對開源軟件而言,代碼受到的關(guān)注度更高,因此惡意的第三方與政府機構(gòu)很難植入監(jiān)控后門程序。使用macOS或Windows時,用戶必須相信Apple或Microsoft對自己的安全不會構(gòu)成危害,并盡最大努力防止任何嚴(yán)重的安全漏洞。而開源系統(tǒng)置于公眾的監(jiān)督之下,因此安全漏洞被忽視的可能性大為降低。

存儲器層次結(jié)構(gòu)

我們知道,計算機的操作可以歸結(jié)為使CPU執(zhí)行簡單的指令,這些指令只能對存儲在CPU寄存器中的數(shù)據(jù)操作。但寄存器的存儲空間通常被限制在1000字節(jié)以內(nèi),這意味著CPU寄存器與RAM之間必須不斷進(jìn)行數(shù)據(jù)傳輸。如果存儲器訪問速度過慢,CPU將被迫處于空閑狀態(tài),以等待RAM完成數(shù)據(jù)傳輸。CPU讀寫存儲器中數(shù)據(jù)所需的時間與計算機性能直接相關(guān)。提高存儲器速度有助于加快計算機運行,也可以提高CPU訪問數(shù)據(jù)的速度。CPU能以近乎實時的速度(一個周期以內(nèi))訪問存儲在寄存器中的數(shù)據(jù),但訪問RAM則慢得多。

對于時鐘頻率為1GHz的CPU,一個周期的持續(xù)時間約為十億分之一秒,這是光線從本書進(jìn)入讀者眼中所需的時間。

處理器與存儲器之間的鴻溝

近年來的技術(shù)發(fā)展使得CPU速度成倍增長。雖然存儲器速度同樣有所提高,但卻慢得多。CPU與RAM之間的這種性能差距稱為“處理器與存儲器之間的鴻溝”。我們可以執(zhí)行大量CPU指令,因此它們很“廉價”;而從RAM獲取數(shù)據(jù)所需的時間較長,因此它們很“昂貴”。隨著兩者之間的差距逐漸增大,提高存儲器訪問效率的重要性越發(fā)明顯。現(xiàn)代計算機需要大約1000個CPU周期(1微秒左右)從RAM獲取數(shù)據(jù)。這種速度已很驚人,但與訪問CPU寄存器的時間相比仍然較慢。減少計算所需的RAM操作次數(shù),是計算機科學(xué)家追求的目標(biāo)。

在兩個面對面的人之間,聲波傳播需要大約10微秒。

時間局部性與空間局部性

在嘗試盡量減少對RAM的訪問時,計算機科學(xué)家開始注意到兩個事實?!驎r間局部性:訪問某個存儲地址時,可能很快會再次訪問該地址?!蚩臻g局部性:訪問某個存儲地址時,可能很快會訪問與之相鄰的地址。因此,將這些存儲地址保存在CPU寄存器中,有助于避免大部分對RAM的“昂貴”操作。不過在設(shè)計CPU(芯片)時,(工業(yè))工程師并未找到可行的方法來容納足夠多的內(nèi)部寄存器,但他們?nèi)匀话l(fā)現(xiàn)了如何有效地利用時間局部性與空間局部性。接下來將對此進(jìn)行討論。

一級緩存

可以構(gòu)建一種集成在CPU內(nèi)部且速度極快的輔助存儲器,這就是一級緩存。將數(shù)據(jù)從一級緩存讀入寄存器,僅比直接從寄存器獲取數(shù)據(jù)稍慢。利用一級緩存,我們將可能訪問的存儲地址中的內(nèi)容復(fù)制到CPU寄存器附近,借此以極快的速度將數(shù)據(jù)載入CPU寄存器。將數(shù)據(jù)從一級緩存讀入寄存器僅需大約10個CPU周期,速度是從RAM獲取數(shù)據(jù)的近百倍。借由10KB左右的一級緩存,并合理利用時間局部性與空間局部性,超過一半的RAM訪問調(diào)用僅通過緩存就能實現(xiàn)。這一創(chuàng)新使計算技術(shù)發(fā)生了翻天覆地的變化。一級緩存可以極大縮短CPU的等待時間,使CPU將更多時間用于實際計算而非處于空閑狀態(tài)。

二級緩存

提高一級緩存的容量有助于減少從RAM獲取數(shù)據(jù)的操作,進(jìn)而縮短CPU的等待時間。但是,增大一級緩存的同時也會降低它的速度。在一級緩存達(dá)到50KB左右時,繼續(xù)增加其容量就要付出極高的成本。更好的方案是構(gòu)建一種稱為二級緩存的緩存。二級緩存的速度稍慢,但容量比一級緩存大得多。現(xiàn)代CPU配備的二級緩存約為200KB,將數(shù)據(jù)從二級緩存讀入CPU寄存器需要大約100個CPU周期。我們將最有可能訪問的地址復(fù)制到一級緩存,較有可能訪問的地址復(fù)制到二級緩存。如果CPU沒有在一級緩存中找到某個存儲地址,仍然可以嘗試在二級緩存中搜索。僅當(dāng)該地址既不在一級緩存、也不在二級緩存中時,CPU才需要訪問RAM。目前,不少制造商推出了配備三級緩存的處理器。三級緩存的容量比二級緩存大,雖然速度不及二級緩存,但仍然比RAM快得多。一級/二級/三級緩存非常重要,它們占據(jù)了CPU芯片內(nèi)部的大部分硅片空間。見圖7-11。使用一級/二級/三級緩存能顯著提高計算機的性能。在配備200KB的二級緩存后,CPU發(fā)出的存儲請求中僅有不到10%必須直接從RAM獲取。讀者今后購買計算機時,對于所挑選的CPU,請記住比較一級/二級/三級緩存的容量。CPU越好,緩存越大。一般來說,建議選擇一款時鐘頻率稍低但緩存容量較大的CPU。

第一級存儲器與第二級存儲器

如前所述,計算機配有不同類型的存儲器,它們按層次結(jié)構(gòu)排列。性能最好的存儲器容量有限且成本極高。沿層次結(jié)構(gòu)向下,可用的存儲空間越來越多,但訪問速度越來越慢。在存儲器層次結(jié)構(gòu)中,位于CPU寄存器與緩存之下的是RAM,它負(fù)責(zé)存儲當(dāng)前運行的所有進(jìn)程的數(shù)據(jù)與代碼。截至2021年,計算機配備的RAM容量通常為1GB到10GB。但在許多情況下,RAM可能無法滿足操作系統(tǒng)以及所有運行程序的需要。因此,我們必須深入探究存儲器層次結(jié)構(gòu),使用位于RAM之下的硬盤。截至2021年,計算機配備的硬盤容量通常為數(shù)百吉字節(jié),足以容納當(dāng)前運行的所有程序數(shù)據(jù)。如果RAM已滿,當(dāng)前的空閑數(shù)據(jù)將被移至硬盤以釋放部分內(nèi)存空間。問題在于,硬盤的速度非常慢,它一般需要100萬個CPU周期(1毫秒)a在磁盤與RAM之間傳輸數(shù)據(jù)。從磁盤訪問數(shù)據(jù)看似很快,但不要忘記,訪問RAM僅需1000個周期,而訪問磁盤需要100萬個周期。RAM通常稱為第一級存儲器,而存儲程序與數(shù)據(jù)的磁盤稱為第二級存儲器。

標(biāo)準(zhǔn)照片在大約4毫秒內(nèi)捕捉光線。

CPU無法直接訪問第二級存儲器。執(zhí)行保存在第二級存儲器中的程序之前,必須將其復(fù)制到第一級存儲器。實際上,每次啟動計算機時,即便是操作系統(tǒng)也要從磁盤復(fù)制到RAM,否則CPU無法運行。確保RAM永不枯竭在典型活動期間,確保計算機處理的所有數(shù)據(jù)與程序都能載入RAM至關(guān)重要,否則計算機將不斷在磁盤與RAM之間交換數(shù)據(jù)。由于這項操作的速度極慢,計算機性能將嚴(yán)重下降,甚至無法使用。這種情況下,計算機不得不花費更多時間等待數(shù)據(jù)傳輸,而無法進(jìn)行實際的計算。當(dāng)計算機不斷將數(shù)據(jù)從磁盤讀入RAM時,則稱計算機處于抖動模式。必須對服務(wù)器進(jìn)行持續(xù)監(jiān)控,如果服務(wù)器開始處理無法載入RAM的數(shù)據(jù),那么抖動可能會導(dǎo)致整個服務(wù)器崩潰。銀行或收銀機前將因此排起

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論