大家使用spinlock的时候,一般是这么配对:

spin_lock---------------------spin_unlock------------------最轻
spin_lock_bh----------------spin_unlock_bh-----------------较轻
spin_lock_irq----------------spin_unlock_irq---------------较重
spin_lock_irqsave---------spin_lock_irqrestore--------------最重

那么,假设我使用 spin_lock_irqsave 来关中断和关抢占,并保存之前的中断状态,那么,我能不能使用spin_unlock来解锁呢?

static inline int
__mod_timer(struct timer_list *timer, unsigned long expires,bool pending_only, int pinned)
{struct tvec_base *base, *new_base;unsigned long flags;int ret = 0 , cpu;timer_stats_timer_set_start_info(timer);BUG_ON(!timer->function);base = lock_timer_base(timer, &flags);ret = detach_if_pending(timer, base, false);if (!ret && pending_only)goto out_unlock;debug_activate(timer, expires);cpu = smp_processor_id();#if defined(CONFIG_NO_HZ_COMMON) && defined(CONFIG_SMP)if (!pinned && get_sysctl_timer_migration())cpu = get_nohz_timer_target();
#endifnew_base = per_cpu(tvec_bases, cpu);if (base != new_base) {/** We are trying to schedule the timer on the local CPU.* However we can't change timer's base while it is running,* otherwise del_timer_sync() can't detect that the timer's* handler yet has not finished. This also guarantees that* the timer is serialized wrt itself.*/if (likely(base->running_timer != timer)) {/* See the comment in lock_timer_base() */timer_set_base(timer, NULL);spin_unlock(&base->lock);base = new_base;spin_lock(&base->lock);timer_set_base(timer, base);}}timer->expires = expires;internal_add_timer(base, timer);out_unlock:spin_unlock_irqrestore(&base->lock, flags);-----------收尾很重要return ret;
}

答案就在这个函数中,看完这个函数,你就不会这么浅显地理解配对了,可能会更深地去理解spinlock的使用。

其实spinlock这种忙等的方式,使用场景一般要求,临界区不能太大,且多路径访问的概率不那么高。这里的多路径,就是指进程上下文和中断上下文,其中中断上下文又分为硬中断和软中断。

进程上下文包括:用户进程,内核线程,从调度角度来说,都归属进程上下文,可以睡眠。

中断上下文包括:HW interrupt context(中断handler)、软中断上下文(soft irq,当然由于各种原因,该softirq被推迟到softirqd的内核线程中执行的时候就不属于这个场景了,属于进程上下文那个分类了)、timer的callback函数(本质上也是softirq)、tasklet(本质上也是softirq)。

不同的控制路径,使用不同的spinlock,比如只有进程上下文访问临界区,则使用spin_lock就够了,如果有软中断和进程上下文访问临界区,则需要用spin_lock_bh,如果有硬中断访问和进程上下文访问,则用spin_lock_irq。

假设只有软中断访问临界区,则只要关软中断就行,甚至都不需要spin-lock,

假设只有硬中断访问临界区,则只要关硬中断就行,也不需要spin-lock

如果有兴趣完全弄懂,可以参考 蜗窝科技  http://www.wowotech.net/kernel_synchronization/spinlock.html

转载于:https://www.cnblogs.com/10087622blog/p/9560979.html

