【51CTO晃荡】8.26 带你深度懂得清华大年夜学、搜狗基于算法的IT运维实践与摸索

本文起首介绍非抢占式内核(Non-Preemptive Kernel)和可抢占式内核(Preemptive Kernel)的差别。接着分析Linux下有两种抢占:用户态抢占(User Preemption)、内核态抢占(Kernel Preemption)。然后分析了在内核态下:若何断定可否抢占内核(什么是可抢占的前提);何时触发从新调剂(何时设置可抢占前提);抢占产生的机会(何时检查可抢占的前提);什么时刻不克不及抢占内核。最后分析了2.6kernel中若何支撑抢占内核。

为了简化问题,我应用嵌入式及时体系uC/OS作为例子。起重要指出的是,uC/OS只有内核态,没有效户态,这和Linux不一样。

多义务体系中,内核负责治理各个义务,或者说为每个义务分派CPU时光,并且负责义务之间的通信。内核供给的根本办事是义务切换。调剂(Scheduler),英文还有一词叫dispatcher,也是调剂的意思。这是内核的重要职责之一,就是要决定该轮到哪个义务运行了。多半及时内核是基于优先级调剂法的。每个义务根据其重要程度的不合被付与必定的优先级。基于优先级的调剂法指,CPU老是让处在就绪态的优先级最高的义务先运行。然而,毕竟何时让高优先级义务控制CPU的应用权,有两种不合的情况,这要看竽暌姑的是什么类型的内核,是弗成剥夺型的┞氛样可剥夺型内核。

非抢占式内核

4.1 数据构造

非抢占式内核是由义务主动放弃CPU的应用权。非抢占式调剂法也称作合作很多义务,各个义务彼此合作共享一个CPU。异尘事宜照样由中断办事来处理。中断办事可以矢荷琐高优先级的义务由挂起状况变为就绪状况。但中断办事今后控制权照样回到本来被中断了的那个义务,直到该义务主动放弃CPU的应用权时,那个高优先级的义务才能获得CPU的应用权。非抢占式内核如下图所示。

非抢占式内核的长处有:中断响应快(与抢占式内核比较);

许可应用弗成重入函数;

几乎不须要应用旌旗灯号量保护共享数据。运行的义务占领CPU,不必担心被其余义务抢占。这不是绝对的,在打印机的应用上,仍须要知足互斥前提。

非抢占式内核的缺点有:义务响应时光慢。高优先级的义务已经进入就绪态,但还不克不及运行,要比及当前运行着的义务释放CPU。

非抢占式内核的义务级响应时光是不肯定的,不知道什么时刻最高优先级的义务才能拿到CPU的┞菲握权,完全取决于应用法度榜样什么时坷矸⑴CPU。

抢占式内核

应用抢占式内核可以包管体系响应时光。最高优先级的义务一旦就绪,总能获得CPU的应用权。当一个运行着的义务矢荷琐比它优先级高的义务进入了就绪态,当前义务的CPU应用权就会被剥夺,或者说被挂起了,那个高优先级的义务急速获得了CPU的┞菲握权。如不雅是中断办事子法度榜样矢荷琐高优先级的义务进入就绪态,中断完成时,中断了的义务被挂起,优先级高的那个义务开端运行。抢占式内核如下图所示。

1. 非抢占式和可抢占式内核的差别

抢占式内核的长处有:应用抢占式内核,最高优先级的义务什么时刻可以履行,可以获得CPU的应用权是可知的。应用抢占式内核使得义务级响应时光得以最优化。

抢占式内核的缺点有:不克不及直接应用弗成重入型函数。调用弗成重入函数时,要知足互斥前提,这点可以应用互斥型旌旗灯号量来实现。如不雅调用弗成重入型函数时,低优先级的义务CPU的应用权被高优先级义务剥夺,弗成重入型函数中的数据有可能被破坏。

need_resched():检查need_ resched标记的值;如不雅被设置就返回真,不然返回假

2. Linux下的用户态抢占和内核态抢占

Linux除了内核态外还有效户态。用户法度榜样的高低文属于用户态,体系调用和中断处理例程高低文属于内核态。在2.6 kernel以前,Linux kernel只支撑用户态抢占。

2.1 用户态抢占(User Preemption)

在kernel返回用户态(user-space)时,并且need_resched标记为1时,scheduler被调用,这就是用户态抢占。当kernel返回用户态时,体系可以安然的履行当前的义务,或者切换到别的一个义务。傍边断处理例程或者体系调用完成后,kernel返回用户态时,need_resched标记的值会被检查,假如它为1,调剂器会选择一个新的义务并履行。

中断和体系调用的返回路径(return path)的实如今entry.S中(entry.S不仅包含kernel entry code,也包含kernel exit code)。

2.2 内核态抢占(Kernel Preemption)

在2.6 kernel以前,kernel code(中断和体系调用属于kernel code)会一向运行,直到code被完成或者被壅塞(体系调用可以被壅塞)。在 2.6 kernel里,Linux kernel变成可抢占式。昔时夜中断处理例程返回到内核态(kernel-space)时,kernel会检查是否可以抢占和是否须要从新调剂。kernel可以在任何时光点上抢占一个义务(因为中断可以产生在任何时光点上),只要在这个时光点上kernel的状况是安然的、可从新调剂的。

3. 内核态抢占的设计

3.1 可抢占的前提

要知足什么前提,kernel才可以抢占一个义务的内核态呢?没持有锁。锁是用于保护临界区的,不克不及被抢占。

Kernel code可重入(reentrant)。因为kernel是SMP-safe的,所以知足可重人道。

