存儲器層次結(jié)構(gòu)

閱讀經(jīng)典——《深入理解計算機系統(tǒng)》08

本文將介紹存儲器層次結(jié)構(gòu)以及局部性對程序性能的影響备埃。

  1. 什么是存儲器層次結(jié)構(gòu)财忽?
  2. 局部性

什么是存儲器層次結(jié)構(gòu)

這個詞大家也許并不陌生,計算機中的存儲器從寄存器鼠冕、緩存到內(nèi)存灾前、硬盤,形成了一個層次結(jié)構(gòu)寞射。為什么不用單一的一種存儲設(shè)備渔工,比如只用硬盤呢?因為每一種存儲設(shè)備都有它的優(yōu)缺點桥温,硬盤雖然存儲空間大引矩,但傳輸速率太慢,完全跟不上CPU的節(jié)奏侵浸,直接與CPU交換數(shù)據(jù)的話會嚴重拉低CPU的執(zhí)行效率旺韭。而內(nèi)存雖然容量小一些,但速度比硬盤快的多掏觉,因此介于CPU和硬盤之間区端。隨著CPU主頻越來越高,CPU與內(nèi)存的交換效率也變得越來越低澳腹,因此現(xiàn)代計算機系統(tǒng)在CPU和內(nèi)存之間插入多級緩存织盼,以縮小CPU與內(nèi)存之間的頻率差距。

下圖為完整的存儲器層次結(jié)構(gòu)酱塔,從最頂層的寄存器沥邻,到最底層的遠程存儲器(包括分布式文件系統(tǒng)、Web服務(wù)器)羊娃,越往下容量越大唐全、傳輸速率越慢、單位容量價格越低蕊玷。

存儲器層次結(jié)構(gòu)

在存儲器層次結(jié)構(gòu)中邮利,每一層都作為其下一層的緩存。比如說垃帅,當我們想要從L1 cache中讀取數(shù)據(jù)的時候延届,先檢查寄存器中有沒有我們需要的數(shù)據(jù),如果有贸诚,直接從寄存器中讀取鳍咱,如果沒有,再從L1 cache中讀取疙赠。再比如說先誉,當我們想要從硬盤中讀取數(shù)據(jù)的時候,先檢查內(nèi)存中有沒有我們需要的數(shù)據(jù),如果有,直接從內(nèi)存中讀取,如果沒有髓窜,再從硬盤中讀取。

存儲器層次結(jié)構(gòu)的優(yōu)點在于欺殿,作為一個整體寄纵,它的容量相當于最底層的存儲設(shè)備的容量,而它的速度卻相當于最頂層存儲設(shè)備的速度脖苏。也就是說程拭,它可以在速度和容量這兩個看似矛盾的方面同時達到極限。

為什么棍潘?為什么如此神奇恃鞋?

這是因為程序具有局部性

局部性

理解局部性對程序開發(fā)人員有極大的幫助亦歉。一般來講恤浪,有良好局部性的程序比局部性差的程序運行得更快。

局部性有兩種:時間局部性空間局部性肴楷。讓我們舉幾個例子來說明吧水由。

下面的數(shù)組元素求和函數(shù)就具有良好的時間局部性和空間局部性。

int sumvec(int v[N])
{
    int i, sum = 0;
    for (i = 0; i < n; i++)
    {
        sum += v[i];
    }
    return sum;
}

在該程序中赛蔫,變量sum在每次循環(huán)迭代中被引用一次砂客。如果同一個存儲單元在短時間內(nèi)多次被引用,我們就說該存儲單元具有時間局部性呵恢。向量v中的元素在循環(huán)中按照存儲順序依次被讀取鞭盟,這些被訪問的存儲單元在空間上離的很近,我們就說它們有良好的空間局部性瑰剃。

有局部性良好的程序,就有局部性不好的程序筝野。下面的二維數(shù)組按列求和就是一個典型的例子晌姚。

int sumarraycols(int a[M][N])
{
    int i, j, sum = 0;
    for (j = 0; j < N; j++)
        for (i = 0; i < M; i++)
            sum += a[i][j];
    return sum;
}

由于二維數(shù)組在內(nèi)存中的存放順序是按行排放的,因此該程序相當于以N個元素的間隔訪問數(shù)據(jù)歇竟,這些存儲位置在空間上的距離變大挥唠,空間局部性不好。正確的做法應(yīng)該是外層循環(huán)行遍歷焕议,內(nèi)層循環(huán)列遍歷宝磨。

上面舉的兩個例子都是數(shù)據(jù)的局部性,除此之外,還有取指令的局部性唤锉。因為指令存放在存儲器中世囊,CPU讀取這些指令也需要考慮局部性。for循環(huán)就具有良好的局部性窿祥,由于循環(huán)體內(nèi)的指令在存儲器中是連續(xù)放置的株憾,因此具有良好的空間局部性;又由于循環(huán)會執(zhí)行多次晒衩,因此也具有良好的時間局部性嗤瞎。

關(guān)注作者文集《深入理解計算機系統(tǒng)》,第一時間獲取最新發(fā)布文章听系。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贝奇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子靠胜,更是在濱河造成了極大的恐慌掉瞳,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件髓帽,死亡現(xiàn)場離奇詭異菠赚,居然都是意外死亡,警方通過查閱死者的電腦和手機郑藏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門衡查,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人必盖,你說我怎么就攤上這事拌牲。” “怎么了歌粥?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵塌忽,是天一觀的道長。 經(jīng)常有香客問我失驶,道長土居,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任嬉探,我火速辦了婚禮擦耀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涩堤。我一直安慰自己眷蜓,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布胎围。 她就那樣靜靜地躺著吁系,像睡著了一般德召。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上汽纤,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天上岗,我揣著相機與錄音,去河邊找鬼冒版。 笑死液茎,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的辞嗡。 我是一名探鬼主播捆等,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼续室!你這毒婦竟也來了栋烤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤挺狰,失蹤者是張志新(化名)和其女友劉穎明郭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丰泊,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡薯定,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瞳购。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片话侄。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖学赛,靈堂內(nèi)的尸體忽然破棺而出年堆,到底是詐尸還是另有隱情,我是刑警寧澤盏浇,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布变丧,位于F島的核電站,受9級特大地震影響绢掰,放射性物質(zhì)發(fā)生泄漏痒蓬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一滴劲、第九天 我趴在偏房一處隱蔽的房頂上張望攻晒。 院中可真熱鬧,春花似錦哑芹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碴萧。三九已至,卻和暖如春末购,著一層夾襖步出監(jiān)牢的瞬間破喻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工盟榴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留曹质,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓擎场,卻偏偏與公主長得像羽德,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子迅办,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容