當前位置:首頁 » 服務存儲 » 存儲程序結構利用了時間局部性
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

存儲程序結構利用了時間局部性

發布時間: 2023-08-10 21:42:32

1. 計算機組成原理中的局部性原理是什麼

時間局部性就是,最近被訪問存儲單元,在之後很有可能會被再次訪問到;

空間局部性就是,對於正在被訪問的存儲單元附近的位置,在之後很有可能會被訪問到。

這個很容易理解,以一段常見的代碼為例:

for(i = 0; i <= 100; i++) {

sum += array[i];

}

其中i、sum 這些元素現在正被訪問,在之後也一定會被重復訪問,這就是時間局部性;

而array這個數組,現在訪問了array[0]的位置,那之後緊接著就會訪問它附近的位置,比如array[1]、array[2]等等,這就是空間局部性。

根據局部性原理,可以做一些相關設計。比如cache就是利用局部性原理設計出來的。

2. 空間局部性和時間局部性的策略是什麼

進程運行時,在一段時間里,程序的執行往往呈現高度的局部性,包括時間局部性和空間局部性。時間局部性是一旦一個指令被執行了,則在不久的將來,它可能再被執行。空間局部性是一旦一個指令一個存儲單元被訪問,那麼它附近的單元也將很快被訪問。

程序的局部性原理是虛擬存儲技術引入的前提。虛擬存儲的實現原理是,當進程要求運行時,不是將它全部裝入內存,而是將其一部分裝入內存,另一部分暫時不裝入內存。

(2)存儲程序結構利用了時間局部性擴展閱讀:

時間局部性

如果在某一點時訪問了存儲器的特定位置,則很可能在不久的將來將再次訪問相同的位置。在對相同存儲器位置的相鄰訪問之間存在時間接近性。

在這種情況下,通常努力將訪問過的數據的副本存儲在可以被更快訪問的特殊存儲器中。時間局部性是空間局部性的特殊情況,即當預期位置與當前位置相同時。

空間局部性

如果特定存儲位置在特定時間被訪問,則很可能在不久的將來訪問附近的存儲位置。在這種情況下,通常嘗試猜測當前訪問周圍的區域的大小和形狀,對於該區域,值得准備更快的訪問。

局部性的原因

局部性有幾個原因。這些原因是某些方面要實現的目標或接受的情況。以下原因不是不相交的;事實上,下面的列表從最一般的情況到特殊情況:

可預測性:事實上,局部性只是計算機系統中一種可預測的行為。

程序結構

局部性通常因為創建計算機程序的方式而發生,用於處理可決定的問題。通常,相關數據存儲在存儲器中的附近位置。計算中常見的一種模式涉及幾個項目的處理,一次一個。這意味著如果進行大量處理,則將訪問單個項目多次,從而導致時間局部性。

此外,移動到下一項意味著將讀取下一項,導致空間局部性,因為存儲器位置通常被批量地讀取。

線性數據結構

局部性通常因為代碼包含循環,傾向於通過索引訪問數組或其他數據結構。當相關數據元素被線性地排列和訪問時,發生順序局部性,即空間局部性的特殊情況。例如,從基地址到最高元素的一維數組中的元素的簡單遍歷將利用存儲器中數組的順序局部性。

當線性遍歷在具有相同結構和大小的相鄰數據結構的較長區域上,訪問每個結構的相互對應的元素而不是整個結構時,發生更一般的等距局部性。這是當矩陣被表示為行的順序矩陣並且需要訪問矩陣的單個列時的情況。

內存層次結構的效率

雖然隨機存取存儲器使程序員能夠在任何時間在任何地方讀取或寫入,但在實踐中,等待時間和吞吐量會受到高速緩存的效率的影響,這通過增加訪問局部性來改進。訪問局部性差導致緩存抖動和緩存污染,為了避免它,具有弱局部性的數據元素可以從緩存旁路。

參考資料:網路-訪問局部性

3. 什麼是存儲訪問的局部性原理,它分別成哪兩個方面的局部性

程序局部性原理:虛擬存儲管理的效率與程序局部性程序有很大關系。根據統計,進程運行時,在-
段時間內,其程序的執行往往呈現岀高度的局限性,包括時間局部性和空間局部性
1、時間局部性:是指若一條指令被執行,則在不久的將來,它可能再被執行
2、空間局部性:是指一旦一個存儲單元被訪問,那它附近的單元也將很快被訪問

4. 局部性原理

局部性通常有兩種形式:

時間局部性(temporal locality):在一個具有良好時間局部性的程序中,被引用過一次的內存位置很可能在不遠的將來再被多次引用。
空間局部性(spatial locality)在一個具有良好空間局部性的程序中,如果一個內存位置被引用了一次,那麼程序很可能在不遠的將來引用附近的一個內存位置。
程序員應該理解局部性原理,一般而言,有良好局部性的程序比局部性差的程序運行得更快。


現代計算機系統的各個層次,從硬體到操作系統,再到應用程序,它們的設計都利用了局部性。

