點選上方 「 Linux開源社群 」,選擇「 設為星標 」
優質文章,及時送達
轉自:網路
為解決各種問題,人們發明了不計其數的機器。電腦種類繁多,從嵌入火星漫遊機器人的電腦到為操縱核潛艇導航系統的電腦,不一而足。
馮• 諾伊曼在1945 年提出第一種計算模型,無論膝上型電腦還是電話,幾乎所有電腦都遵循與這種模型相同的工作原理。那麽你們了解電腦是如何工作的嗎?本文將討論這些內容:
理解電腦體系結構的基礎知識
選擇編譯器將程式碼轉換為電腦可以執行的指令
根據記憶體階層提高數據的儲存速度
畢竟,在非程式設計師看來,編程要像魔法一樣神奇,我們程式設計師不會這麽看。
體系結構
電腦是一種根據指令運算元據的機器,主要由處理器與記憶體兩部份組成。記憶體又稱RAM(隨機存取記憶體),用於儲存指令以及需要操作的數據。處理器又稱CPU(中央處理器),它從記憶體獲取指令與數據,並執行相應的計算。接下來,我們將討論這兩部份的工作原理。
記憶體
記憶體被劃分為許多單元,每個單元儲存少量數據,透過一個數位地址加以標識。在記憶體中讀取或寫入數據時,每次對一個單元進行操作。
為讀寫特定的儲存單元,必須找到該單元的數位地址。
由於記憶體是一種電氣元件,單元地址作為二進制數透過訊號線傳輸。
二進制數以 2 為基數表示,其工作原理如下:
每條訊號線傳輸一個位元,以高電壓表示訊號「1」,低電壓表示訊號「0」,如圖7-1 所示。
對於某個給定的單元地址,記憶體可以進行兩種操作:獲取其值或儲存新值,如圖7-2 所示。記憶體包括一條用於設定操作模式的特殊訊號線。
每個儲存單元通常儲存一個 8 位二進制數,它稱為字節。設定為「讀」模式時,記憶體檢索保存在單元中的字節,並透過8 條數據傳輸線輸出,如圖7-3 所示。
設定為「寫」模式時,記憶體從數據傳輸線獲取一個字節,並將其寫入相應的單元,如圖7-4 所示。
傳輸相同數據的一組訊號線稱為 匯流排 。用於傳輸地址的8 條訊號線構成地址匯流排,用於在儲存單元之間傳輸數據的另外8 條訊號線構成數據匯流排。地址匯流排是單向的(僅用於接收數據),而數據匯流排是雙向的(用於發送和接收數據)。
在所有電腦中,CPU 與RAM 無時無刻不在交換數據:CPU 不斷從RAM 獲取指令與數據,偶爾也會將輸出與部份計算儲存在RAM 中,如圖7-5 所示。
CPU
CPU 包括若幹稱為寄存器的內部儲存單元,它能對儲存在這些寄存器中的數位執行簡單的數學運算,也能在RAM 與寄存器之間傳輸數據。可以指示CPU 執行以下典型的操作:
將數據從儲存位置 220 復制到寄存器 3;
將寄存器 3 與寄存器 1 中的數位相加。
CPU 可以執行的所有操作的集合稱為 指令集 ,指令集中的每項操作被分配一個數位。電腦程式碼本質上是表示CPU 操作的數位序列,這些操作以數位的形式儲存在RAM 中。輸入/ 輸出數據、部份計算以及電腦程式碼都儲存在RAM 中。
透過在RAM 中包含重寫部份程式碼的指令,程式碼甚至可以對自身修改,這是電腦病毒逃避反病毒軟體檢測的慣用手法。與之類似,生物病毒透過改變自身的DNA以躲避宿主免疫系統的打擊。
圖7-6 取自Intel 4004 操作手冊,顯示了部份CPU 指令對映為數位的方法。隨著制造工藝的發展,CPU 支持的操作越來越多。現代CPU 的指令集極為龐大,但最重要的指令在幾十年前就已存在。
CPU 的執行永無休止,它不斷從記憶體獲取並執行指令。 這個周期的核心是PC 寄存器,PC (program counter)是「程式計數器」的簡稱。PC 是一種特殊的寄存器,用於保存下一條待執行指令的儲存地址。CPU 的工作流程如下:
(1) 從PC 指定的儲存地址獲取指令;
(2) PC 自增;
(3) 執行指令;
(4) 返回步驟1。
PC 在CPU 上電時復位為預設值,它是電腦中第一條待執行指令的地址。這條指令通常是一種不可變的內建程式,用於載入電腦的基本功能。
在許多個人電腦中,這種程式稱為 BIOS (基本輸入輸出系統)。
CPU 上電後將繼續執行這種「獲取- 執行」周期直至關機。然而,如果CPU 只能遵循有序、順序的操作列表,那麽它與一個花哨的小算盤並無二致。CPU 的神奇之處在於可以指示它向PC 中寫入新值,從而實作執行過程的分支,或「跳轉」到記憶體的其他位置。這種分支可以是有條件的。以下面這條CPU 指令為例:「如果寄存器1 等於0,將PC設定為地址200」。該指令相當於:
if x = 0
compute_this()
else
compute_that()
僅此而已。無論是開啟網站、玩電腦遊戲抑或編輯電子試算表,所涉及的計算並無區別,都是一系列只能對記憶體中的數據求和、比較或移動的簡單操作。
大量簡單的操作組合在一起,就能表達復雜的過程。以經典的【太空侵略者】遊戲為例,其程式碼包括大約3000 條機器指令。
CPU 時鐘 早在20 世紀80 年代,【太空侵略者】就已風靡一時。這個遊戲在配備2 MHz CPU 的街機上執行。「2 MHz」表示CPU 的時鐘,即CPU 每秒可以執行的基本運算元。時脈為200 萬赫茲(2 MHz)的CPU 每秒大約可以執行200 萬次基本操作。完成一條機器指令需要5到10 次基本操作,因此老式街機每秒能執行數十萬條機器指令。
隨著現代科技的進步,普通的台式電腦與智慧型手機通常配備2 GHzCPU,每秒可以執行數億條機器指令。時至今日,多核CPU 已投入大規模套用,如四核2 GHz CPU 每秒能執行近10 億條機器指令。展望未來,CPU 配備的核心數量或許會越來越多。
CPU 體系結構
讀者是否思考過,PlayStation 的遊戲CD 為何無法在台式電腦中執行?iPhone 套用為何無法在Mac 中執行?原因很簡單,因為它們的CPU 體系結構不同。
x86 體系結構如今已成為行業標準,因此相同的程式碼可以在大部份個人電腦中執行。但考慮到節電的要求,手機采用的CPU 體系結構有所不同。 不同的CPU 體系結構意味著不同的CPU 指令集 ,也意味著將指令編碼為數位的方式各不相同。台式電腦CPU 的指令並非手機CPU的有效指令,反之亦然。
32 位與64 位體系結構
第一種CPU 是Intel 4004,它采用4 位體系架構。換言之,這種CPU 在一條機器指令中可以對最多4 位二進制數執行求和、比較與移動操作。Intel 4004 的數據匯流排與地址匯流排均只有4 條。
不久之後,8 位CPU 開始廣為流行,這種CPU 用於執行DOS 的早期個人電腦。20 世紀八九十年代,著名的人員攜行式遊戲機Game Boy 就采用8 位處理器。這種CPU 可以在一條指令中對8 位二進制數進行操作。
技術的快速發展使16 位以及之後的32 位體系結構成為主導。CPU 寄存器隨之增大,以容納32 位數位。更大的寄存器自然催生出更大的數據匯流排與地址匯流排:具有32 條訊號線的地址匯流排可以對232 字節(4 GB)的記憶體進行尋址。
人們對計算能力的渴求從未停止。電腦程式越來越復雜,消耗的記憶體越來越多,4 GB 記憶體已無法滿足需要。使用適合32 位寄存器的數位地址對超過4 GB 記憶體進行尋址頗為棘手,這成為64 位體系結構興起的動因,這種體系結構如今占據主導地位。64 位CPU 可以在一條指令中對極大的數位進行操作,而64 位寄存器將地址儲存在海量的儲存空間中:264 字節相當於超過170 億吉字節(GB)。
大端序與小端序
一些電腦設計師認為,應按從左至右的順序在RAM 與CPU 中儲存數位,這種模式稱為小端序。另一些電腦設計師則傾向於按從右至左的順序在記憶體中寫入數據,這種模式稱為大端序。因此,根據「字節序」的不同,二進制序列1-0-0-0-0-0-1-1 表示的數位也有所不同。
大端序:27 + 21 + 20 = 131
小端序:20 + 26 + 27 = 193
目前的大部份CPU 采用小端序模式,但同樣存在許多采用大端序模式的電腦。如果大端序CPU 需要解釋由小端序CPU 產生的數據,則必須采取措施以免出現字節序不匹配。程式設計師直接對二進制數進行操作,在解析來自網路交換機的數據時尤其需要註意這個問題。
雖然目前多數電腦采用小端序模式,但由於大部份早期的網路路由器使用大端序CPU,所以因特網流量仍然以大端序為基礎進行標準化。以小端序模式讀取大端序數據時將出現亂碼,反之亦然。
模擬器 某些情況下,需要在電腦上執行某些為不同CPU 設計的程式碼,以便在沒有iPhone 的情況下測試iPhone 套用,或玩膾炙人口的老式超級任天堂遊戲。這是透過稱為模擬器的軟體來實作的。
模擬器用於模仿目標機器,它假定與其擁有相同的CPU、RAM 以及其他硬體。模擬器程式對指令進行解碼,並在模擬機器中執行。可以想見,如果兩台機器的體系結構不同,那麽在一台機器內部模擬另一台機器絕非易事。好在現代電腦的速度遠遠超過之前的機器,因此模擬並非無法實作。我們可以利用Game Boy 模擬器在電腦中建立一個虛擬的Game Boy,然後就能像使用實際的Game Boy 那樣玩遊戲。
編譯器
透過對電腦進行編程,可以完成核磁共振成像、聲音辨識、行星探索以及其他許多復雜的任務。值得註意的是,電腦執行的所有操作最終都要透過簡單的CPU 指令完成,即歸結為對數位的求和與比較。而Web 瀏覽器等復雜的電腦程式需要數百萬乃至數十億條這樣的機器指令。
但我們很少會直接使用CPU 指令來編寫程式,也無法采用這種方式開發一個逼真的三維電腦遊戲。為了以一種更「自然」且更緊湊的方式表達命令,人們創造了程式語言。我們使用這些語言編寫程式碼,然後透過一種稱為編譯器的程式將命令轉換為CPU 可以執行的機器指令。
我們用一個簡單的數學類比來解釋編譯器的用途。假設我們向某人提問,要求他計算5 的階乘。
5!=?
但如果回答者不了解什麽是階乘,則這樣提問並無意義。我們必須采用更簡單的操作來重新表述問題。
5×4×3×2×1=?
不過,如果回答者只會做加法怎麽辦?我們必須進一步簡化問題的表述。
5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5=?
可以看到,表達計算的形式越簡單,所需的運算元量越多。電腦程式碼同樣如此。編譯器將程式語言中的復雜指令轉換為等效的CPU 指令。結合功能強大的外部庫,就能透過相對較少的幾行程式碼表示包含數十億條CPU 指令的復雜程式,而這些程式碼易於理解和修改。
電腦之父 艾倫• 圖靈 發現,簡單的機器有能力計算任何可計算的事物。如果機器具有通用的計算能力,那麽它必須能遵循包含指令的程式,以便:
對記憶體中的數據進行讀寫;
執行條件分支:如果儲存地址具有給定的值,則跳轉到程式的另一個點。
我們稱具有這種通用計算能力的機器是 圖靈完備 的。無論計算的復雜性或難度如何,都可以采用簡單的讀取/ 寫入/ 分支指令來表達。只要分配足夠的時間與儲存空間,這些指令就能計算任何事物。
人們最近發現,一種稱為 MOV(數據傳送) 的CPU 指令是圖靈完備的。這意味著僅能執行MOV 指令的CPU 與完整的CPU 在功能上並無不同:換言之,透過MOV 指令可以嚴格地表達任何型別的程式碼。微信搜尋公眾號:架構師指南,回復:架構師 領取資料 。
這個重要概念在於,無論簡單與否, 如果程式能采用程式語言進行編碼,就可以重寫後在任何圖靈完備的機器中執行。 編譯器是一種神奇的程式,能自動將程式碼從復雜的語言轉換為簡單的語言。
作業系統
從本質上講,編譯後的電腦程式是CPU 指令的序列。如前所述,為台式電腦編譯的程式碼無法在智慧型手機中執行,因為二者采用不同的CPU體系結構。不過,由於程式必須與電腦的作業系統通訊才能執行,編譯後的程式也可能無法在共享相同CPU 架構的兩台電腦中使用。
為實作與外界的通訊,程式必須進行輸入與輸出操作,如開啟檔、在螢幕上顯示訊息、開啟網路連線等。但不同的電腦采用不同的硬體,因此程式不可能直接支持所有不同型別的螢幕、音效卡或網卡。
這就是程式依賴於作業系統執行的原因所在。借助作業系統的幫助,程式可以毫不費力地使用不同的硬體。程式建立特殊的系統呼叫,請求作業系統執行所需的輸入/ 輸出操作。編譯器負責將輸入/ 輸出命令轉換為合適的系統呼叫。
然而,不同的作業系統往往使用互不相容的系統呼叫。例如,與macOS或Linux 相比,Windows 在螢幕上打印資訊所用的系統呼叫有所不同。
因此,在使用x86 處理器的Windows 中編譯的程式,無法在使用x86處理器的Mac 中執行。除針對特定的CPU 體系結構外,編譯後的程式碼還會針對特定的作業系統。
編譯最佳化
優秀的編譯器致力於最佳化它們生成的機器碼。如果編譯器認為可以透過修改部份程式碼來提高執行效率,則會處理。在生成二進制輸出之前,編譯器可能嘗試套用數百條最佳化規則。
因此,應使程式碼易於閱讀以利於進行微最佳化。編譯器最終將完成所有細微的最佳化。例如,一些人對以下程式碼頗有微詞。
functionfactorial(n)
if n > 1
return factorial(n - 1) * n
else
return1
他們認為應該進行以下修改:
functionfactorial(n)
result← 1
whilen > 1
result← result * n
n← n - 1
returnresult
誠然,在不使用遞迴的情況下執行factorial 函式將消耗較少的計算資源,但仍然沒有理由因此而改變程式碼。現代編譯器將自動重寫簡單的遞迴函式,舉例如下。
i← x + y + 1
j← x + y
為避免進行兩次x+y 計算,編譯器將上述程式碼重寫為:
t1← x + y
i← t1 + 1
j← t1
應專註於編寫清晰且自解釋的程式碼。如果效能出現問題,可以利用分析工具尋找程式碼中的瓶頸,並嘗試改用更好的方法計算存在問題的程式碼。此外,避免在不必要的微操作上浪費太多時間。
但在某些情況下,我們希望跳過編譯,接下來將對此進行討論。
手稿語言
某些語言在執行時並未被直接編譯為機器碼,這些語言稱為手稿語言,包括JavaScript、Python 以及Ruby。在手稿語言中,程式碼由直譯器而非CPU 執行,直譯器必須安裝在執行程式碼的機器中。
直譯器即時轉譯並執行程式碼,因此其執行速度通常比編譯後的程式碼慢得多。但另一方面,程式設計師隨時都能立即執行程式碼而無須等待編譯過程。
對於規模極大的計畫,編譯可能耗時數小時之久。
Google 工程師必須不斷編譯大量程式碼,導致程式設計師「損失」了很多時間(圖7-9)。由於需要保證編譯後的二進制檔有更好的效能,Google 無法切換到手稿語言。公司為此開發了Go 語言,它的編譯速度極快,同時仍然保持很高的效能。
反組譯與逆向工程
給定一個已編譯的電腦程式,無法在編譯之前恢復其原始碼。但我們可以對二進制程式解碼,將用於編碼CPU 指令的數位轉換為人類可讀的指令序列。這個過程稱為反組譯。
接下來,可以檢視這些CPU 指令,並嘗試分析它們的用途,這就是所謂的逆向工程。某些反組譯程式對這一過程大有裨益,它們能自動檢測並註釋系統呼叫與常用函式。借由反組譯工具,黑客對二進制程式碼的各個環節了如指掌。我相信,許多頂尖的IT 公司都設有秘密的逆向工程實驗室,以便研究競爭對手的軟體。
地下黑客經常分析Windows、Photoshop、【俠盜獵車手】等授權程式中的二進制程式碼,以確定哪部份程式碼負責驗證軟體授權證。黑客將二進制程式碼修改,在其中加入一條指令,直接跳轉到驗證授權證後執行的程式碼部份。執行修改後的二進制程式碼時,它在檢查授權證前獲取註入的JUMP 命令,從而可以在沒有付費的情況下執行非法的盜版副本。
在秘密的政府情報機構中,同樣設有供安全研究人員與工程師研究iOS、Windows、IE 瀏覽器等流行消費者軟體的實驗室。他們尋找這些程式中可能存在的安全漏洞,以防禦網路攻擊或對高價值目標的入侵。在這類攻擊中,最知名的當屬「震網」病毒,它是美國與以色列情報機構研制的一種網路武器。透過感染控制地下融合反應堆的電腦,「震網」延緩了伊朗核計劃。
開源軟體
如前所述,我們可以根據二進制可執行檔分析有關程式的原始指令,但無法恢復用於生成二進制檔的原始原始碼。
在沒有原始原始碼的情況下,即使可以稍許修改二進制檔以便以較小的方式破解,實際上也無法對程式進行任何重大更改(如添加新功能)。一些人推崇協作構建程式碼的方式,因此將自己的原始碼開放供他人修改。「開源」的主要概念就在於此:所有人都能自由使用與修改的軟體。基於Linux 的作業系統(如Ubuntu、Fedora 與Debian)是開源的,而Windows 與macOS 是閉源的。
開源作業系統的一個有趣之處在於,任何人都可以檢查原始碼以尋找安全漏洞。現已證實,政府機構透過日常消費者軟體中未修補的安全漏洞,對數百萬平民進行利用和監視。
但對開源軟體而言,程式碼受到的關註度更高,因此惡意的第三方與政府機構很難植入監控後門程式。使用macOS 或Windows 時,使用者必須相信Apple 或Microsoft 對自己的安全不會構成危害,並盡最大努力防止任何嚴重的安全漏洞。而開源系統置於公眾的監督之下,因此安全漏洞被忽視的可能性大為降低。
記憶體階層
我們知道,電腦的操作可以歸結為使CPU 執行簡單的指令,這些指令只能對儲存在CPU 寄存器中的數據操作。但寄存器的儲存空間通常被限制在1000 字節以內,這意味著CPU 寄存器與RAM 之間必須不斷進行數據傳輸。
如果記憶體存取速度過慢,CPU 將被迫處於空閑狀態,以等待RAM 完成數據傳輸。CPU 讀寫記憶體中數據所需的時間與電腦效能直接相關。提高記憶體速度有助於加快電腦執行,也可以提高CPU 存取數據的速度。CPU 能以近乎即時的速度(一個周期以內)存取儲存在寄存器中的數據,但存取RAM 則慢得多。
對於時脈為1 GHz 的CPU,一個周期的持續時間約為十億分之一秒,這是光線從本書進入讀者眼中所需的時間。
處理器與記憶體之間的鴻溝
近年來的技術發展使得CPU 速度成倍增長。雖然記憶體速度同樣有所提高,但卻慢得多。CPU 與RAM 之間的這種效能差距稱為「處理器與記憶體之間的鴻溝」。我們可以執行大量CPU 指令,因此它們很「廉價」;而從RAM 獲取數據所需的時間較長,因此它們很「昂貴」。隨著兩者之間的差距逐漸增大,提高記憶體存取效率的重要性越發明顯。
現代電腦需要大約1000 個CPU 周期(1 微秒左右) 從RAM 獲取數據。這種速度已很驚人,但與存取CPU 寄存器的時間相比仍然較慢。減少計算所需的RAM 操作次數,是電腦科學家追求的目標。
在兩個面對面的人之間,聲波傳播需要大約10 微秒。
時間局部性與空間局部性
在嘗試盡量減少對RAM 的存取時,電腦科學家開始註意到兩個事實。
時間局部性:存取某個儲存地址時,可能很快會再次存取該地址。
空間局部性:存取某個儲存地址時,可能很快會存取與之相鄰的地址。
因此,將這些儲存地址保存在CPU 寄存器中,有助於避免大部份對RAM的「昂貴」操作。不過在設計CPU 芯片時,工業工程師並未找到可行的方法來容納足夠多的內部寄存器,但他們仍然發現了如何有效地利用時間局部性與空間局部性。接下來將對此進行討論。
一級緩存
可以構建一種整合在CPU 內部且速度極快的輔助記憶體,這就是一級緩存。將數據從一級緩存讀入寄存器,僅比直接從寄存器獲取數據稍慢。
利用一級緩存,我們將可能存取的儲存地址中的內容復制到CPU 寄存器附近,借此以極快的速度將數據載入CPU 寄存器。將數據從一級緩存讀入寄存器僅需大約10 個CPU 周期,速度是從RAM 獲取數據的近百倍。
借由10 KB 左右的一級緩存,並合理利用時間局部性與空間局部性,超過一半的RAM 存取呼叫僅透過緩存就能實作。這一創新使計算技術發生了翻天覆地的變化。一級緩存可以極大縮短CPU 的等待時間,使CPU 將更多時間用於實際計算而非處於空閑狀態。
二級緩存
提高一級緩存的容量有助於減少從RAM 獲取數據的操作,進而縮短CPU 的等待時間。但是,增大一級緩存的同時也會降低它的速度。在一級緩存達到50 KB 左右時,繼續增加其容量就要付出極高的成本。更好的方案是構建一種稱為二級緩存的緩存。二級緩存的速度稍慢,但容量比一級緩存大得多。現代CPU 配備的二級緩存約為200 KB,將數據從二級緩存讀入CPU 寄存器需要大約100 個CPU 周期。
我們將最有可能存取的地址復制到一級緩存,較有可能存取的地址復制到二級緩存。如果CPU 沒有在一級緩存中找到某個儲存地址,仍然可以嘗試在二級緩存中搜尋。僅當該地址既不在一級緩存、也不在二級緩存中時,CPU 才需要存取RAM。
目前,不少制造商推出了配備三級緩存的處理器。三級緩存的容量比二級緩存大,雖然速度不及二級緩存,但仍然比RAM 快得多。一級/ 二級/ 三級緩存非常重要,它們占據了CPU 芯片內部的大部份矽片空間。見圖7-11。
使用一級/ 二級/ 三級緩存能顯著提高電腦的效能。在配備200 KB的二級緩存後,CPU 發出的儲存請求中僅有不到10% 必須直接從RAM獲取。
讀者今後購買電腦時,對於所挑選的CPU,請記住比較一級/ 二級/三級緩存的容量。CPU 越好,緩存越大。一般來說,建議選擇一款時脈稍低但緩存容量較大的CPU。
第一級記憶體與第二級記憶體
如前所述,電腦配有不同型別的記憶體,它們按階層排列。效能最好的記憶體容量有限且成本極高。沿階層向下,可用的儲存空間越來越多,但存取速度越來越慢。
在記憶體階層中,位於CPU 寄存器與緩存之下的是RAM,它負責儲存當前執行的所有行程的數據與程式碼。截至2017 年,電腦配備的RAM 容量通常為1 GB 到10 GB。但在許多情況下,RAM 可能無法滿足作業系統以及所有運行程式的需要。
因此,我們必須深入探究記憶體階層,使用位於RAM 之下的硬碟。截至2017 年,電腦配備的硬碟容量通常為數百吉字節,足以容納當前執行的所有程式數據。如果RAM 已滿,當前的空閑數據將被移至硬碟以釋放部份記憶體空間。
問題在於,硬碟的速度非常慢,它一般需要100 萬個CPU 周期(1 毫秒)a 在磁盤與RAM 之間傳輸數據。從磁盤存取數據看似很快,但不要忘記,存取RAM 僅需1000 個周期,而存取磁盤需要100 萬個周期。RAM 通常稱為第一級記憶體,而儲存程式與數據的磁盤稱為第二級記憶體。
標準照片在大約4 毫秒內捕捉光線。
CPU 無法直接存取第二級記憶體。執行保存在第二級記憶體中的程式之前,必須將其復制到第一級記憶體。實際上,每次啟動電腦時,即便是作業系統也要從磁盤復制到RAM,否則CPU 無法執行。
確保RAM 永不枯竭
在典型活動期間,確保電腦處理的所有數據與程式都能載入RAM 至關重要,否則電腦將不斷在磁盤與RAM 之間交換數據。由於這項操作的速度極慢,電腦效能將嚴重下降,甚至無法使用。這種情況下,電腦不得不花費更多時間等待數據傳輸,而無法進行實際的計算。
當電腦不斷將數據從磁盤讀入RAM 時,則稱電腦處於抖動模式。必須對伺服器進行持續監控,如果伺服器開始處理無法載入RAM 的數據,那麽抖動可能會導致整個伺服器崩潰。銀行或收銀機前將因此排起長隊,而服務員除了責怪發生抖動的電腦系統之外別無他法。記憶體不足或許是導致伺服器故障的主要原因之一。
外部記憶體與第三級記憶體
我們繼續沿記憶體階層向下分析。在連線到網路之後,電腦就能存取由其他電腦管理的記憶體。它們要麽位於本地網路,要麽位於因特網(即雲端)。但存取這些數據所需的時間更長:讀取本地磁盤需要1 毫秒,而獲取網路中的數據可能耗時數百毫秒。網路包從一台電腦傳輸到另一台電腦大約需要10 毫秒,如果經由因特網傳輸則需要200 毫秒到300 毫秒,與眨眼的時間相仿。
位於記憶體階層底部的是第三級記憶體,這種儲存裝置並非總是線上與可用的。在盒式磁帶或CD 中儲存數百萬吉字節的數據成本較低,但存取這類介質中的數據時,需要將介質插入某種讀取裝置,這可能需要數分鐘甚至數天之久(不妨嘗試讓IT 部門在周五晚上備份磁帶中的數據……)。有鑒於此,第三級記憶體僅適合歸檔很少存取的數據。
儲存技術的發展趨勢
一方面,很難顯著改進「快速」記憶體(位於記憶體階層頂端)所用的技術;另一方面,「慢速」記憶體的速度越來越快,價格也越來越低。幾十年來,硬碟儲存的成本一直在下降,這種趨勢似乎還將持續下去。
新技術也使磁盤的速度得以提高。人們正從旋轉磁盤轉向固態硬碟(SSD),它沒有動件,因而更快、更可靠且更省電。
采用SSD 技術的磁盤正變得越來越便宜且越來越快,但其價格仍然不菲。有鑒於此,一些制造商推出了同時采用SSD 與磁技術的混合磁盤。後者將存取頻率較高的數據儲存在SSD 中,存取頻率較低的數據儲存在速度較慢的磁盤中。當需要頻繁存取原先不經常存取的數據時,則將其復制到混合驅動器中速度較快的SSD。這與CPU 利用內部緩存提高RAM 存取速度的技巧頗為類似。
-End-
讀到這裏說明你喜歡本公眾號的文章,歡迎 置頂(標星)本公眾號 Linux技術迷,這樣就可以第一時間獲取推播了~
在本公眾號,後台回復:Linux,領取2T學習資料 !
推薦閱讀
1.
2.
3.
4.