18luck网站

18luck网站電子設計 | 18luck网站Rss 2.0 會員中心 會員注冊
搜索: 您現在的位置: 18luck网站 >> 基礎入門 >> 計算機原理 >> 正文

通俗地講解計算機工作原理

作者:佚名    文章來源:本站原創    點擊數:    更新時間:2022-01-29

任何技術,隻要足夠高深,都無法與(yu) 魔法區分開來。

——亞(ya) 瑟 • 克拉克

為(wei) 解決(jue) 各種問題,人們(men) 發明了不計其數的機器。計算機種類繁多,從(cong) 嵌入火星漫遊機器人的計算機到為(wei) 操縱核潛艇導航係統的計算機,不一而足。馮(feng) • 諾伊曼在1945 年提出第一種計算模型,無論筆記本電腦還是電話,幾乎所有計算機都遵循與(yu) 這種模型相同的工作原理。那麽(me) 你們(men) 了解計算機是如何工作的嗎?本文將討論這些內(nei) 容:

◎ 理解計算機體(ti) 係結構的基礎知識

◎ 選擇編譯器將代碼轉換為(wei) 計算機可以執行的指令

◎ 根據存儲(chu) 器層次結構提高數據的存儲(chu) 速度

畢竟,在非程序員看來,編程要像魔法一樣神奇,我們(men) 程序員不會(hui) 這麽(me) 看。

體(ti) 係結構

計算機是一種根據指令操作數據的機器,主要由處理器與(yu) 存儲(chu) 器兩(liang) 部分組成。存儲(chu) 器又稱RAM(隨機存取存儲(chu) 器),用於(yu) 存儲(chu) 指令以及需要操作的數據。處理器又稱CPU(中央處理器),它從(cong) 存儲(chu) 器獲取指令與(yu) 數據,並執行相應的計算。接下來,我們(men) 將討論這兩(liang) 部分的工作原理。

存儲(chu) 器

存儲(chu) 器被劃分為(wei) 許多單元,每個(ge) 單元存儲(chu) 少量數據,通過一個(ge) 數字地址加以標識。在存儲(chu) 器中讀取或寫(xie) 入數據時,每次對一個(ge) 單元進行操作。

為(wei) 讀寫(xie) 特定的存儲(chu) 單元,必須找到該單元的數字地址。

由於(yu) 存儲(chu) 器是一種電氣元件,單元地址作為(wei) 二進製數通過信號線傳(chuan) 輸。

二進製數以 2 為(wei) 基數表示,其工作原理如下:

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

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

每個(ge) 存儲(chu) 單元通常存儲(chu) 一個(ge) 8 位二進製數,它稱為(wei) 字節。設置為(wei) “讀”模式時,存儲(chu) 器檢索保存在單元中的字節,並通過8 條數據傳(chuan) 輸線輸出,如圖7-3 所示。

設置為(wei) “寫(xie) ”模式時,存儲(chu) 器從(cong) 數據傳(chuan) 輸線獲取一個(ge) 字節,並將其寫(xie) 入相應的單元,如圖7-4 所示。

傳(chuan) 輸相同數據的一組信號線稱為(wei) 總線。用於(yu) 傳(chuan) 輸地址的8 條信號線構成地址總線,用於(yu) 在存儲(chu) 單元之間傳(chuan) 輸數據的另外8 條信號線構成數據總線。地址總線是單向的(僅(jin) 用於(yu) 接收數據),而數據總線是雙向的(用於(yu) 發送和接收數據)。

在所有計算機中,CPU 與(yu) RAM 無時無刻不在交換數據:CPU 不斷從(cong) RAM 獲取指令與(yu) 數據,偶爾也會(hui) 將輸出與(yu) 部分計算存儲(chu) 在RAM 中,如圖7-5 所示。

CPU

CPU 包括若幹稱為(wei) 寄存器的內(nei) 部存儲(chu) 單元,它能對存儲(chu) 在這些寄存器中的數字執行簡單的數學運算,也能在RAM 與(yu) 寄存器之間傳(chuan) 輸數據。可以指示CPU 執行以下典型的操作:

◎ 將數據從(cong) 存儲(chu) 位置 220 複製到寄存器 3;

◎ 將寄存器 3 與(yu) 寄存器 1 中的數字相加。

CPU 可以執行的所有操作的集合稱為(wei) 指令集,指令集中的每項操作被分配一個(ge) 數字。計算機代碼本質上是表示CPU 操作的數字序列,這些操作以數字的形式存儲(chu) 在RAM 中。輸入/ 輸出數據、部分計算以及計算機代碼都存儲(chu) 在RAM 中。

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

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

