(三)自旋锁_zzhere2007
来源:互联网 发布:2016双十一淘宝销售额 编辑:程序博客网 时间:2024/06/05 04:46
1 自旋锁简介
自旋锁它是为为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。
2 自旋锁适用情况
自旋锁比较适用于锁使用者保持锁时间比较短的情况。正是由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下文使用,而自旋锁适合于保持时间非常短的情况,它可以在任何上下文使用。如果被保护的共享资源只在进程上下文访问,使用信号量保护该共享资源非常合适,如果对共享资源的访问时间非常短,自旋锁也可以。但是如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就必须使用自旋锁。自旋锁保持期间是抢占失效的,而信号量和读写信号量保持期间是可以被抢占的。自旋锁只有在内核可抢占或SMP(多处理器)的情况下才真正需要,在单CPU且不可抢占的内核下,自旋锁的所有操作都是空操作。另外格外注意一点:自旋锁不能递归使用。
3 自旋锁 使用
自旋锁它是为为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。
2 自旋锁适用情况
自旋锁比较适用于锁使用者保持锁时间比较短的情况。正是由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下文使用,而自旋锁适合于保持时间非常短的情况,它可以在任何上下文使用。如果被保护的共享资源只在进程上下文访问,使用信号量保护该共享资源非常合适,如果对共享资源的访问时间非常短,自旋锁也可以。但是如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就必须使用自旋锁。自旋锁保持期间是抢占失效的,而信号量和读写信号量保持期间是可以被抢占的。自旋锁只有在内核可抢占或SMP(多处理器)的情况下才真正需要,在单CPU且不可抢占的内核下,自旋锁的所有操作都是空操作。另外格外注意一点:自旋锁不能递归使用。
3 自旋锁 使用
自旋锁定义: linux/Spinlock.h
在Linux中,每个自旋锁都用spinlock_t结构表示:typedef struct { raw_spinlock_t raw_lock; #if defined(CONFIG_PREEMPT) && defined(CONFIG_SMP) unsigned int break_lock; #endif #ifdef CONFIG_DEBUG_SPINLOCK unsigned int magic, owner_cpu; void *owner; #endif #ifdef CONFIG_DEBUG_LOCK_ALLOC struct lockdep_map dep_map; #endif} spinlock_t;typedef struct{ volatile unsigned int slock;} raw_spinlock_t;
定义和初始化spinlock_t my_lock = SPIN_LOCK_UNLOCKED; void spin_lock_init(spinlock_t *lock); 自旋锁操作://加锁一个自旋锁函数void spin_lock(spinlock_t *lock); //获取指定的自旋锁void spin_lock_irq(spinlock_t *lock); //禁止本地中断获取指定的锁void spin_lock_irqsave(spinlock_t *lock, unsigned long flags); //保存本地中断的状态,禁止本地中断,并获取指定的锁void spin_lock_bh(spinlock_t *lock) //安全地避免死锁, 而仍然允许硬件中断被服务//释放一个自旋锁函数void spin_unlock(spinlock_t *lock); //释放指定的锁void spin_unlock_irq(spinlock_t *lock); //释放指定的锁,并激活本地中断void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags); //释放指定的锁,并让本地中断恢复到以前的状态void spin_unlock_bh(spinlock_t *lock); //对应于spin_lock_bh//非阻塞锁int spin_trylock(spinlock_t *lock); //试图获得某个特定的自旋锁,如果该锁已经被争用,该方法会立刻返回一个非0值, //而不会自旋等待锁被释放,如果成果获得了这个锁,那么就返回0. //而不会自旋等待锁被释放,如果成果获得了这个锁,那么就返回0.int spin_trylock_bh(spinlock_t *lock); //这些函数成功时返回非零( 获得了锁 ), 否则 0. 没有"try"版本来禁止中断.//其他int spin_is_locked(spinlock_t *lock); //和try_lock()差不多,如果自旋锁被置为1(未锁),返回0;否则,返回1zz总结
- (三)自旋锁_zzhere2007
- (二)原子操作_zzhere2007
- Windows 自旋锁分析(三)
- Windows 自旋锁分析(三)
- (一)内核定时器总结_zzhere2007
- 自旋锁(转载)
- 自旋锁(spinlock)
- 自旋锁(spinlock)
- 自旋锁(spinlock)
- 自旋锁(spinlock)
- 读写(自旋)锁
- 自旋锁(spinlock)
- 自旋锁(spinlock)
- 自旋锁(spinlock)
- 自旋锁公平性的三种实现
- 转:自旋锁(spinlock)
- 自旋锁(Spin Lock)
- 五、自旋锁(spinlock)
- 4. HEVC 综述
- MPEG Audio Frame Header
- Hibernate 关系映射 总结整理
- 安装VS2010SDN问题解决
- ASP.NET总结
- (三)自旋锁_zzhere2007
- Linux下调试core文件的方法
- Android 启动之旅
- 一篇正则好文,转过来
- linux 压缩命令巧记
- hd audio驱动
- 一步步构建大型网站架构
- 关于直方图均衡化(无用)
- 数据通过webservice上传不上去了,报错误Provider org.apache.xalan.processor.TransformerFactoryImpl not found