深入理解計算機系統_第六章_存儲器層次結構

章前導讀

到目前我們只看到了一個簡化的計算機系統模型,其中CPU執行指令,而存儲器系統爲CPU存放指令和數據,實際上存儲器系統是一個具有不同容量、成本和訪問時間的存儲設備的層次結構。CPU寄存器保存最常用的數據;靠近CPU的小的、快速的高速緩存存儲器作爲一部分存儲在相對慢速的主存儲器中數據和指令的緩衝區域;主存儲器存儲在容量較大的、慢速磁盤上的數據,這些磁盤可以作爲存儲在通過網絡連接的其他機器的磁盤上的數據的緩衝區域。
如果理解了系統是如何將數據在存儲器層次結構中上上下下移動的,那麼你就可以編寫自己的應用程序,使它們的數據項存儲在層次結構中較高的地方,在那裏CPU能更快地訪問到它們。
這個思想稱爲局部性。具有良好局部性的程序運行的更快,因爲它傾向於一次次地訪問相同的數據項集合,或相鄰的數據項集合。比如,Core i7系統,不同的矩陣乘法核心程序執行相同數量的算術操作,在不同局部性下,運行時間相差40倍。
接下來介紹一些基本的存儲即使——SRAM、DRAM、ROM以及旋轉的和固態的硬盤——並描述它們如何被組織成層次結構。我們將特別關注高速緩存存儲器,它在CPU和主存之間,對程序性能影響最大。

存儲技術

計算機技術的成功跟大程度源自於存儲技術的巨大進步

隨機訪問存儲器

隨機訪問存儲器(Random-Access Memory,RAM)分兩類:靜態(SRAM)和動態(DRAM)。SRAM比DRAM更快,也更貴。SRAM用來作爲高速緩存存儲器。DRAM用來作爲主存,以及圖形系統的幀緩衝區。
1.SRAM
SRAM的每個維存儲在一個雙穩態存儲器單元中,這種單元用六晶體管實現,並且可以無限期的保持在兩個不同狀態之一。所以只要有電,它就永遠保持它的值。即使有干擾來擾亂電壓,當干擾消除,電路就會恢復到穩定值。
2.DRAM
DRAM將每個位存儲爲對一個電容的充電。所以DRAM存儲器單元對干擾非常敏感,被擾亂後就永遠不會恢復,暴露在光線下會導致電容電壓改變(數碼相機和攝像機的傳感器本質上就是DRAM單元陣列)。DRAM很容易漏電,導致數據丟失,所以內存系統必須週期性的讀出-重寫來刷新內存每一位。
在這裏插入圖片描述
3.傳統DRAM
電路設計者把DRAM組織成了二維陣列而不是線型數組的一個原因是降低芯片上地址引腳的數量。比如128位(16單元 * 8位)DRAM組織成線性數組的話,地址爲0 ~ 15,那麼需要4個地址引腳,如果是二維陣列,就只需要2個(先發從行地址,再發送列地址)。二維陣列組織的缺點是必須分佈發送地址,增加了訪問時間。
每個DRAM芯片連接到內存控制器的電路,這個電路可以一次傳送w位到每個DRAM芯片或一次從每個DRAM芯片傳出w位(對於16 * 8的DRAM,w = 8)。爲了讀出(i,j)位置的內容,內存控制器先發送行地址i到DRAM,這時DRAM會把這一行的所有數值存在內部行緩衝區中,再發送列地址j到DRAM,然後DRAM就在內部行緩衝區中取出對應列的數值,這樣DRAM就把(i,j)的內容發回給控制器了。行地址i稱爲RAS,列地址j稱爲CAS,RAS和CAS請求共享相同的DRAM地址引腳。
4.內存模塊
DRAM芯片封裝在內存模塊中,插到主板的擴展槽上。下圖是內存模塊的基本思想。在這裏插入圖片描述
要取出內存地址A處的一個字,內存控制器將A轉換成一個單元地址(i,j),並將地址發送到內存模塊,內存模塊將i和j廣播到每個DRAM。作爲響應,每個DRAM輸出它的(i,j)單元的8位內容。模塊中的電路收集這些輸出,並把它們整合爲一個64位字,再返回給內存控制器。
通過將多個內存模塊連接到內存控制器,能夠聚合成主存。這種情況下,當控制器收到一個地址A時,控制器選擇包含A的模塊k,將A轉換成它的(i,j)形式,並將(i,j)發送給模塊k。
5.增強DRAM
快頁模式(FPM DRAM),傳統的DRAM將一整行單元複製到內部行緩衝器中,使用一個,丟棄剩餘。FPM DRAM允許對同一行連續地訪問可以直接從行緩衝區得到,從而改進了這一點。
擴展數據輸出(EDO DRAM),這是FPM DRAM的增強,允許各個CAS信號在時間上靠近的更緊密。
同步(SDRAM),就它們與內存控制器通信使用一組顯式的控制信號來說,常規的、FPM和EDO DRAM都是異步的。SDRAM用與驅動內存控制器相同的外部時鐘信號的上升沿來代替許多這樣的控制信號,最終效果就是SDRAM能夠比那些異步存儲器更快的輸出它的單元內容。
雙倍數據速率同步(DDR SDRAM),DDR SDRAM是對SDRAM的一種增強,通過兩個時鐘沿作爲控制信號,從而使DRAM的速度翻倍。不同的DDR用提高有效帶寬的很小的預期緩衝區大小劃分:DDR(2位)、DDR2(4位)、DDR3(8位)
視頻RAM(VRAM),用於圖形系統的幀緩衝區中,它與FPM DRAM類似,兩個主要區別是:VRAM的輸出是通過依次對內部緩衝區的整個內容進行移位得到的;VRAM允許對內存並行讀寫。
6.非易失性存儲區
如果斷電,DRAM和SRAM會丟失信息,所以是易失的非易失性存儲區在斷電後,依然保存信息。ROM中有的類型既可以讀也可以寫,但是它們整體上被稱爲只讀寄存器(ROM)
可編程ROM PROM只能變成一次。
可擦寫可編程ROM(EPROM)可以擦除和編程1000次,而EEPROM可以達到100000次。
閃存基於EEPROM,它爲大量的電子設備提供快速而持久的非易失性存儲,比如手機,筆記本等。之後還會研究新型的基於閃存的磁盤驅動器,稱爲固態硬盤(SSD),相對於傳統旋轉磁盤,SSD更快速。
存儲在ROM設備中的程序通常被稱爲固件。當一個計算機系統通電後,它會運行存儲在ROM中的固件。
7.訪問主存
數據流通過稱爲總線的共享電子電路在處理器和DRAM主存之間來來回回。每次CPU和主存之間的數據傳送都是通過一系列步驟完成的。這些步驟稱爲總線事務。從主存傳數據到CPU是讀事務,從CPU到主存是寫事務。總線是一組並行導線,能攜帶地址、數據和控制信號。當然,可以根據總線的設計,數據和地址信號可以共享同一組導線,也可以使用不同的。兩個以上的設備也能共享同一總線。連接CPU和主存的總線結構示例如下:
在這裏插入圖片描述