CPU 的運行永無休止,它不斷從(cong) 存儲(chu) 器獲取並執行指令。這個(ge) 周期的核心是PC 寄存器,PC (program counter)是“程序計數器”的簡稱。PC 是一種特殊的寄存器,用於(yu) 保存下一條待執行指令的存儲(chu) 地址。CPU 的工作流程如下:

(1) 從(cong) PC 指定的存儲(chu) 地址獲取指令;

(2) PC 自增;

(3) 執行指令;

(4) 返回步驟1。

PC 在CPU 上電時複位為(wei) 默認值,它是計算機中第一條待執行指令的地址。這條指令通常是一種不可變的內(nei) 置程序,用於(yu) 加載計算機的基本功能。

在許多個(ge) 人計算機中,這種程序稱為(wei) Bioses(基本輸入輸出係統)。

CPU 上電後將繼續執行這種“獲取- 執行”周期直至關(guan) 機。然而,如果CPU 隻能遵循有序、順序的操作列表,那麽(me) 它與(yu) 一個(ge) 花哨的計算器並無二致。CPU 的神奇之處在於(yu) 可以指示它向PC 中寫(xie) 入新值,從(cong) 而實現執行過程的分支,或“跳轉”到存儲(chu) 器的其他位置。這種分支可以是有條件的。以下麵這條CPU 指令為(wei) 例:“如果寄存器1 等於(yu) 0,將PC設置為(wei) 地址200”。該指令相當於(yu) :

if x = 0

compute_this()

else

compute_that()

僅(jin) 此而已。無論是打開網站、玩計算機遊戲抑或編輯電子表格,所涉及的計算並無區別,都是一係列隻能對存儲(chu) 器中的數據求和、比較或移動的簡單操作。

大量簡單的操作組合在一起,就能表達複雜的過程。以經典的《太空侵略者》遊戲為(wei) 例,其代碼包括大約3000 條機器指令。

CPU 時鍾 早在20 世紀80 年代,《太空侵略者》就已風靡一時。這個(ge) 遊戲在配備2 MHz CPU 的街機上運行。“2 MHz”表示CPU 的時鍾,即CPU 每秒可以執行的基本操作數。時鍾頻率為(wei) 200 萬(wan) 赫茲(zi) (2 MHz)的CPU 每秒大約可以執行200 萬(wan) 次基本操作。完成一條機器指令需要5到10 次基本操作,因此老式街機每秒能運行數十萬(wan) 條機器指令。

隨著現代科技的進步,普通的台式計算機與(yu) 智能手機通常配備2 GHzCPU,每秒可以執行數億(yi) 條機器指令。時至今日,多核CPU 已投入大規模應用,如四核2 GHz CPU 每秒能執行近10 億(yi) 條機器指令。展望未來,CPU 配備的核心數量或許會(hui) 越來越多。

CPU 體(ti) 係結構讀者是否思考過,PlayStation 的遊戲CD 為(wei) 何無法在台式計算機中運行? iphoness 應用為(wei) 何無法在Mac 中運行?原因很簡單,因為(wei) 它們(men) 的CPU 體(ti) 係結構不同。

x86 體(ti) 係結構如今已成為(wei) 行業(ye) 標準,因此相同的代碼可以在大部分個(ge) 人計算機中執行。但考慮到節電的要求,手機采用的CPU 體(ti) 係結構有所不同。不同的CPU 體(ti) 係結構意味著不同的CPU 指令集,也意味著將指令編碼為(wei) 數字的方式各不相同。台式計算機CPU 的指令並非手機CPU的有效指令,反之亦然。

32 位與(yu) 64 位體(ti) 係結構第一種CPU 是Intel 4004,它采用4 位體(ti) 係架構。換言之,這種CPU 在一條機器指令中可以對最多4 位二進製數執行求和、比較與(yu) 移動操作。Intel 4004 的數據總線與(yu) 地址總線均隻有4 條。

不久之後,8 位CPU 開始廣為(wei) 流行,這種CPU 用於(yu) 運行DOS 的早期個(ge) 人計算機。20 世紀八九十年代,著名的便攜式遊戲機Game Boy 就采用8 位處理器。這種CPU 可以在一條指令中對8 位二進製數進行操作。

技術的快速發展使16 位以及之後的32 位體(ti) 係結構成為(wei) 主導。CPU 寄存器隨之增大,以容納32 位數字。更大的寄存器自然催生出更大的數據總線與(yu) 地址總線:具有32 條信號線的地址總線可以對232 字節(4 GB)的內(nei) 存進行尋址。

