標籤:裝置 order jpg 部分 演算法 地方 暫停 資料流 緩衝
儲存空間系統(memory system)是一個具有不同容量、成本和訪問時間的存放裝置的階層。
(一)存放裝置的種類
(二)訪問主存
讀寫操作由CPU上的匯流排介面電路發起。
根據中的資料流,對於讀操作:
1.CPU將地址A放到系統匯流排上,然後I/O橋將訊號傳遞給儲存空間匯流排;
2.主存感覺到儲存空間匯流排上的地址訊號,從儲存空間匯流排讀地址,從DRAM取出資料字,並將資料寫到儲存空間匯流排。I/O橋將訊號翻譯為系統匯流排訊號傳遞。
3.CPU感覺到系統匯流排上的資料,從匯流排上讀資料。
對於寫操作:
1.CPU將地址A放到系統匯流排上,然後I/O橋將訊號傳遞給儲存空間匯流排;主存讀出地址,等待資料到達;
2.CPU將資料字拷貝到系統匯流排
3.主存從儲存空間匯流排讀出資料字,並儲存。
這是CPU與主存之間資料傳遞的過程。如果更加細部地來看,對於主存來說,如何根據匯流排的資訊讀寫資料?
(三)訪問磁碟
當作業系統要執行IO操作時,作業系統會發送一個命令到磁碟控制卡,讓它讀某個邏輯號。控制器上的一個韌體執行快速表尋找,將一個邏輯塊號翻譯成一個(盤面、磁軌、扇區)三元組,讀取資料放到控制器的一個緩衝區,然後拷貝到主存。
CPU使用一種稱為儲存空間映射的技術來向IO裝置發送命令。在使用儲存空間映射IO系統中,地址空間中有一塊地址是為與IO裝置通訊保留的。這樣的地址稱為IO連接埠。
根據圖示,磁碟讀:
1.第一條指令是發送一個命令字,告訴磁碟發起一個讀,同時還發送了其他參數(例如當讀完成,是否中斷CPU);第二條指令指明應當讀的邏輯塊號;第三條指令指明應該儲存磁碟扇區內容的主存地址。發起磁碟讀。
2.磁碟控制卡收到命令,將邏輯塊號翻譯為扇區地址,讀扇區內容,然後將這些內容直接傳送到主存,不需要CPU幹涉。這個過程叫做DMA傳送(direct memory access)
3.DMA傳送完成,磁碟控制卡會給CPU發送一個中斷訊號通知CPU,這會導致CPU暫停它當前正在做的工作,跳轉到一個作業系統常式。這個常式會記錄下IO已經完成,然後將控制返回CPU被中斷的地方。
(四)局部性
一個編寫良好的程式會展現出良好的局部性。
時間局部性:在一個良好的時間局部性的程式中,被引用過一次的儲存空間位置很可能在不遠的將來再被引用;
空間局部性:在一個良好的空間局部性的程式中,如果一個儲存空間位置被引用了一次,那麼程式很可能在不遠的將來引用附近的一個儲存空間位置。
評價程式局部性的簡單原則:
1.重複引用同一個變數的程式有良好的時間局部性;
2.對於具有步長為k的參考模式,步長越小,空間局部性越好。
3.對於取指令來說,迴圈有好的時間和空間局部性。迴圈體越小,迭代次數越多,局部性越好。
(五)儲存空間結構
基於兩個事實:1)不同儲存技術的訪問時間差很大,CPU和主存之間的速度差距在增大;2)良好的程式具有良好的局部性。人們想到一種組織儲存空間系統的方法:儲存空間階層。
儲存空間階層主要是依賴一個概念:緩衝。
(六)快取儲存空間
早期電腦系統的儲存空間階層只有三層:CPU寄存器、DRAM主儲存空間和磁碟儲存。由於CPU和主存之間的差距逐漸增大,系統設計者被迫在插入L1快取,而後又插入L2快取。
多說一點:
C與M相差有多大?就是T/E那麼大,因為緩衝很小,所以T必然很大。
同樣多的行,按S組織和按E組織有什麼差別?按S組織,可以用地址來索引,類似於數組;按E組織,使用tag來匹配,類似於map。
根據E的不同,快取被分為不同的類。E=1的快取稱為直接映射快取(direct-mapped cache)。E>1的稱為組相聯快取(set associative cache).
對於直接映射快取,如果不命中的話,需要將從下一層中取出新塊儲存在緩衝中。如果要替換的話,因為組中只有一行,所以直接替換即可。
由於只有組中只有一行,所以當程式訪問大小為2的冪的數組時,經常發生衝突不命中。原因如下:
組相聯快取的基本原理類似於直接映射緩衝。值得一提的是:不命中時的行替換。有隨機替換策略、最不常用替換策略、最近最少使用替換策略。所有這些策略都需要額外的時間和硬體。但是,越往儲存空間階層下面走,一次不命中的開銷越昂貴,所以用更好的替換策略更加值得。
上面只講了讀,如何寫呢?
在快取中更新了w的拷貝之後,怎麼更新w在階層中緊接著低一層中的拷貝呢?
1.直寫,就是立即將w的快取塊寫回到緊接著的低一層中的拷貝。
2.寫回,只有當替換演算法要驅逐更新過的塊時,才把它寫到緊接著的低一層中。那麼快取必須為每一個快取行維護一個額外的修改位,表明這個快取是否被修改過
如何處理寫不命中呢?
1.寫分配,載入相應的下一層中的塊到快取中,然後更新這個快取塊。
2.非寫分配,避開快取,直接寫到低一層。
直寫快取通常是非寫分配的,寫回快取通常是寫分配的。
(七)編寫局部性好的代碼
1.將你的注意力集中到內迴圈上,大部分的計算和儲存空間訪問都發生在這裡;
2.通過按照資料Object Storage Service在儲存空間中搞得順序,以步長為1的來讀資料,從而使空間局部性最大;
3.一旦從儲存空間中讀入了一個資料對象,就儘可能多的使用它,從而使得時間局部性最大
CSAPP(4):儲存空間階層