在硬體層,局部性原理允許計算機設計者通過引入小而快速的高速緩存存儲器來保存最近被引用的指令和數據項,從而提高對主存的訪問速度。
在操作系統級,局部性原理允許系統使用主存作為虛擬地址空間最近被引用塊的高速緩存。類似的,操作系統用主存來緩存磁碟文件系統中最近被使用的磁碟塊。
在應用程序的設計中,局部性原理也扮演者重要角色。如Web瀏覽器將最近被引用的文檔放在本地磁碟上,利用的就是時間局部性。大容量的Web伺服器將最近被請求的文檔放在前端磁碟高速緩存中,這些緩存能滿足對這些文檔的請求,而不需要伺服器的干預。

5. 存儲器層次結構中的緩存

《深入理解計算機系統》p422

6.1 存儲器層次結構中的緩存

一般而言,高速緩存( cache ,讀作「 cash 」)是一個小而快速的存儲設備,它作為存儲在更大、也更慢的設備中的數據對象的緩沖區域。使用高速緩存的過程稱為緩存( caching ,讀作「 cashing 」)。存儲器層次結構的中心思想是,對於每個 k ,位於 k 層的更快更小的存儲設備作為位於 k 十1層的更大更慢的存儲設備的緩存。換句話說,層次結構中的每一層都緩存來自較低一層的數據對象。例如,本地磁碟作為通過網路從遠程磁碟取出的文件(例如 Web 頁面)的緩存,主存作為本地磁碟上數據的緩存,依此類推,直到最小的緩存—— CPU 寄存器組。圖6-22展示了存儲器層次結構中緩存的一般性概念。第 k 十1層的存儲器被劃分成連續的數據對象組塊( chunk ),稱為塊( block )。每個塊都有一個唯一的地址或名字,使之區別於其他的塊。塊可以是固定大小的(通常是這樣的),也可以是可變大小的(例如存儲在 Web 伺服器上的遠程 HTML 文件)。例如,圖6-22中第 k 十1層存儲器被劃分成16個大小固定的塊,編號為0~15。

類似地,第 k 層的存儲器被劃分成較少的塊的集合,每個塊的大小與 k 十1層的塊的大小一樣。在任何時刻,第 k 層的緩存包含第 k 十1層塊的一個子集的副本。例如,在圖6-22中,第 k 層的緩存有4個塊的空間,當前包含塊4、9、14和3的副本。

數據總是以塊大小為傳送單元( transfer unit )在第 k 層和第 k +1層之間來回復制的。雖然在層次結構中任何一對相鄰的層次之間塊大小是固定的,但是其他的層次對之間可以有不同的塊大小。例如,在圖6-21中,L1和 LO 之間的傳送通常使用的是1個字大小的塊。L2和L1之間(以及I3和I2之間、L4和I3之間)的傳送通常使用的是幾十個位元組的

塊。而L5和L4之間的傳送用的是大小為幾百或幾千位元組的塊。一般而言,層次結構中較低層(離 CPU 較遠)的設備的訪問時間較長,因此為了補償這些較長的訪問時間,傾向於使用較大的塊。

1. 緩存命中

當程序需要第 k 十1層的某個數據對象 d 時,它首先在當前存儲在第 k 層的一個塊中查找 d 。如果 d 剛好緩存在第 k 層中,那麼就是我們所說的緩存命中( cache hit )。該程序直接從第 k 層讀取 d ,根據存儲器層次結構的性質,這要比從第 k +1層讀取 d 更快。例如,一個有良好時間局部性的程序可以從塊14中讀出一個數據對象,得到一個對第 k 層的緩存命中。

2. 緩存不命中

另一方面,如果第 k 層中沒有緩存數據對象 d ,那麼就是我們所說的緩存不命中( cache miss )。當發生緩存不命中時,第 k 層的緩存從第 k 十1層緩存中取出包含 d 的那個塊,如果第 k 層的緩存已經滿了,可能就會覆蓋現存的一個塊。

覆蓋一個現存的塊的過程稱為替換( replacing )或驅逐( evicting )這個塊。被驅逐的這個塊有時也稱為犧牲塊( victim block )。決定該替換哪個塊是由緩存的替換策略( replace — ment policy )來控制的。例如,一個具有隨機替換策略的緩存會隨機選擇一個犧牲塊。一個具有最近最少被使用 LRU )替換策略的緩存會選擇那個最後被訪問的時間距現在最遠的塊。

在第 k 層緩存從第 k 十1層取出那個塊之後,程序就能像前面一樣從第 k 層讀出 d 了。例如,在圖6-22中,在第 k 層中讀塊12中的一個數據對象,會導致一個緩存不命中,因為塊12當前不在第 k 層緩存中。一旦把塊12從第 k 十1層復制到第 k 層之後,它就會保持在那裡,等待稍後的訪問。

3. 緩存不命中的種類

區分不同種類的緩存不命中有時候是很有幫助的。如果第 k 層的緩存是空的,那麼對

