24c儲存器讀寫軟體 必知必會 儲存器層次結構

2021-10-16 10:32:56 字數 4052 閱讀 2729

相信大家一定都用過各種儲存技術,比如mysql,mongodb,redis,mq等,這些儲存服務效能有非常大的區別,其中之一就是底層使用的儲存裝置不同。作為乙個程式設計師,你需要理解儲存器的層次結構,這樣才能對程式的效能差別了然於心。今天帶大家了解下計算機系統儲存器的層次結構。
首先了解下什麼是儲存器系統?

實質上就是乙個具有不同容量、成本和訪問時間的儲存裝置的層次結構。從快到慢依次為:cpu暫存器、快取記憶體、主存、磁碟;

接下來一起深入了解下計算機系統涉及的幾個儲存裝置:

隨機訪問儲存器(ram)分為靜態ram (sram) 和動態ram(dram)。sram的速度更快,但也貴很多,一般不會超過幾兆位元組,通常用來做告訴快取儲存器。dram就是就是我們常說的主存。

資料流是通過作業系統中的匯流排的共享電子電路在處理器和dram之間來來回回。每次cpu和主存之間的資料傳送都是通過一系列複雜的步驟完成,這些步驟成為匯流排事務。讀事務是將主存傳送資料到cpu。寫事務從cpu傳送資料到主存。

匯流排是一組並行的導線,能攜帶位址、資料和控制訊號。下圖展示了cpu晶元是如何與主存dram連線的。

那麼我們在載入資料和儲存資料時,cpu和主存到底是怎樣互動實現的呢?

首先來看乙個基本指令,載入記憶體資料到cpu暫存器中:

movq a,%rax

cpu將位址a放到系統匯流排上,i/o橋將訊號傳遞到記憶體匯流排。詳情看下下圖a

主存感覺到記憶體匯流排上的位址訊號,從記憶體匯流排讀位址,從dram取出資料字,將其寫到記憶體匯流排。i/o橋將記憶體匯流排訊號翻譯成系統匯流排訊號,沿著系統匯流排傳遞到cpu匯流排介面。下圖b

cpu感覺到系統匯流排上的資料,從匯流排上讀資料,並將資料複製到暫存器%rax。下圖c

隨機訪問儲存器,有個缺點是當斷電後,dram和sram會丟失它們的資訊,因此為易失性儲存。

磁碟是廣為使用的儲存大量資料的儲存裝置,目前我們家用電腦,動輒也都是1t的。它相比於基於ram的只有幾百或幾千兆位元組的儲存器來說,雖然大但是讀寫效能差。時間為毫秒級,比dram讀慢了10萬倍,比sram慢了100萬倍。

磁碟是由碟片構成的。每個碟片有兩面。表面覆蓋著磁性記錄材料。碟片**是乙個可以旋轉的主軸(spindle),它使碟片可以以固定的速率旋轉,通常是5400~15000轉每分鐘,磁碟通常包含多個碟片,密封在乙個容器內。

如上圖,我們可以看到,表面被劃分為很多同心圓,稱為磁軌。磁軌又被劃分為很多扇區,每個扇區具有相同的資料位(通常512位元組)。扇區之間有間隙隔開,用來儲存標識扇區的格式化位。

多個碟片封裝在一起到乙個容器中,就是我們平時用的硬碟,稱為磁碟驅動器。

容量很好理解,就是磁碟一共可以儲存的資料位。根據磁碟的構造,我們得出磁碟的容量由下面因素決定:

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

結合乙個例子方便各位理解:

假如我們有乙個磁碟,有5個碟片,每個扇區512位元組,沒個面20000條磁軌,每條磁軌 300 個扇區,那麼容量計算為:

磁碟容量 = 512 * 300 * 20000 * 2 * 5 = 30720000000位元組=30.72g

磁碟讀寫操作靠的是讀寫頭來讀寫儲存在磁性表面的位,它在傳動臂的一端,通過這個傳動臂沿著半徑前後移動,從而讀取不同的磁碟上資料,這個過程就成為尋道(seek)

通過上圖可以清晰的了解到,在讀取資料的時候,首先通過傳動臂沿著半徑將讀寫頭移動到對應表面的磁軌上,而表面一直在以固定的速率旋轉,讀取指定扇區的資料(磁碟是以扇區大小來讀寫資料)。因為對於資料訪問來說,消耗時間主要集中在:尋道時間、旋轉時間和傳送時間。

這裡給出乙個書上寫的結論,訪問乙個磁碟扇區中512位元組的時間主要是尋道時間和旋轉延遲。也就是訪問扇區中第乙個位元組花費很長時間,剩下的幾乎不用時間。

也就是i/o匯流排連線各種i/o裝置、主存等。

