深入分析Linux自旋锁】的更多相关文章

转自:http://blog.chinaunix.net/uid-20543672-id-3252604.html 前言: 在复习休眠的过程中,我想验证自旋锁中不可休眠,所以编写了一个在自旋锁中休眠的模块.但是在我的ARMv7的单核CPU(TI的A8芯片)中测试的时候,不会锁死,并且自旋锁可以多次获取.实验现象和我对自旋锁和休眠的理解有出路. 在spinlock上不过就是多了CONFIG_DEBUG_SPINLOCK的自旋锁调试功能.于是我将自己板子的内核也加了这个配置,并让同事Omap3530…
原创 2016-08-12 tekkamanninja CU技术社区   作者| tekkamanninja本文版权由tekkamanninja所有,如需转载,请联系本公众号获取授权!在复习休眠的过程中,我想验证自旋锁中不可休眠,所以编写了一个在自旋锁中休眠的模块.但是在我的ARMv7的单核CPU(TI的A8芯片)中测试的时候,不会锁死,并且自旋锁可以多次获取.实验现象和我对自旋锁和休眠的理解有出路.      我后来我将这个模块放到自己的PC上测试,成功锁死了,说明我的模块原理上没有问题.但是…
一.概述: 自旋锁是SMP架构中的一种low-level的同步机制.当线程A想要获取一把自旋锁而该锁又被其它线程锁持有时,线程A会在一个循环中自旋以检测锁是不是已经可用了.对于自选锁需要注意: 由于自旋时不释放CPU,因而持有自旋锁的线程应该尽快释放自旋锁,否则等待该自旋锁的线程会一直在那里自旋,这就会浪费CPU时间. 持有自旋锁的线程在sleep之前应该释放自旋锁以便其它线程可以获得自旋锁. 使用任何锁需要消耗系统资源(内存资源和CPU时间),这种资源消耗可以分为两类: 建立锁所需要的资源 线…
为了避免并发,防止竞争.内核提供了一组同步方法来提供对共享数据的保护. 我们的重点不是介绍这些方法的详细用法,而是强调为什么使用这些方法和它们之间的差别. Linux 使用的同步机制可以说从2.0到2.6以来不断发展完善.从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁.这些同步机制的发展伴随 Linux从单处理器到对称多处理器的过度:伴随着从非抢占内核到抢占内核的过度.锁机制越来越有效,也越来越复杂.目前来说内核中原子操作多用来做计数使用,其它情况最常用的是两种锁以及它们的变种:一个…
转自:http://blog.csdn.net/xu_guo/article/details/6072823 版权声明:本文为博主原创文章,未经博主允许不得转载. 自旋锁最多只能被一个可执行线程持有(读写自旋锁除外).自旋锁不会引起调用者睡眠,如果一个执行线程试图获得一个已经被持有的自旋锁,那么线程就会一直进行忙循环,一直等待下去(一直占用 CPU ),在那里看是否该自旋锁的保持者已经释放了锁, " 自旋 " 一词就是因此而得名. 由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不…
  自旋锁 毫秒以下. 自旋锁用于多个CPU系统中,在单处理器系统中,自旋锁不起锁的作用,只是禁止或启用内核抢占.在自旋锁忙等待期间,内核抢占机制还是有效的,等待自旋锁释放的线程可能被更高优先级的线程抢占CPU. 来确定锁现是否可用,然后在忙等待的循环中"自旋"直到锁可用为止. 通用自旋锁 表示解锁状态,说明有1个资源可用:0或负值表示加锁状态,0说明可用资源数为0.Linux内核为通用自旋锁提供了API函数初始化.测试和设置自旋锁.API函数功能说明如下. 宏定义 功能说明 spin…
自旋锁原语要求的包含文件是 <linux/spinlock.h>. 一个实际的锁有类型 spinlock_t. 象任何其他数据结构, 一个 自旋锁必须初始化. 这个初始化可以在编译时完成, 如下: spinlock_t my_lock = SPIN_LOCK_UNLOCKED; 或者在运行时使用: void spin_lock_init(spinlock_t *lock); 在进入一个临界区前, 你的代码必须获得需要的 lock , 用: void spin_lock(spinlock_t *…
我们已经看到 2 个函数, spin_lock 和 spin_unlock, 可以操作自旋锁. 有其他几个函 数, 然而, 有类似的名子和用途. 我们现在会展示全套. 这个讨论将带我们到一个我们无 法在几章内适当涵盖的地方; 自旋锁 API 的完整理解需要对中断处理和相关概念的理解. 实际上有 4 个函数可以加锁一个自旋锁: void spin_lock(spinlock_t *lock); void spin_lock_irqsave(spinlock_t *lock, unsigned lo…
自旋锁(Spin Lock) 自旋锁类似于互斥量,不过自旋锁不是通过休眠阻塞进程,而是在取得锁之前一直处于忙等待的阻塞状态.这个忙等的阻塞状态,也叫做自旋. 自旋锁通常作为底层原语实现其他类型的锁. 适用场景: 1)锁被持有的时间短,而且线程不希望在重新调度上花费太多的成本: 2)在非抢占式内核中,会阻塞中断,这样中断处理程序不会让系统陷入死锁状态.因为中断处理程序无法休眠,只能使用这种锁: 缺点: 1)线程自旋等待锁变成可用时,CPU不能做其他事情,会浪费CPU资源: 伪代码 S = 1 线程…
一.前言 在linux kernel的实现中,经常会遇到这样的场景:共享数据被中断上下文和进程上下文访问,该如何保护呢?如果只有进程上下文的访问,那么可以考虑使用semaphore或者mutex的锁机制,但是现在中断上下文也参和进来,那些可以导致睡眠的lock就不能使用了,这时候,可以考虑使用spin lock.本文主要介绍了linux kernel中的spin lock的原理以及代码实现. 二.工作原理 1.spin lock的特点 我们可以总结spin lock的特点如下: (1)spin…