手机银行可以取消吗:内存栅障

来源:百度文库 编辑:中财网 时间:2024/05/06 04:01:42
 高级搜索 收藏本站 网站地图 RSS订阅 首页 新闻 Ubuntu Fedora Gentoo Mandriva Slackware Suse 红旗 LFS C++ JAVA Perl PHP Python Ruby 入门 命令 多媒体 服务器 内核 嵌入式 软件 SHELL DB2 MySQL Oracle PostgreSQL Sybase    智能模糊搜索 仅搜索标题  热门关键字:  ubuntu  分区  Fedora  linux系统进程  函数
 
 
当前位置 :| 主页>Linux教程>编程开发>C++> 内存栅障来源: 作者: 时间:2009-01-20 Tag: 点击: 87  而真正的内存栅障是硬件一级的。是采用了CPU提供的某些特定的指令。例如,在Microsoft Platform SDK中,MemoryBarrier宏即该类型的内存栅障。其定义如下(在x86,x64,IA64平台下):  #ifdef _AMD64_ #define MemoryBarrier __faststorefence #endif #ifdef _IA64_ #define MemoryBarrier __mf #endif // x86 FORCEINLINE VOID MemoryBarrier(void) { LONG Barrier; __asm { xchg Barrier, eax } }  通过以上说明可见,如果希望得到正确的内存操作顺序,就需要在程序中恰当的使用软件的或者真正的内存栅障。内存栅障使用过度,会造成程序性能比较严重的下降(因为CPU的内存操作顺序优化和Cache优化不能发挥作用);而使用不当则会造成非常隐蔽而难以调试的错误。  [END:内存栅障]  三、Cache的一致性  在“之一”中,有一句话:“CPU 1操作了内存单元1进而操作了内存单元2,但是另一个CPU先看到了内存单元2的改变而后又看到了内存单元1的改变”需要指出的是:这个在大多数处理器中都是不存在的,大多数处理器保证了这种顺序的可见性与操作顺序是一致的。(对于Intel处理器,参见:Intel 64 and IA-32 Architectures Software Developer's Manual,Volume 3A: System Programming Guide,10.4)  在大多数有关多线程的文章中,都会提到由于内存的优化,以至于可见性...需要澄清的是,这种可见性的差异在大多数情况下都不是Cache造成的。应该说是Memory Optimization造成的还不错。因为正因为为了避免Cache的不一致,才有了Cache一致性协议的研究。才有了Intel关于我的Cache采用了四种状态云云,实际上就是所谓的采用了总线监听协议。  我们在"Loads are not reorderd with other loads" is a FACT!! 系列文章中,通过了一个例子说明.NET MM是有问题的,但是如果Cache都没问题,那么到底是什么造成的这个问题呢?答案是,Store Buffer!!我们先来看看Cache的工作:  如果CPU发现系统内存的操作数是可以被缓存的(并非所有的内存单元都是可以被缓存的),CPU便将一个Cache Line全部读到恰当的缓存中L1,L2或者L3(如果有的话)。该操作称为Cache Line Fill。如果CPU发现需要的操作数已经存在在Cache中,则CPU直接从缓存中而不是内存中读取操作数,这种情况称之为Cache Hit。 当CPU试图向可缓存的系统内存写入操作数时,其首先检查Cache中是否已经缓存了该操作数。如果一个有效地(Valid)Cache Line的确存在在缓存中,CPU(根据当前写操作数的策略)可以将操作数写入Cache中而不是系统内存中。这种操作称之为Write Hit。反之,如果缓存中并不包含该操作数的地址,则CPU执行一次Cache Line Fill操作,并将操作数写入缓存,同时(根据当前写操作数的策略)可以将操作数写回系统内存。如果真的要将操作数写回内存,则其首先写回存储缓冲区(Store Buffer),然后等待总线空闲,并从存储缓冲区(Store Buffer)回写到内存中。(参见:Intel 64 and IA-32 Architectures Software Developer's Manual,Volume 3A: System Programming Guide,10.2)  好了,现在我们知道Store Buffer是什么东西了。如果没有Store Buffer那么我们必须等待总线空闲再将操作数写回内存,但是现在,即使总线不是空闲的Cache回写的操作也能立即返回!但是,当一个Store临时的处于Store Buffer时,他满足了自身处理器的Load操作但是不能满足其他处理器的Load操作。也就是,此时如果其他CPU需要Load这个地址,则他不能看到新的值!这不是因为Cache不一致造成的,但是现象好像是Cache不一致造成的!(参见:Intel 64 Architecture Memory Ordering White Paper,2.4)  因此,我们说,如果要修正这个错误就要Flush Store Buffer,而不是Flush Cache!而如何Flush Store Buffer呢?列举如下:  当一个CPU异常或者中断产生的时候; 当一个顺序执行指令执行的时候; 当一个I/O指令执行的时候; 当一个LOCK操作执行的时候; 当一个BINIT操作执行的时候; 当使用LFENCE限制操作的调整的时候; 当使用MFENCE限制操作调整的时候; (参见:Intel 64 and IA-32 Architectures Software Developer's Manual,Volume 3A: System Programming Guide,10.10)  而我们知道,System.Threading.Thread.MemoryBarrer()实际上就是一个xchg(对于IA-32),属于一个LOCK操作,因此具有Flush Store Buffer的功能!因此我们说System.Threading.Thread.MemoryBarrer()可以修正这个错误,但是原因并不是Cache,而是Store Buffer!
上一页 1 2下一页 [收藏] [推荐] [评论] [打印] [关闭] 0顶一下上一篇:回调函数快速使用
下一篇:将一个整数逆序存放入一个整形数组(递归实现) 最新评论共有 0 位网友发表了评论 查看所有评论发表评论
 评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。  用户名: 密码:  匿名?  注册 栏目列表 C++ JAVA jsp Perl PHP python Ruby 热点关注C/C++笔试题目大全C++面试题集(最全的C\C++extern的作用Linux 常用C函数说明-文件Linux 常用C函数说明-文件Linux 常用C函数说明-进程Linux 常用C函数说明-接口c/c++实现一个密集型serve如何生成csv文件,以及csvprintf()函数参数格式详解C++命名空间namespaceLinux 常用C函数说明-内存C++求职笔试题汇总ld.so.conf 文件与PKG_CONLinux 常用C函数说明-文件Linux 常用C函数说明-信号摄像头驱动实现源码分析c语言中命令行参数argc,arGCC警告选项例解GNU C 扩展之__attribute_ 相关文章new、getmem、Allocmem的堆栈 内存 c与c++语言关于虚析构函数 C++中指针和引用的区别 C++判断两实数是否相等 unix C下面socket编程 动态链接库的隐式连接与显使用 GDB 调试多进程程序 V4L2应用程序框架C函数atoi的实现 91Linux!   
 
本文来自: (www.91linux.com) 详细出处参考:http://www.91linux.com/html/article/program/cpp/20090120/15426_2.html