固態硬碟也就是俗稱的ssd(solid state disk),是一種基於快閃儲存器的儲存技術,目前常用的日常pc都用它來代替了磁碟,獲取更快的速度。

ssd是內部由快閃儲存器構成,乙個快閃儲存器由b個塊的序列組成,每個塊由p頁組成。通常頁的大小是512位元組~4kb,塊由32~128頁組成,塊的大小為16kb~512kb。

ssd的隨機讀比寫快很多,是因為:

在寫的時候,只有一頁所屬的整個塊被擦除之後才能寫。而擦除塊需要較長時間,1ms級的,比讀取高乙個數量級。

如果寫的頁p已經有資料,那麼這個塊中所有帶資料的頁都必須被複製到乙個新的已經擦除過的塊,然後才能對頁p寫操作。

在大約進行100000次重複寫之後,塊會被磨損,不能在使用,所以這也是網上建議儲存固態磁碟不要頻繁格式化,作為系統盤的原因。

現在計算機頻繁的使用基於sram的告訴快取,為了彌補處理器-記憶體之間的差距,這種方法行之有效是因為區域性性這個基本屬性。

程式的區域性性原理是指程式在執行時呈現出區域性性規律,即在一段時間內,整個程式的執行僅限於程式中的某一部分。相應地,執行所訪問的儲存空間也侷限於某個記憶體區域。區域性性原理又表現為:時間區域性性和空間區域性性。時間區域性性是指如果程式中的某條指令一旦執行,則不久之後該指令可能再次被執行;如果某資料被訪問,則不久之後該資料可能再次被訪問。空間區域性性是指一旦程式訪問了某個儲存單元,則不久之後。其附近的儲存單元也將被訪問。
上面我們介紹了記憶體和磁碟的讀取邏輯,因此一旦某個資料被訪問過,很快的時間內再次被訪問,則會有快取等手段,提高訪問效率。

因此我們程式中應該尊村下列普遍方法:

重複引用相同變數的程式有良好的時間區域性性;

總是順序訪問資料,跨越的步長越小,則程式的空間區域性性越好。

對於取指令來說,迴圈有好的時間和空間區域性性。迴圈體越小,迴圈迭代次數越多,區域性性越好。

比如乙個for迴圈,這是平時經常使用到的場景。假設它訪問乙個同乙個陣列元素,那麼這個陣列就是當前階段的訪問工作集,在快取夠大的情況下,它是可以直接命中快取的。

上面主要介紹了儲存技術和計算機軟體一些基本的和持久的屬性:

而現在計算機系統中,硬體和軟體這些基本屬性互相補充的很完美,即高層從底層走,儲存裝置變得更慢、更便宜和更大,頂層的是cpu暫存器,cpu可以在乙個時鐘週期內訪問他們,接下來是快取記憶體sram、主存等 。

看上圖所示,其中心思想就是:對於每個k,位於k層的更快更小的儲存裝置是作為位於k+1層更大更慢裝置的快取。

概括來說,基於快取的儲存器層次結構行之有效,因為較慢的儲存裝置比較快的裝置更便宜,還因為程式傾向於展示區域性性。

常用的儲存技術,以及計算機是如何操作這些儲存裝置中的資料的。

講解了程式中的區域性性原理,時間區域性性和空間區域性性。方便大家寫出更快的程式。

最後學習了整個計算機系統的儲存器層次結構。儲存系統其實就是乙個多級快取系統,上層的儲存裝置昂貴,容量小,**貴,但是速度快,作為下一層裝置的快取。

關注公主號,掌握第一手資料:羅小黑愛程式設計

24 C語言函式傳參詳解

24.1.普通變數作為函式形參 1 普通變數作為引數在函式傳參時,形參和實參名字可以相同也可以不同,實際上都是用實參來替代相應的形參的。2 在字函式內部,形參的值等於實參。原因是函式呼叫時把實參的值賦值給了形參。這就是所謂的 傳值呼叫 相當於實參做右值,形參做左值。24.2.陣列和指標作為函式形參 ...

24 C語言和設計模式(之單件模式)

有過面試經驗的朋友,或者對設計模式有點熟悉的朋友,都會對單件模式不陌生。對很多面試官而言,單件模式更是他們面試的保留專案。其實,我倒認為,單件模式算不上什麼設計模式。最多也就是個技巧。單件模式要是用c 寫,一般這麼寫。cpp view plain copy include include class...

24 C 抽象類 存虛函式 介面 多重繼承

抽象類和介面 什麼是抽象類 比如圖形 shape 類,就是乙個抽象的概念,因為我們無法計算這個 圖形 的面積,所以它的成員函式area 是空的。而繼承它的子類 矩形,圓形,三角形等 就可以去重寫area 成員函式.裡面通過數學公式,計算出面積.參考圖形 shape 類,如下 class shape ...