#define preempt_disable() /
  do { /
      inc_preempt_count(); /
      barrier(); /
  } while (0)

实现很简单,就两行代码,第一行把进程描述符中的preempt_count加1,第二行加一个优化屏障。展开inc_preempt_count()后就是:

current->thread_info->preempt_count++;

barrier();

看到这个实现的时候,觉的很奇怪,用个优化屏障就够了吗?似乎应该用内存屏障mb()。优化屏障只能保证编译器不乱排指令,而如果CPU乱序执行,被preempt_disable保护的临界区中的指令岂不是有可能在preempt_count++之前执行。但可以肯定这不是个BUG,这么重要的地方不可能出现这么低级的BUG。那么就结合preempt_disable的应用环境分析一下,以下为个人的分析,并未得到权威认证,如有错误还请指正。

既然没有BUG,那只能有两种可能,第一就是禁用抢占后临界区中的指令,不会先于preempt_count++执行。第二就是在临界区中的指令先执行且preempt_count++尚未执行的时候,不能发生抢占或者抢占不会有问题。第一种情况由于cpu的乱序执行显然无法保证。那么只能是第二种。为什么呢?接着分析。

内核抢占发生在硬件中断唤醒一个高优先级任务的时候,当发现当前任务的优先级低于被唤醒的任务的优先级且当前任务的preempt_count为0,那么就会抢占当前任务。因此硬件中断是导火索,也就是说只有在临界区中的指令执行后,preempt_count++未执行前发生一个硬件中断,才有可能发生抢占。但是硬件中断都是precise interrupt,精确中断,即中断发生时的PC指针记录的指令之前的指令都已完成,之后的指令都未执行。这样即使在上述情况发生一个硬件中断,硬件只能有两种方法来保证中断的精确性:

1. 丢弃临界区中指令的执行结果,将PC指针指向preempt_disable()。这样即使被抢占,临界区中的指令的执行结果也被丢弃了,所以不会出问题。

2. 等preempt_disable()指令执行后,将PC指针指向临界区中最后完成的指令的下一条指令。这样由于preempt_count被加1了,该任务就不能被抢占了,所以也不会出问题。

分析到这里,可以看出此处确实不需要内存屏障了,用barrier()保证编译器不乱排临界区中的指令就可以了。但是实际上这里这个barrier()还有另外一个作用,就是保证编译器会产生写内存的指令,把preempt_count的值写到内存。否则编译器可能对preempt_count进行优化,仅仅把更新后的值放到寄存器中。这样会出问题,比如在临界区中产生一个中断,中断处理程序只能从内存中去读preempt_count的值,它可能无法看到内核抢占已经被禁止,而错误的将不能被抢占的任务抢占。这是中断和进程共享数据时用barrier()来保持同步而不用锁的一个很好的例子。

终于分析完了,不由的感叹,内核真是太精妙了,简单的两行代码,隐藏着这么深的问题。要想成为linux hacker,要走的路还有很长,努力吧。

由preempt_disable的实现想到的相关推荐

  1. 真没想到,Python还能实现5毛特效

    来源 | ZackSock(ID:ZackSock) 图源 | 视觉中国 Python牛已经不是一天两天的事了,但是我开始也没想到,Python能这么牛.前段时间接触了一个批量抠图的模型库,而后在一些 ...

  2. 万万没想到,逛B站也能学编程了

    作者 | 徐麟,某互联网公司数据分析狮 转载自 | 数据森麟(id:shujusenlin) 前言 很多人提到B站,首先想到的就会是二次元或者鬼畜,上个月,我们公众号也发表了一篇关于B站鬼畜视频的文章 ...

  3. PyTorch迎来5岁生日,创始人带领大一实习生开发:没想到会这么成功

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源丨量子位 编辑丨极市平台 导读 PyTorch公开发布5周年! ...

  4. 没想到我提前56年感受了赛博朋克

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 硬核的 ...

  5. 显卡暴涨,这我万万没想到啊

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 梦晨 晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI ...

  6. 万万没想到,坤坤洗白的第一步是周琦…

    前晚(2日)中国男篮与波兰队的关键一战惜败后,几乎所有中国球迷都在哭"琦","琦"到一夜未眠. 周琦关键时刻边线发球失误,硬生生把中国男篮提前出线的jio给拖了 ...

  7. 真是没想到,Springboot + Flowable 开发工作流会这么简单!

    " 程序员是块砖,哪里需要哪里搬. " 公司内部的OA系统最近要升级改造,由于人手不够就把我借调过去了,但说真的我还没做过这方面的功能,第一次接触工作流的开发,还是有点好奇是个怎样 ...

  8. 笔记本电脑处理器_苹果高管:我们都没有想到M1的性能有那么强|英特尔|处理器|iphone|ipad|笔记本电脑...

    苹果近日发布了自主研发处理器M1以及搭载新处理器的笔记本电脑,显示其速度和效率都有很大提升.发布会结束不久,苹果三位最资深的高管--营销总监格雷格·乔维亚克(Greg Joswiak).软件主管克雷格 ...

  9. 搞定了数学,拿下了代码,没想到在这件事上栽了跟头……

    "我好像要失业了." 如果有一天,你的学霸老同学给你发了这样一条信息,你会怎么想? 我就碰到了这样的事.当年我们系所向披靡的刚哥,毕业季能拿着一叠offer打扑克的牛人,他竟然告诉 ...

最新文章

  1. Swift快速入门之getter 和 setter
  2. 《预训练周刊》第25期:HyperCLOVA:数十亿级韩语生成式预训练变换器、GPT-3在生物医学领域不是好的小样本学习器...
  3. 集群理论讲解(续三)
  4. Python内置模块bisect(二分查找实现和快速插入有序序列)
  5. 汇编语言位向量(位映射)
  6. Java学习从入门到精通
  7. 通俗易懂,快速幂基本思想
  8. sap.m.SplitApp
  9. 高清摄像头MIPI接口与ARM连接【转】
  10. 邪恶的Java技巧使JVM忘记检查异常
  11. 如何在命令行中使用jq将JSON转换为CSV
  12. 你会为了好工作和优质配偶整容吗?
  13. web浏览器_2019版 web 浏览器现状
  14. 图像处理基础(二)_OpenCV命名规则
  15. apulSoft apShaper for Mac(滤波失真插件)
  16. mybatis开发中遇到的小问题
  17. java sql连接代码 sqlserver的jar包
  18. Electron点击右上角关闭按钮隐藏任务栏图标(electron类似杀毒软件的任务栏图标)
  19. 囚徒健身(中文完整版)(保罗·威德)
  20. ffmpeg mp4 mp3 wav flac webm aac ac3 ogg格式转换

热门文章

  1. hypervisor - qnx
  2. 自动创建 api 模拟数据
  3. 《数学巴士》使用指南
  4. Android新闻客户端实训-Day1类Day2接口基操
  5. SQL基础条件查询语句
  6. 主流的B/S架构模式在软考教程里居然是被一笔带过的。
  7. 网络安全实验1 Sniffer Pro网络分析器应用实验
  8. shell字符串包含空格处理
  9. 微信转发网站怎么可以看到icon图标?
  10. 11广义表的基本概念和性质