自旋锁和信号量

spinlock mutex语义上是一样的,都是对一临界区加锁保护,
区别是mutex得不到锁会睡眠,因此不能在中断上下文中使用。
另外,解锁的一定是上锁的那个 semaphore 得不到锁会睡眠,也不能用在中断中, 上锁的不一定负责解锁 。
rwlock 很好理解了,可多个读,只有一个写者,同样会引起睡眠
最重要的就是只有spinlock 可以用在中断上下文中.

至于wait_queue,不是同步手段,是内核管理sleeping进程的一种手段
什么是等待队列?
在软件开发中任务经常由于某种条件没有得到满足而不得不进入睡眠状态,然后等待条件得到满足的时候再继续运行,进入运行状态。这种需求需要等待队列机制的支持。
而且semaphore(我不知道所有的实现是不是这样)中也用到了wait_queue_head
-----------------------------------------
spinlock和信号量sem的区别
重点:死循环/睡眠
spinlock只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁。sem则会导致调用睡眠。然后应用上就是前者可以在中断处理中使用,后者不行。
信号量是针对使用时间比较长的共享资源,而自旋锁的则一般时间较短.一般的申请锁被其它保存则循环不止的等待.

* Spinlock 不断的检查等待的对象是否就绪,该进程/LWP始终处于Running的状态 
* Sem使该进程/LWP进入Wait转台,系统会将CPU切换给其他的进程/LWP运行。 

由于这个根本特性的不同,导致了以下用法上的不同: 

1. Spinlock 只适用于短暂的等待,因为没有进程切换所以对于短暂等待他的效率会比较高。 但是对于长时间等待,由于它的CPU占用是100% 等的越长越不合算。 

2. Spinlock只能在多个CPU的系统上用,因为等待者占据了100%的CPU,只由另外一个CPU上的进程才能解锁。

两者都是用于Linux内核互斥。避免并发,防止竞争,对系统公共资源或者共有数据进行合理保护的。Spin Lock的出现是因为Symmetric Multi-Processor的出现,如果是UniProcessor,用简单的Disable IRQ就可以满足其要求。Spin Lock是通过Poll方式的,其可以说是一个Test and Set or Test and Clear的模型的延伸。而Semaphore则是传统的IPC,是通过Sleep and Wake up方式实现的。通过Spin Lock and Semaphore两者的实现机制则,我们可以_很明晰的_看出两者的应用场合。
(在高并发的地方,轮询比睡眠更高效)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值