重要思想:編寫出數(shù)據(jù)項存儲在層次結(jié)構(gòu)中嵌巷,較高地方的程序鸟雏。
- **學(xué)習(xí)目標:SRAM、DRAM惧财、ROM存儲器及旋轉(zhuǎn)和固態(tài)存儲器巡扇。
重點關(guān)注高速緩存存儲器cache。
隨機訪問存儲器(Random-Access Memory):
-
靜態(tài)RAM(SRAM):
(速度快垮衷,價格高厅翔,用于高速緩存,一般為幾M搀突。)
SRAM用雙穩(wěn)態(tài)的存儲器單元刀闷,每個單元有6個晶體管,可以無限期保持兩個電壓中的狀態(tài)之一仰迁。
具有扛干擾性甸昏。
靜態(tài)RAM的雙穩(wěn)態(tài)示意圖
-
傳統(tǒng)的動態(tài)RAM(DRAM):
而動態(tài)RAM結(jié)構(gòu),由細節(jié)到宏觀徐许,如下圖所示施蜜。 -
訪問數(shù)據(jù)步驟:
1:傳送一個地址A到內(nèi)存控制器
2:控制器隨即訪問數(shù)據(jù),選擇指定的模塊(module)k
3:k模塊將地址A轉(zhuǎn)化成(i绊寻,j)形式花墩。
(i為行row悬秉,j為列column)
4:將8個DRAM芯片,都訪問其(i,j)冰蘑,得到8個字節(jié)(8位)和泌,依次組成64位。
具體從單個DRAM芯片中得到字節(jié)的方式祠肥,如下圖2武氓。
1
2
3
-
增強的DRAM:
主要在傳統(tǒng)結(jié)構(gòu)上,進行優(yōu)化仇箱,而得到一系列的改進結(jié)構(gòu)县恕。
依性能排序為:
1-快頁模式: FPM DRAM
(Fast Page Mode)
2-拓展數(shù)據(jù)輸出: EDO DRAM
(Extended Data Out)
3-同步DRAM: SDRAM
(Synchronous同步)
4-雙倍數(shù)據(jù)速率同步DRAM: DDR SDRAM
(Double Data-Rate):
根據(jù)預(yù)取緩沖區(qū)大小劃分: DDR1 DDR2 DDR3。
-
非易失性存儲器:
DRAM和SRAM剂桥,如果斷電就會丟失信息忠烛。從這方面來說,屬于易失的(volatile)权逗。
而非易失性存儲器美尸,即使斷電之后,仍然可以存儲信息斟薇。
他們整體上都被成為只讀存儲器ROM(Read Only Memory)师坎。
ROM設(shè)備中,有基本的程序:固件堪滨,用來翻譯cpu的輸入輸出請求胯陋。
以可重寫次數(shù)和重寫機制分為:
1:PROM(programmable)
存儲單元有熔絲,可以用高電流熔斷一次袱箱。
2:EPROM(erasable programmable)
利用了光學(xué)物理設(shè)備進行寫入遏乔,清零是用紫外線照射存儲單元。
可擦除重編程次數(shù):1000數(shù)量級犯眠。
3:EEPROM(electrically erasable)
類似EPROM按灶,但不需要格外物理設(shè)備症革,而是在電路卡上編程筐咧。
可擦除編程數(shù):10 0000數(shù)量級。
閃存(flash memory)便是基于EEPROM結(jié)構(gòu)噪矛。
及基于閃存的固態(tài)硬盤量蕊。
訪問主存的方式:
cpu和主存連接方式:
cpu--總線接口--系統(tǒng)總線--I/O橋--內(nèi)存總線--主存
(I/O橋連接了I/O總線,由磁盤艇挨,顯卡等共享)
-
磁盤:
磁盤結(jié)構(gòu):由盤片残炮、面、磁道缩滨、扇區(qū)和傳動臂組成势就。
磁盤封裝了一個固件:磁盤控制器泉瞻,用以將實際地址轉(zhuǎn)化成連續(xù)的邏輯塊。
訪問磁盤:
每一個邏輯塊苞冯,會被翻譯成:(盤片袖牙,磁道,扇區(qū))三元組舅锄,對應(yīng)唯一物理扇區(qū)鞭达。
讀取時,讀寫頭會將數(shù)據(jù)保存在控制器的緩沖區(qū)里皇忿,然后復(fù)制到內(nèi)存中畴蹭。
訪問磁盤時間分為三個階段:
1:尋道,將傳動臂移到指定磁道鳍烁。
時間平均通常為3-9ms叨襟。
2:旋轉(zhuǎn),磁盤轉(zhuǎn)到指定的扇區(qū)幔荒。
Tmax=(1/RPM) //以m為單位要乘以60
Tavg=1/2 * Tmax
3:讀寫芹啥,對扇區(qū)(指定為512個字節(jié))進行讀寫。
用每轉(zhuǎn)耗時铺峭,除以扇區(qū)數(shù)墓怀。
T=Tmax / 扇區(qū)數(shù)。
連接I/O設(shè)備:
說明:系統(tǒng)總線和內(nèi)存總線都與cpu相關(guān)卫键,
而I/O總線與CPU無關(guān)傀履。
如intel的外部設(shè)備互連PCI總線,其連接了磁盤莉炉、顯卡钓账、鍵盤、鼠標絮宁、USB(通用串行總線)梆暮。
PCI(Peripheral Component Interconnect )。
下圖為CPU绍昂,內(nèi)存啦粹,I/O設(shè)備簡單抽象連接圖:
- 訪問磁盤:
CPU使用:內(nèi)存映射I/O 技術(shù)來向I/O發(fā)射命令。
下圖說明:
a.cpu發(fā)出三次指令:
1 命令:讀窘游。及其他參數(shù)如是否中斷指令唠椭。
2 磁盤的邏輯塊地址。
3 讀出放到某個內(nèi)存地址忍饰。
b.磁盤控制器接受命令贪嫂,并讀取定邏輯塊,將值傳送到內(nèi)存艾蓝。
此步驟不需要CPU參與力崇,稱為DMA(直接內(nèi)存訪問)斗塘。
c.當(dāng)內(nèi)容安全存儲到主存上后,磁盤控制器會發(fā)生給cpu一個中斷信號亮靴,來通知cpu逛拱。
-
固態(tài)硬盤SSD:
(Solid State Disk)
與磁盤區(qū)別:
1:底層硬件為閃存而非磁盤,閃存分為b個塊台猴,每個塊內(nèi)又有一定數(shù)量的頁朽合,頁內(nèi)存放512~4k個字節(jié)。
2:以閃存翻譯器(控制器)代替磁盤控制器饱狂。
說明:閃存讀取比寫入快曹步,因為:
1:必須已經(jīng)格式化即擦除的塊,才能在頁寫入數(shù)據(jù)休讳。擦除塊需要1ms左右時間讲婚。
但塊進行一次擦除,其內(nèi)頁不需要擦除即可寫入一次俊柔。
2:寫入位置若已有數(shù)據(jù)筹麸,則需要將整個塊的有用數(shù)據(jù)全部拷貝到已經(jīng)被擦除的塊,才能再進行寫入雏婶。
下面是閃存的結(jié)構(gòu)示意圖和速度指標:
(IOPS是每秒I/O次數(shù))
近年cpu與各存儲器性能物赶、價格示意圖:
存儲器層次結(jié)構(gòu):
(memory hierarchy)
-
原則:基于緩存思想
根據(jù)局部性(locality)思想,緩存可以作為實現(xiàn)的橋梁留晚。
如: - 空間局部性:如數(shù)組酵紫,以步長1訪問(每次索引加一),具有良好的空間局部性错维。
此時若高速緩存不命中奖地,而下一層命中。則會提取包含多個元素的一整塊赋焕,到高速緩存参歹。因而下次訪問的時間也會大大縮減。 - 時間局部性:頻繁地訪問某元素隆判。
高速緩存可以保存該元素在高層次中犬庇,相比每次從內(nèi)存提取,能大大提高速度蜜氨。
越靠近cpu械筛,緩存容量越小,速度越快飒炎,價格越貴。
- 對于任意兩層緩存(k,k+1)之間:
傳輸方式:以塊進行傳輸笆豁。
在指定兩層郎汪,塊大小相同赤赊。而層次結(jié)構(gòu)里,越高煞赢,則塊的大小越小抛计。
-
緩存命中與不命中:(讀取)
緩存命中(cache hit):當(dāng)需要的數(shù)據(jù)照筑,在k層的塊內(nèi)時吹截,緩存命中。
緩存不命中(cache miss):當(dāng)需要的數(shù)據(jù)凝危,在k層找不到波俄,此時緩存不命中,會到k+1層尋找蛾默。
緩存原理
不命中的種類:
①冷不命中(cold miss):k層是空的懦铺,
②容量不命中(capacity miss):如程序中,需反復(fù)訪問同一數(shù)組的元素支鸡,此時緩存太小冬念,不能夠處理這個工作集。
③沖突不命中(conflict miss):緩存足夠牧挣,但是k層中的某塊地址急前,被k+1層以某種規(guī)則映射,即兩個塊都會映射到同一個地方瀑构。
如規(guī)則為mod 4時:程序反復(fù)需要塊0叔汁,塊4。
1:先請求塊0检碗,此時k層沒有据块,從k+1層取出放在k層指定位置,并取出元素返回給cpu折剃。
2:cpu又請求塊4另假,又會不命中從下一層調(diào),然后保存并返回值怕犁,此時又覆蓋了塊0边篮。
3:cpu又請求塊0,又會不命中奏甫。這就是沖突不命中戈轿。
-
緩存管理:
可以由軟件、硬件阵子、或者兩者結(jié)合思杯,如下圖
-
SRAM高速緩存結(jié)構(gòu)示意圖:
cpu發(fā)出的地址的,高速緩存是如何翻譯挠进,并判斷出指定地址的? - 高速緩存采壬(S,E,B,m)結(jié)構(gòu):
S:高速緩存內(nèi)部分為S個組(0誊册,S-1)。
E:每個組內(nèi)部又有E個行暖璧。
B:每個行包括:1個有效位案怯,t個標記位,一個塊(B個字節(jié)澎办,可以理解為字節(jié)數(shù)組) -
與地址的對應(yīng):
傳入地址為:t個標記位嘲碱,s個組數(shù)位,b個偏移位局蚀。
t標記位一一對應(yīng)麦锯;
s個數(shù)組位指出指定組——共S=2^s個組;
b位指出字節(jié)偏移位——共B=2^b個字節(jié)至会。
如下圖:
高速緩存實現(xiàn):
以下模型均假設(shè)內(nèi)存和cpu間离咐,只有一個L1高速緩存。
-
直接映射高速緩存:
最簡單模型奉件。E為1宵蛀,即每組一行。
步驟①:由s位找到指定組县貌。
步驟②:訪問唯一行的有效位术陶。
步驟③-1:有效位為1,匹配標志位t煤痕,若相等梧宫,由b在塊中,找到偏移位摆碉,取出指定數(shù)量字節(jié)塘匣,返回給cpu。
步驟③-2:有效位為0巷帝,則訪問內(nèi)存忌卤,從內(nèi)存得到一個數(shù)據(jù)塊,將其放到指定組楞泼,取出字驰徊,返回給cpu。
直接映射抽象流程 -
E路相聯(lián)高速緩存:
每組有E行堕阔。
步驟與直接映射類似棍厂,找到組后,對每一行進行遍歷超陆,命中則返回值牺弹,否則訪問內(nèi)存。
2路相聯(lián)高速緩存 -
全相聯(lián)高速緩存:
僅有一組,包含了C/B行例驹,C為容量(僅包含塊數(shù)據(jù)捐韩,不包含標志位和有效位)退唠。
全相聯(lián)高速緩存
ps:為什么用中間位當(dāng)做s組索引?↓
寫命中與不命中:
- 寫命中會執(zhí)行:
直寫:當(dāng)某層寫命中后鹃锈,會更新塊內(nèi)指定內(nèi)容,然后往更低層繼續(xù)寫瞧预。
寫回:當(dāng)某層命中后屎债,也會更新寫入到塊內(nèi),但是不會直接寫入更低層垢油,除非該行會被替換時盆驹。(需要附加硬件判斷該行是否被修改過。) - 寫不命中會執(zhí)行:
寫分配:從更低層讀入塊滩愁,然后更新塊內(nèi)內(nèi)容躯喇。
非寫分配:直接寫入到更低層肛度,而不對該層進行修改更新施无。
說明:
寫回和寫分配洋侨,都更利于局部性實現(xiàn)请琳,但會需要格外硬件扁誓,使要替換驅(qū)逐該行時放吩,會將該行復(fù)制更新到更低層中乍炉。
-
cpu與高速緩存
三層cache封裝到cpu中
層次結(jié)構(gòu)
影響參數(shù)
ps:存儲器山的實驗替饿,暫時沒進行责球,以后可以看csapp家庭作業(yè)焦履,山的代碼已經(jīng)下載到OSstudy/soft里了。