人們(men) 對計算能力的渴求從(cong) 未停止。計算機程序越來越複雜,消耗的內(nei) 存越來越多,4 GB 內(nei) 存已無法滿足需要。使用適合32 位寄存器的數字地址對超過4 GB 內(nei) 存進行尋址頗為(wei) 棘手,這成為(wei) 64 位體(ti) 係結構興(xing) 起的動因,這種體(ti) 係結構如今占據主導地位。64 位CPU 可以在一條指令中對極大的數字進行操作,而64 位寄存器將地址存儲(chu) 在海量的存儲(chu) 空間中:264 字節相當於(yu) 超過170 億(yi) 吉字節(GB)。

大端序與(yu) 小端序 一些計算機設計師認為(wei) ,應按從(cong) 左至右的順序在RAM 與(yu) CPU 中存儲(chu) 數字,這種模式稱為(wei) 小端序。另一些計算機設計師則傾(qing) 向於(yu) 按從(cong) 右至左的順序在存儲(chu) 器中寫(xie) 入數據,這種模式稱為(wei) 大端序。因此,根據“字節序”的不同,二進製序列1-0-0-0-0-0-1-1 表示的數字也有所不同。

◎ 大端序:27 + 21 + 20 = 131

◎ 小端序:20 + 26 + 27 = 193

目前的大部分CPU 采用小端序模式,但同樣存在許多采用大端序模式的計算機。如果大端序CPU 需要解釋由小端序CPU 產(chan) 生的數據,則必須采取措施以免出現字節序不匹配。程序員直接對二進製數進行操作,在解析來自網絡交換機的數據時尤其需要注意這個(ge) 問題。雖然目前多數計算機采用小端序模式,但由於(yu) 大部分早期的網絡路由器使用大端序CPU,所以因特網流量仍然以大端序為(wei) 基礎進行標準化。以小端序模式讀取大端序數據時將出現亂(luan) 碼,反之亦然。

模擬器 某些情況下,需要在計算機上運行某些為(wei) 不同CPU 設計的代碼,以便在沒有iphoness 的情況下測試iphoness 應用,或玩膾炙人口的老式超級任天堂遊戲。這是通過稱為(wei) 模擬器的軟件來實現的。

模擬器用於(yu) 模仿目標機器,它假定與(yu) 其擁有相同的CPU、RAM 以及其他硬件。模擬器程序對指令進行解碼,並在模擬機器中執行。可以想見,如果兩(liang) 台機器的體(ti) 係結構不同,那麽(me) 在一台機器內(nei) 部模擬另一台機器絕非易事。好在現代計算機的速度遠遠超過之前的機器,因此模擬並非無法實現。我們(men) 可以利用Game Boy 模擬器在計算機中創建一個(ge) 虛擬的Game Boy,然後就能像使用實際的Game Boy 那樣玩遊戲。

編譯器

通過對計算機進行編程,可以完成核磁共振成像、聲音識別、行星探索以及其他許多複雜的任務。值得注意的是,計算機執行的所有操作最終都要通過簡單的CPU 指令完成,即歸結為(wei) 對數字的求和與(yu) 比較。而Web 瀏覽器等複雜的計算機程序需要數百萬(wan) 乃至數十億(yi) 條這樣的機器指令。

但我們(men) 很少會(hui) 直接使用CPU 指令來編寫(xie) 程序,也無法采用這種方式開發一個(ge) 逼真的三維計算機遊戲。為(wei) 了以一種更“自然”且更緊湊的方式表達命令,人們(men) 創造了編程語言。我們(men) 使用這些語言編寫(xie) 代碼,然後通過一種稱為(wei) 編譯器的程序將命令轉換為(wei) CPU 可以執行的機器指令。

我們(men) 用一個(ge) 簡單的數學類比來解釋編譯器的用途。假設我們(men) 向某人提問,要求他計算5 的階乘。

5! = ?

但如果回答者不了解什麽(me) 是階乘,則這樣提問並無意義(yi) 。我們(men) 必須采用更簡單的操作來重新表述問題。

5×4×3×2×1 = ?

不過,如果回答者隻會(hui) 做加法怎麽(me) 辦?我們(men) 必須進一步簡化問題的表述。

5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 +5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 + 5 = ?

可以看到,表達計算的形式越簡單,所需的操作數量越多。計算機代碼同樣如此。編譯器將編程語言中的複雜指令轉換為(wei) 等效的CPU 指令。結合功能強大的外部庫,就能通過相對較少的幾行代碼表示包含數十億(yi) 條CPU 指令的複雜程序,而這些代碼易於(yu) 理解和修改。