磁盤存儲

磁盤是廣爲應用的保存大量數據的存儲設備,存儲數據可以達到幾百到幾千籤兆字節,而RAM存儲器只有幾百或幾千兆字節,但是磁盤讀取速度比DRAM滿了10萬倍,比SRAM慢100萬倍。
1.磁盤構造
磁盤是由盤片構成的,每個盤片有兩面,上面覆蓋磁性記錄材料。盤片中央有一個可以旋轉的主軸,它使得盤片以固定的旋轉速度旋轉。磁盤包含一個或多個這樣的盤片,封裝在一個密封容器內。
在這裏插入圖片描述
如上圖,每個表面由一組稱爲磁道的同心圓組成,每個磁道被劃分爲一組扇區。每個扇區包含相等數量的數據位,這些數據編碼在扇區上的磁性材料中。扇區之間由一些間隙分隔開,這些間隙中不存數據位,而用來標誌扇區的格式化位。磁盤由一個或多個疊放在一起的盤片組成,封裝在密封包裝中。整個裝置簡稱爲磁盤,也稱爲旋轉磁盤,以使之區別於基於閃存的固態硬盤。經常用柱面來描述多個盤片驅動器的構造,這裏,柱面是所有盤片表面上到主軸中心的距離相等的磁道的集合。例如,如果一個驅動器有3個盤片,即6個面,每個表面上的磁道的編號都一致,那麼柱面k就是6個磁道k的集合。
2.磁盤操作
磁盤用讀/寫頭來讀寫存儲位,而讀/寫頭連接到一個傳動臂一端,通過沿着半徑軸向前後移動這個傳動臂,就可以將讀/寫頭定位在盤面上的任何磁道上。
在這裏插入圖片描述
訪問一個磁盤扇區中512個字節的時間主要是尋道時間和旋轉延遲。訪問扇區中的第一個字節用了很長時間,但是訪問剩下的字節幾乎不用時間。尋道時間 * 2 可以等於磁盤訪問時間。