linux 使用spinlock的配对关系问题相关推荐

  1. Linux与JVM的内存关系分析

    Linux与JVM的内存关系分析 原文出处: 美团技术团队 引言 在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 ...

  2. 【转】mac os、linux及unix之间的关系

    [转]mac os.linux及unix之间的关系 mac os.linux及unix之间的关系 unix 是由贝尔实验室开发的多用户.多任务操作系统 linux是一类Unix操作系统的统称,严格来说 ...

  3. Java 内存 关系_JVM和Linux之间的详细内存关系

    JVM和Linux之间的详细内存关系 在一些具有8g物理内存的服务器上,主要运行Java服务.系统内存分配如下:Java服务的JVM堆大小设置为6g,监视过程大约需要600m,Linux本身使用大约8 ...

  4. Linux软件间的依赖关系(转)

    Linux中的软件大部分是零碎的,其粒度比windows的小很多,软件之间的依赖关系很强烈,下面是自己的一些理解: 一.Linux中的软件依赖 Linux中的软件依赖关系成一颗拓扑树结构,比如A直接或 ...

  5. Linux与JVM的内存关系分析(转)

    引言 在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约600m,Linux自身使用大约800m.从表面上,物理内存 ...

  6. 两台 Linux 主机之间配置信任关系(以及如何解除)

      主机之间的 ssh 信任,简单地说,就是主机之间使用 ssh 命令登录主机不需要密码.   一.主机之间配置信任关系   将主机 A (47.100.247.242) 作为信任主机,主机 B(10 ...

  7. Linux和Ubuntu是什么关系

    Linux和Ubuntu是什么关系 Linux这个词是指操作系统的内核,ubuntu是指基于这种内核的操作系统,就是在linux这个内核上又加上了一种界面系统,就像你看到的windows的界面一样. ...

  8. python封装api linux_python Socket编程-python API 与 Linux Socket API之间的关系

    python socket编程 by SA19225409 地址协议家族 Python 支持 AF_UNIX. AF_NETLINK. AF_TIPC 和 AF_INET 家族 AF_UNIX 基于本 ...

  9. linux gcc 与 glibc 的关系 glibc版本查看

    glibc是什么,以及与gcc的关系? glibc是gnu发布的libc库,也即c运行库.glibc是linux 系统中最底层的api(应用程序开发接口),几乎其它任何的运行库都会倚赖于glibc.g ...

最新文章

  1. Oracle手工建库
  2. android eclipse中导入framework.jar以及使用其隐藏类的方法
  3. 前端学习(2552):vue简介
  4. 第二百一十九天 how can I 坚持
  5. 整数线性规划实现(lingo,python分枝界定法)
  6. 怎么用计算机弹是你,抖音带你去旅行怎么用计算器弹奏_抖音带你去旅行计算器乐谱_管理资源吧...
  7. 用sklearn mysql_sklearn 生成随机数据
  8. n进制快速转化成10进制
  9. 用友T6打开UFO报表提示登录失败
  10. 字符串逆序(三种方法)
  11. 安卓开发环境的搭建2017-01-15更新
  12. 鼠标模拟android,android_模拟鼠标指针demo
  13. Studio 3T 使用教程 mogodb
  14. 智能语音的扫地机器人介简_米家扫地机器人1S评测:升级支持智能语音操控
  15. PV,UV,IP,VV,CV的含义与区别
  16. 【微信小程序】引用echarts 在真机上预览图表模糊的解决办法
  17. python图片压缩原理_LZ77无损压缩算法原理详解(结合图片和简单代码)
  18. 药品大湾区分中心牵手易臣,OA系统助力机构高效办公
  19. 复习高数下册8-10章主要内容(简略版)
  20. 对于等待事件(direct path read)的理解

热门文章

  1. RocketMQ:Consumer概述及启动流程与消息拉取源码分析
  2. python re正则匹配_python re正则表达式模块
  3. 如何把很多照片拼成一张照片_一张25GB的照片,到底比普通照片强在哪儿?
  4. UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0x8b in position 1: invalid start byte
  5. Lock与synchronized 的区别
  6. host mysql server_解决服务器连接错误Host ‘XXX’ is not allowed to connect to this MySQL server...
  7. c语言uint赋值给int,如何在C#中将uint转换为int?
  8. ts-node 直接运行ts文件
  9. ajax 更新页面变量,[Django 1.5] jQuery/Ajax 在Django使用 ,如何更新模板里里变量
  10. 将下图的nfa确定化为dfa_作业8 非确定的自动机NFA确定化为DFA