計算機之父艾倫(lun) • 圖靈發現,簡單的機器有能力計算任何可計算的事物。如果機器具有通用的計算能力,那麽(me) 它必須能遵循包含指令的程序,以便:

◎ 對存儲(chu) 器中的數據進行讀寫(xie) ;

◎ 執行條件分支:如果存儲(chu) 地址具有給定的值,則跳轉到程序的另一個(ge) 點。

我們(men) 稱具有這種通用計算能力的機器是圖靈完備的。無論計算的複雜性或難度如何,都可以采用簡單的讀取/ 寫(xie) 入/ 分支指令來表達。隻要分配足夠的時間與(yu) 存儲(chu) 空間,這些指令就能計算任何事物。

人們(men) 最近發現,一種稱為(wei) MOV(數據傳(chuan) 送)的CPU 指令是圖靈完備的。這意味著僅(jin) 能執行MOV 指令的CPU 與(yu) 完整的CPU 在功能上並無不同:換言之,通過MOV 指令可以嚴(yan) 格地表達任何類型的代碼。

這個(ge) 重要概念在於(yu) ,無論簡單與(yu) 否,如果程序能采用編程語言進行編碼,就可以重寫(xie) 後在任何圖靈完備的機器中運行。編譯器是一種神奇的程序,能自動將代碼從(cong) 複雜的語言轉換為(wei) 簡單的語言。

操作係統

從(cong) 本質上講,編譯後的計算機程序是CPU 指令的序列。如前所述,為(wei) 台式計算機編譯的代碼無法在智能手機中運行,因為(wei) 二者采用不同的CPU體(ti) 係結構。不過,由於(yu) 程序必須與(yu) 計算機的操作係統通信才能運行,編譯後的程序也可能無法在共享相同CPU 架構的兩(liang) 台計算機中使用。

為(wei) 實現與(yu) 外界的通信,程序必須進行輸入與(yu) 輸出操作,如打開文件、在屏幕上顯示消息、打開網絡連接等。但不同的計算機采用不同的硬件,因此程序不可能直接支持所有不同類型的屏幕、聲卡或網卡。

這就是程序依賴於(yu) 操作係統執行的原因所在。借助操作係統的幫助,程序可以毫不費力地使用不同的硬件。程序創建特殊的係統調用,請求操作係統執行所需的輸入/ 輸出操作。編譯器負責將輸入/ 輸出命令轉換為(wei) 合適的係統調用。

然而,不同的操作係統往往使用互不兼容的係統調用。例如,與(yu) macOS或Linux 相比,Windows 在屏幕上打印信息所用的係統調用有所不同。

因此,在使用x86 處理器的Windows 中編譯的程序,無法在使用x86處理器的Mac 中運行。除針對特定的CPU 體(ti) 係結構外,編譯後的代碼還會(hui) 針對特定的操作係統。

編譯優(you) 化

優(you) 秀的編譯器致力於(yu) 優(you) 化它們(men) 生成的機器碼。如果編譯器認為(wei) 可以通過修改部分代碼來提高執行效率,則會(hui) 處理。在生成二進製輸出之前,編譯器可能嚐試應用數百條優(you) 化規則。

因此,應使代碼易於(yu) 閱讀以利於(yu) 進行微優(you) 化。編譯器最終將完成所有細微的優(you) 化。例如,一些人對以下代碼頗有微詞。

function factorial(n)

if n > 1

return factorial(n - 1) * n

else

return 1

他們(men) 認為(wei) 應該進行以下修改:

function factorial(n)

result ← 1

while n > 1

result ← result * n

n ← n - 1

return result

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

i ← x + y + 1

j ← x + y

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

t1 ← x + y

i ← t1 + 1

j ← t1

應專(zhuan) 注於(yu) 編寫(xie) 清晰且自解釋的代碼。如果性能出現問題,可以利用分析工具尋找代碼中的瓶頸,並嚐試改用更好的方法計算存在問題的代碼。此外,避免在不必要的微操作上浪費太多時間。

但在某些情況下,我們(men) 希望跳過編譯,接下來將對此進行討論。

腳本語言

某些語言在執行時並未被直接編譯為(wei) 機器碼,這些語言稱為(wei) 腳本語言,包括Java、Python 以及Ruby。在腳本語言中,代碼由解釋器而非CPU 執行,解釋器必須安裝在運行代碼的機器中。

解釋器實時轉譯並執行代碼,因此其運行速度通常比編譯後的代碼慢得多。但另一方麵,程序員隨時都能立即運行代碼而無須等待編譯過程。

對於(yu) 規模極大的項目,編譯可能耗時數小時之久。

Google 工程師必須不斷編譯大量代碼,導致程序員“損失”了很多時間(圖7-9)。由於(yu) 需要保證編譯後的二進製文件有更好的性能,Google 無法切換到腳本語言。公司為(wei) 此開發了Go 語言,它的編譯速度極快,同時仍然保持很高的性能。

反匯編與(yu) 逆向工程

給定一個(ge) 已編譯的計算機程序,無法在編譯之前恢複其源代碼。但我們(men) 可以對二進製程序解碼,將用於(yu) 編碼CPU 指令的數字轉換為(wei) 人類可讀的指令序列。這個(ge) 過程稱為(wei) 反匯編。

接下來,可以查看這些CPU 指令,並嚐試分析它們(men) 的用途,這就是所謂的逆向工程。某些反匯編程序對這一過程大有裨益,它們(men) 能自動檢測並注釋係統調用與(yu) 常用函數。借由反匯編工具,黑客對二進製代碼的各個(ge) 環節了如指掌。我相信,許多頂尖的IT 公司都設有秘密的逆向工程實驗室,以便研究競爭(zheng) 對手的軟件。

地下黑客經常分析Windows、Photoshop、《俠(xia) 盜獵車手》等授權程序中的二進製代碼,以確定哪部分代碼負責驗證軟件許可證。黑客將二進製代碼修改,在其中加入一條指令,直接跳轉到驗證許可證後執行的代碼部分。運行修改後的二進製代碼時,它在檢查許可證前獲取注入的JUMP 命令,從(cong) 而可以在沒有付費的情況下運行非法的盜版副本。

在秘密的政府情報機構中,同樣設有供安全研究人員與(yu) 工程師研究ioses、Windows、IE 瀏覽器等流行消費者軟件的實驗室。他們(men) 尋找這些程序中可能存在的安全漏洞,以防禦網絡攻擊或對高價(jia) 值目標的入侵。在這類攻擊中,最知名的當屬“震網”病毒,它是美國與(yu) 以色列情報機構研製的一種網絡武器。通過感染控製地下聚變反應堆的計算機,“震網”延緩了伊朗核計劃。

開源軟件

如前所述,我們(men) 可以根據二進製可執行文件分析有關(guan) 程序的原始指令,但無法恢複用於(yu) 生成二進製文件的原始源代碼。

在沒有原始源代碼的情況下,即使可以稍許修改二進製文件以便以較小的方式破解,實際上也無法對程序進行任何重大更改(如添加新功能)。一些人推崇協作構建代碼的方式,因此將自己的源代碼開放供他人修改。“開源”的主要概念就在於(yu) 此:所有人都能自由使用與(yu) 修改的軟件。基於(yu) Linux 的操作係統(如Ubuntu、Fedora 與(yu) Debian)是開源的,而Windows 與(yu) macOS 是閉源的。

開源操作係統的一個(ge) 有趣之處在於(yu) ,任何人都可以檢查源代碼以尋找安全漏洞。現已證實,政府機構通過日常消費者軟件中未修補的安全漏洞,對數百萬(wan) 平民進行利用和監視。

但對開源軟件而言,代碼受到的關(guan) 注度更高,因此惡意的第三方與(yu) 政府機構很難植入監控後門程序。使用macOS 或Windows 時,用戶必須相信Apple 或Microsoft 對自己的安全不會(hui) 構成危害,並盡最大努力防止任何嚴(yan) 重的安全漏洞。而開源係統置於(yu) 公眾(zhong) 的監督之下,因此安全漏洞被忽視的可能性大為(wei) 降低。

存儲(chu) 器層次結構

我們(men) 知道,計算機的操作可以歸結為(wei) 使CPU 執行簡單的指令,這些指令隻能對存儲(chu) 在CPU 寄存器中的數據操作。但寄存器的存儲(chu) 空間通常被限製在1000 字節以內(nei) ,這意味著CPU 寄存器與(yu) RAM 之間必須不斷進行數據傳(chuan) 輸。

如果存儲(chu) 器訪問速度過慢,CPU 將被迫處於(yu) 空閑狀態,以等待RAM 完成數據傳(chuan) 輸。CPU 讀寫(xie) 存儲(chu) 器中數據所需的時間與(yu) 計算機性能直接相關(guan) 。提高存儲(chu) 器速度有助於(yu) 加快計算機運行,也可以提高CPU 訪問數據的速度。CPU 能以近乎實時的速度(一個(ge) 周期以內(nei) )訪問存儲(chu) 在寄存器中的數據,但訪問RAM 則慢得多。

