1. 程式人生 > >每個程式設計師都應該瞭解的記憶體知識1——記憶體概述

每個程式設計師都應該瞭解的記憶體知識1——記憶體概述

1、概述

    早期的計算機很簡單,它的各種元件如CPU、記憶體、大容量儲存和網路介面都是一起開發的,所以效能差不多。舉個例子來說,記憶體和網路介面提供資料的速度不會比CPU快多少。

    這種情況隨著計算機基本結構的固化和各子系統的優化慢慢地發生了改變。其中一些元件的效能開始落後,成為系統的瓶頸。特別是大容量儲存和記憶體子系統,由於成本的原因,它們的發展嚴重滯後了。

    大容量儲存的效能問題往往靠軟體來改善:作業系統將最常用(且最有可能被用到)的資料放在主存中,因為後者的速度要比硬碟快上幾個數量級。儲存裝置中增加了快取,這樣就可以在不修改作業系統的前提下提升效能。(但是為了在使用快取時保證資料的完整性,仍然要作出一些修改。)這些內容不在本文的談論範圍之內,就不作贅述了。

    與大容量儲存不同,解決記憶體的瓶頸問題更為困難,幾乎每種方案都需要對硬體作出修改。目前,這些修改主要包括以下這些方式:

  • RAM的硬體設計(速度與併發度)
  • 記憶體控制器的設計
  • CPU快取
  • 裝置的直接記憶體訪問(DMA)

    本文主要關心的是CPU快取和記憶體控制器的設計。在討論這些問題的過程中,我們還會研究DMA。不過,我們首先會從當今商用硬體的設計談起。這有助於我們理解目前在使用記憶體子系統時可能遇到的問題和限制。我們還會詳細介紹RAM的分類,並說明為什麼會存在這麼多不同型別的記憶體。

    本文並不會包括所有內容,也不是最終版本。我們的討論範圍僅止於商用硬體,而且只限於其中的一小部分。另外,本文中的許多論題只會點到為止。大家可以閱讀關於這些論題的其它文件,以獲得更詳細的說明。

    當本文提到作業系統特定的細節和解決方案時,針對的都是Linux,不會包含其他作業系統的資訊,作者無意討論其他作業系統的情況。如果讀者認為他/她不得不使用別的作業系統,那麼必須去要求供應商提供其作業系統類似於本文的文件。

    在開始之前最後的一點說明,本文包含大量的“經常”和別的類似的限定詞。這裡討論的技術在現實中有很多不同的實現,所以本文只闡述使用得最廣泛最主流的版本,在闡述中很少用到絕對的限定詞。

1.1 文件結構