计算机存储器的金字塔层次结构,参考这里
CPU、内存、硬盘的关系:硬盘用来存储我们的程序和数据,当我们运行程序的时候,CPU首先接受到我们的命令,之后CPU是告诉硬盘,我要运行你存储的程序A,你把程序A送到内存去。CPU对内存说,我让硬盘把程序A送到你这里来了,你保存一下。 等程序A被完整的送到内存之后。CPU就开始执行程序A。
CPU 并不会直接和每⼀种存储器设备直接打交道,⽽是每⼀种存储器设备只和它相邻的存储器设备打交道。⽐如,CPU Cache 的数据是从内存加载过来的,写回数据的时候也只写回到内存,CPU Cache 不会直接把数据写到硬盘,也不会直接从硬盘加载数据,⽽是先加载到内存,再从内存加载到 CPU Cache 中。
当 CPU 需要访问内存中某个数据的时候,如果寄存器有这个数据CPU就直接从寄存器读取,如果寄存器没有这个数据,CPU 就会往下依次查询 L1、L2、L3高速内存,如果一直查到L3都没有,才去内存中取数据,取数据时,也是根据层级一级一级往上加载最后加载到每个数据应该在的不同层级和位置给CPU运算用的。
CPU:中央处理器(central processing unit)作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元CPU 寄存器:最靠近 CPU 的控制单元和逻辑计算单元的存储器,32 位 CPU 中⼤多数寄存器可以存储 4 个字节; 64 位 CPU 中⼤多数寄存器可以存储 8 个字节。寄存器的访问速度⾮常快,⼀般要求在半个 CPU 时钟周期内完成读写,⽐如 2 GHz 主频的 CPU,那么它的时钟周期就是 1/2G,也就是 0.5ns(纳秒)。CPU 处理⼀条指令的时候,除了读写寄存器,还需要解码指令、控制指令执⾏和计算。如果寄存器的速度太慢,则会拉长指令的处理周期,从而给⽤户的感觉,就是电脑很慢CPU Cache:CPU Cache ⽤的是⼀种叫 SRAM的芯片(Static Random-Access Memory,静态随机存储器) 。SRAM 之所以叫【静态存储器】,是因为【保持有电】数据才能存在,一旦断电数据丢失。SRAM存储1bit数据需使用 6 个晶体管,所以 SRAM 的存储密度不⾼,单位物理空间存储数据有限,不过也因为 SRAM 的电路简单,所以访问速度⾮常快。内存:内存⽤的芯⽚是⼀种叫作 DRAM (Dynamic Random AccessMemory,动态随机存取存储器) 的芯⽚。存储1bit 数据只需1个晶体管和1个电容,但是因为数据会被存储在电容⾥,电容会不断漏电,所以需要【定时刷新】电容,才能保证数据不会被丢失,这就是 DRAM 之所以被称为【动态存储器】的原因,只有不断刷新,数据才能被存储起来。硬盘:SSD固态/HDD机械硬盘,断电后数据还是存在的
经过对硬件的理解,可以对Java语言有更深入的了解。
比如volatile关键字:
由于CPU不能越级访问内存,肯定是把内存中的数据逐层往上读取直到交由CPU进行运算,不同CPU线程通过运算之后得到运算后的返回结果,再逐层往下更新,最后更新到数据的存储介质(内存、缓存、硬盘等)。我们先了解volatile关键字的特性:①被volatile修饰的变量,可以避免高并发量时,不同线程对变量数据的读取出现幻读(例如CAS机制)②被volatile修饰变量在JVM中的公共内存中,被所有线程共享。按照volatile的特性和CPU访问数据的特性进行分析①CPU把volatile关键字修饰的变量数据加载到了高速缓存中,因此去读写volatile关键字修饰的数据时,少了高速缓存和内存之间的读取操作,又因为高速缓存的访问速度比内存快得多,因此JVM各个线程再进行各种操作时,读或写volatile关键字修饰的变量数据的操作比其他操作先完成,因此可以保证幻读不会出现。
②volatile修饰的变量数据被JVM中所有线程共享,而符合这一特性的只有L3 Cache,因此这个数据被高速缓存读取的位置肯定是在L3 Chche三级缓存。