對於(yu) 時鍾頻率為(wei) 1 GHz 的CPU,一個(ge) 周期的持續時間約為(wei) 十億(yi) 分之一秒,這是光線從(cong) 本書(shu) 進入讀者眼中所需的時間。

處理器與(yu) 存儲(chu) 器之間的鴻溝

近年來的技術發展使得CPU 速度成倍增長。雖然存儲(chu) 器速度同樣有所提高,但卻慢得多。CPU 與(yu) RAM 之間的這種性能差距稱為(wei) “處理器與(yu) 存儲(chu) 器之間的鴻溝”。我們(men) 可以執行大量CPU 指令,因此它們(men) 很“廉價(jia) ”;而從(cong) RAM 獲取數據所需的時間較長,因此它們(men) 很“昂貴”。隨著兩(liang) 者之間的差距逐漸增大,提高存儲(chu) 器訪問效率的重要性越發明顯。

現代計算機需要大約1000 個(ge) CPU 周期(1 微秒左右) 從(cong) RAM 獲取數據。這種速度已很驚人,但與(yu) 訪問CPU 寄存器的時間相比仍然較慢。減少計算所需的RAM 操作次數,是計算機科學家追求的目標。

在兩(liang) 個(ge) 麵對麵的人之間,聲波傳(chuan) 播需要大約10 微秒。

時間局部性與(yu) 空間局部性

在嚐試盡量減少對RAM 的訪問時,計算機科學家開始注意到兩(liang) 個(ge) 事實。

◎ 時間局部性:訪問某個(ge) 存儲(chu) 地址時,可能很快會(hui) 再次訪問該地址。

◎ 空間局部性:訪問某個(ge) 存儲(chu) 地址時,可能很快會(hui) 訪問與(yu) 之相鄰的地址。

因此,將這些存儲(chu) 地址保存在CPU 寄存器中,有助於(yu) 避免大部分對RAM的“昂貴”操作。不過在設計CPU 芯片時,工業(ye) 工程師並未找到可行的方法來容納足夠多的內(nei) 部寄存器,但他們(men) 仍然發現了如何有效地利用時間局部性與(yu) 空間局部性。接下來將對此進行討論。

一級緩存

可以構建一種集成在CPU 內(nei) 部且速度極快的輔助存儲(chu) 器,這就是一級緩存。將數據從(cong) 一級緩存讀入寄存器,僅(jin) 比直接從(cong) 寄存器獲取數據稍慢。

利用一級緩存,我們(men) 將可能訪問的存儲(chu) 地址中的內(nei) 容複製到CPU 寄存器附近,借此以極快的速度將數據載入CPU 寄存器。將數據從(cong) 一級緩存讀入寄存器僅(jin) 需大約10 個(ge) CPU 周期,速度是從(cong) RAM 獲取數據的近百倍。

借由10 KB 左右的一級緩存,並合理利用時間局部性與(yu) 空間局部性,超過一半的RAM 訪問調用僅(jin) 通過緩存就能實現。這一創新使計算技術發生了翻天覆地的變化。一級緩存可以極大縮短CPU 的等待時間,使CPU 將更多時間用於(yu) 實際計算而非處於(yu) 空閑狀態。

二級緩存

提高一級緩存的容量有助於(yu) 減少從(cong) RAM 獲取數據的操作,進而縮短CPU 的等待時間。但是,增大一級緩存的同時也會(hui) 降低它的速度。在一級緩存達到50 KB 左右時,繼續增加其容量就要付出極高的成本。更好的方案是構建一種稱為(wei) 二級緩存的緩存。二級緩存的速度稍慢,但容量比一級緩存大得多。現代CPU 配備的二級緩存約為(wei) 200 KB,將數據從(cong) 二級緩存讀入CPU 寄存器需要大約100 個(ge) CPU 周期。

我們(men) 將最有可能訪問的地址複製到一級緩存,較有可能訪問的地址複製到二級緩存。如果CPU 沒有在一級緩存中找到某個(ge) 存儲(chu) 地址,仍然可以嚐試在二級緩存中搜索。僅(jin) 當該地址既不在一級緩存、也不在二級緩存中時,CPU 才需要訪問RAM。

