作業系統中的主儲存器 快取記憶體

2021-10-07 07:54:09 字數 3694 閱讀 4454

儲存管理是作業系統的重要組成部分,它負責管理計算機系統中的主儲存器。

任何程式(**)及資料在執行前必須進入主存空間,因此儲存管理的優劣直接影響系統的效能,主儲存空間一般分為兩部分:一部分是系統區,存放作業系統的核心程式以及標準子程式等;另一部分是使用者區,存放使用者的程式和資料等,供當前正在執行的程式使用。我們所關注的儲存管理就是使用者區的管理,作業系統的任務之一就是要盡可能方便使用者使用以及提高主儲存器的利用效率;而且,有效的儲存管理也是多道程式設計系統的關鍵支撐,儲存管理主要有如下功能

介於處理器和記憶體二者之間的快取有兩個天然衝突的效能指標:速度和容積,這個矛盾也是引入多級快取的主要原因。

作業系統中的儲存一般分為六層結構,暫存器,快取記憶體(cpu cache),主儲存器,磁碟快取,固定磁碟,可移動儲存等;如下圖所示,越往上,儲存介質的訪問速度越快,但是記憶體也越小;

其中,暫存器、快取記憶體以及主儲存器和磁碟快取都屬於作業系統儲存管理的範圍,掉電之後它們的資訊不再存在;而固定磁碟管理和可移動儲存介質屬於裝置管理的管轄範疇,它們儲存的資訊將被長期儲存。

可執行的程式必須被儲存在計算機主存中,但是cpu訪問主存的時間要遠大於處理時間,所以暫存器和快取記憶體被引入用於加快指令的執行;

快取記憶體的容量比暫存器大,而訪問速度比主存要快,使用它存放主存中一些經常訪問的資訊可以大幅度提高程式執行速度;比如主存訪問速度1微秒,快取記憶體為0.1微秒,如果訪問資訊在快取記憶體中的機率為50,那麼儲存器的訪問速度就可以提高到0.55微秒。因此,提高訪問資訊在cpu cache中的命中是乙個非常重要的事情,比如unity的ecs、dots架構等就是通過合理分配儲存空間來提高cache的命中率從而提高效能。

一般來說程式的處理流程為,資料資訊存放在主存中,每當使用它時,就會將其賦值到乙個訪問速度很快的cache中,當cpu訪問一組特定資訊時,首先,檢查是否在cache中,如果存在,直接取用;否則,就從主存中讀資訊,通常認為這批資訊被再次用到的概率很高,所以同時還把主存讀出的資訊複製到cache中。

在cpu的內部暫存器和主存之間建立了乙個cache,而由程式設計師或編譯系統實現暫存器的分配或替換演算法,以決定資訊是儲存在暫存器還是在主存。有一些cache是通過硬體實現的,如大多數計算機有指令cache,用來暫存下一條欲執行的指令,如果沒有指令cache,cpu將會空等若干個週期,直到下一條指令從主存中取出。多數計算機系統的儲存層次中設定了乙個或多個高速資料cache,可見cache是解決主存速度與cpu速度不相匹配的一種部件。

由於高速cache的容量有限(速度小於25ns,容量有128k和256k),所以,cache的管理是乙個重要的設計問題,仔細確定其大小和替換策略,能夠做到80%-99%的所需資訊在cache中找到。主存也可以看作是輔存的cache,因為輔存中的資料必須複製到主存方能使用;反之,資料也必須先存在主存中,才能輸出到輔存。乙個檔案的資料可能出現在儲存器層次的不同級別中,例如,作業系統可在主存中維護乙個檔案資料的cache。

快取記憶體之所以有效,是因為程式執行時對記憶體的訪問呈現區域性性特徵,這種區域性性既包括空間區域性性也包括時間區域性性。所以,有效利用這種區域性性,快取可以達到極高的命中率。而在處理器看來,cache對程式開發者而言是透明的,因此開發者無法直接干預對快取的操作,但是可以根據快取的特點對**進行特定優化,從而更好利用快取。

在結構上,乙個直接對映快取由若干快取塊構成。每個快取塊儲存具有連續記憶體位址的若干個儲存單元,在32位中每個儲存單元佔雙字,即四個位元組,每個雙字具有唯一的塊內偏移量。

每乙個快取塊有乙個索引,它一般是記憶體位址的低端部分,但不含塊內偏移和位元組偏移所佔的最低若干位,乙個資料總量為4kb、快取塊大小為16b的直接對映快取一共有256個快取塊,其索引範圍為0到255,使用乙個簡單的移位函式就可以得到任意記憶體位址對應的快取塊的索引。由於這種是多對一對映,必須在儲存一段資料的同時標識出這些資料在記憶體中的確切位置,所以每個快取塊都配有乙個tag,拼接標籤值和此快取塊的索引,即可求得快取塊的記憶體位址,再通過塊內偏移可以算出任意一塊資料的記憶體位址。

因此,在快取大小不變的情況下,快取塊的大小和快取塊的數量總是呈反比;

另外,如下圖所示,快取塊中還有若干標誌位,包括有效位、髒位、使用位等,這些在保證正確性、排除衝突、優化效能等方面起重要作用。

