java程序员必须知道的内存知识-硬件层

Java基础

浏览数:453

2020-6-13

1.哪里会存数据

电脑的数据存储,一般有寄存器、高速缓存、内存、硬盘这几个硬件。寄存器和高速缓存都在cpu内部。

2.数据交互方式

CPU <–> 内存 <–> 硬盘
从访问关系上看,寄存器和高速缓存是可以直接访问内存的,硬盘也是可以直接访问内存的。而在绝大多少硬件架构上,cpu是不能直接访问硬盘的。让硬盘直接访问内存的原因就是cpu访问硬盘时间太长,或者cpu控制硬盘写入内存也需要等待太久,所以一般都是由硬盘把数据写入内存中供cpu使用。

3.仲裁器

但内存作为一个RAM芯片,只能串行的执行读写命令,如果多个设备同时需要访问内存,这时就需要有一套排队等待机制来实现串行化,仲裁器是在总线(北桥芯片)上的一个硬件,通过物理的方式保证只有一个设备在访问内存。
但随着cpu性能的提高,总线已经成为性能提高的瓶颈,便有了CPU直连内存的方案,把总线与内存交互的元件集成到了CPU内部,称为内存控制器。
内存控制器主要有两个作用,一个是辅助内存读写,整合数据;另一方面就是提供仲裁功能。既然内存管理器已经从总线整合进了cpu,那如何控制仲裁呢?

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访问。

5.MMU

cpu因为存储大小有限制,无法与内存地址一一对应,所有有了虚拟地址,虚拟地址是需要转化成物理地址才能访问内存的,所以就有了MMU(Memory Management Unit)内存管理单元。
mmu是通过内存管理虚拟地址和物理地址的映射,他会在内存中开辟一段空间维护页表数据(PTE),但是PTE在内存中,每次查询耗时太长,便在MMU中独立出了一块TLB(Translation Lookaside Buffers)转换快表,作为PTE的缓存。
PTE作为cpu中的存储,空间成本很高,为了节省空间。页表被设计成了多级结构。

6.高速缓存

随着cpu运算速度的提升,但内存的访问速度却并没有太大的提高,如果数据都存储在内存中,每次cpu需要数据时都需要等待几个时钟周期,这个效率太差了。为了解决这个问题,我们现在的cpu都在内部增加了高速缓存,现在的主流cpu都采用了3级缓存的架构,我们一般称之为L1、L2、L3,其中L1离运算器更近,会分为数据缓存和指令缓存,L1和L2为每个核自用,L3为所有核公用。

高速缓存除了离运算器更近外,硬件上也有区别,我们的主存一般采用DRAM,高速缓存采用SRAM,相对来说SRAM相比DRAM造价高、访问快但容量低。

作者:搬砖的张飞