操作系统 锁机制和内存一致性

本文介绍了操作系统层面的锁机制,探讨了多核CPU环境下内存一致性问题,包括总线锁定和缓存一致性协议MESI。通过例子解释了如何解决因缓存导致的内存不一致,并讨论了不同场景下锁的使用选择。
摘要由CSDN通过智能技术生成

写在前面:

想要深刻了解Java中的锁机制 还是要了解下操作系统层面的锁机制以及CPU缓存和内存一致性等知识 所以用一篇博客来记录整理一下

早期CPU处理数据是先从内存中读取数据加载到比如寄存器中,处理完之后再刷新回主存。但是这里有一个问题就是内存的数据读取速度是比较慢的,而CPU的处理时间很快,造成了很多时候CPU都是在等待从内存中读入数据再处理,白白消耗了CPU资源,这个时候就引入的缓存的概念。

缓存是一种可以进行高速数据交换的存储器,因此我们可以先把内存中的一部分可能会被访问的数据预先调入缓存中,CPU每次要读取数据的时候,首先从缓存中查找,如果命中就进行处理,若没有才去内存中读取,如果命中率很高的话效率还是非常快的。

现在基本都是多核CPU,每个CPU都有一个缓存,每次大家都是从主存中读取数据到缓存中,然后如果修改了数据再刷新回去,但是可能会造成内存不一致性的原因。比如在内存中有一个变量i,它的值是0,CPU A和B的缓存中i都是0,且都对i进行了加1操作,此时CPU A先把数据刷新回主存,主存中的i为1,而CPU B并不知道内存中的值改变了,因此它也把自己的值刷新回主存 这样就导致主存中的变量i的值是1而不是2。

解决这种内存不一致性的方法有两种

第一种是总线锁定。
CPU和其他部件的通信都是通过CPU总线来通信的,通过地址总线找到要操作的部件和使用数据总线来进行数据交互,当要进行写数据时,就在总线上发出一个LOCK#指令,表示其他CPU不可以再使用总线操作其他部件比如内存,同一时刻只有当前CPU可以访问内存,这样实现了对共享变量操作的原子性。

虽然保证了操作的原子性,但是由于我们只是需要对一个变量进行原子操作,却

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值