java程序員必須知道的內存知識-硬件層

1.哪裏會存數據

電腦的數據存儲,通常有寄存器、高速緩存、內存、硬盤這幾個硬件。寄存器和高速緩存都在cpu內部。緩存

2.數據交互方式

CPU <--> 內存 <--> 硬盤
從訪問關係上看,寄存器和高速緩存是能夠直接訪問內存的,硬盤也是能夠直接訪問內存的。而在絕大多少硬件架構上,cpu是不能直接訪問硬盤的。讓硬盤直接訪問內存的緣由就是cpu訪問硬盤時間太長,或者cpu控制硬盤寫入內存也須要等待過久,因此通常都是由硬盤把數據寫入內存中供cpu使用。架構

3.仲裁器

但內存做爲一個RAM芯片,只能串行的執行讀寫命令,若是多個設備同時須要訪問內存,這時就須要有一套排隊等待機制來實現串行化,仲裁器是在總線(北橋芯片)上的一個硬件,經過物理的方式保證只有一個設備在訪問內存。
但隨着cpu性能的提升,總線已經成爲性能提升的瓶頸,便有了CPU直連內存的方案,把總線與內存交互的元件集成到了CPU內部,稱爲內存控制器。
內存控制器主要有兩個做用,一個是輔助內存讀寫,整合數據;另外一方面就是提供仲裁功能。既然內存管理器已經從總線整合進了cpu,那如何控制仲裁呢?ide

3.DMA

在瞭解仲裁原理前,咱們先熟悉一個概念,DMA (Direct Memory Access,直接存儲器訪問),是爲了解決外圍設備直接訪問內存的問題。
咱們以網卡寫入內存舉例,當網卡須要寫數據到內存時,會經過DMA controller(dmac),向cpu的內存控制器發出一個信號,請求控制內存,cpu在執行完內存操做後,會向dmac輸出應答,dmac這時再把數據寫入到內存,寫入完成後再向內存控制器發出結束信號。
經過這個例子能夠看出,cpu在訪問內存的時候有絕對的有限權,其它設備要訪問內存須要cpu的批准,由此保證了cpu訪問內存的性能。性能

4.NUMA

內存控制器被整合進cpu的緣由一方面是想讓cpu直連內存,另外一方面由於cpu的核愈來愈多了,內存通道數也多了,因此內存控制器並非在cpu中只有一個,而是具體看cpu支持的內存通道數。但這麼多內存控制器該聽誰的呢?
NUMA(Non Uniform Memory Access Architecture)非一致性內存訪問,numa就是把每一個內存通道分配個一個內存管理器,一個內存管理對應多個核,這些核能夠經過內存管理器直接訪問這塊內存,這塊內存就是本地內存,而掛在別的內存管理器下的則稱爲遠端內存。
cpu只能直接訪問本地內存,而遠端內存則要經過這塊內存對應的cpu訪問。spa

5.MMU

cpu由於存儲大小有限制,沒法與內存地址一一對應,全部有了虛擬地址,虛擬地址是須要轉化成物理地址才能訪問內存的,因此就有了MMU(Memory Management Unit)內存管理單元。
mmu是經過內存管理虛擬地址和物理地址的映射,他會在內存中開闢一段空間維護頁表數據(PTE),可是PTE在內存中,每次查詢耗時太長,便在MMU中獨立出了一塊TLB(Translation Lookaside Buffers)轉換快表,做爲PTE的緩存。
PTE做爲cpu中的存儲,空間成本很高,爲了節省空間。頁表被設計成了多級結構。
image.png設計

6.高速緩存

隨着cpu運算速度的提高,但內存的訪問速度卻並無太大的提升,若是數據都存儲在內存中,每次cpu須要數據時都須要等待幾個時鐘週期,這個效率太差了。爲了解決這個問題,咱們如今的cpu都在內部增長了高速緩存,如今的主流cpu都採用了3級緩存的架構,咱們通常稱之爲L一、L二、L3,其中L1離運算器更近,會分爲數據緩存和指令緩存,L1和L2爲每一個核自用,L3爲全部核公用。
image.png
高速緩存除了離運算器更近外,硬件上也有區別,咱們的主存通常採用DRAM,高速緩存採用SRAM,相對來講SRAM相比DRAM造價高、訪問快但容量低。orm

相關文章
相關標籤/搜索