目前,不少製造商推出了配備三級緩存的處理器。三級緩存的容量比二級緩存大,雖然速度不及二級緩存,但仍然比RAM 快得多。一級/ 二級/ 三級緩存非常重要,它們(men) 占據了CPU 芯片內(nei) 部的大部分矽片空間。見圖7-11。

使用一級/ 二級/ 三級緩存能顯著提高計算機的性能。在配備200 KB的二級緩存後,CPU 發出的存儲(chu) 請求中僅(jin) 有不到10% 必須直接從(cong) RAM獲取。

讀者今後購買(mai) 計算機時,對於(yu) 所挑選的CPU,請記住比較一級/ 二級/三級緩存的容量。CPU 越好,緩存越大。一般來說,建議選擇一款時鍾頻率稍低但緩存容量較大的CPU。

第一級存儲(chu) 器與(yu) 第二級存儲(chu) 器

如前所述,計算機配有不同類型的存儲(chu) 器,它們(men) 按層次結構排列。性能最好的存儲(chu) 器容量有限且成本極高。沿層次結構向下,可用的存儲(chu) 空間越來越多,但訪問速度越來越慢。

在存儲(chu) 器層次結構中,位於(yu) CPU 寄存器與(yu) 緩存之下的是RAM,它負責存儲(chu) 當前運行的所有進程的數據與(yu) 代碼。截至2017 年,計算機配備的RAM 容量通常為(wei) 1 GB 到10 GB。但在許多情況下,RAM 可能無法滿足操作係統以及所有運行程序的需要。

因此,我們(men) 必須深入探究存儲(chu) 器層次結構,使用位於(yu) RAM 之下的硬盤。截至2017 年,計算機配備的硬盤容量通常為(wei) 數百吉字節,足以容納當前運行的所有程序數據。如果RAM 已滿,當前的空閑數據將被移至硬盤以釋放部分內(nei) 存空間。

問題在於(yu) ,硬盤的速度非常慢,它一般需要100 萬(wan) 個(ge) CPU 周期(1 毫秒)a 在磁盤與(yu) RAM 之間傳(chuan) 輸數據。從(cong) 磁盤訪問數據看似很快,但不要忘記,訪問RAM 僅(jin) 需1000 個(ge) 周期,而訪問磁盤需要100 萬(wan) 個(ge) 周期。RAM 通常稱為(wei) 第一級存儲(chu) 器,而存儲(chu) 程序與(yu) 數據的磁盤稱為(wei) 第二級存儲(chu) 器。

標準照片在大約4 毫秒內(nei) 捕捉光線。

CPU 無法直接訪問第二級存儲(chu) 器。執行保存在第二級存儲(chu) 器中的程序之前,必須將其複製到第一級存儲(chu) 器。實際上,每次啟動計算機時,即便是操作係統也要從(cong) 磁盤複製到RAM,否則CPU 無法運行。

確保RAM 永不枯竭在典型活動期間,確保計算機處理的所有數據與(yu) 程序都能載入RAM 至關(guan) 重要,否則計算機將不斷在磁盤與(yu) RAM 之間交換數據。由於(yu) 這項操作的速度極慢,計算機性能將嚴(yan) 重下降,甚至無法使用。這種情況下,計算機不得不花費更多時間等待數據傳(chuan) 輸,而無法進行實際的計算。

當計算機不斷將數據從(cong) 磁盤讀入RAM 時,則稱計算機處於(yu) 抖動模式。必須對服務器進行持續監控,如果服務器開始處理無法載入RAM 的數據,那麽(me) 抖動可能會(hui) 導致整個(ge) 服務器崩潰。銀行或收銀機前將因此排起長隊,而服務員除了責怪發生抖動的計算機係統之外別無他法。內(nei) 存不足或許是導致服務器故障的主要原因之一。

外部存儲(chu) 器與(yu) 第三級存儲(chu) 器

我們(men) 繼續沿存儲(chu) 器層次結構向下分析。在連接到網絡之後,計算機就能訪問由其他計算機管理的存儲(chu) 器。它們(men) 要麽(me) 位於(yu) 本地網絡,要麽(me) 位於(yu) 因特網(即雲(yun) 端)。但訪問這些數據所需的時間更長:讀取本地磁盤需要1 毫秒,而獲取網絡中的數據可能耗時數百毫秒。網絡包從(cong) 一台計算機傳(chuan) 輸到另一台計算機大約需要10 毫秒,如果經由因特網傳(chuan) 輸則需要200 毫秒到300 毫秒,與(yu) 眨眼的時間相仿。

