CPU 读、修改内存数据过程
2015-07-21 17:05
330 查看
之前一直不明白为什么一个线程修改了数据(不用volatile修饰),而另一个线程读取时还是之前的值,网上查找了一些资料做了个总结,纯属个人理解如有不对请指正
1.CPU缓存(Cache Memory)是位于CPU和内存之间的临时存储器,它的容量小但是数据交换速度很快。
2.内存:它的容量比较大,但是CPU访问内存的效率相对缓存较低
有了缓存和内存,内存储器(缓存+内存)就变成既有缓存的高速度又有内存的大容量的存储系统。
缓存工作原理:CPU读取一个数据时,会先从缓存中查找,如果没有找到才会从内存中查找。(CPU下次要读取的数据90%在缓存中,因此效率很高)
现在的CPU与内存之间一般都存在一级缓冲区、二级缓冲区,这样效率更高。
Write-back:CPU在改写了cache line后,并不是马上把其写回内存,而是将该cache line标志为dirty。只有当cache中发生一次cache miss,其他的数据要占用该cache line时,CPU才会把其写回内存。在实现write-back策略时,有一个重要的问题是需要被考虑到的,当多个处理器访问同一内存时,必须保证所有处理器所看到的内存内容是相同的,也就是一致性的问题。当一个cache
line被一个处理器设置为dirty后,另一个处理器要访问同一内存,那么显然,该处理器真正需要的数据是前者的cache里的数据,而不是内存中还未更新的数据。
个人理解:
在多线程编程中,一个线程把数据更改了,而另一个线程读取这个数据还是之前的值,可能就是读取的是缓冲区中的值,而不是内存中的值,用关键字volatile修饰变量就是告诉CPU取值的时候直接从内存中获取(原子操作)
1.CPU缓存(Cache Memory)是位于CPU和内存之间的临时存储器,它的容量小但是数据交换速度很快。
2.内存:它的容量比较大,但是CPU访问内存的效率相对缓存较低
有了缓存和内存,内存储器(缓存+内存)就变成既有缓存的高速度又有内存的大容量的存储系统。
缓存工作原理:CPU读取一个数据时,会先从缓存中查找,如果没有找到才会从内存中查找。(CPU下次要读取的数据90%在缓存中,因此效率很高)
现在的CPU与内存之间一般都存在一级缓冲区、二级缓冲区,这样效率更高。
Write-back:CPU在改写了cache line后,并不是马上把其写回内存,而是将该cache line标志为dirty。只有当cache中发生一次cache miss,其他的数据要占用该cache line时,CPU才会把其写回内存。在实现write-back策略时,有一个重要的问题是需要被考虑到的,当多个处理器访问同一内存时,必须保证所有处理器所看到的内存内容是相同的,也就是一致性的问题。当一个cache
line被一个处理器设置为dirty后,另一个处理器要访问同一内存,那么显然,该处理器真正需要的数据是前者的cache里的数据,而不是内存中还未更新的数据。
个人理解:
在多线程编程中,一个线程把数据更改了,而另一个线程读取这个数据还是之前的值,可能就是读取的是缓冲区中的值,而不是内存中的值,用关键字volatile修饰变量就是告诉CPU取值的时候直接从内存中获取(原子操作)
相关文章推荐
- Minimum Path Sum
- iOS 自定义UISlider
- VC++6.0 配置CxImage 库的使用
- Java练习题--------------乘法表
- 将bitmap设置为背景的问题解决
- Single Number
- 二叉搜素树 二叉排序树 插入 删除 中序输出
- PC-启动慢的解决好方法!
- fancybox 基础 简单demo
- java面试常见问题之Hibernate总结
- mediawiki上传文件大小的设置
- Java 死锁的简单实例
- Android SDK 和 Eclipse ADT 离线安装 教程
- Linux自学笔记:02_vi编辑器的简单使用
- POJ Treasure Exploration 2594【Warshall求传递闭包+最小路径覆盖】
- [Python学习] 简单爬取CSDN下载资源信息
- IE-一根网线二台电脑上网
- mvc与三层结构终极区别
- Algorithms—2.Add Two Numbers
- Android Touch事件分发机制