作者:刘洪涛,华清远见嵌入式学院高级讲师,ARM公司授权ATC讲师。

关于自旋锁用法介绍的文章,已经有很多,但有些细节的地方点的还不够透。我这里就把我个人认为大家容易有疑问的地方拿出来讨论一下。

  一、自旋锁(spinlock)简介

自旋锁在同一时刻只能被最多一个内核任务持有,所以一个时刻只有一个线程允许存在于临界区中。这点可以应用在多处理机器、或运行在单处理器上的抢占式内核中需要的锁定服务。

  二、信号量简介

这里也介绍下信号量的概念,因为它的用法和自旋锁有相似的地方。

Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。

  三、自旋锁和信号量对比

在很多地方自旋锁和信号量可以选择任何一个使用,但也有一些地方只能选择某一种。下面对比一些两者的用法。

表1-1自旋锁和信号量对比

应用场合

信号量or自旋锁

低开销加锁(临界区执行时间较快)

优先选择自旋锁

低开销加锁(临界区执行时间较长)

优先选择信号量

临界区可能包含引起睡眠的代码

不能选自旋锁,可以选择信号量

临界区位于非进程上下文时,此时不能睡眠

优先选择自旋锁,即使选择信号量也只能用down_trylock非阻塞的方式

四、自旋锁与linux内核进程调度关系

我们讨论下表1-1中的第3种情况(其它几种情况比较好理解),如果临界区可能包含引起睡眠的代码则不能使用自旋锁,否则可能引起死锁。

那么为什么信号量保护的代码可以睡眠而自旋锁就不能呢?

先看下自旋锁的实现方法吧,自旋锁的基本形式如下:

spin_lock(&mr_lock);

//临界区

spin_unlock(&mr_lock);

跟踪一下spin_lock(&mr_lock)的实现

#define spin_lock(lock)  _spin_lock(lock)

#define _spin_lock(lock)      __LOCK(lock)

#define __LOCK(lock) \

do { preempt_disable(); __acquire(lock); (void)(lock); } while (0)

注意到“preempt_disable()”,这个调用的功能是“关抢占”(在spin_unlock中会重新开启抢占功能)。从中可以看出,使用自旋锁保护的区域是工作在非抢占的状态;即使获取不到锁,在“自旋”状态也是禁止抢占的。了解到这,我想咱们应该能够理解为何自旋锁保护的代码不能睡眠了。试想一下,如果在自旋锁保护的代码中间睡眠,此时发生进程调度,则可能另外一个进程会再次调用spinlock保护的这段代码。而我们现在知道了即使在获取不到锁的“自旋”状态,也是禁止抢占的,而“自旋”又是动态的,不会再睡眠了,也就是说在这个处理器上不会再有进程调度发生了,那么死锁自然就发生了。

咱们可以总结下自旋锁的特点:

●  单处理器非抢占内核下:自旋锁会在编译时被忽略;

●  单处理器抢占内核下:自旋锁仅仅当作一个设置内核抢占的开关;

●  多处理器下:此时才能完全发挥出自旋锁的作用,自旋锁在内核中主要用来防止多处理器中并发访问临界区,防止内核抢占造成的竞争。

五、linux抢占发生的时间

最后在了解下linux抢占发生的时间,抢占分为用户抢占和内核抢占。

用户抢占在以下情况下产生:

●  从系统调用返回用户空间

●  从中断处理程序返回用户空间

内核抢占会发生在:

●  当从中断处理程序返回内核空间的时候,且当时内核具有可抢占性;

●  当内核代码再一次具有可抢占性的时候。(如:spin_unlock时)

●  如果内核中的任务显式的调用schedule()

●  如果内核中的任务阻塞。

基本的进程调度就是发生在时钟中断后,并且发现进程的时间片已经使用完了,则发生进程抢占。通常我们会利用中断处理程序返回内核空间的时候可以进行内核抢占这个特性来提高一些I/O操作的实时性,如:当I/O事件发生的是时候,对应的中断处理程序被激活,当它发现有进程在等待这个I/O事件的时候,它会激活等待进程,并且设置当前正在执行进程的need_resched标志,这样在中断处理程序返回的时候,调度程序被激活,原来在等待I/O事件的进程(很可能)获得执行权,从而保证了对I/O事件的相对快速响应(毫秒级)。可以看出,在I/O事件发生的时候,I/O事件的处理进程会抢占当前进程,系统的响应速度与调度时间片的长度无关。

转载于:https://www.cnblogs.com/armlinux/archive/2012/03/14/2396749.html

