儲存器體系結構

2021-06-29 14:20:38 字數 3267 閱讀 5472

對於乙個剛開始搞超算的本科生來說,要是不懂儲存器的體系結構,那當真是說不過去,今天詳細地說一下計算機的儲存結構吧。

隨機訪問暫存器(ram)分為兩類:靜態的和動態的。靜態(sram)比動態(dram)更快,但也貴的多(不過搞超算的其實不太考慮貴不貴了)。所以一般sram用作快取記憶體,而dram一般用作計算機的主儲存器,也就是我們平時所說的記憶體了。還有就是dram可以用作圖形系統的幀緩衝區,相信做過cuda程式設計的同學對這個肯定不陌生吧。

sram將每個位儲存在乙個雙穩態的儲存單元裡,每個單元是用乙個六電晶體電路來實現的。雙穩態也就是它可以無限期地保持在兩個不通過的電壓或狀態之一。所以它的抗干擾能力非常強。

dram每一位儲存單元是由乙個電容和乙個訪問電晶體組成(難怪比sdram便宜),它對干擾非常敏感。當電容和電壓被擾亂以後,它永遠也不會再恢復,暴露在光線下會導致電容和電壓的改變。

很多原因會導致漏電,所以dram單元在10~100微秒的時間內失去電荷。所以儲存系統必須周期性地讀出,然後重寫來重新整理儲存器的每一位。

磁碟的碟片**有乙個可以旋轉的主軸,它使得碟片以固定的旋轉速率旋轉,通常5400-15000轉每分鐘。磁碟表面有乙個稱為磁軌的同心圓組成的。每個磁軌被劃分為一組扇區。每個扇區包含相等數量的資料位(通常是512位元組)扇區之間由一些間隙分隔開,這些間隙中不儲存資料位。間隙儲存用來標識扇區的格式化位。磁碟製造商通常用術語柱面來描述多個碟片驅動器的構造。

乙個磁碟上可以記錄的最大位數被稱為最大容量。

現在大容量磁碟使用一種多區記錄的技術,在這種記錄中,柱面的集合被分割成不相交的子集,稱為記錄區。乙個區中的每個柱面中的每條磁軌都有相同數量的扇區。該扇區的數量是由該區中最裡面的磁軌上的扇區數量決定的。

磁碟容量的計算方法:

磁碟容量=位元組數/扇區*平均扇區數/磁軌 *磁軌數/表面 * 表面數/盤面 * 碟片數/磁碟

將驅動器磁頭定位在磁軌上被稱為尋道。讀寫頭垂直排列,任意時刻所有讀寫頭都位於同一柱面上。磁碟以扇區大小的快塊來讀取資料

因為尋道時間和旋轉時間基本時相同的,所以可以將尋道時間乘以二是估計磁碟訪問時間的合理方法。

intel的外圍裝置互聯pci,諸如pci這樣的i/o匯流排設計成與底層cpu無關。

主機匯流排介面卡是將乙個或多個磁碟連線到i/o匯流排上。使用的乙個特別的主機匯流排介面定義的通訊協議。兩個最常用的磁碟介面是scsi和sata,前者貴,速度快且能支援多個磁碟驅動器。

cpu使用一種儲存器對映i/o的技術來向i/o裝置發出命令,位址空間有一塊空降是為了i/o裝置通訊保留的。每個這樣的位址稱為i/o埠。當乙個裝置連線到匯流排時,它與乙個或多個埠相關聯。

裝置可以自己執行讀或者寫匯流排事務,這個過程稱為直接儲存器訪問,這種資料傳輸稱為dma傳送。

在dma完成以後,磁碟扇區的內容被安全地儲存在主存中之後,磁碟控制器會傳送乙個中斷訊號給cpu。磁碟控制器把乙個中斷訊號傳送到cpu的乙個引腳上。這會導致cpu中斷當前的工作,跳轉到乙個作業系統例程。這時cpu會記錄下i/o已經完成,然後將控制返回到cpu中斷的地方。

ssd順序讀寫效能相當,當以隨機順序訪問邏輯塊時,讀比寫快乙個數量級。ssd是基於快閃儲存器的,而乙個快閃儲存器是由b個塊組成,而乙個塊又是由p個也組成,其中乙個頁有512b4kb,乙個塊有32128個頁組成。資料是以頁為單位進行讀寫的。只有在一頁所屬的塊被擦除以後,才能寫這一頁。不過一旦乙個塊被擦除了之後,塊中的每乙個頁都可以不需要擦除就進行寫一次。大約進行了100000次重複寫之後,塊就會磨損,一旦塊磨損了,塊就不能再用了。

區域性性原理:程式傾向於引用鄰近於它最近引用過的資料項的資料項,或者最近引用過的資料項本身。

