互斥锁的实现

这篇博客探讨了互斥锁在操作系统中的实现,主要依赖于硬件的原子指令,如TestAndSet。作者指出,由于信号量的p/v操作非原子性,互斥锁应运而生,通过硬件确保锁的修改过程是原子性的。锁的发明最初是为测试OS设计的,但现在广泛用于多线程同步。博客还提到了其他硬件原子操作,如开/关中断,但这些可能不适用于多CPU系统或存在安全隐患。
摘要由CSDN通过智能技术生成

一个朋友面试被问到了锁是如何实现的,没答上来,没记错的话这应该是一个操作系统的概念。
下面简单叙述一下互斥锁的实现:

使用过信号量来进行同步的朋友都知道,信号量都是配合互斥锁来进行的,是因为信号量的p和v操作过程不是原子的,会导致程序出现意想不到的事情。
所以我们就引入了锁来保证这个过程不出问题,但是互斥锁本身也是一个数值,系统根据互斥锁的值来决定是不是继续向下执行,那么为什么锁自身的修改就能保证原子性呢:

这是依赖于硬件,硬件原子指令法

//读者对CAS有印象吗
bool TestAndSet(bool &x){
    bool rv = x;
    x = true;  //上锁
    return rv;
    //三条会代码一次执行完毕,是一个原子的过程
}

那么再来看加锁的过程:

while(TestAndSet(&lock));//不停尝试上锁,获取锁
//进入临界区执行
lock = false;  //解锁走人
//.....

总结:

  • 锁的实现是要依赖于硬件的,没有硬件的支持,软件层面无法设计出我们现在用的锁
  • 锁的出现实际上是偶然,最初是为了测试os设计的,编程用的锁是一个副产品
  • 还有其他的一些硬件指令也可以实现,如开中断和关中断(不安全,可能会导致宕机,对于多CPU机器也不通用)等原子操作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值