一步步编写操作系统 29 cpu缓存简介
緩存是20世紀最大的發明,其原理用一些存取速度較快的存儲設備做為數據緩沖區,避免頻繁訪問速度較慢的低速存儲設備,歸根結底的原因是,低速存儲設備是整個系統的瓶頸,緩存用來緩解“瓶頸設備”的壓力。
之前介紹實模式下的寄存器時,舉了一個瀏覽器訪問網頁的例子,里面有12步,幾乎步步都用到了緩存。不過,這些緩存都是在內存DRAM中實現的,即動態隨機訪問存儲器,究其原因是數據要么在數據庫中要么在硬盤上,其速度肯定比內存慢。選做用緩存的存儲設備,其存取速度肯定是比其原有存儲設備更快,否則失去了緩存的意義。相對于cpu來說,DRAM太慢了,如果也要用它來做cpu的緩存,反而是拖了后腿,不如不用。
cpu為什么要用緩存?因為待執行的指令和相關數據是存儲在低速的內存中,讓cpu這種高速設備等待慢速的內存,著實太浪費cpu資源了。人們根本無法容忍cpu如此“漫長”的“浪費”,所以需要用一個比內存更快的存取設備做緩沖區,盡量和cpu一個速度,讓cpu不要等待。于是SRAM成了cpu的救世主,成為cpu和內存之間數據緩存的不二之選。
前面在介紹實模式下的寄存器時,也說到了cpu中的緩存。cpu中有一級緩存L1、二級緩存L2,甚至三級緩存L3等。它們都是SRAM,即靜態隨機訪問存儲器,它是最快的存儲器啦。之所以把SRAM和寄存器放到一塊說,是因為很多同學在感觀上覺得寄存器是cpu直接使用的存儲單元,所以寄存器比SRAM更快。其實他們在速度上是同一級別的東西,因為寄存器和SRAM都是用相同的存儲電路實現的,用的都是觸發器,它可是工作速度極快的,屬于納秒級別。至于觸發器是什么,這已屬于硬件范疇,這里咱就不深究了,因為我也不懂,不敢亂說啦^_^,有興趣的同學請自行調研吧。
有哪些東西可以被緩存呢?無論是程序中的數據或指令,在cpu眼里全是一樣形式的二進制01串,沒有任何區別,都是cpu待處理的“數據”。所以我們眼中的指令和數據都可以被緩存到SRAM中。
什么時候能緩存呢?可以根據程序的局部性原理采取緩存策略。局部性原理是:程序90%的時間都運行在程序中10%的代碼上。
局部性分為兩個方面:
一方面是時間局部性:最近訪問過的指令和數據,在將來一段時間內依然經常被訪問。
另一方面空間局部性:靠近當前訪問內存空間的內存地址,在將來一段 時間也會被訪問。
舉一個典型的例子,我們在用高級語言寫程序時,經常會寫到這樣的循環嵌套代碼,如:
int array[100][100]; int sum = 0; … 數組array元素被賦值,略。 … for (int i=0, i<100,i++) {for(int j=0;j<100,j++) {sum+=array[i][j];} }以上是將二維數組中的所有元素相加求和。循環中經常被用到的地址是sum所在的地址,經常被用到的指令是加法求和指令,這是在時間上的局部性。未來要訪問的地址是與當前訪問地址&array[i][j]相鄰的地址&array[i][j+1],它們之間只差一個整型變量的大小,這是空間上的局部性的。(當然,這些局部性都是編譯器編譯的結果,編譯器就是這樣安排的。)cpu利用此特性,將當前用到的指令和當前位置附近的數據都加載到緩存中,這就大大提高了cpu效率,下次直接從緩存中拿數據,不用再去內存中取啦。
當然,上面說的是理想的狀態,如果緩存中沒有相應的數據,還是要去內存中去加載,然后再放到緩存中。
總結
以上是生活随笔為你收集整理的一步步编写操作系统 29 cpu缓存简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中信信金宝
- 下一篇: 浦发信用卡里程银行有啥用