天天看點

Cache 的基本概念與工作原理

1.背景知識

随着 CPU 技術的飛速發展,常用的處理器飛奔在越來越高的頻率之上,雖然處理器的速度越來越快,但是與之相比對的存儲器的速度卻沒有獲得相應的提升,這大大限制了 CPU 的處理性能。而我們本系列文檔所介紹的主角 Cache 技術就是用來解決這個難題的。

在 ARM 釋出 Cortex-M7 架構之後,微控制器領域也出現了頻率高達數百兆的晶片,如 ST 的 STM32F7 系列和 NXP 的 i.MX RT 系列晶片,這些晶片内的處理器都自帶 cache,在合理配置下可以表現出十分強悍的資料處理性能。那麼什麼是 cache?如何利用這一新特性編寫高性能的程式?又有什麼要注意的地方嗎?你可能會有上述這些疑問,别擔心,本系列文章将會為你一一解答。

本系列文章分為三篇,第一篇為 《cache 的基本概念與工作原理》,講解 cache 相關的基礎知識。第二篇為《STM32F7 Cache 介紹與實戰》,講解如何在 STM32F7 系列晶片上使用 cache,并編寫程式進行性能測試。第三篇為《Cache 的一緻性問題與使用技巧》,将會介紹 cache 的資料一緻性問題和使用 cache 過程中的一些技巧。下面我們從 cache 的基礎知識開始,了解這一強大的特性吧。

想要了解 cache 的工作原理,就必須要了解計算機系統中資料的存儲方式。

在計算機中程式執行時所有的指令和資料都是從存儲器中取出來執行的。存儲器是計算機系統中的重要組成部分,相當于計算機的倉庫,用來存放各類程式及其處理的資料。是以存儲器的容量和性能應當随着處理器的速度和性能的提高而通過提高,以保持系統性能的平衡。

然而在過去的 20 多年中,随着時間的推移,處理器和存儲器在性能發展上的差異越來越大,存儲器在容量尤其是通路延時方面的性能增長越來越跟不上處理器性能發展的需要。為了縮小存儲器和處理器兩者之間在性能方面的差距,通常在計算機内部采用階層化的存儲器體系結構。

Cache 的基本概念與工作原理

從上圖可以看到,速度越快則容量越小、越靠近 CPU。CPU 可以直接通路内部存儲器。而外部存儲器的資訊則要先取到主存,然後才能被 CPU 通路。CPU 執行指令時,需要的操作數大部分來自寄存器,當需要對存儲器進行讀寫操作時,先通路 cache ,如果不在 cache 中,則通路主存,如果不在主存中,則通路硬碟。此時,操作數從硬碟中讀出送到主存,然後從主存送到 cache。

資料使用時,一般隻在相鄰兩層之間複制傳送,而且總是從慢速存儲器複制到快速存儲器。傳送的機關是一個定長塊,是以需要确定定長塊的大小,并且在相鄰兩層間建立塊之間的映射關系。

在我們接觸的嵌入式系統中,具體的存取時間和存儲容量的大小可能和上圖不符,但是不同層級之間的量級對比還是一緻的。

3. 為什麼需要 Cache?

由于 CPU 和主存所使用的半導體器件工藝不同,兩者速度上的差異導緻快速的 CPU 等待慢速的存儲器,為此需要想辦法提高 CPU 通路主存的速度。除了提高 DRAM 晶片本身的速度和采用并行結構技術以外,加快 CPU 訪存速度的主要方式之一是在 CPU 和主存之間增加高速緩沖器,也就是我們主角 Cache。

Cache 的基本概念與工作原理

Cache 位于 CPU 和記憶體之間,可以節省 CPU 從外部存儲器讀取指令和資料的時間。

4. 基本概念

程式通路的局部性

對大量典型程式運作情況分析的結果表明,在較短的時間間隔内,程式産生的位址往往集中在存儲空間的一個很小範圍,這種現象稱為程式通路的局部性。這種局部性可細分為時間局部性和空間局部性。時間局部性是指被通路的某個存儲單元在一個較短的時間間隔很可能又被通路。空間的局部性是指通路的某個存儲單元的臨近單元在一個較短的時間間隔内很可能也被通路。

Instruction Cache

指令 cache 隻被用于緩存指令,從外部存儲器讀取指令需要很長時間,如果外部存儲器是 flash,那麼 CPU 可能需要 50-100ns 才能獲得指令。

Data Cache

資料 cache 隻被用于緩存資料,和指令 cache 類似,CPU 要花費很長時間才能從外部的 SRAM 或者 SDRAM 取回資料。

