# Miku Memory ###### tags: `IT鐵人` ## 虛擬記憶體(Virtual Memory) 前面說到了Cache System後面還有一個Virtual Memory,Virtual Memory是利用硬碟支援Main Memory的技術。比如說我們做了需要很多Memory的事情,像是Chrome開了很多分頁或是開了很多APP,8GB或是16GB的Main Memory有時候會塞不下,所以我們就需要安全且有效率的方法實行,否則電腦將無法正常運作。 ## 虛擬位址(Virtual Address) 在支援Virtual Memory的電腦中,處理器會產生一個Virtual Address,並且藉由硬體及軟體轉譯程Physical Address。 也就是說電腦會告訴你東西的編號,要去某個地方詢問才能得知東西的真正位置在哪個裝置的哪個位置。 ## Page Table 不同於Cache System的單位名稱Block,Virtual Memory的單位稱為Page,如果要求的page不在Main Memory,則稱為page fault。 因為記憶體跟硬碟的存取速度有明顯的落差,所以Virtual Memory注重的是減少page fault,通常採用Fully Associative,並且也會使用教聰明的演算法更換page。 我們透過Page Table儲存Virtual Address,並將此表存在Main Memory中,Page Table架構如下: ![](https://i.imgur.com/AFhjfHE.png) 透過page table可以找到phsical page number,並且有一個valid bit,如果是1代表該page在Main Memory中,反之則在disk中,並且稱為page fault。因為將page放在Main Memory中程式才能正常執行。 ## Reference Bit & Dirty Bit 為了更好的演算法決定哪個page要被替換掉,我們需要加上一些資訊。Reference bit就是拿來檢測該page多久沒有被使用到了,不過因為LRU成本較高,我們使用的只是類似LRU的作法而已。 因為寫回硬碟相當花時間,所以我們又增加了一個bit來確認該page有沒有被更動,有發生改動才花時間寫回硬碟。 增加了這兩種bit,在加上Main Memory還有disk的圖形就會如下圖所示: ![](https://i.imgur.com/bEThdYY.png) 如果存取到不在Main Memory(Physical Memory)中的就代表page fault,此時要在disk才能翻到。 可以注意到上面還有一個TLB,馬上就來說說他是什麼。 ## TLB 我們凡是都會希望再快一點,page的存取一樣有區域性,所以現在用到的page很可能等等又要用到,相較於現在page table放在Main Memory中,如果我們能另外用一個硬體當作一個特別的page table,速度又可以提昇許多。 TLB就像是page table的cache,可以更快速的取得某些physical address,如果這邊沒有找到再去page table找,所以通常TLB不會太大,以免花在TLB的時間太多。 ## Miss種類 前面提到如果需求的資料不再較為快速的那一層稱為miss,不過miss還可以分成三個類型: |名稱|原因| |-|-| |強迫性失誤(Compulsory misses)|第一次使用的區塊必定不在快速的那一層中,所以必定發生失誤,也稱為冷開機失誤(cold-start misses)。| |容量性失誤(Capacity misses)|程式執行時如果容量不足以包含所有需要的區塊時,區塊會不斷被取代。| |衝突性失誤(Conflict misses)|在Set Associative以及Direct Mapped中,當許多區塊撞到同一個entry中,導致其不斷遭替換。| 既然知道了miss的原因,我們就可以著手改善:Conflict misses可以透過增加關聯度降低,不過可能造成讀取速度變慢;Capacity misses可以透過加大容量,不過可能導致整體效能降低;Compulsory misses可以增加區塊大小,不過會造成miss penalty增加。 各種作法都會有優缺點,最後該怎麼做需要不斷的實驗,才能找出對當下最有幫助的作法。 |上一篇|下一篇| |--|--| |[Multilevel Cache](https://hackmd.io/@dZfCcN4hT8aUuDPv3B8CWQ/BkAc7ihxK)|[Disk很大,你忍一下](https://hackmd.io/@dZfCcN4hT8aUuDPv3B8CWQ/S1DlavXbt) ## 不斷嘗試be like ![](https://i.imgur.com/aCYLObU.png)