老樣子,在正式開始介紹「高速緩衝存儲器」以前,咱們先來了解一下其相關的信息。緩存
我相信,上面這張圖你必定已經很是熟悉了,沒錯,這就是在本章緒論說的「存儲器的層次結構」。 上一講咱們介紹了存儲層次結構中的L4,即主存。繼續向上看,你會看到L三、L二、L1都是高速緩衝存儲器。那麼究竟什麼是高速緩衝存儲器呢?那就要從「速度」這個關鍵詞提及。 隨着計算機硬件行業的不斷進步,以因特爾爲首的芯片企業造出了一代又一代的高速CPU, 能夠說CPU處理數據的速度是愈來愈快。可是從圖中咱們可以看到,L0-L6的設備的速度是逐漸降低的,並且速度相差愈來愈大。 雖說近年來的存儲技術也有進步,可是照着CPU就差遠了。這就形成了CPU和主存之間速度差距愈來愈大。高速緩衝存儲器的存在就是爲了儘量的消除這種差距。 在這個存儲層次結構中,雖然高速緩衝存儲器分爲三個檔次,可是他們的做用都是相同的,都是起到一種橋樑的做用,不一樣的只是速度和造價。此外,L1的速度幾乎和寄存器的速度相同。接下來,咱們來看看高速緩衝存儲器在CPU中的具體位置。微信
這種結構進一步的驗證了存儲器的層次結構——高速緩衝存儲器位於寄存器之下的特色。好了,說了這麼多,那讓咱們來看看高速緩衝存儲器的工做原理吧!設計
實際上,Cache的工做原理很是簡單,就是利用了映射的方式來獲取主存信息。 咱們知道,主存的地址範圍是2^n(即2^n個字),而每一個字都有一個n位的地址。(不明白的能夠翻翻這個系列的前幾篇文章)。所謂映射,就是兩個元素之間的對應關係。而咱們很清楚,主存的容量確定是遠遠大於高速緩衝存儲器的。因此,這種映射必然是一對多的關係,某部分高速緩衝存儲器中的內容對應着主存中的的吧部份內容。 爲了實現上面所說的映射,咱們須要對主存和緩存進行塊的劃分,使這些「字塊」實現一對多的映射關係。簡略圖以下: 能夠看見,咱們將主存和緩存劃分紅了一個又一個的字塊,從而實現映射關係。3d
CPU想要處理信息,首先就是看緩存(高速緩衝存儲器)中是否存在信息,若是存在,那麼好,就從緩存中讀入一個字(一個字塊可能包括多個字);若是緩存中沒有數據,那麼就會根據這種映射關係,將主存中的數據一個字塊一個字塊地映射到相應的位置,而後再由CPU進行讀取便可。 這裏有一個名詞,叫作緩存命中和緩存不命中。上面說的兩種狀況中的第一種就是緩存命中,然後一種就是緩存不命中。命中率是衡量緩存的效率的。命中率越高,效率越好。命中率=緩存命中/(緩存命中+緩存不命中)。cdn
上面說的例子,能夠理解爲映射中的第一種方式——直接相連映射。下面咱們就來詳細的瞭解一下映射方式。blog
下圖給出了直接映射的示意圖: it
直接相連映射能夠說是一種最簡單的方法,爲何這樣說呢,由於他的邏輯最爲清晰、也是最好理解的一種映射方式。 你可能會說,這麼複雜的一個圖你跟我說這是最簡單的方法,你怕不是個傻子吧!不要急,聽我慢慢說。 首先,先看Cache,Cache被分紅了2^c 塊,而主存則被分紅了n*2^c, n就是n組,從圖中的鏈接線能夠很直觀的看出,主存中的字塊0~2^c-1 塊對應着Cache中的0~2^c-1 塊。而主存中的2^c 塊則是對應着Cache中的第0塊,依次類推。即主存中的每一組字塊對應着Cache中的相應字塊。 好了,對應關係說完了,咱們來解釋一下圖中的其餘內容。 首先說標記,標記表明的意義就是當前Cache字塊中的數據是否有效。能夠這樣想,咱們以前講了緩存命中和緩存不命中,當CPU向緩存推送地址,說「我想拿到Cache中字塊0上的數據」,那麼好,Cache首先要看看字塊0上的標記位是否爲1,若是是1,就把這個數據給CPU,這就叫緩存命中;若是標記位爲0,則說明此時Cache上的數據無效,則不推送,這就叫作緩存不命中。你可能會這樣想:Cache上的數據不都是從主存上拿到的嗎,爲何還會有無效的時候呢?這樣的例子很多,好比說Cache剛通電的那一瞬間,這時候Cache上面是沒有數據的,標記位的0就起了很大做用。若是發現是0的話,接着主存會向Cache推送數據的,這一點沒必要擔憂。看到這,我相信你確定也知道比較器是個什麼玩意了。io
若是說直接相連映射是最簡單的方法的話,那麼全相連映射就是一種最粗暴的映射方式。仍是先看圖: class
我相信你此時必定知道我爲啥說這是一種至關粗暴的映射方式了,沒錯,看到那交錯縱橫的線,一開始我是拒絕的,這貨太暴力了。 標記位天然是不用說,主要是這貨的主存不分組,主存中的任何一個字塊均可以映射到Cache中的任何一個字塊,因此看起來十分的凌亂。可是仍是有好處的,你看直接映射,好比說主存仍是分紅n組,也就是說Cache中的每個字塊都有n個主存中的字塊對應,且主存中的字塊只能對應Cache中的一個字塊。因此說,若是Cache中的數據沒有失效的時候,主存中的其餘的n-1個字塊都是須要等待的。 可是全相聯映射不一樣——主存中的字塊能夠對應任何一個Cache中的字塊,也就是說,若是主存想要向Cache推送數據,只須要挑一個失效的地方,將原有數據覆蓋便可。 這種方式比較混亂,電路可能會很複雜,同時又會形成較高的成本。效率
計算機組成原理頗有意思,你會發現,在計算機結構的設計方案中,通常都是這樣的:有一種比較簡單的方案,可是效率並不怎麼好,而後有一種效率很好的方案可是可能過於複雜,接着就會出現第三種方案,通常這種方案都是以上兩者的折中。在有效的消除了兩者的缺點的同時,又極大的利用了兩者的優勢,不得不感嘆這些科學家的聰明才智。
首先說對應方式,組相聯的映射方式和直接相連的映射方式相同,都是主存中的每一組字塊中的每個字塊對應着Cache中的一個相應字塊,可是有不一樣之處在於,Cache中的字塊分紅了兩組,這種方式也叫作二路組相聯。 其次說下這種鏈接方式的優勢:能夠看到,在二路組相聯中,除非是Cache中每塊的兩組字塊都被佔用了,不然不存在衝突的問題,這大大提升了效率,同時又沒有全相聯那種暴力的方式。
本文詳細的討論了Cache的工做原理及三種映射方式,但願對你們有所幫助。 若是你喜歡個人文章,請幫忙點贊;若是你對本文內容存在疑問,請留言告訴我。您的點贊和留言是對原創做者的最大支持,感謝您的閱讀。 此外,本人一直在尋找志同道合的小夥伴,一樣如此的能夠郵件聯繫我:roobtyan@outlook.com. 本人微信公衆號: