天天看點

《現代體系結構上的UNIX系統:核心程式員的對稱多處理和緩存技術(修訂版)》——第2章 高速緩存存儲系統概述 2.1存儲器層次結構

本節書摘來自異步社群《現代體系結構上的unix系統:核心程式員的對稱多處理和緩存技術(修訂版)》一書中的第2章,第2.1節,作者:【美】curt schimmel著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

高速緩存存儲系統(cache memory system)是高速存儲器,它能夠利用引用的局部性來提高系統性能。本章解釋了高速緩存的基本術語、規劃和操作,闡述了高速緩存是如何配合主存儲器運作的,以及高速緩存中的資料是如何定位的。本章還介紹了雜湊演算法(hashing algorithm)、缺失處理(miss processing)、寫政策(write policy)、替換政策(replacement policy)以及組相聯(set associativity)。本章主要着眼于單處理器系統的高速緩存,多處理器高速緩存将在第三部分中進行介紹。到本章結束的時候,讀者會對高速緩存的操作非常熟悉,可以在後面的章節中開始研究作業系統的問題了。

現代體系結構上的unix系統:核心程式員的對稱多處理和緩存技術(修訂版)

高速緩存是一種高速存儲系統,它儲存有主存儲器很小的一個子集的内容。它的實體位置介于主存儲器和cpu之間。因為它比主存儲器速度快,是以如果頻繁使用的指令和資料能夠儲存在高速緩存中供cpu存取,那麼就有可能提高系統的性能。圖2-1給出了包含高速緩存的一個計算機系統的邏輯框圖。

《現代體系結構上的UNIX系統:核心程式員的對稱多處理和緩存技術(修訂版)》——第2章 高速緩存存儲系統概述 2.1存儲器層次結構

高速緩存利用引用的局部性(locality of reference)來改善系統性能。引用局部性是大多數程式所表現出來的一種屬性,在這些程式中,在一個特定的時間段内,程式指令和資料的一個相當小的子集被頻繁地重複引用。如果能夠把程式目前的局部引用儲存在高速緩存中,那麼程式就能執行得更快,因為高速緩存可以比主存儲器更快地提供指令和資料。

高速緩存隻是存儲器層次結構(memory hierarchy)中的一個組成部分。這個存儲結構的一端是磁盤存儲器,它具有非常高的密度,很低的每位成本,而存取速度則(相對)較慢。另一端是cpu内的寄存器,在數量上隻有幾個,具有很高的每位成本,但是存取速度極快。随着我們從磁盤存儲器過渡到寄存器,機關成本逐漸增加,存取速度逐漸加快,而密度卻逐漸降低。

虛拟存儲器調頁系統(paging system)已經顯示出隻占系統中所有程序所使用的全部虛拟存儲空間大小若幹分之一的主存儲器系統是怎樣提供良好的整體性能的。引用的局部性通過隻要求一個程序目前的工作集(working set)駐留記憶體使之成為可能,工作集是那些包含有程序目前局部引用位置的存儲頁面。程序位址空間的其他部分則可以儲存在磁盤上,直到需要的時候再加載。

引用局部性延伸到了比工作集更細的粒度上。在一個程序工作集的頁面内,肯定會有一組指令和變量在一段極短的時間内被一個程式頻繁地重複引用。例如,考慮圖2-2中計算矩陣a和b乘積的c代碼小片段。假定a是一個m×r矩陣,而b是一個r×n矩陣,c的全部元素都初始化為0。

《現代體系結構上的UNIX系統:核心程式員的對稱多處理和緩存技術(修訂版)》——第2章 高速緩存存儲系統概述 2.1存儲器層次結構

在這段代碼執行的同時,它重複引用了3個循環内的指令、矩陣的元素以及循環計數器。這就是當這段代碼在執行時程式的局部引用。由于矩陣包含的資料比寄存器能儲存的資料多,是以如果沒有高速緩存,cpu就不得不重複引用主存儲器,進而将這部分程式的執行速度限制在了主存儲器的存取時間上。

圖2-2中有兩種類型的局部性:時間的(temporal)和空間的(spatial)。時間局部性是程式有可能重複使用近期引用過的項的屬性。例如,在執行最裡面的一層循環期間,數組c的同一個元素會被引用兩次,循環變量i、j和k也是如此。類似地,在所有三層循環中的指令也會被重複引用。所有這些引用都展現出了時間局部性。空間局部性是程式有可能重複使用前面附近引用過的項的屬性。由于c語言中的數組都是按照行的順序儲存的,是以數組a和c都展現出了空間局部性,因為會在後面的疊代中通路到行中的下一個鄰接元素。類似地,串行程式的執行表現出了高度的空間局部性。

主存儲器系統速度的提高和成本的降低并不能跟上如今高速cpu的發展速度。如果cpu的速度和主存儲器的存取時間遠遠不能平衡,這意味着存儲器要比cpu執行指令以及加載和儲存資料的能力慢得多,那麼cpu就會受到存儲器速度的限制。在這樣的情況下,提高cpu的速度對于改善系統的整體性能來說幾乎沒有什麼幫助,因為存儲系統仍然是限制因素。雖然人們可以制造大規模的高速主存儲器系統,它們的存取時間能夠同cpu加載和儲存資料的能力相媲美,但是這種存儲系統對于高端大型機和超級計算機以外的系統來說往往太貴了。當今很多系統設計人員所采取的另一種選擇是使用高速緩存。

通過利用細粒度的引用局部性,高速緩存能夠彌補速度較慢的主存儲系統和快速的cpu之間的鴻溝。在存儲器層次結構中,每一級引用局部性的應用情況如圖2-1所示。正如主存儲器隻儲存了程式的一個子集(工作集)那樣,寄存器儲存了目前運算的操作數,高速緩存儲存了正在工作的指令和變量集,在那之上形成了細粒度的局部引用。由于引用的局部性,高速緩存隻需要擁有主存儲器的很小一部分就能夠發揮效用。由于它的規模相對較小,是以實際上可以使用比主存儲器所采用的速度更快的儲存設備,因為并不需要太多的高速緩存。于是,高速緩存的高速度與對引用局部性的利用相結合就能大幅提高系統性能,同時在經濟上也很劃算。

繼續閱讀