spinlock与linux内核调度的关系相关推荐

  1. 【Linux 内核】CFS 调度器 ⑥ ( CFS 调度器就绪队列 cfs_rq | Linux 内核调度实体 sched_entity | “ 红黑树 “ 数据结构 rb_root_cached )

    文章目录 一.CFS 调度器就绪队列 cfs_rq 二.Linux 内核调度实体 sched_entity 三." 红黑树 " 数据结构 rb_root_cached 一.CFS ...

  2. Android版本与Linux内核版本的关系

    Android版本与Linux内核版本的关系 一.Android版本与Linux内核的关系 英文名 中文名 Android版本 Linux内核版本 No 无 1.1 Cupcake 纸杯蛋糕 1.5 ...

  3. 阿里为Linux内核调度器提出一个新的”组平衡器”概念

    导读 随着越来越多的组织为了发展云计算等业务配置他们的服务器在应用程序之间共享 CPU 核心/资源,而不是专门分配 CPU 核心给单个应用程序/任务,中国公司阿里巴巴正在为 Linux 内核调度器提出 ...

  4. 黑莓手机时代落幕;阿里巴巴为 Linux 内核调度器提出新概念;清理 Linux 内核“依赖地狱” | 开源日报

    整理 | 宋彤彤 责编 | 屠敏 开源吞噬世界的趋势下,借助开源软件,基于开源协议,任何人都可以得到项目的源代码,加以学习.修改,甚至是重新分发.关注「开源日报」,一文速览国内外今日的开源大事件吧! ...

  5. 【Linux 内核】Linux 操作系统结构 ( Linux 内核在操作系统中的层级 | Linux 内核子系统及关系 | 进程调度 | 内存管理 | 虚拟文件系统 | 网络管理 | 进程间通信 )

    文章目录 一.Linux 内核在操作系统中的层级 二.Linux 内核子系统 三.Linux 内核子系统之间的关系 一.Linux 内核在操作系统中的层级 Linux 内核 所在层级 : 整个计算机系 ...

  6. linux内核调度 0号进程,Linux内核源代码情景分析---第四章 进程与进程调度

    4.1 进程四要素 什么是进程? 1:有一段代码段供其执行,这代码段不一定是进程所专用,可以与其他进程公用. 2:每个进程有其专用的系统空间的堆栈(栈)[这个栈是进程起码的"私有财产&quo ...

  7. 实时Linux内核调度器 | Real-Time Linux Kernel Scheduler

    <Real-Time Linux Kernel Scheduler> HOWTOs by Ankita Garg on August 1, 2009 目录 Design Goal 设计目标 ...

  8. linux内核运行关系图,一张图看懂Linux内核运行交互关系

    很多朋友如果接触过Linux的都知道Kernel的含义,kernel是操作系统的核心或者最重要的部分.众所周知的是,几乎整个互联网都运行在  Linux上,从网络协议,到服务器,到你平常访问的绝大多数 ...

  9. linux内核调度,Linux内核的三种调度策略

    一 Linux内核的三种调度策略: 1,SCHED_OTHER 分时调度策略, 2,SCHED_FIFO实时调度策略,先到先服务.一旦占用cpu则一直运行.一直运行直到有更高优先级任务到达或自己放弃 ...

最新文章

  1. 实验8-SPSS交叉表分析
  2. RDMA技术详解(三):理解RDMA Scatter Gather List
  3. 一切从用户的需求与体验出发
  4. java求完数(完全数 完美数)
  5. Linux/CentOS下安装Apache/SVN/Subversion图文详解教程
  6. Cocos2d x 2 0 从HelloWorld入手
  7. Redhat/CentOS修改主机名
  8. 翻译:SET PASSWORD语句(已提交到MariaDB官方手册)
  9. HackingTeam重磅炸弹: 估值超1000万美金带有军火交易性质的木马病毒以及远控源码泄露
  10. mysql 函数操作_mysql 数学操作函数
  11. 大二狗卸任社团职位以及对专业发展方向的思考与总结
  12. 钉钉安装需要管理员权限报错解决办法
  13. 卷积神经网络发展(网络骨架:Backbone)
  14. 人生第一笔试加面试 SAP胜略
  15. 普元软件推动企业应用架构转型互联网
  16. 需求到系统上线经历了什么
  17. 王小波:我为什么要写作?
  18. 论文学习-Exploiting Long-Term Dependencies for Generating Dynamic Scene GraphsExploiting Long-Term Depe
  19. MySQL基础知识之增删改查
  20. Unity游戏Server放在云服务器上

热门文章

  1. WCF完美搭建android平台服务之一
  2. 用Excel的VBA实现文本匹配与替换
  3. 同事间竞争,你该如何对待?
  4. 迅雷(XUNLEI)的工作原理揭密(续)---为何遭封杀及如何应对?
  5. speaking class onOct 13
  6. shanghai hongqiao railway station
  7. [OS][FS]查看ext3文件系统分区的superblock
  8. DOS命令大全(转)
  9. canal中mysql版本错误日志
  10. 看文艺青年怎么玩微信客户端