linux禁止内核抢占,Linux内核态抢占机制分析

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

8369426f3bea0a5c5bf389f3dc52b7ba.jpg-wh_651x-s_2383313915.jpg

本文起首介绍非抢占式内核(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值