在層次式儲存結構中,相同的資料可能出現在不同層次上。例如,考慮對檔案b中的乙個整數a做加1操作,假如檔案b儲存在磁碟上,首先,發出i/o指令,它把a所在的盤塊讀到主存中,再做加法操作。跟著這個操作,可能把a的乙個副本複製到cache,而a的另乙個副本複製到cpu暫存器。因此,a的副本出現在層次的若干地方,當加1操作在cpu暫存器執行之後,在儲存器各層次中,a的值是不同的,僅當a的新值被寫回磁碟之後,a的值才會變成相同。

在多cpu環境中,情況變得較為複雜,除了維護cpu暫存器外,cpu還包含乙個區域性資料cache,於是,a的副本可能同時出現在若干個cache中,所有的cpu都併發地執行,對a值在某個cache中的修改,立即會影響到a所在的所有其它cache,這個問題稱作緩衝一致性問題。

當乙個組的全部快取塊都被佔滿後,如果再次發生快取失效,就必須選擇乙個快取塊來替換掉,存在多種策略決定哪個塊被替換。最理想的替換塊應該是距離下一次被訪問最晚的那個,但這個是無法真正實現的,可它的方向是正確的。比如先進先出fifo演算法,替換掉進入組內時間最長的快取塊;最久未使用lru演算法則跟蹤各個快取塊的使用情況,並根據統計比較出哪個塊已經最長時間未被訪問,這兩種演算法的時間代價比較高,乙個替代的演算法是nmru非最近使用演算法,這個演算法僅僅記錄哪乙個快取虧啊是最近被使用的,在替換時,會隨機替換掉任何乙個其它的塊。

為了和下級儲存保持資料一致性,就必須把資料更新適時傳播下去,一般有兩種回寫策略:寫回和寫通。

寫回:僅當乙個快取塊需要被替換回記憶體時,才將其內容寫入記憶體。如果快取命中,則不需要更新記憶體。為了減少記憶體的寫操作,快取塊通常還設有乙個髒位,用於標識該塊在被載入以後是否發生過更新,如果乙個快取塊在被置換回記憶體之前從未被寫入過,則可以免去寫操作。寫回的好處是節省了大量的寫操作,對每個資料塊內不同單元的更新僅需要一次寫操作就可以完成。

開發者通過高階程式語言編寫的源程式是不能被計算機直接執行的,需要通過編譯程式或匯程式設計序編譯或彙編獲得目標程式。目標程式的位址不是記憶體的實際位址,把使用者目標程式使用的位址單元稱為邏輯位址,乙個使用者作業的目標程式的邏輯位址集合稱為該作業的邏輯位址空間。

作業的邏輯位址空間可以是一維的,邏輯位址限制在從0開始的位址空間內;也可以是二維的,這時整個使用者作業被分為若干段,每段有不同的段號,段內位址從0開始。當程式執行時,它將被裝入主存位址空間的某些部分,此時程式和資料的實際位址一般不可能同原來的邏輯位址一致,把主存中的實際儲存單元稱為實體地址(絕對位址),實體地址的總體相應構成了使用者程式實際執行的實體地址空間,這個空間是由儲存器位址匯流排掃瞄出來的空間,其大小取決於實際安裝的主存容量。

為了保證程式的正確執行,必須把程式和資料的邏輯位址轉換為實體地址,這一過程稱為位址轉換或重定位。位址轉換有兩種方式,一種是作業裝入時由作業裝入程式實現位址轉換,這種是靜態重定位,要求目標程式使用相對位址,位址變換在作業執行前完成所有位址轉換工作;第二種方式,在程式執行過程中,cpu訪問程式和資料之前實現位址轉換,這種稱謂動態重定位。在多道程式設計系統中,可用的主存空間通常是被許多程序共享的,而且必須要允許程式因對換或者空區收集而移動,這些問題都需要程式的動態重定位,而動態重定位則必須借助於硬體的位址轉換來實現。

在多道程式中,作業系統程式和各個使用者程式在主存中各有自己的儲存區域,各道程式只能訪問自己的工作區而不能相互干擾,因此,作業系統必須對主存中的程式和資料進行保護,以免其他程式有意或無意的破壞,這個工作就是儲存保護,它也需要借助相應的硬體來實現。

快取記憶體儲存器 cache

早期計算機層次結構 cpu暫存器 dram主儲存器和磁碟儲存。由於cpu和主存之間差距逐漸增大,便出現了小的sram快取記憶體儲存器於cpu暫存器檔案和主存之間,稱為l1快取記憶體 一級快取 cpu和主存之間效能差距繼續增大,便在l1快取記憶體和主存間出現了更大的快取記憶體,稱為l2快取記憶體。如圖...

儲存器 cpu快取記憶體1

現代儲存器一共包括以下幾種 暫存器直接和cpu進行互動資料的儲存器 速度最快 與cpu1級快取記憶體互動 cpu 1級快取記憶體 直接嵌在cpu內部,每個cpu獨有的 cpu 2級快取記憶體 在cpu外部,也是每個cpu獨有 cpu 3快取記憶體 所有cpu共享的快取 記憶體與快取記憶體互動 通過c...

CPU的快取記憶體儲存器的理解

參考 cpu的快取記憶體儲存器知識整理 基於快取的儲存器層次結構行之有效,是因為較慢的儲存裝置比較快的儲存裝置更便宜,還因為程式往往展示區域性性 1.通用快取記憶體儲存器結構介紹 乙個通用的快取記憶體儲存器會有s 2 s個set 組 每個set含有e個line 既通常所說的cache line 每個...