1. 程式人生 > >三種快取模式(Cache Pattern)

三種快取模式(Cache Pattern)

(這是一個MIT同學整理的6.004 Computation Structure的課程的筆記,內容清晰易懂,看一遍可以簡單瞭解計算機組成的基本內容,一共55頁,計劃全部譯成中文。轉載請註明出處。)

(筆記原文: https://app.box.com/s/hj73i5cnek38kpy9yw22)

儲存層次(Memory Hierarchy)

CUP和記憶體資料交換的效率不高,這是指令流水線式處理器的瓶頸之一。我們可以通過儲存層次(Memory Hierarchy)的方式來解決這個問題。這個儲存層次內有:

1、容量小的、高速的快取

2、容量較大的、慢一點記憶體

3、容量很大的、但很慢的硬碟

所以當CPU獲取一個記憶體地址A時,通常經過這些步驟:

1、檢查快取: 如果地址A儲存在快取裡(稱作Cache Hit),那麼返回這個資料,否則去第2步

2、檢查記憶體(Main Memory):如果A在主存裡,那就返回A並把它放在快取裡,否則執行第3步

3、如果A不在快取和記憶體裡,A必然在硬碟(Disk)裡。我們把A放入主存和快取,並且返回資料。

為了簡化這個結構,我們在這裡假設A不會在硬盤裡。所以如果在快取裡沒有,必在主存裡。

快取是很小而且很快的儲存單元,它儲存了儲存器的臨時備份。在6.004課程中,你可以假設一個CPU內部的Clock速率,在這樣的速率下,一次Cache Hit會在一個時間週期(Cycle)內返回Cache儲存的資料。而且一次失敗的Cache查詢後,CPU會暫停,知道資料在記憶體中被找到。如果Cache Miss的概率不是很高,那麼使用Cache可以顯著提高記憶體的平均讀取時間。

t = t(cache) + miss_rate * t(memory)

本地化(Locality)

Cache很有用,因為它利用了Locality的策略:

如果你得到了A位置的資料,你很有可能不久還要使用它。每當有一次Cache Miss,這個記憶體地址就會進入Cache,並且替代一些Cache中的很久沒用的資料。

全關聯快取(Fully Associative Cache)


一個快取包括很多條線(Cache Line)。一條Cache Line包括:

1、一個有效位(Valid Bit),用來表示這條線中的資料是否有效。

2、一個可選的狀態位(State Bit),用來表示這個資料是否被修改過(Dirty),是否是隻讀(Read-only),等等

3、一個標籤,是由記憶體地址生成的

4、以及地址對應的資料

我們將會討論3種快取,全關聯快取是其中之一。它和其他結構的區別是,全關聯快取可以把資料放在任何地方

當一個記憶體地址送給一個全關聯記憶體時,這個地址標籤就和Cache中的所有有效線路(Valid Line)進行對比,如果tag相同,算作Cache Hit。這條線路的資料就被髮送給CPU,否則算作一次Cache Miss。

如果Cache中所有的線路都是有效的(Cache是滿的),發生了一次Cache Miss。我們就需要做一次資料替換(把得到的資料和Cache中某個資料進行替換)。替換的原則我們會在後文中提到。如果被線路有效並且被修改過(V =1,D = 1),那我們就必須把這線路中的資料寫回主存。如果沒被修改過,我們直接覆蓋這線路。

關於全關聯快取,有一些有用的等式:

Capacity  = # lines * ( 1 valid bit + S status bits + T tag bits + D data bits)

在 6.004課程中,有一些特別的數值: T = 30 bits, D = 32 bits

下面這些例子展示了三次取指操作。從一個空的全關聯快取開始。每幅圖展示了Cache在圖片下方註釋內容被執行後的狀態。




直接對映快取記憶體(Direct-Mapped Cache)

直接對映快取記憶體比全關聯快取便宜。因為整個快取中只有一個標籤比較器(Tag Comparator)。這和全關聯快取器中每一條線路都有一個比較器不同。


但在直接對映快取記憶體中,地址衝突是存在的,這可能會影響cache的效果。

給出一個記憶體地址後,index會選擇快取線路。如果目標TAG和快取中的Tag相等,就達成一次Cache Hit。這條快取中的資料會被髮送給CPU。

如果快取中沒有index對應的線路,我們需要去主存,主存中的資料替換了快取中的index對應的線路的資料。如果線路中的資料是有效的並且被修改過(V=1, D=1)。快取必須把那個資料寫進記憶體再扔掉。

看到這裡,我們肯定會思考,全關聯快取和直接對映快取記憶體哪個更好,這取決於資料獲取的模式(Memory Access Pattern)。不同的模式和資料替換策略(Replacement Strategy,就是發生Cache Miss後的資料替換規則)在不同的快取結構中各有千秋。

這裡是一些關於直接快取記憶體的有用的等式:

Capacity = # lines * ( 1 valid bit + S status bit + T tag bits + D data bits)

# lines = 2^(# index bits)

下面這些例子展示了四次取指操作。從一個空的直接快取記憶體開始。每幅圖展示了Cache在圖片下方註釋內容被執行後的狀態。




N路組相聯快取記憶體(Direct-Mapped Cache)


相關推薦

快取模式Cache Pattern

(這是一個MIT同學整理的6.004 Computation Structure的課程的筆記,內容清晰易懂,看一遍可以簡單瞭解計算機組成的基本內容,一共55頁,計劃全部譯成中文。轉載請註明出處。) (筆記原文: https://app.box.com/s/hj73i5cne

設計模式系列之:工廠模式Factory Pattern

這是本系列的第三篇部落格,這次主要來說一下工廠模式。 基本工廠模式 簡單來說工廠模式是將工程中的相同型別物件的建立活動集中管理,一般通過反射來生成外界需要的實體類。比如Spring中的容器Bean概念,通過Spring BeanFactory來產生不同的Be

關於負載均衡的傳輸模式反向代理,透傳,三角

什麼是負載均衡(SLB) SLB(伺服器負載均衡):在多個提供相同服務的伺服器的情況下,負載均衡裝置存在虛擬服務地址,當大量客戶端從外部訪問虛擬服務IP地址時,負載均衡裝置將這些報文請求根據負載均衡演算法,將流量均衡的分配給後臺伺服器以平衡各個伺服器的負載壓力,避免在還有伺服器

Java的代理模式轉載

Java的三種代理模式 1.代理模式 代理(Proxy)是一種設計模式,提供了對目標物件另外的訪問方式;即通過代理物件訪問目標物件.這樣做的好處是:可以在目標物件實現的基礎上,增強額外的功能操作,即擴充套件目標物件的功能. 這裡使用到程式設計中的一個思想:不要隨意去修改別人已經寫好的程式碼或

設計模式——裝飾者模式Decorator Pattern

    裝飾者模式:動態將責任附加到物件上,要拓展功能,提供了比繼承更有彈性的方案。 很多文章也是拿了書上的例子來講,同時寫到,有的調料裝飾者都必須實現 getDescription() 大家可以先考慮下,稍後我們會說。最後都是沒說,還有思考的

設計模式之建造者模式Builder Pattern

通過靜態內部類等方式實現的零件無序話構造 程式碼 1.User public class User { private String name; private int age; private String address; public String

Tomcat Connector執行模式BIO, NIO, APR的比較和優化

                  Java Blocking Connector   Java Nio Blocking Connector   APR/native Connector                              BIO                         NIO

計算機網路的通訊模式單播,廣播,組播小結

1.單播(Unicast) 單播在傳送者和每一接收者之間實現點對點網路連線。 如果一臺傳送者同時給多個的接收者傳輸相同 的資料,也必須相應的複製多份的相同資料包。如果有大量主機希望獲得資料包的同一份拷貝時, 將 導致傳送者負擔沉重、延遲長、網路擁塞;為保證一定

hadoop初識之:搭建hadoop環境配置HDFS,Yarn及mapreduce 執行在yarn上及執行模式本地模式,偽分散式和分散式介

--===============安裝jdk(解壓版)================== --root 使用者登入 --建立檔案層級目錄    /opt下分別 建 modules/softwares/datas/tools 資料夾 --檢視是否安裝jdk    rpm -

二十三設計模式[21] - 策略模式Strategy Pattern

vat tle 新的 auto 避免 play 可能 https 相互 前言 策略模式,對象行為型模式的一種。在《設計模式 - 可復用的面向對象軟件》一書中將之描述為“ 定義一些列的算法,把它們一個個封裝起來,並且使它們可相互替換。使得算法可以獨立於使用它的客戶

靜態時序分析的分析模式簡述

  經過跟行業前輩的探討和參考一些書籍,本文中的“個人理解”部分有誤,即:   (個人理解:)在一個庫中,儘管電路器件單元已經被綜合對映,但是工具可以通過改變周圍的環境來得到不同的單元延時,所以即使是同一個庫,呼叫工藝引數不一樣的情況下,其單元延時是不同的,因此就有了最快路徑和最慢路徑。 (這裡有誤)。

【23設計模式】之 組合模式Composite Pattern

需求: (1)需要某種樹形結構,可以容納選單、子選單和選單項 (2)需要確定能夠在每個選單的各個項之間遊走,而且至少要像現在用迭代器一樣方便。 (3)需要能夠更有彈性地在選單

計算機網路通訊模式單播、廣播、組播小結

1、單播定義:單播在傳送者和每一接收者之間實現點對點網路連線。如果一臺傳送者同時給多個接收者傳輸相同的資料,也必須相應的複製多份的相同資料包。如果有大量主機希望獲得資料包的同一份拷貝時,將導致傳送者負擔沉重、延遲長、網路擁塞,為保證一定的服務質量需增加硬體和頻寬。單播優點:1

Unity遊戲設計模式原型模式Prototype Pattern

        原型模式,顧名思義就是通過物件的原型克隆而產生的新的物件。原型模式在遊戲中運用非常多。怪物,一張地圖上有許許多多的怪物,這些怪物一般都具有共通性,同一種怪物就有可能擁有同樣的模型,同樣的攻擊方式等。即使是不同型別的怪物他們也擁有許多共通性,例如都擁有攻擊力,

設計模式-工廠模式-附Java原始碼

建議結合示例原始碼理解 1 簡單工廠模式 簡單工廠模式(Simple Factory Pattern):定義一個工廠類,它可以根據引數的不同返回不同類的例項,被建立的例項通常都具有共同的父類。因為在簡單工廠模式中用於建立例項的方法是靜態(

二十三設計模式[23] - 訪問者模式Visitor Pattern

htm 訪問者模式 單一職責 script truct width string void sig 前言 訪問者模式,是一種將數據的結構與其操作分離的類行為型模式。它能夠幫助我們解決數據結構穩定但數據操作多變的問題,使我們可以很容易的增加或修改數據的操作。

AOP的程式設計模式

 註解完成AOP程式設計applicationContext.xml檔案<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/be

ADF VO排序及VO的查詢模式

常規應用中,當需要使用Table向終端使用者展示資料時,Table中資料的顯示排序一致性極大程度的影響到了客戶體驗。通常希望諸如多次查詢結果顯示順序相同、插入資料在原資料上方等的實現。ADF為開發人員提供了兩種級別的排序,即資料庫級別的排序及記憶體級別(In-Memory

設計模式之 - 模板模式Template Pattern

process egg lec pass jdbcutils ima tint new sta 引入:這幾天在看一本講spring源碼的書《SPRING技術內幕》裏面在講加載配置文件的時候,可以有不同的加載方式,如根據文件系統目錄加載配置文件(FileSystemXmlAp

thinkphp5 重定向跳轉

scrip names 成功 三種 line hist server -s 需要 頁面跳轉 在應用開發中,經常會遇到一些帶有提示信息的跳轉頁面,例如操作成功或者操作錯誤頁面,並且自動跳轉到另外一個目標頁面。系統的\think\Controller類內置了兩個跳轉方法succ