5. 工作原理

cache 是一種小容量高速緩沖存儲器,由快速的 SRAM 組成,直接制作在 CPU 晶片内,速度較快,幾乎與 CPU 處于同一個量級。在 CPU 和主存之間設定 cache,總是把主存中被頻繁通路的活躍程式塊和資料塊複制到 cache 中。由于程式通路的局部性,大多數情況下,CPU 可以直接從 cache 中直接取得指令和資料,而不必通路慢速的主存。

為了友善 cache 和主存間交換資訊,cache 和主存空間都被劃分為相等的區域。例如将主存中一個 512 個位元組的區域稱作一個塊(block),cache 中存放一個主存塊的區域稱作行(line)。

cache 的行有效位

系統啟動時,每個 cache 行都為空,其中的資訊無效,隻有 cache 行中裝入了主存塊之後才有效。為了說明 cache 行中的資訊是否有效,某一個行都有一個有效位。通過将一行的有效位清零來淘汰這一行中所存儲的主存快的操作稱為沖刷,也就是我們常說的刷 cache。

CPU 在 cache 中的通路過程

在 CPU 執行程式過程中,需要從主存取指令或寫資料時,先檢查 cache 中有沒有要通路的資訊,若有,就直接在 cache 中讀寫,而不用通路主存儲器。若沒有,再從主存中把目前通路資訊所在的一個一個主存塊複制到 cache 中。是以,cache 中的内容是主存中部分内容的副本。下圖展示了帶 cache 的 CPU 執行一次訪存操作的過程。

Cache 的基本概念與工作原理

cache 與主存的平均通路時間

如上圖所示的訪存過程中,需要判斷所通路的資訊是否在 cache 中。若 CPU 通路單元的主存塊在 cache 中,則稱 cache 命中(hit),命中的機率稱為命中率 p (hit rate)。若不在 cache 中,則為不命中(miss),其機率為缺失率(miss rate)。命中時,CPU 在 cache 中直接存取資訊,所用的時間開銷就是 cache 的通路時間 Tc,稱為命中時間。缺失時,需要從主存讀取一個主存塊送 cache,并同時将所需資訊送 CPU,是以所用時間為主存通路時間 Tm,和 cache 通路時間 Tc 之和。通常把從主存讀入一個主存塊到 cache 的時間 Tm 稱為缺頁損失。

CPU 在 cache 和主存層次的平均通路時間為:

<code>Ta = p * Tc + (1 - p) * (Tm + Tc) = Tc + (1 - p) * Tm</code>

由于程式通路的局部性特點,cache 的命中率可以達到很高,接近于 1。是以,雖然缺頁損失所耗費的時間遠遠大于命中時間,但最終的平均通路時間仍可接近 cache 的通路時間。

cache 的映射方式

cache 行中的資訊取自主存中的某個塊。将主存塊複制到 cache 行時,主存塊和 cache 行之間必須遵循一定的映射規則。這樣 CPU 在要通路某個主存單元時,可以依據映射規則到 cache 對應的行中查找要通路的資訊,而不用在整個 cache 中查找。

根據不同的映射規則,主存塊和 cache 行之間有以下三種映射方式。

目前我們常見的 CPU 一般都采用的組相連的映射方式,組相連的映射方式将前兩種映射方式取長補短,獲得了優異的性能和較低的硬體實作難度。在這裡不再展開仔細描述,感興趣的小夥伴可以通過搜尋閱讀相關内容來了解其中的細節。

直接映射(direct):每個主存塊映射到 cache 的固定行中。

全相連映射(full associate):每個主存塊映射到 cache 的任意行中。

組相連映射(set associate):每個主存塊映射到 cache 的固定組的任意行中。

值得注意的是,cache 對程式員在編寫進階或低級語言程式時是透明的,是以程式員無需了解 cache 是否存在或者如何設定,感覺不到 cache 的存在。但是對 cahche 的深入了解有助于編寫出高效的程式!

在下一篇中,我們将在 STM32F767 開發闆上運作 RT-Thread 的 stm32f767-atk-apollo BSP,開啟 cache 功能,并編寫不同情況下的性能測試程式。

Cache 的基本概念與工作原理

NOW現在行動!

Cache 的基本概念與工作原理

RT-Thread

讓物聯網終端的開發變得簡單、快速,晶片的價值得到最大化發揮。Apache2.0協定,可免費在商業産品中使用,不需要公布源碼,無潛在商業風險。

長按二維碼,關注我們