兩種形式:時間區域性性 和空間區域性性 在乙個具有良好時間區域性性的程式中,被引用過一次的儲存器位置很可能在不遠的將來再被多次引用。在乙個具有良好空間區域性性的程式中,如果乙個儲存器位置被引用一次,那麼程式很可能在不遠的將來引用附近的儲存器位置。

int sumvec(int v[n])

對於x和y來說,這個函式有良好的空間區域性性,並且有較高的命中率。但是並不總是如此。

但是有可能實際後面每一次對x和y的引用都會導致衝突不命中,因為我們在x和y之間的塊抖動。

為什麼用中間位作索引?

如果用高位作索引,那麼一些連續的儲存器塊就會對映到相同的快取記憶體行。如果乙個程式有良好的空間區域性性,那麼在任何時刻快取記憶體中只儲存著乙個塊大小的陣列空間,這對快取記憶體是乙個浪費。

組相連快取記憶體行匹配的基本思想是組中任何一行都可以包含任何對映到這個組中的儲存器塊。所以快取記憶體必須搜尋組中的每一行,尋找乙個有效的行,其標記和位址中的標記相匹配。如果找到了,那我們就命中了,然後根據偏移位找到要找的字。

快取不命中的替換策略,一是隨機替換,二是最不常使用策略lfu,三是最近最少使用策略lru。

越往層次結構下面走,遠離cpu,一次不命中的開銷會變得更加昂貴。

乙個全相連快取記憶體是由乙個包含所有快取記憶體行的組組成的。因為快取記憶體電路必須並行地搜尋許多相匹配的標記,構造乙個又大又快的相連快取記憶體很困難,而且很昂貴。因此,全相連快取記憶體只適合做小的快取記憶體,例如虛擬儲存器系統中的翻譯備用儲存器tlb。

寫命中以後寫入低一層的儲存器有兩種方法,一種是直寫,另外一種是寫回,即等到需要執行替換策略時,再將快取記憶體中更新過的行寫回到下一層的儲存器中。這樣可以顯著減小匯流排的流量。但此時快取記憶體必須為每乙個快取行維護乙個修改位,以確定該行是否修改過了。

當快取不命中時,一種是將相應的行取到快取記憶體中,然後對其進行更新,然後寫回,這種被稱為寫分配,還有一種是非寫分配的,即直接寫到低一層的儲存器,一般直寫都是非寫分配的,寫回快取記憶體都是寫分配的。

寫回和寫分配試圖利用區域性性,所以我們可以在更高層次上開發我們的程式,使其具有更高的時間和空間區域性性。

intel core i7的所有快取記憶體都在cpu晶元上。且其l1快取記憶體的指令快取和資料快取是分開的。指令快取i-cache,資料快取d-cache。

快取記憶體的大小,一方面快取記憶體大能增大快取記憶體的命中率,但是當快取記憶體增大時卻又會增大命中時間,特別是l1快取記憶體必須要快。

傳統上,努力爭取時鐘頻率的高效能系統會為l1快取記憶體選擇較低的相聯度,而在處罰比較高的低層次上使用比較高的相聯度。在intel core i7 的l1,l2上是使用8路組相聯的,而在l3上是使用16路組相聯的。

兩個原則:

對區域性變數的反覆引用是好的,因為編譯器能夠將它們快取在暫存器檔案中(時間區域性性)。

步長為1的引用模式是好的,因為編譯器層次結構中所有層次上的快取都是將資料儲存在連續的塊中(空間區域性性)。

core i7具有硬體預取機制,它會自動地確定儲存器的引用模式,試圖在一些塊被訪問之前將它們取到快取記憶體中。

儲存器效能不是乙個數字就能描述的,相反的,它是一座空間和時間區域性性的山。

MySQL儲存引擎體系結構

mysql採用外掛程式式儲存體系結構。提供到儲存引擎有 myisam 預設的mysql外掛程式式儲存引擎,它是在web,資料倉儲和其他應用環境下最常用的儲存引擎之一。通過更改storage engine配置變數能夠方便地更改mysql伺服器的預設儲存引擎。innodb 用於事物處理應用程式,具有眾多...

MySQL 儲存引擎體系結構

最上層是一些客戶端和連線服務,包含本地 sock 通訊和大多數基於客戶端 服務端工具實現的類似於 tcp ip 的通訊。主要完成一些類似於連線處理 授權認證 及相關的安全方案。在該層上引入了執行緒池的概念,為通過認證安全接入的客戶端提供執行緒。同樣在該層上可以實現基於 ssl 的安全鏈結。伺服器也會...

mysql 體系結構 了解MySQL體系結構

mysql 資料庫體系結構圖 mysql 由以下幾部分組成 1 connectors 不同語言中與 sql 的互動 show variables like connection variable name value character set connection utf8 collation c...