任何數據對象的訪問都會不命中。一個空的緩存有時被稱為冷緩存( cold cache ),此類不命中稱為強制性不命中( compulsory miss )或冷不命中( cold miss )。冷不命中很重要,因為它們通常是短暫的事件,不會在反復訪問存儲器使得緩存暖身( warmed up )之後的穩定狀態中出現。

只要發生了不命中,第 k 層的緩存就必須執行某個放置策略( placement policy ),確定把它從第 k 十1層中取出的塊放在哪裡。最靈活的替換策略是允許來自第 k +1層的任何塊放在第 k 層的任何塊中。對於存儲器層次結構中高層的緩存(靠近 CPU ),它們是用硬體來實現的,而且速度是最優的,這個策略實現起來通常很昂貴,因為隨機地放置塊,定位起來代價很高。

因此,硬體緩存通常使用的是更嚴格的放置策略,這個策略將第 k 十1層的某個塊限制放置在第 k 層塊的一個小的子集中(有時只是一個塊)。例如,在圖6-22中,我們可以確定第 k 十1層的塊 i 必須放置在第 k 層的塊( i mod 4)中。例如,第 k 十1層的塊0、4、8和12會映射到第 k 層的塊0;塊1、5、9和13會映射到塊1;依此類推。注意,圖6-22中的示例緩存使用的就是這個策略。

這種限制性的放置策略會引起一種不命中,稱為沖突不命中( conflict miss ),在這種情況中,緩存足夠大,能夠保存被引用的數據對象,但是因為這些對象會映射到同一個緩存塊,緩存會一直不命中。例如,在圖6-22中,如果程序請求塊0,然後塊8,然後塊0,然後塊8,依此類推,在第 k 層的緩存中,對這兩個塊的每次引用都會不命中,即使這個緩存總共可以容納4個塊。

程序通常是按照一系列階段(如循環)來運行的,每個階段訪問緩存塊的某個相對穩定不變的集合。例如,一個嵌套循環可能會反復地訪問同一個數組的元素。這個塊的集合稱為這個階段的工作集( working set )。當工作集的大小超過緩存的大小時,緩存會經歷容量不命中( capacity miss )。換句話說就是,緩存太小了,不能處理這個工作集。

4. 緩存管理

正如我們提到過的,存儲器層次結構的本質是,每一層存儲設備都是較低一層的緩存。在每一層上,某種形式的邏輯必須管理緩存。這里,我們的意思是指某個東西要將緩存劃分成塊,在不同的層之間傳送塊,判定是命中還是不命中,並處理它們。管理緩存的邏輯可以是硬體、軟體,或是兩者的結合。

例如,編譯器管理寄存器文件,緩存層次結構的最高層。它決定當發生不命中時何時發射載入,以及確定哪個寄存器來存放數據。L1、L2和L3層的緩存完全是由內置在緩存中的硬體邏輯來管理的。在一個有虛擬內存的系統中, DRAM 主存作為存儲在磁碟上的數據塊的緩存,是由操作系統軟體和 CPU 上的地址翻譯硬體共同管理的。對於一個具有像 AFS 這樣的分布式文件系統的機器來說,本地磁碟作為緩存,它是由運行在本地機器上的 AFS 客戶端進程管理的。在大多數時候,緩存都是自動運行的,不需要程序採取特殊的或顯式的行動。

6.3.2 存儲器層次結構概念小結

概括來說,基於緩存的存儲器層次結構行之有效,是因為較慢的存儲設備比較快的存儲設備更便宜,還因為程序傾向於展示局部性:

1)利用時間局部性: 由於時間局部性,同一數據對象可能會被多次使用。一旦一個數據對象在第一次不命中時被復制到緩存中,我們就會期望後面對該目標有一系列的訪問命中。因為緩存比低一層的存儲設備更快,對後面的命中的服務會比最開始的不命中快很多。

2)利用空間局部性: 塊通常包含有多個數據對象。由於空間局部性,我們會期望後面對該塊中其他對象的訪問能夠補償不命中後復制該塊的花費。現代系統中到處都使用了緩存。正如從圖6-23中能夠看到的那樣, CPU 晶元、操作系統、分布式文件系統中和萬維網上都使用了緩存。各種各樣硬體和軟體的組合構成和管理著緩存。注意,圖6-23中有大量我們還未涉及的術語和縮寫。在此我們包括這些術語和縮寫是為了說明緩存是多麼的普遍。

6. 什麼是程序訪問的局部性存儲系統中哪一級採用了程序訪問的局部性原理

程序訪問的局部性是指程序在執行時呈現出局部性規律,即在一段時間內,整個程序的執行僅限於程序中的某一部分。它們傾向於引用的數據項鄰近於其他最近引用過的數據項,或者鄰近於最近自我引用過的數據項。局部性通常有兩種形式:時間局部性和空間局部性

存儲系統中Cache-主存層次和主存-輔存層次均採用了程序訪問的局部性原理。