3.邏輯磁盤塊
磁盤控制器維護了一個邏輯塊號和物理磁盤扇區之間的映射關係,當OS想執行一個I/O時,比如讀一個磁盤數據到主存,OS會發送一個命令到磁盤控制器,讓它讀某個邏輯塊號。控制器上的固件執行一個快速表查找,將一個邏輯塊號翻譯成一個三元組(盤面,磁道,扇區),這個三元組唯一的標識了對應的物理扇區。控制器上的硬件會解釋這個三元組,將讀/寫頭移動到適當的柱面,等到扇區移動到讀/寫頭下,將讀/寫頭感知到的位放到控制器上的一個小緩衝區,然後將它們複製到主存中。
4.連接I/O設備
比如鼠標、鍵盤這種IO設備,都是通過IO總線連接到CPU和主存的。系統總線和內存總線是於CPU相關的,但是IO總線與底層CPU無關。、
5.訪問磁盤
CPU使用內存映射I/O來向IO設備發射命令。在使用內存映射IO的系統中,地址空間中有一塊地址是爲IO設備通信保留的,每個這樣的地址成爲IO端口。當一個設備連接到總線時,它與一個或多個端口相關聯。
當CPU從磁盤讀取數據時,CPU先把命令(讀/寫),邏輯塊號和目的內存地址發送到磁盤對應的內存映射地址,然後磁盤控制器按照指示讀取內容,並且直接將這些內容傳送給主存,不需要CPU干涉(這種設備可以自己執行讀寫而不需要CPU干涉的過程,稱爲直接內存訪問(DMA)),DMA完成後,磁盤控制器給CPU發一箇中斷,告訴CPU IO操作已經完成,圖示如下。
在這裏插入圖片描述
在這裏插入圖片描述

固態硬盤

SSD是基於閃存技術的存儲技術。SSD封裝插到IO總線上標準硬盤插槽(USB或SATA中),行爲就和其他硬盤一樣,處理來自CPU的讀寫邏輯磁盤塊的請求。在這裏插入圖片描述
對於SSD,讀比寫快很多。SSD相對於旋轉磁盤來說,好處是訪問時間塊,能耗低。反覆寫之後,閃存塊也會磨損,但一般要很多年才能磨損。

存儲技術趨勢

SRAM比DRAM快,而DRAM比磁盤快,當然越快越貴,SSD的價格和速度都位於DRAM和旋轉磁盤之間。

局部性

局部性通常有兩種不同形式:時間局部性空間局部性。時間局部性指被引用過一次的內存位置很快就被引用;空間局部性指一個內存被引用了,很快就會引用其附近的一個內存位置。
局部行好的程序運行得更快。而且到處都有這一原理的應用,在硬件上,局部行原理使得計算機引入了用來保存最近被引用指令和數據的高速緩存存儲器;在OS上,局部行原理允許OS使用主存作爲虛擬地址空間最近被引用塊的高速緩存;Web瀏覽器將最近被引用的文檔放在本地磁盤上等等

對數據程序引用的局部行

在這裏插入圖片描述
形如上面的數據循環,順序的訪問每一行的元素,就具有很好的空間局部性,但是完全沒有時間局部性(因爲每個元素只用了一次),這樣順序訪問一個向量每個元素的函數,具有步長爲1的引用模式,如果是每隔了k個元素進行訪問,就稱爲步長爲k的引用模式。來看看下面的例子:
在這裏插入圖片描述
這個函數顯然空間局部性很差,因爲每次都隔了N個元素。

取指令的局部性

程序指令是存放在內存中的,CPU必須取出這些指令,所以我們也能夠評價一個程序關於取指令的局部性。上述代碼循環體裏的指令是按照連續內存順序執行的,所以循環體有良好的空間局部性,而且循環體會被執行很多次,循環體也有很好的時間局部性(上面說完全沒有時間局部性是針對循環中的變量)。

局部性小結

1.重複引用相同變量的程序有良好的時間局部性
2.對於具有步長爲k引用模式的程序,k越小,空間局部性越好。在內存中以大步長跳來跳去的程序空間局部性很差,比如上面的第二個例子
3.對於取指令來說,循環有好的時間和空間局部性。循環體越小,循環迭代次數越多,局部性越好。

存儲器層次結構

