漫談計算機組成原理(五)高速緩沖存儲器


本文講什么?

老樣子,在正式開始介紹“高速緩沖存儲器”之前,我們先來了解一下其相關的信息。

我相信,上面這張圖你一定已經非常熟悉了,沒錯,這就是在本章緒論說的“存儲器的層次結構”。
上一講我們介紹了存儲層次結構中的L4,即主存。繼續向上看,你會看到L3、L2、L1都是高速緩沖存儲器。那么究竟什么是高速緩沖存儲器呢?那就要從“速度”這個關鍵詞說起。
隨着計算機硬件行業的不斷進步,以因特爾為首的芯片企業造出了一代又一代的高速CPU, 可以說CPU處理數據的速度是越來越快。但是從圖中我們能夠看到,L0-L6的設備的速度是逐漸下降的,而且速度相差越來越大。
雖然說近年來的存儲技術也有進步,但是照着CPU就差遠了。這就造成了CPU和主存之間速度差距越來越大。高速緩沖存儲器的存在就是為了盡可能的消除這種差距。
在這個存儲層次結構中,雖然高速緩沖存儲器分為三個檔次,但是他們的作用都是相同的,都是起到一種橋梁的作用,不同的只是速度和造價。此外,L1的速度幾乎和寄存器的速度相同。接下來,我們來看看高速緩沖存儲器在CPU中的具體位置。

這種結構進一步的驗證了存儲器的層次結構——高速緩沖存儲器位於寄存器之下的特點。好了,說了這么多,那讓我們來看看高速緩沖存儲器的工作原理吧!

高速緩沖存儲器(Cache)的工作原理

實際上,Cache的工作原理非常簡單,就是利用了映射的方式來獲取主存信息。
我們知道,主存的地址范圍是2^n(即2^n個字),而每個字都有一個n位的地址。(不明白的可以翻翻這個系列的前幾篇文章)。所謂映射,就是兩個元素之間的對應關系。而我們很清楚,主存的容量肯定是遠遠大於高速緩沖存儲器的。所以,這種映射必然是一對多的關系,某部分高速緩沖存儲器中的內容對應着主存中的的吧部分內容。
為了實現上面所說的映射,我們需要對主存和緩存進行塊的划分,使這些“字塊”實現一對多的映射關系。簡略圖如下:
可以看見,我們將主存和緩存划分成了一個又一個的字塊,從而實現映射關系。

CPU想要處理信息,首先就是看緩存(高速緩沖存儲器)中是否存在信息,如果存在,那么好,就從緩存中讀入一個字(一個字塊可能包括多個字);如果緩存中沒有數據,那么就會根據這種映射關系,將主存中的數據一個字塊一個字塊地映射到相應的位置,然后再由CPU進行讀取即可。
這里有一個名詞,叫做緩存命中和緩存不命中。上面說的兩種情況中的第一種就是緩存命中,而后一種就是緩存不命中。命中率是衡量緩存的效率的。命中率越高,效率越好。命中率=緩存命中/(緩存命中+緩存不命中)。

上面說的例子,可以理解為映射中的第一種方式——直接相連映射。下面我們就來詳細的了解一下映射方式。

主存——高速緩沖存儲器之間的映射方式

直接映射

下圖給出了直接映射的示意圖:

直接相連映射可以說是一種最簡單的方法,為什么這樣說呢,因為他的邏輯最為清晰、也是最好理解的一種映射方式。
你可能會說,這么復雜的一個圖你跟我說這是最簡單的方法,你怕不是個傻子吧!不要急,聽我慢慢說。
首先,先看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推送數據的,這一點不必擔心。看到這,我相信你肯定也知道比較器是個什么玩意了。

全相聯映射

如果說直接相連映射是最簡單的方法的話,那么全相連映射就是一種最粗暴的映射方式。還是先看圖:

我相信你此時一定知道我為啥說這是一種相當粗暴的映射方式了,沒錯,看到那交錯縱橫的線,一開始我是拒絕的,這貨太暴力了。
標記位自然是不用說,主要是這貨的主存不分組,主存中的任何一個字塊都可以映射到Cache中的任何一個字塊,所以看起來十分的凌亂。但是還是有好處的,你看直接映射,比如說主存還是分成n組,也就是說Cache中的每一個字塊都有n個主存中的字塊對應,且主存中的字塊只能對應Cache中的一個字塊。所以說,如果Cache中的數據沒有失效的時候,主存中的其他的n-1個字塊都是需要等待的。
但是全相聯映射不同——主存中的字塊可以對應任何一個Cache中的字塊,也就是說,如果主存想要向Cache推送數據,只需要挑一個失效的地方,將原有數據覆蓋即可。
這種方式比較混亂,電路可能會很復雜,同時又會造成較高的成本。

組相聯映射

計算機組成原理很有意思,你會發現,在計算機結構的設計方案中,一般都是這樣的:有一種比較簡單的方案,但是效率並不怎么好,然后有一種效率很好的方案但是可能過於復雜,接着就會出現第三種方案,一般這種方案都是以上二者的折中。在有效的消除了二者的缺點的同時,又極大的利用了二者的優點,不得不感嘆這些科學家的聰明才智。

首先說對應方式,組相聯的映射方式和直接相連的映射方式相同,都是主存中的每一組字塊中的每一個字塊對應着Cache中的一個相應字塊,但是有不同之處在於,Cache中的字塊分成了兩組,這種方式也叫做二路組相聯。
其次說下這種連接方式的優點:可以看到,在二路組相聯中,除非是Cache中每塊的兩組字塊都被占用了,否則不存在沖突的問題,這大大提高了效率,同時又沒有全相聯那種暴力的方式。

總結

本文詳細的討論了Cache的工作原理及三種映射方式,希望對大家有所幫助。
如果你喜歡我的文章,請幫忙點贊;如果你對本文內容存在疑問,請留言告訴我。您的點贊和留言是對原創作者的最大支持,感謝您的閱讀。
此外,本人一直在尋找志同道合的小伙伴,同樣如此的可以郵件聯系我:roobtyan@outlook.com.
本人微信公眾號:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM