1. 引言

早期的電腦相對簡單,系統中的各個元件,如 CPU、記憶體、大容量儲存裝置 (mass storage) 及網路介面 (network interface),在相近時間發展,因此在效能表現相對平衡。 以資料存取為例,記憶體和網路介面的速度儘管不若 CPU 快,但差異不顯著。

隨著電腦基礎結構的穩定及硬體開發者專注於最佳化獨立的子系統,這種情況發生變化:一些電腦元件的效能突然大幅落後,成為系統的瓶頸。 尤其是大容量儲存裝置和記憶體,由於成本的限制,與其他系統相比,改進相對緩慢。

大容量儲存裝置的效能問題主要藉由軟體技術解決:作業系統 (operating system) 將最常使用 (且最有可能使用) 的資料保存在主記憶體 (main memory) 中, 其存取速度比硬碟 (hard disk) 快了幾個數量級。 此外,快取也加到儲存裝置中,以提升效能,這不需要對作業系統進行任何改變1。 由於偏離本文的主旨,我們不會深入探討有關大型儲存裝置存取的軟體最佳化細節。

相較於儲存子系統,解決主記憶體的瓶頸被證實更加困難,因為幾乎所有的解決方法都需要改變硬體。 目前有以下主要方式來改善主記憶體的效能:

  • RAM 的硬體設計,包括速度和平行度 (parallelism) 的提升
  • 記憶體控制器(controller)的設計改進
  • CPU 快取的運用
  • 裝置的直接記憶體存取 (Direct Memory Access,簡稱 DMA)

本文主要涉及 CPU 快取和記憶體控制器設計對系統性能的影響,探索這些主題的過程中,我們將深入了解直接記憶體存取 (DMA)。 不過,我們首先需要從現今商用硬體的設計概觀開始,這是理解如何高效使用記憶體子系統以及其限制的必要條件。 同時,我們也提及不同類型的 RAM,以及為何這些差異仍然存在。

值得一提的是,本文件並非最終且完整的版本,僅涵蓋商用硬體的一個子集,且許多主題的討論僅止於基本概念。 對於這些主題,建議讀者參照更詳盡的文件。

提及特定作業系統的細節和解決方法時,本文僅針對 Linux,不會包含其他作業系統的任何資訊,作者無意詳述其他作業系統。 若讀者覺得需要使用不同的作業系統,建議參照相應供應商所提供的文件。

最後,本文中多處使用「通常」和類似修飾詞,討論的技術在現實世界中存在許多不同的變體,本文僅針對最常見且主流的版本進行討論。 因此,這些技術往往沒有絕對的答案或解決方案。

文件結構

本文主要針對軟體開發者撰寫,不細究對於硬體方向讀者有用的硬體技術細節。 然而,談及能為開發者提供實用資訊之前,有一些基礎知識是必要的。

為了達到這個目標,第二節將以技術細節介紹隨機存取記憶體 (Random-Access Memory,簡稱 RAM),這一節的內容值得一讀,但對於後面幾節的理解並非必要。 在需要這節內容的地方,我們會提供相應的引用 (back reference),所以急於掌握主題的讀者可暫時略過本節的大部分內容。

第三節描述多項 CPU 快取行為的細節。為了避免冗長的文字,我們將使用一些圖表來說明。 這一節的內容對於理解後續章節是必不可少的。 第四節簡要介紹虛擬記憶體 (virtual memory) 的實作方式,這也是後續內容的基礎。

第五節則詳細論述了非均勻記憶體存取 (Non-Uniform Memory Access,簡稱 NUMA) 系統的細節。

第六節是本文的關鍵章節,將整合前幾節的知識,並向程式開發者提供如何在不同情境下撰寫高效程式的建議。 對於非常急切的讀者,可從這一節開始,並在需要時回顧前幾節的基礎知識。

第七節介紹一些能夠幫助程式開發者提升效能的工具。 即使完全理解這些技術,解決複雜軟體專案的問題仍然遠遠不夠,因此某些工具是必要的。

最後,在第八節中,我們將展望未來幾年中可期待或希望擁有的技術發展。

回報問題

作者有意更新這份文件一段時間,包括隨著技術的進展而進行更新,及修正錯誤。 如果讀者願意回報問題,請透過電子郵件與作者聯繫,並於回報中提供精確的版本資訊,這些資訊可以在文件的最後一頁找到。 非常感謝您的貢獻!

致謝

作者要特別感謝 Johnray Fuller 及 LWN 的團隊成員們 (尤其是 Jonathan Corbet 承擔著改寫為典雅英文風格的艱鉅任務)。 同時,也要感謝 Markus Armbruster 為本文提供許多寶貴的建議,指出其中的問題和疏漏。

關於本文

本文標題〈What Every Programmer Should Know About Memory〉向 David Goldberg 的經典論文〈What Every Computer Scientist Should Know About Floating-Point Arithmetic〉致敬。 儘管該論文鮮少人知,然而它闡述任何致力於嚴謹地撰寫程式的人的先備知識。

1. 然而,為確保在使用儲存裝置快取時的資料完整性 (data integrity),必須進行相應的改變。

results matching ""

    No results matching ""