在這裏插入圖片描述

存儲器層級結構的緩存

告高速緩存(cache)是一個小二快速的存儲設備,它作爲存儲在更大、也更慢的設備中的數據對象的緩衝區域。使用高速緩衝的過程稱爲緩存(caching)
存儲器層次結構的中心思想是,對於每個k,位於k層的更快更小的存儲設備作爲位於k+1層的更大更慢的存儲設備的緩存。換句話說,層次結構中的每一層都緩存來自較低一層的數據對象,如下圖。
在這裏插入圖片描述
第k + 1層的存儲器被劃分成連續的數據對象組塊,成爲。每個塊都有唯一地址或名字,每個塊可以固定大小,也可以變大變小。第k層的存儲器被劃分爲比較少的塊集合,每個塊的大小與k + 1層的塊的大小一樣。在任何時刻,第k層的緩存包含第k + 1層塊的一個子集的副本。比如上圖有第4、9、14、3的副本。
數據總是以塊大小爲傳送單元在第k層和第k + 1層之間來回複製。在L1到L0之間通常使用的是1個字大小的塊,L2和L1之間(L3和L2之間、L4和L3之間)通常是幾十個字大小的塊,L5和L4之間是大小爲幾百或幾千字節的塊。層次結構距CPU越遠的設備訪問時間越長,因此爲了補償這些較長的訪問時間,傾向於使用較大的塊。
1.緩存命中
當程序需要第k + 1層的某個數據對象d時,它首先在當前存儲在第k層的一個塊中查找d,如果d剛好緩存在第k層中,就稱爲緩存命中。那程序就直接從緩存中讀取d,比去第k + 1層讀d更快。
2.緩存不命中
如果第k層沒有緩存數據對象d,就稱爲緩存不命中。不命中時,第k層的緩存從第k + 1層緩存中取出包含d的那個塊,如果第k層的緩存已經滿了,可能就會覆蓋現存的一個塊,稱爲替換驅逐這個塊。決定該替換哪個塊是由緩存的替換策略來控制的。有的策略會替換掉最近最少使用的塊。
3.緩存不命中的種類
如果第k層緩存是空的,那任何數據都不會命中。空的緩存被稱爲冷緩存,這種不命中稱爲強制性不命中冷不命中
在出現了冷不命中後,緩存需要按照放置策略來把下一層緩存中的數據放置在本層的緩存中,如果用隨機放置成本太高,所以會強制一個或幾個塊,比如上面的圖示中,第k + 1層的塊0、4、8、12會映射到第k層的塊0;塊1、5、9、13會映射到塊1;以此類推。這種放置策略就引起了衝突不命中,比如程序請求塊0、然後塊8、然後塊0、然後塊8,以此類推,在第k層的緩存中,請求了塊0,接下來請求塊8就必然不命中,去k + 1層讀了塊8再作爲緩存後,接下來請求塊0也必然不命中,以此類推。
程序通常是按照一系列階段來運行,每個階段訪問緩存塊的某個相對穩定不變的集合。例如,嵌套循環可能反覆的訪問同一個數組的元素。這個塊的集合稱爲這個階段的工作集。當工作集大小超過了緩存大小,緩存就出現了容量不命中
4.緩存管理
每一層都需要某種邏輯來管理緩存,比如將緩存劃分成塊,在不同的層之間傳送塊,判定是命中還是不命中,並處理它們。管理緩存的邏輯可以使硬件、軟件,或者兩者結合。
例如,編譯器管理寄存器文件,緩存層次結構的對高層。它決定當發生不命中時如何發射加載,以及確定哪個寄存器來存放數據。L1、L2和L3層的緩存完全是由內置在緩存中的硬件邏輯來管理,在一個有虛擬內存的系統中,DRAM主存作爲存儲在磁盤上的數據塊的緩存,是由OS軟件和CPU上的地址翻譯硬件共同管理的。對於一個具有像AFS這樣的分佈式文件系統的機器來說,本地磁盤作爲緩存,它是由運行在本地機器上的AFS客戶端進行管理的。在大多數時候,緩存都是自動運行的,不需要程序採用特殊行動。

存儲器層級結構小結

1.利用時間局部性:由於時間局部性,同一數據對象可能會被多次使用。一旦一個數據對象在第一次不命中時被複制到緩存中,我們就會期望後面對該目標有一系列的訪問命中。因爲緩存比低一層的存儲設備更快,如果命中了比不命中快很多。
2.利用空間局部性:塊通常包含有多個數據對象。由於空間局部性,我們期望後面對該塊中其他對象的訪問能夠補償不命中複製該快的花費。
在這裏插入圖片描述

