本文主要是介绍java基础【十二】外存、内存、CPU、缓存,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、原理
(一)外存
除计算机内存、cpu、缓存意外的存储器。比如:CDEF盘。硬盘、软盘、光盘、U盘
- 一般的软件都是安装在外存中
- 此类储存器一般断电后仍然能保存数
(二)内存
内存作为与CPU直接进行沟通的部件
- 计算机所有程序的运行都是在内存中进行,因此内存的性能对计算机的影响非常大
- 作用是暂时存放CPU的运算数据、以及与硬盘交换的数据。也是相当于CPU与硬盘沟通的桥梁
- 内存(Memory)也被称为内存储器,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。
- 只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行
- 内存指的就是主板上的存储部件,是CPU直接与之沟通,并用其存储数据的部件,存放当前正在使用的(即执行中)的数据和程序,它的物理实质就是一组或多组具备数据输入输出和数据存储功能的集成电路,内存只用于暂时存放程序和数据,一旦关闭电源或发生断电,其中的程序和数据就会丢失。
- 内存虽然也是存储设备,但是他的主要任务是整个硬件系统的缓存,原因是个硬件的传输速率不一样,如果没有内存这个缓存,各硬件间的速率不一样,就会导致因某个硬件过快或过慢导致整个硬件系统的崩溃。
- 此类储存器一般断电后数据就会被清空
(三)CPU
CPU是中央处理的简称
- 它可以从内存和缓存中读取指令,放入指令寄存器,并且能发出控制指令来完成一条指令的执行。
- CPU不能直接从硬盘中读取程序或者数据。
- CPU运行时首先会去自身的缓存中寻找,如果没有再去内存中找。
(四)缓存
缓存是CPU的一部分,它存在于CPU中
- 缓存是数据交换的缓冲区(cache),当某一硬件要读取数据时,会首先从缓存汇总查询数据,有则直接执行,不存在时从内存中获取。由于缓存的数据比内存快的多,所以缓存的作用就是帮助硬件更快的运行。
- 高速缓存是为了解决CPU速度和内存之间运算速度的差异而设置的不见。由于CPU的存取速度很快,而内存的速度很慢,为了不让CPU每次都在运行相对缓慢的内存中操作,缓存就作为一个中间者出现了。
- 高速缓存的存取速度介于CPU和主存之间
- 电脑中最大缓存就是内存条,硬盘上也有16M或者32M的缓存
- 缓存会记录一些常用的数据等信息,以免每次都要到内存中,节省了时间,提高了效率。
- 缓存就是把一些外存上的数据保存在内存上而已,为什么保存在内存上,我们运行的所有程序里面的变量都是存放在内存中的,所以如果想将值放入内存上,可以通过变量的方式存储。在JAVA中一些缓存一般都是通过Map集合来实现的。
缓存的在不同场景下的不同作用:
转载:https://blog.csdn.net/weixin_31070201/article/details/114229661
- 操作系统磁盘缓存 ——> 减少磁盘机械操作。
- 数据库缓存——>减少文件系统IO。
- 应用程序缓存——>减少对数据库的查询。
- Web服务器缓存——>减少应用服务器请求。
- 客户端浏览器缓存——>减少对网站的访问。
二、区别
(一)缓存和内存
1.内存+缓存 -> 内存储空间
2. 有些常用的数据或是地址,就直接存在缓存中,这样,下一次调用的时候就不需要再去内存中去找了。因此,CPU每次回先到自己的缓存中寻找想要的东西(一般80%的东西都可以找到),找不到的时候再去内存中获取。
(二)CPU和内存
1. 读取数据速度差异:CPU存取数据的速度非常的快,一秒钟能够存取、处理十亿条指令和数据(术语:CPU主频1G),而内存就慢很多,快的内存能够达到几十兆就不错了
2. 只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行
3. 内存的作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据
4. 硬盘中的数据会先写入内存才能被CPU使用
5. 计算机硬件系统是由CPU和内存组成的
(三)CPU和内存
CPU是负责原损和处理的。内存是交换数据的。
当程序或者操作者对CPU发出指令,这些指令和数据暂存在内存里。在CPU空闲时传送给CPU,CPU处理后把结果输出到输出设备上,输出设备就是显示器,打印机等。在没有显示完之前,这些数据也保存在内存里,如果内存不足,那么系统自动从硬盘上划分一部分空间作为虚拟内存来用。但写入和读取的速度 跟物理内存差的很远很远,所以,在内存不足的时候,会感到机器反应很慢,硬盘一直在响。 512M的物理内存如果增加到2GB,你会感到电脑变得飞快。但内存512,即使你把CPU从单核换成双核,加速感觉也不明显。 如果你本来就有2G内存,再增加2G,使用起来几乎没有多少性能的改变。 在理论上,物理内存太大反而会减慢速度,因为它增加了寻址的时间
(四)外存和内存
1. 存储器的种类很多,按其用途可分为主存储器和辅助存储器,主存储器又称内存储器(简称内存),辅助存储器又称外存储器(简称外存)。
(五)CPU和缓存和内存
- CPU运行时首先会去自身的缓存中寻找,如果没有再去内存中找。
- 由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提高了系统的效率
- 缓存的存取速度介于CPU和主存之间。系统将一些CPU在近几个时间段经常访问的内容存入高速缓冲,当CPU需要使用数据时,先在高速缓存中找,如果找到,就不必访问内存了,找不到时,再找内存,这样就在一定程度上缓解了由于主存速度低造成的CPU“停工待料”的情况
- 内存中被CPU访问最频繁的数据和指令被复制入CPU中的缓存,这样CPU就可以不经常到象“蜗牛”一样慢的内存中去取数据了,CPU只要到缓存中去取就行了,而缓存的速度要比内存快很多
这里要特别指出的是: 1. 因为缓存只是内存中少部分数据的复制品,所以CPU到缓存中寻找数据时,也会出现找不到的情况(因为这些数据没有从内存复制到缓存中去),这时CPU还是会到内存中去找数据,这样系统的速度就慢下来了,不过CPU会把这些数据复制到缓存中去,以便下一次不要再到内存中去取。 2. 因为随着时间的变化,被访问得最频繁的数据不是一成不变的,也就是说,刚才还不频繁的数据,此时已经需要被频繁的访问,刚才还是最频繁的数据,现在又不频繁了,所以说缓存中的数据要经常按照一定的算法来更换,这样才能保证缓存中的数据是被访问最频繁的 3. 关于一级缓存和二级缓存 。通常CPU找数据或指令的顺序是:先到一级缓存中找,找不到再到二级缓存中找,如果还找不到就只有到内存中找了 |
三、他们关系的总结
CPU处理数据,硬盘储存数据,内存负责连接CPU和硬盘,存储临时使用的数据。
CPU是电脑运行总指挥,负责发指令和调控。 内存是数据执行者,根据指令工作。硬盘是数据保存者。
四、缓存的实现
转载:https://blog.csdn.net/bird_tp/article/details/86292864
其实缓存就是把一些外存上的数据保存到内存上而已,怎么保存到内存上呢,我们运行的所有程序,里面的变量值都是放在内存上的,所以说如果要想使一个值放到内存上,实质就是在获得这个变量之后,用一个生存期较长的变量存放你想存放的值,在java中一些缓存一般都是通过map集合来做的。
(一)缓存实现原理:
简单讲就是,如果某些资源或者数据会被频繁的使用,而这些资源或数据存储在系统外部,比如数据库、硬盘文件等,那么每次操作这些数据的时候都从数据库或者硬盘上去获取,速度会很慢,会造成性能问题。
一个简单的解决方法就是:把这些数据缓存到内存里面,每次操作的时候,先到内存里面找,看有没有这些数据,如果有,那么就直接使用,如果没有那么就获取它,并设置到缓存中,下一次访问的时候就可以直接从内存中获取了。从而节省大量的时间,当然,缓存是一种典型的空间换时间的方案。
(二)Java中缓存的实现:
1. Map实现缓存
- 先到缓存里面查找,看看是否存在需要使用的数据
- 如果没有找到,那么就创建一个满足要求的数据,然后把这个数据设置回到缓存中,以备下次使用
- 如果找到了相应的数据,或者是创建了相应的数据,那就直接使用这个数据。
/**
* Java中缓存的基本实现示例
*/
public class JavaCache {/*** 缓存数据的容器,定义成Map是方便访问,直接根据Key就可以获取Value了* key选用String是为了简单,方便演示*/private Map<String,Object> map = new HashMap<String,Object>();/*** 从缓存中获取值* @param key 设置时候的key值* @return key对应的Value值*/public Object getValue(String key){//先从缓存里面取值Object obj = map.get(key);//判断缓存里面是否有值if(obj == null){//如果没有,那么就去获取相应的数据,比如读取数据库或者文件//这里只是演示,所以直接写个假的值obj = key+",value";//把获取的值设置回到缓存里面map.put(key, obj);}//如果有值了,就直接返回使用return obj;}
}
这里只是缓存的基本实现,还有很多功能都没有考虑,比如缓存的清除,缓存的同步等等。当然,Java的缓存还有很多实现方式,也是非常复杂的,现在有很多专业的缓存框架,更多缓存的知识,这里就不再去讨论了。
下面用单例模式实现缓存:
/**
* 使用缓存来模拟实现单例
*/
public class Singleton {/*** 定义一个缺省的key值,用来标识在缓存中的存放*/private final static String DEFAULT_KEY = "One";/*** 缓存实例的容器*/private static Map<String,Singleton> map =new HashMap<String,Singleton>();/*** 私有化构造方法*/private Singleton(){//}public static Singleton getInstance(){//先从缓存中获取Singleton instance = (Singleton)map.get(DEFAULT_KEY);//如果没有,就新建一个,然后设置回缓存中if(instance==null){instance = new Singleton();map.put(DEFAULT_KEY, instance);}//如果有就直接使用return instance;}
}
参考:
https://blog.csdn.net/bird_tp/article/details/86292864
https://www.cnblogs.com/keyi/p/7472369.html
https://blog.csdn.net/qq_26050385/article/details/80983508
https://blog.csdn.net/qq_33915826/article/details/81168154
https://blog.csdn.net/bird_tp/article/details/86292864
这篇关于java基础【十二】外存、内存、CPU、缓存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!