当前位置: 首页 > news >正文

真正的上锁前,为何要调用preempt_disable()来关闭抢占的case【转】

转自:http://blog.csdn.net/kasalyn/article/details/11473885

static inline void raw_spin_lock(raw_spinlock_t *lock)
{
     preempt_disable();
     do_raw_spin_lock(lock);
}

在真正的上锁前,为何要调用preempt_disable()来关闭抢占?

==》
1.如果内核可抢占, 单CPU
    process1通过系统调用进入内核态,如果其需要访问临界区,则在进入临界区前获得锁,上锁,V=1,然后进入临界区
    如果process1在内核态执行临界区代码的过程中发生了一个外部中断,当中断处理函数返回时,因为内核的可抢占性,此时将会出现一个调度点,如果CPU的运行队列中出现了一个比当前被中断进程process1优先级更高的进程process2,那么被中断的进程将会被换出处理器,即便此时它正运行于内核态。
    如果process2也通过系统调用进入内核态,且要访问相同的临界区,则会形成死锁(因为拥有锁的Process1永没有机会再运行从而释放锁)
    
2.如果内核可抢占,多CPU
    CPU1上的process1通过系统调用进入内核态,如果其需要访问临界区,则在进入临界区前获得锁,上锁,V=1,然后进入临界区
     如果process1在内核态执行临界区代码的过程中发生了一个外部中断,当中断处理函数返回时,因为内核的可抢占性,此时将会出现一个调度点,如果CPU1的运行队列中出现了一个比当前被中断进程process1优先级更高的进程process2,那么被中断的进程process1将会被换出处理器,即便此时它正运行于内核态。
    如果CPU2上的process3也通过系统调用进入内核态,且要访问相同的临界区,也一样形成死锁
    

为了防止系统进入死锁状态,需要在真正上锁前,调用preempt_disable()来关闭抢占

【作者】 张昺华
【出处】 http://www.cnblogs.com/sky-heaven/
【博客园】 http://www.cnblogs.com/sky-heaven/
【新浪博客】 http://blog.sina.com.cn/u/2049150530
【知乎】 http://www.zhihu.com/people/zhang-bing-hua
【我的作品---旋转倒立摆】 http://v.youku.com/v_show/id_XODM5NDAzNjQw.html?spm=a2hzp.8253869.0.0&from=y1.7-2
【我的作品---自平衡自动循迹车】 http://v.youku.com/v_show/id_XODM5MzYyNTIw.html?spm=a2hzp.8253869.0.0&from=y1.7-2
【新浪微博】 张昺华--sky
【twitter】 @sky2030_
【facebook】 张昺华 zhangbinghua
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

相关文章:

  • 【烈日炎炎战后端】Linux(0.3万字)
  • POJ3159 Candies(最短路径:SPFA+链表+栈)
  • 【烈日炎炎战后端】SpringMVC(0.5万字)
  • 【shell 脚本】两种登录方式
  • 【烈日炎炎战后端】Spring(2.1万字)
  • tcpdump统计http请求
  • 产品经理技能之MRD的笔记之一
  • 【烈日炎炎战后端】消息队列(1.0万字)
  • css笔记:如何让一个div居于页面正中间
  • 【烈日炎炎战后端】Git(0.1万字)
  • R语言 如何为图片添加文字说明(转载)
  • 【烈日炎炎战后端 】MyBatis(0.4万字)
  • Windows Docker的有趣事实
  • RSD和wlwmanifest是什么
  • 【烈日炎炎战后端】Zookeeper(0.5万字)
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 《剑指offer》分解让复杂问题更简单
  • conda常用的命令
  • flutter的key在widget list的作用以及必要性
  • GitUp, 你不可错过的秀外慧中的git工具
  • HashMap剖析之内部结构
  • Javascript 原型链
  • Nodejs和JavaWeb协助开发
  • php的插入排序,通过双层for循环
  • rc-form之最单纯情况
  • react 代码优化(一) ——事件处理
  • Redux系列x:源码分析
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 前端技术周刊 2019-01-14:客户端存储
  • 前嗅ForeSpider中数据浏览界面介绍
  • 微信小程序填坑清单
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #define,static,const,三种常量的区别
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (12)Hive调优——count distinct去重优化
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (分布式缓存)Redis分片集群
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • *上位机的定义
  • .Mobi域名介绍
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