高速緩存存儲器

早期計算機系統的存儲器層次結構只有三層:CPU寄存器、DRAM主存和磁盤存儲。後來在CPU寄存器和DRAM主存間插入了L1高速緩存、L2高速緩存、L3高速緩存,以下會假設一個簡單的層次結構,CPU和主存之間只有一個L1高速緩存。

通用的高速緩存存儲器組織結構

在這裏插入圖片描述
高速緩存的組織如上圖,分爲S組,每個組有E行,每行上有1個有效位,有t個標記位,有B個字節。所以高速緩存的大小C(指的是所有塊的大小的和)爲:C = S * E * B。
一條加載指令指示CPU從主存地址A中讀一個字時,它將地址A發送到高速緩存。如果高速緩存中正保存着地址A處那個字的副本,它就立刻將那個字發回給CPU。那麼高速緩存如何知道它是否包含地址A處那個字的副本呢? 高速緩存的結構使得它能通過簡單地檢查地址位,找到所請求的字,類似於使用一種簡單的函數對應關係。
具體工作過程如下:參數S 和 B 將 m 個地址分爲了三個字段(如上圖),A 中 s 個組索引位是組數的索引,第一個組是0,第二個組爲1,以此類推。這個組索引位被解釋爲一個無符號整數,它告訴我們這個字必須存儲在哪個組中。A 中的 t 個標記位告訴我們這個字在某一組中的哪一行(如果有的話)。B 給出了這個字在這一行的字偏移地址。

直接映射高速緩存

根據每個組的高速緩存行數E,高速緩存被分爲不同的類。每個組只有一行的稱爲直接映射高速緩存,接下來以這個爲例子說明高速緩存的工作方式。
如果CPU所請求的數據緩存命中,高速緩存就很快取出該數據返回給CPU,如果緩存不命中,當L1高速緩存向主存請求包含改數據的副本時,CPU必須等待,當L1高速緩存將這個塊存放在它的一個高速緩存行中,從被存儲的塊中取出目標字,返回給CPU。高速緩存 確定一個請求是否命中,然後抽取被請求字的過程,分爲:組選擇-行匹配-字抽取。
在這裏插入圖片描述
在這裏插入圖片描述
如果出現緩存不命中,就需要從下一層取出被請求塊,將這個新的塊存儲在組索引位指示的組中的一個高速緩存行中。

理解這個過程後,來看一個現實問題,代碼如下:
在這裏插入圖片描述
對於x 和 y 來說,這個函數有很好的空間局部性,因此它的命中率應該比較高才對,但事實並不總是如此。假設浮點數是4個字節,x被加載到從地址0開始的32字節連續內存中,y緊跟在x之後,地址從32開始。各元素的地址關係如下:
在這裏插入圖片描述
看到x[i] 和 y[i] 的組索引相同,那每次緩存了x[i]後,y[i]就必然不命中,再緩存了y[i]後,下一次的x[i + 1]必然不命中,這種在x 和 y 之間的抖動會導致一直衝突不命中。在這種情況下,即使程序有良好的空間局部性,而且高速緩存中也有足夠的空間來存放x 和 y的塊,每次引用還是會衝突不命中。因爲這些塊被映射到了同一個高速緩存組,即組索引位相同。根據這個原因,很好修正:在x 數組結構防B字節的填充。比如,將x定義改爲 float[12],之後的映射關係如下:在這裏插入圖片描述
現在x[i] 和 y[i] 映射到不同的組了,消除了抖動衝突不命中。

組相聯高速緩存

剛剛說的直接映射高速緩存造成衝突不命中的原因在於每個組只有一行。組相聯高速緩存放鬆了這條限制,所以每個組都保存有多於一個的高速緩存行。判斷是否命中的三個步驟如下:
在這裏插入圖片描述
在這裏插入圖片描述
在緩存不命中時,高速緩存必須從內存中取出包含這個字的塊,用這個塊來替換哪個行呢?有最不常使用規則、最近最少使用規則等等,越是遠離CPU,一次不命中的開銷就會更大,用更好的替換策略使得不命中最少也變得更珍惜。

全相聯高速緩存

全相聯高速緩存是由一個包含所有高速緩存行的組組成的。它的組選擇、行匹配和字選擇如下:
在這裏插入圖片描述
在這裏插入圖片描述
這樣的高速緩存電路必須並行地搜索許多相匹配的標記,構造一個又大又快的相聯高速緩存很困難,而且很昂貴,因此全相聯高速緩存只適合做小的高速緩存。

