记一次Python Web接口优化
当多个处理器的运算任务都涉及同一块主内存区域,可能导致「缓存数据不一致」问题。如何解决这个问题呢?有两种方案 ❝1、通过在总线加LOCK#锁的方式。 2、通过缓存一致性协议(Cache Coherence Protocol)❞ 总线 ❝总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束, 按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、地址总线和控制总线,分别用来传输数据、数据地址和控制信号。❞ CPU和其他功能部件是通过总线通信的,如果在总线加LOCK#锁,那么在锁住总线期间,其他CPU是无法访问内存,这样一来,「效率就比较低了」。 MESI协议为了解决一致性问题,还可以通过缓存一致性协议。即各个处理器访问缓存时都遵循一些协议,在读写时要根据协议来进行操作,这类协议有MSI、MESI(IllinoisProtocol)、MOSI、Synapse、Firefly及DragonProtocol等。比较著名的就是Intel的MESI(Modified Exclusive Shared Or Invalid)协议,它的核心思想是: ❝当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取。❞
CPU中每个缓存行标记的4种状态(M、E、S、I),也了解一下吧: 所以当面试官问你「volatile的作用或者特性」,都可以这么回答: 保证变量对所有线程可见性; 禁止指令重排序 不保证原子性 3. 现代计算机的内存模型(计算机模型,MESI协议,嗅探技术,总线) 为了更好理解volatile,先回顾一下计算机的内存模型与JMM(Java内存模型)吧~ 计算机模型计算机执行程序时,指令是由CPU处理器执行的,而打交道的数据是在主内存当中的。 由于计算机的存储设备与处理器的运算速度有几个数量级的差距,总不能每次CPU执行完指令,然后等主内存慢悠悠存取数据吧, 所以现代计算机系统加入一层读写速度接近处理器运算速度的高速缓存(Cache),以作为来作为内存与处理器之间的缓冲。
在多路处理器系统中,每个处理器都有自己的高速缓存,而它们共享同一主内存。「计算机抽象内存模型」如下: (编辑:吉安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |