spin_lock & mutex_lock的区别? .

转载 2016年08月29日 15:08:29
为什么需要内核锁?
多核处理器下,会存在多个进程处于内核态的情况,而在内核态下,进程是可以访问所有内核数据的,因此要对共享数据进行保护,即互斥处理

有哪些内核锁机制?
(1)原子操作
atomic_t数据类型,atomic_inc(atomic_t *v)将v加1
原子操作比普通操作效率要低,因此必要时才使用,且不能与普通操作混合使用
如果是单核处理器,则原子操作与普通操作相同
(2)自旋锁
spinlock_t数据类型,spin_lock(&lock)和spin_unlock(&lock)是加锁和解锁
等待解锁的进程将反复检查锁是否释放,而不会进入睡眠状态(忙等待),所以常用于短期保护某段代码
同时,持有自旋锁的进程也不允许睡眠,不然会造成死锁——因为睡眠可能造成持有锁的进程被重新调度,而再次申请自己已持有的锁
如果是单核处理器,则自旋锁定义为空操作,因为简单的关闭中断即可实现互斥
(3)信号量与互斥量
struct semaphore数据类型,down(struct semaphore * sem)和up(struct semaphore * sem)是占用和释放
struct mutex数据类型,mutex_lock(struct mutex *lock)和mutex_unlock(struct mutex *lock)是加锁和解锁
竞争信号量与互斥量时需要进行进程睡眠和唤醒,代价较高,所以不适于短期代码保护,适用于保护较长的临界区
互斥量与信号量的区别?(转载但找不到原文出处)
(1)互斥量用于线程的互斥,信号线用于线程的同步
这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别
互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源
(2)互斥量值只能为0/1,信号量值可以为非负整数
也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问
(3)互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到
 
 
 
 
 

[转]mutex和spin lock的区别

mutex和spin lock的区别和应用(sleep-waiting和busy-waiting的区别)2011-10-19 11:43

信号量mutex是sleep-waiting。 就是说当没有获得mutex时,会有上下文切换,将自己、加到忙等待队列中,直到另外一个线程释放mutex并唤醒它,而这时CPU是空闲的,可以调度别的任务处理。

而自旋锁spin lock是busy-waiting。就是说当没有可用的锁时,就一直忙等待并不停的进行锁请求,直到得到这个锁为止。这个过程中cpu始终处于忙状态,不能做别的任务。

例如在一个双核的机器上有两个线程(线程A和线程B),它们分别运行在Core0 和Core1上。 用spin-lock,coer0上的线程就会始终占用CPU。
另外一个值得注意的细节是spin lock耗费了更多的user time。这就是因为两个线程分别运行在两个核上,大部分时间只有一个线程能拿到锁,所以另一个线程就一直在它运行的core上进行忙等待,CPU占用率一直是100%;而mutex则不同,当对锁的请求失败后上下文切换就会发生,这样就能空出一个核来进行别的运算任务了。(其实这种上下文切换对已经拿着锁的那个线程性能也是有影响的,因为当该线程释放该锁时它需要通知操作系统去唤醒那些被阻塞的线程,这也是额外的开销)

总结
(1)Mutex适合对锁操作非常频繁的场景,并且具有更好的适应性。尽管相比spin lock它会花费更多的开销(主要是上下文切换),但是它能适合实际开发中复杂的应用场景,在保证一定性能的前提下提供更大的灵活度。

(2)spin lock的lock/unlock性能更好(花费更少的cpu指令),但是它只适应用于临界区运行时间很短的场景。而在实际软件开发中,除非程序员对自己的程序的锁操作行为非常的了解,否则使用spin lock不是一个好主意(通常一个多线程程序中对锁的操作有数以万次,如果失败的锁操作(contended lock requests)过多的话就会浪费很多的时间进行空等待)。