3.2 内核态须要抢占的触发前提

内核供给了一个need_resched标记(这个标记在义务构造thread_info中)来注解是否须要从新履行调剂。

若何断定当前高低文(中断处理例程、体系调用、内核线程等)是没持有锁的?Linux在每个每个义务的thread_info构造中增长了preempt_count变量作为preemption的计数器。这个变量初始为0,当加锁时计数器增一,当解锁时计数器减一。

推荐阅读

【51CTO晃荡】8.26 带你深度懂得清华大年夜学、搜狗基于算法的IT运维实践与摸索

摘要: 控制反转(Inversion of Control,英文缩写为IoC)是框架的重要特点。控制反转(IOC)是一种思惟,依附>>>详细阅读

地址:http://www.17bianji.com/lsqh/36756.html

linux禁止内核抢占,Linux内核态抢占机制分析相关推荐

  1. Linux:设置/修改linux主机名+hosts映射+主机名解析机制分析+DNS域名劫持

    设置/修改主机名 查看主机名hostname,修改主机名(在vim编译器里修改),重启命令(reboot),操作如下: 结果如下: 设置hosts映射: 操作意义:ip地址很长,不好记忆,直接记忆主机 ...

  2. linux 禁止内部命令,Linux命令——文件内部命令

    1.cat 连接并全部显示文件内的信息 -n:在显示的时候可以显示行号,这个行号只是显示出来,跟文件内容没有关系 -E:显示每一行的行结束符,所以linux中文本文件的行结束符是$符 -T:可以显示制 ...

  3. linux禁止防火墙命令,LINUX关闭打开防火墙命令

    Linux下打开和关闭防火墙 1.及时生效,重启后复原 关闭:service iptables stop  开启:service iptalbes start  查看状态:service iptabl ...

  4. Linux 禁止查看根目录,Linux用户登录之后,不能查看根目录列表(转载+原创)

    如图,显示根目录的目录列表就卡死: 分析为什么卡住: 1.根目录的内存满了,导致目录显示不出来?(我认为Linux不会这么傻,连显示目录的内存都不留) 2.文件目录引用其他服务器的目录了,本服务器与其 ...

  5. linux禁止rm运行,Linux之劫持rm命令实现安全删除和屏蔽删除/、/*

    摘要 我认为Linux上这是一个必须添加的功能,必须屏蔽rm / .rm /* .rm -rf / .rm -rf /*,不怕恶意去执行就怕无意中招让自己gg了 还是一键脚本吧 wget http:/ ...

  6. linux禁止系统休眠,linux – 防止系统进入休眠/暂停 – Xviewer...

    关于整个桌面会话: 有两个流行的applet用于防止睡眠/暂停:Caffeine和Inhibit Applet(内置Cinnamon applet:右键单击底部面板 – >将Applet添加到P ...

  7. linux禁止线程网络,linux – 如何在gdb中禁用新线程/线程退出的消息?

    我正在调试一个Gtk应用程序,我得到了很多这样的消息: [New Thread 0x7fffde152700 (LWP 11142)] [Thread 0x7fffde152700 (LWP 1114 ...

  8. Linux内核态抢占机制分析

    http://blog.sina.com.cn/s/blog_502c8cc401012pxj.html [摘要]本文首先介绍非抢占式内核(Non-Preemptive Kernel)和可抢占式内核( ...

  9. Linux内核抢占实现机制分析【转】

    Linux内核抢占实现机制分析 转自:http://blog.chinaunix.net/uid-24227137-id-3050754.html [摘要]本文详解了Linux内核抢占实现机制.首先介 ...

最新文章

  1. R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(改变图例位置)实战(dot plot)
  2. spring aop xml事务配置
  3. Java Review - LinkedList源码解读
  4. 四十五、Gtihub+Hexo+icarus搭建自己的博客
  5. boost::type_erasure模块实现了支持多个签名的 Boost.Function 扩展
  6. 客户端命令(docker)
  7. java切入式编程显示屏_C语言嵌入式系统编程修炼之四:屏幕操作
  8. OK6410裸机调试
  9. 万能套用PS分层模板,不怕老板捉急!
  10. BGP router-id OSPF router-id 路由同步实验
  11. EwonCOSY 141 MPI EC51410【路由器】
  12. wxformbuilder软件制作gui界面教程
  13. 【数据安全案例】案例汇总
  14. [转载]无线网络优化
  15. uc浏览器安卓版 打不开php吗,javascript只允许安卓uc浏览器访问
  16. 4、oracle使用网络管理工具—Net Manager添加本地监听程序
  17. 360手机刷机:360N7lite刷机
  18. LInux 命令show
  19. 【程序源代码】音乐小程序
  20. 产业园区数字化运营管理之“精准招商”篇

热门文章

  1. 交换机端口mtu值最大_交换机 MTU
  2. oracle如何搜索字段类型,Oracle通过字段类型查询字段
  3. ajax post提交数据_JavaEE学习——为什么get请求方式比post请求方式效率高
  4. 用unity制作能量护盾(3)
  5. AWS Lambda中的Cron表达式解析器
  6. Azure Synapse Analytics简介第3部分:数据科学和商业智能
  7. PowerToys 又推新工具 Launcher,可以替代 Win+R
  8. python自动化框架pytest接口关联串联_python(pytest)+allure+jenkins 实现接口自动化的思路...
  9. 网络资产管理系统_网络版固定资产管理系统具备哪些优势?
  10. 总线与微命令实验总结_【干货】总线制?分线制?分不清楚看看这篇文章就知道了...