信号量/锁

我开始说信号亮有一个计数
  
后来又说信号亮可以睡眠,自旋锁不可以
  
面试的阴森的不语,
  
大家说是什么?


>我想,面试的想要答案就是   睡觉/死循环
不会问道内核实现方案


>同意,spinlock只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁。sem则会导致调用睡眠。然后应用上就是前者可以在中断处理中使用,后者不行。


>sem确实也是有计数类型的,而自旋锁没有,这也是一个不同点


>信号量是针对使用时间比较长的共享资源,而自旋锁的则一般时间较短.一般的申请锁被其它保存则循环不止的等待.


>你应该装作对这种问题不屑回答的样子,看他还阴森不阴森


>哈哈。顶楼上的.


>spinlock: 忙等;semaphore: 调用的进程进入睡眠! lz回答大概也是是这个意思


>mark


>这些是kernel驱动最基本的东西,要很熟悉才行


>信号量可以用在中断中用down_trylock,如果获取不到就直接返回失败,不会像自旋锁那样等待;如果临界区的代码执行时间比较长就要用信号量,让进程调度去管理,如果时间比较短就用自旋锁;另外在自旋锁里不要用引起阻塞的函数,比如copy_user_from copy_to_from等函数


>* Spinlock 不断的检查等待的对象是否就绪,该进程/LWP始终处于Running的状态
* Sem使该进程/LWP进入Wait转台,系统会将CPU切换给其他的进程/LWP运行。
  
由于这个根本特性的不同,导致了以下用法上的不同:
  
1. Spinlock 只适用于短暂的等待,因为没有进程切换所以对于短暂等待他的效率会比较高。 但是对于长时间等待,由于它的CPU占用是100% 等的越长越不合算。
  
2. Spinlock只能在多个CPU的系统上用,因为等待者占据了100%的CPU,只由另外一个CPU上的进程才能解锁。


>楼上的说法对,顶
在单cpu的机器上spinlock是个空函数


>在高并发的地方,轮询比睡眠更高效


>用处:
自旋锁用于多处理器之间的同步,
信号量用于多线程之间的同步。
  
实现:
在多处理器平台下,信号量的实现会用到自旋锁
自旋锁一般通过特殊的机器指令来实现
  
使用:
自旋锁保护范围内不能作调度(当然不能进入睡眠),
不能存取可分页内存,当中断处理程序也有同样的自
旋锁时,必须在进入时关闭相关中断。
  
信号量没有太多的**。但是在实时响应上无法预测的。


>等待牛人来答.


>有用spin_lock的代码必须是原子的,不可以休眠和中断。

 

 

 

 

 

 

 

 

注意 __mutex_unlock_common_slowpath 与 up 的区别:

C/C++ code
   
   
static inline void __mutex_unlock_common_slowpath(atomic_t * lock_count, int nested) { ...... if (__mutex_slowpath_needs_to_unlock()) atomic_set( & lock -> count, 1 ); ......

__mutex_unlock_common_slowpath总是会将lock->count置1. (__mutex_slowpath_needs_to_unlock在X86下应该总是返回1。)
假设A进程在持有mutex时,先unlock再lock,那么unlock已经将lock->count置1,则lock会成功。
所以你看到进程A总是持有mutex,进程B总是等待(虽然进程A在unlock时,会将进程B唤醒。但是等进程B醒来,重新检查lock->count的时候,lock->count已经再次被进程A置0了)。
C/C++ code
   
   
void up( struct semaphore * sem) { unsigned long flags; spin_lock_irqsave( & sem -> lock , flags); if (likely(list_empty( & sem -> wait_list))) sem -> count ++ ; else __up(sem); spin_unlock_irqrestore( & sem -> lock , flags); }

up则不同,它只有在没有进程等待的情况下才将sem->count++(++以后sem->count才可能大于0)。
如果有进程在等待,则sem->count必定为0,并且up之后sem->count还是0。
假设A进程在持有sem时,先up再down。如果此时有进程B在等待这个sem,则进程A执行up过后sem->count还是0,down会使进程A进入等待。
所以进程A和进程B是交替的在持有sem。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值