(3)更保险的方法或许是先(保守的)使用 Mutex,然后如果对性能还有进一步的需求,可以尝试使用spin lock进行调优。毕竟我们的程序不像Linux kernel那样对性能需求那么高(Linux Kernel最常用的锁操作是spin lock和rw lock)。

Linux内核同步机制API函数:宏:spin_lock_init ( )

宏定义:       在内核源码中的位置:linux-2.6.30/include/linux/spinlock.h 宏定义格式:# define spin_lock_init(lock)    ...
  • dyzok88
  • dyzok88
  • 2014年12月22日 17:18
  • 3392

深入分析_linux_spinlock_实现机制

在 x86 平台上,spinlock 主要通过处理器的 lock 指令前缀实现当某个线程的一条指令访问某个内存的时候,其他的线程的指令无法访问该内存的功能。(可见都是由处理器特性来保证!) 因此在 ...
  • electrombile
  • electrombile
  • 2016年05月01日 11:10
  • 2524

关于自旋锁spinlock的一些理解

这里并不是讲spinlock的一般用法,只是提出自己曾经的一些疑问点,也给出自己的解答。     在《LINUX内核设计与实现》《LINUX设备驱动程序》里都提过,在非抢占式的单处理器系统上的自旋锁被...
  • zj_jim
  • zj_jim
  • 2016年03月03日 12:20
  • 1487

spinlock造成死锁的原因

看了这个网址,对自选锁造成的死锁有了更深刻对理解。 http://blog.csdn.net/zhanglei4214/article/details/6837697 spin_lock比sp...
  • shenyanxxxy
  • shenyanxxxy
  • 2013年08月06日 10:56
  • 1051

spin_lock的变体

spin_lock变体的引入 考虑如下图所示的情况: 当处理器上当前进程A需要对共享变量a操作,所以在操作前通过spin_lock获取锁进入临界区,如上图标号1。当进程A进入临界区后,进程A所在的...
  • longwang155069
  • longwang155069
  • 2016年08月08日 16:28
  • 741

深入理解linux互斥锁(mutex)

锁机制,可以说是linux整个系统的精髓所在,linux内核都是围绕着同步在运转。在多进程和多线程编程中,锁起着极其重要的作用。我这里说的是互斥锁,其实是泛指linux中所有的锁机制。我在这里不讲如果...
  • cnbird2008
  • cnbird2008
  • 2013年09月13日 13:52
  • 5938

关于Spinlock机制的一点思考

Spin_lock的kernel中的实现对单核(UP),多核(SMP)有不同的处理方式。在这之前经常搞混,重新理一理。 对单核来说,如果spin_lock不处于中断上下文,则spin_lock锁定...
  • tangcong29
  • tangcong29
  • 2014年11月22日 00:11
  • 909

内核自旋锁spin_lock

自旋锁的初衷:在短期间内进行轻量级的锁定。一个被争用的自旋锁使得请求它的线程在等待锁重新可用的期间进行自旋(特别浪费处理器时间),所以自旋锁不应该被持有时间过长。如果需要长时间锁定的话, 最好使用信号...
  • zhyjunFov
  • zhyjunFov
  • 2017年05月04日 10:56
  • 325

spin_lock自旋锁

spin_lock自旋锁的时间片轮转 很关键的内核问题 被保护的资源已经持有自旋锁,那么新的内核线程再度访问保护的资源的时候,会自旋等待。 1 那么此内核线程的时间片用完之后,自旋锁是会让出...
  • wzw88486969
  • wzw88486969
  • 2014年04月18日 22:43
  • 630

那些情况该使用它们spin_lock到spin_lock_irqsave

Spinlock的目的是用来同步SMP中会被多个CPU同时存取的变量。在Linux中,普通的spinlock由于不带额外的语义,是用起来反而要非常小心。 在Linux kernel中执行的代码大体分...
  • tangtang_yue
  • tangtang_yue
  • 2016年02月04日 16:08
  • 103
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:spin_lock & mutex_lock的区别? .
举报原因:
原因补充:

(最多只允许输入30个字)