有關寫的問題

高速緩存關於讀的操作非常簡單。但是寫就要複雜一點,假設我們寫一個已經緩存了的字w,在高速緩存更新了它的w的副本之後,怎麼更新w在接下來底層的副本呢?一種最簡單的方法是直寫,就是立即將w的高速緩存塊寫回到緊接着的低一層中。這樣簡單,但是每次寫都要引起總線流量。另一種是寫回,這種方法儘可能的推遲更新,只有當替換算法要驅逐這個更新過的塊時,才把他寫回到低一層中。
在處理寫不命中時,一種方法是寫分配,加載相應的低一層中的塊到高速緩存中,再更新這個高速緩存塊,這個方法缺點是每次不命中都會導致一個塊從低一層傳送到高速緩存。另一個方法是非寫分配,避開高速緩存,直接把這個字寫到低一層中。

真實的高速緩存層次結構解剖

高速緩存既能存數據,也能存指令。只保存指令的稱爲 i-cache,只保存程序的稱爲d-cache。兩者都保存的稱爲統一高速緩存。下圖給出了 Intel Core i7處理器的高速緩存層次結構。每個CPU芯片有四個核。每個核有自己私有的L1 i-cache,L1 d-cache和L2統一的高速緩存。所有的核共享片上L3統一高速緩存。在這裏插入圖片描述

編寫高速緩存友好的代碼

兩個重要問題:

1.對局部變量的反覆引用是好的,因爲編譯器能夠將它們緩存在寄存器文件中(時間局部性)
2.步長爲1的引用模式是好的,因爲存儲器層次結構㕜所有層次上的緩存都是將數據存儲爲連續的快(空間局部性)

綜合:高速緩存對程序性能的影響

存儲器山

一個程序從存儲系統中讀數據的速率成爲讀吞吐量。如果在s秒內讀了n個字節,讀吞吐量爲 n/s,通常單位是(MB/s)。
在這裏插入圖片描述
這座Core i7 山中,垂直於大小軸的是四條山脊,分別對應於工作集完全在L1高速緩存、L2高速緩存、L3高速緩存和主存內的時間局部性區域。L1山脊的最高點(CPU讀速率爲14GB/s)與主存山脊的最低點(CPU讀速率爲900MB/s)之間的差別有一個數量級。在L2、L3和主存山脊上,隨着步長的增加,有一個空間局部性的斜坡,空間局部性下降。即使當工作集太大,不能全部裝進任何一個高速緩存時,主存山脊的最高點也比它的最低點高8倍。因此,即使程序的時間局部性很差,空間局部性仍然能補救。

重新排列循環以提高空間局部性

例舉了3重嵌套循環下的,各個不同循環排列的執行週期,最終效果圖如下:
在這裏插入圖片描述
週期最小的兩種算法,內循環的兩個數組訪問步長均爲1;週期最大的兩種算法,內循環的兩個數組訪問步長均爲n(數組長度);週期居中的兩種算法,內循環的兩個數據訪問步長一個爲1,一個爲n。這個圖說明兩個問題:
1.內存引用和加載次數的影響遠遠小於局部性影響。
2.時刻保持循環最多次的數據訪問步長爲1。

在程序中利用局部性

1.將注意力集中於內循環上,大部分的計算和內存訪問都在這裏。
2.通過按照數據對象存儲在內存中的順序(即定義順序)、以步長爲1的來讀數據,從而使得空間局部性很大。
3.一旦從存儲器中讀入了一個數據對象,就儘可能多的使用它,從而使得程序中的時間局部性最大。

小結

基本存儲技術包括RAM、ROM和磁盤。RAM分爲SRAM和DRAM,SRAM更快也更貴,可以做高速緩存;DRAM更慢也更便宜,可以做主存和圖像緩衝區。掉電後ROM保持數據,可以存儲固件。旋轉磁盤可以保存大量數據,但是訪問時間比DRAM長很多;SSD正在逐步替代旋轉磁盤。
系統爲了彌補不同存儲設備的訪問速度,設計了存儲器層次結構,較小、較快的設備在頂部,較大、較慢的設備在底部。可以通過編寫具有良好空間和時間侷限性的程序來顯著提高程序性能。利用cache特別重要,從cache存取數據的程序(局部性好)比從內存取數據的程序(局部性差)運行得快很多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章