位於(yu) 存儲(chu) 器層次結構底部的是第三級存儲(chu) 器,這種存儲(chu) 設備並非總是在線與(yu) 可用的。在盒式磁帶或CD 中存儲(chu) 數百萬(wan) 吉字節的數據成本較低,但訪問這類介質中的數據時,需要將介質插入某種讀取設備,這可能需要數分鍾甚至數天之久(不妨嚐試讓IT 部門在周五晚上備份磁帶中的數據……)。有鑒於(yu) 此,第三級存儲(chu) 器僅(jin) 適合歸檔很少訪問的數據。

存儲(chu) 技術的發展趨勢

一方麵,很難顯著改進“快速”存儲(chu) 器(位於(yu) 存儲(chu) 器層次結構頂端)所用的技術;另一方麵,“慢速”存儲(chu) 器的速度越來越快,價(jia) 格也越來越低。幾十年來,硬盤存儲(chu) 的成本一直在下降,這種趨勢似乎還將持續下去。

新技術也使磁盤的速度得以提高。人們(men) 正從(cong) 旋轉磁盤轉向固態硬盤(SSD),它沒有動件,因而更快、更可靠且更省電。

采用SSD 技術的磁盤正變得越來越便宜且越來越快,但其價(jia) 格仍然不菲。有鑒於(yu) 此,一些製造商推出了同時采用SSD 與(yu) 磁技術的混合磁盤。後者將訪問頻率較高的數據存儲(chu) 在SSD 中,訪問頻率較低的數據存儲(chu) 在速度較慢的磁盤中。當需要頻繁訪問原先不經常訪問的數據時,則將其複製到混合驅動器中速度較快的SSD。這與(yu) CPU 利用內(nei) 部緩存提高RAM 訪問速度的技巧頗為(wei) 類似。

小結

本文介紹了一些基本的計算機工作原理。任何可計算的事物都能采用簡單的指令來表示。為(wei) 將複雜的計算命令轉換為(wei) CPU 可以執行的簡單指令,需要使用一種稱為(wei) 編譯器的程序。計算機之所以能進行複雜計算,僅(jin) 僅(jin) 是因為(wei) CPU 可以執行大量基本操作。

計算機的處理器速度很快,但存儲(chu) 器相對較慢。CPU 並非以隨機方式訪問存儲(chu) 器,而是遵循空間局部性與(yu) 時間局部性原理。因此,可以將訪問頻率較高的數據緩存在速度更快的存儲(chu) 器中。這一原則在多個(ge) 級別的緩存中得到了應用:從(cong) 一級緩存直到第三級存儲(chu) 器,不一而足。

本文討論的緩存原則可以應用於(yu) 多種場景。確定應用程序頻繁使用的數據,並設法提高這部分數據的訪問速度,是縮短計算機程序運行時間的最常用策略之一。

——本文選自《計算機科學精粹》

這是一本計算機重要知識點參考手冊(ce) 。

在北美的院校中,某些考試允許攜帶 cheat sheet(中文可稱為(wei) “備忘單”或“速查表”),學生可以將自己認為(wei) 重要的公式或知識點寫(xie) 在上麵。從(cong) 某種意義(yi) 上說,《計算機科學精粹》就是這樣一本具有 cheat sheet 性質的書(shu) 。

與(yu) 圖靈推出的《算法圖解》類似,本書(shu) 梳理了計算機科學領域的重要知識點,著力將抽象的理論具體(ti) 化、複雜的問題簡單化。當然,亦想拋磚引玉,希望在喚起讀者對計算機科學的興(xing) 趣後,能深入閱讀其他資料。

目錄

查爾斯 • 巴貝奇的分析機原理圖

第 1 章 預備知識

第 2 章 複雜度

第 3 章 策略

第 4 章 數據

第 5 章 算法

第 6 章 數據庫

第 7 章 計算機

第 8 章 程序設計

提到好懂的計算機基礎圖書(shu) ,你最先想到哪本?

是《計算機是怎樣跑起來的》還是《網絡是怎樣鏈接的》?

你印象中最深刻計算機科學圖書(shu) 是哪本?

你有沒有更有趣的學習(xi) 方式?

Tags:計算機,工作原理  
責任編輯:admin
  • 上一個文章:
  • 下一個文章: 沒有了
  • 請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
    1分 2分 3分 4分 5分

    還可以輸入 200 個字
    [ 查看全部 ] 網友評論
    推薦文章
    • 此欄目下沒有推薦文章
    最新推薦
    關於我們 - 聯係我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
    返回頂部
    刷新頁麵
    下到頁底
    晶體管查詢