首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux2.6调度和抢占- preempt_count使用

是指在Linux内核版本2.6中,通过使用preempt_count来实现调度和抢占的机制。

调度是指操作系统决定哪个进程或线程可以使用CPU资源的过程。在Linux内核中,调度器负责根据一定的策略和算法,选择合适的进程或线程来运行。而抢占是指当一个进程或线程正在执行时,另一个优先级更高的进程或线程需要使用CPU资源时,操作系统会中断当前进程或线程的执行,将CPU资源分配给优先级更高的进程或线程。

preempt_count是一个计数器,用于记录内核中的抢占状态。当preempt_count的值大于0时,表示内核处于抢占禁止状态,即当前进程或线程不可被抢占。当preempt_count的值等于0时,表示内核处于抢占允许状态,即当前进程或线程可以被抢占。

preempt_count的使用可以通过以下几个方面来理解:

  1. 调度器:调度器会根据preempt_count的值来判断是否可以进行调度。当preempt_count大于0时,调度器会认为当前进程或线程不可被抢占,因此不会进行调度。只有当preempt_count等于0时,调度器才会根据一定的策略选择合适的进程或线程进行调度。
  2. 抢占:当一个进程或线程需要抢占当前正在执行的进程或线程时,会先检查preempt_count的值。如果preempt_count大于0,表示当前进程或线程不可被抢占,抢占请求会被延迟处理。只有当preempt_count等于0时,抢占请求才会被立即处理,当前进程或线程会被中断,CPU资源会被分配给优先级更高的进程或线程。
  3. 临界区保护:preempt_count也可以用于保护临界区,防止多个进程或线程同时访问共享资源。当进程或线程进入临界区时,会将preempt_count的值保存起来,并将其设置为一个较大的数值,禁止其他进程或线程进行抢占。当进程或线程离开临界区时,会将preempt_count的值恢复,并允许其他进程或线程进行抢占。

总结起来,Linux2.6中的preempt_count使用是为了实现调度和抢占的机制。它通过记录抢占状态来控制调度器的行为,保证进程或线程的执行顺序和资源的合理分配。在实际应用中,preempt_count的使用可以提高系统的响应性能和并发能力。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Symmetric multiprocessing(SMP)下的spinlock

现在的计算机都是多核对称的cpu处理器,本文通过liunx内核2.6.0代码来分析在多核处理器下,如何使用自旋锁抢占来进行高效的内核运转。...如果正在内核中运行着的任务此时可以抢占另外一个内核执行的任务,比如说有一个优先级很高的任务想去抢占内核中正在运行的任务,在linux2.6之前是没有实现的。...在2.6版本的内核中,加入了抢占相关的信息,在preempt.h头文件里,定义了一个preempt_count如果这个count大于零表示不可以被抢占,如果等于零,表示可以被抢占。...#define preempt_count() (current_thread_info()->preempt_count)//核心变量,每一个任务的线程信息里都有这个值 //对这个变量进行加减操作 #...do { \ preempt_count()--; \ } while (0) #ifdef CONFIG_PREEMPT //抢占动作,在别的文件中实现,所以是extern extern void

70430

Linux内核24-内核同步理解

不论是抢占式还是非抢占式,当进程完成内核活动的某个线程并调用调度器时就会发生进程切换。但是,在非抢占式内核中,除非即将切换到用户态时,否则不会发生进程替换。...如果内核是可抢占式的,就会发生进程A到进程B的替换。异常处理程序还没有执行完,只有当调度器再一次选择进程A执行的时候才会继续。...实施内核抢占的动机就是减少用户态进程的调度延时,也就是减少可运行状态到真正运行时的延时。需要实时调度的任务(比如外部的硬件控制器等)需要内核具有抢占性,因为减少了被其它进程延时的风险。...->preempt_count = 0; } 可以看出,这个函数首先检查中断是否使能,以及抢占计数是否为0。...基于这个原因,Linux2.6内核允许用户在编译内核代码的时候,通过配置,可以使能禁止内核抢占。 4 什么时候需要同步技术? 我们先了解一下内核进程的竞态条件临界区的概念。

1.1K20
  • Linux用户抢占内核抢占详解(概念, 实现触发时机)--Linux进程的管理与调度(二十)

    1 非抢占抢占式内核 为了简化问题,我使用嵌入式实时系统uC/OS作为例子 首先要指出的是,uC/OS只有内核态,没有用户态,这Linux不一样 多任务系统中, 内核负责管理各个任务, 或者说为每个任务分配...; } table th:nth-of-type(2){ width: 30% ; } 1.1 非抢占式内核 非抢占式内核是由任务主动放弃CPU的使用权 非抢占调度法也称作合作型多任务, 各个任务彼此合作共享一个...抢占式内核如下图所示 ? 抢占式内核的优点有 使用抢占式内核,最高优先级的任务什么时候可以执行,可以得到CPU的使用权是可知的。使用抢占式内核使得任务级响应时间得以最优化。...内核抢占用户层进程被其他进程抢占是两个不同的概念, 内核抢占主要是从实时系统中引入的, 在非实时系统中的确也能提高系统的响应速度, 但也不是在所有情况下都是最优的,因为抢占也需要调度同步开销,在某些情况下甚至要关闭内核抢占......... */ } preempt_count值 描述 0 禁止内核抢占, 其值标记了使用preempt_count的临界区的数目 0 开启内核抢占 <0 锁为负值, 内核出现错误 内核自然也提供了一些函数或者宏

    5.3K30

    60秒问答:抢占式多任务处理 vs 协作式多任务处理

    翻译: 协程 现在已经是抢占调度。 不回出现因为gcc死循环造成调度上死锁或者延迟。 查看维基百科 协程是协作式多任务的,而线程典型是抢占式多任务的。...内核关闭抢占 是为了防止死锁 preempt_enable() 开启抢占 preempt_disable() 禁止抢占 内核中每个进程数据结构里有一个计数器preempt_count 抢占的开启与禁止...,操作当前进程的preempt_count 内核在进行进程调度的时候,只要prempt_count为0,内核就可以进行抢占。...中有 实时, deadline cfs 三个调度实体, cfs 调度实体即红黑树节点 - 每个 CPU 都有 rq 结构体, 里面有 dl_rq, rt_rq cfs_rq 三个调度队列以及其他信息...sched_class 有几种实现: stop_sched_class 优先级最高的任务会使用这种策略,会中断所有其他线程,且不会被其他任务打断; dl_sched_class 就对应上面的 deadline

    1.9K30

    Linux内核22-软中断tasklet

    Linux2.6内核使用两种手段满足这项挑战:软中断tasklet,还有工作队列。其中,工作队列我们单独在一篇文章中讲解。...事实上,只使用了6类软中断,如下表所示: 表4-9 Linux2.6使用的软中断 软中断 优先级 描述 HI_SOFTIRQ 0 处理高优先级的tasklet TIMER_SOFTIRQ 1 定时器中断...也就是说,目前只使用了数组中的前6项。softirq_action包含2个指针:分别指向软中断函数函数使用的数据。...另一个重要的数据是preempt_count,存储在进程描述符中的thread_info成员中,用来追踪记录内核抢占内核控制路径嵌套层数。...它又被划分为4部分,如下表所示: 表4-10 preempt_count各个位域 位 描述 0-7 内核抢占禁止计数(最大值255) 8-15 软中断禁用深度计数(最大值255) 16-27 硬中断计数

    1.5K30

    Linux进程调度器概述--Linux进程的管理与调度(十五)

    , 但是没办法区分交互式程序批处理程序(统称为普通进程), linux2.6调度程序实现了基于进程过去行为的启发式算法, 以确定进程应该被当做交互式进程还是批处理进程....如果内核检查进程的抢占标识被设置, 则会在一个关键的时刻, 调用调度器来完成调度抢占的工作 4.4 内核抢占用户抢占 而根据进程抢占发生的时机, 抢占可以分为内核抢占用户抢占, 内核抢占就是指一个在内核态运行的进程...任务主动放弃CPU使用权 内核抢占采用同抢占标识的类似方法被实现, linux内核在thread_info结构中添加了一个自旋锁标识preempt_count, 称为抢占计数器(preemption counter.../* ...... */ } preempt_count 描述 >0 禁止内核抢占, 其值标记了使用preempt_count的临界区的数目 =0 开启内核抢占 <0 锁为负值, 内核出现错误...4.9 唤醒抢占 当在try_to_wake_up/wake_up_processwake_up_new_task中唤醒进程时, 内核使用全局check_preempt_curr看看是否进程可以抢占当前进程可以抢占当前运行的进程

    3.6K20

    Linux进程核心调度器之主调度器schedule--Linux进程的管理与调度(十九)

    在进程的thread_info结构中添加了preempt_count该数值为0,当进程使用一个自旋锁时就加 1,释放一个自旋锁时就减1. 为0时表示内核可以抢占. 1....从中断处理程序返回内核空间时,内核会检查preempt_countTIF_NEED_RESCHED标志,如果进程设置了 TIF_NEED_RESCHED标志,并且preempt_count为0,发生内核抢占...这包括保存、恢复栈信息寄存器信息 2.3 调度的内核抢占用户抢占 内核在完成调度的过程中总是先关闭内核抢占, 等待内核完成调度的工作后, 再把内核抢占开启, 如果在内核完成调度器过程中, 这时候如果发生了内核抢占..., 内核在即将返回用户空间时会检查标识TIF_NEED_RESCHED标志进程是否需要重新调度,如果设置了,就会发生调度, 这被称为用户抢占, 而内核抢占是通过自旋锁preempt_count实现的,...标志,并且preempt_count为0,发生内核抢占

    3.7K31

    深入理解Linux内核之内核抢占

    内核抢占抢占式内核究竟有什么关系呢?抢占计数器究竟干什么用?... 本文我们就来好好讨论下,关于内核抢占的一些技术细节,力求让大家理解内核抢占。 注:本文主要关注CFS调度类。...2.内核抢占抢占式内核 我们经常使用uname -a命令能看到“PREEMPT”的字样,没错,我们使用的是抢占式内核。...preempt_count,有的是preempt,为何会使用这么奇怪的定义呢?...5.不可抢占内核的低延迟处理 下面我们来看下在没有开启内核抢占的内核中如何处理低延迟: 我们会看到在一些比较耗时的处理中如文件系统内存回收的一些路径会调用cond_resched,它是干什么用呢: 下面是使用这个宏的例子...实际上,对于非抢占式内核来说,在内核的很多地方,特别是文件系统操作和内存管理相关的一些耗时路径中,都已经被内核开发者识别出来,并使用cond_resched来减小延迟(感兴趣的小伙伴可以通过grepwc

    2.7K21

    对中断的一点思考

    除了时钟中断外,绝大多数中断都不使用该标志。 SA_SHIRQ 该位表示中断可以在设备之间共享。...SA_SAMPLE_RANDOM 该位指出产生的中断能对/dev/random设备/dev/urandom设备使用的熵池有贡献。...,当时可能研究的是2.4的内核,因为那时的内核是不可抢占的。...但这个问题忽略了一个很重要的问题,那就是中断B返回时,当返回内核态时(我想不可能返回到用户态吧),将会对need_reschedpreempt_count进行检查,如果这两者都满足,才会进行调度。...从上面分析可知,当发生中断嵌套时,preempt_count此时等于一个很大的值,虽然B在执行时,preempt_count经过一次加减的操作,但A还是将该值设置成禁止抢占的,所以中断B返回时,根本不可能发生调度

    1.3K20

    软中断SOFTIRQ

    用来实现tasklet,NET_TX_SOFTIRQNET_RX_SOFTIRQ用于网络的发送接受操作,TIMER_SOFTIRQHRTIMER_SOFTIRQ用于定时器,前者是低精度的定时器,后者是高精度的定时器...BLOCK_SOFTIRQBLOCK_IOPOLL_SOFTIRQ用于块设置操作,SCHED_SOFTIRQ用于调度方面的操作,RCU_SOFTIRQ用于rcu方面的操作。...注意上述的注释: 大概的意思是不要人为添加softirq类型,目前使用tasklet已经足够满足使用。...没有更高优先级任务需要调度 3. 循环次数没有超过10次 满足上述三个条件就可以进入到restart的执行流程中,否则唤醒softirqd唤醒执行。...如果减去cnt这时候perrmpt_count可能会为0,为0的时候cpu就可以发生抢占,假如这时候有softirq在运行,岂不是此softirq会被抢占到别cpu上。

    2.3K21

    preempt_count

    其中preempt_count代表的是该进程是否可以被抢占,根据注释的说明当peermpt_count等于0的时候当前进程就可以被抢占,当小于0存在bug,当不等于0也就是大于0说明当前进程不可以被抢占...不可抢占的原因很多,比如当前进程在中断上下文中或者使用了锁(spin_lock的过程中会disable掉抢占的)。至于当前是什么原因不能被抢占,就需要看peermpt_count每个字段的含义。...*/ #define PREEMPT_BITS 8 #define SOFTIRQ_BITS 8 #define HARDIRQ_BITS 4 #define NMI_BITS 1 结合上述的示图代码的定义可知...,bit0-7代表的是抢占的次数,最大抢占深度为256次; bit8-15代表的是软中断的次数,最大也是256次; bit16-19表示硬件中断的次数,注释的大概意思是避免中断嵌套,但是也不能防止某些驱动中嵌套使用中断...#define in_atomic() ((preempt_count() & ~PREEMPT_ACTIVE) != 0) 使用上述的宏判断当前进程是否处于原子操作中。

    91110

    Linux内核中的软中断、tasklet工作队列具体解释

    实现原理实例 软中断的调度时机: do_irq完毕I/O中断时调用irq_exit。 系统使用I/O APIC,在处理完本地时钟中断时。 local_bh_enable,即开启本地软中断时。...若 tasklet 又一次调度它自己,则必须阻止在调用 tasklet_kill 前它又一次调度它自己,如同使用 del_timer_sync 实现原理 调度原理 static inline void...因此不能堵塞睡眠。而tasklet使用软中断实现。当然也不能堵塞睡眠。但假设某延迟处理函数须要睡眠或者堵塞呢?没关系工作队列就能够如您所愿了。...最重要特点的就是工作队列同意又一次调度甚至是睡眠。 通常。在工作队列软中断/tasklet中作出选择很easy。可使用以下规则: – 假设推后运行的任务须要睡眠,那么仅仅能选择工作队列。...由于其能够抢占普通进程内核线程。同一时候不可睡眠。 – 假设推后运行的任务对延迟的时间没有不论什么要求。则使用工作队列,此时通常为无关紧要的任务。 实际上。

    2K30

    调度器增强

    内核抢占低延迟相关工作 我们现在把注意力转向内核抢占,该特性用来为系统提供更平滑的体验,特别是在多媒体环境下。与此密切相关的是内核进行的低延迟方面的工作,我会稍后讨论。...如果多媒体应用长时间无法得到CPU,则可能发生视频音频漏失现象。 在编译内核时启用对内核抢占的支持,则可以解决这些问题。...如果高优先级进程有事情需要完成,那么在启用内核抢占的情况下,不仅用户空间应用程序可以被中断,内核也可以被中断。切记,内核抢占用户层进程被其他进程抢占是两个不同的概念!...该结构也包含了一个抢占计数器(preemption counter): struct thread_info { ... int preempt_count...我已经讨论了内核提供的一些用于缓解该问题的措施: CFS内核抢占中的调度延迟。第5章中将讨论的实时互斥量也有助于解决该问题,但还有一个与调度有关的操作能够对此有所帮助。

    74810

    Linux进程上下文切换过程context_switch详解--Linux进程的管理与调度(二十一)

    调度普通的非实时进程 SCHED_FIFOSCHED_RRSCHED_DEADLINE则采用不同的调度策略调度实时进程 SCHED_IDLE则在系统空闲时调用idle进程. 5个调度器类 而依据其调度策略的不同实现了...:schedule中实现,会按照调度类顺序优先级挑选出一个最高优先级的进程执行 而对于主调度器则直接关闭内核抢占后, 通过调用schedule来完成进程的调度 可见不管是周期性调度器还是主调度器, 内核中的许多地方...注意 进程调度抢占的区别 进程调度不一定发生抢占, 但是抢占时却一定发生了调度 在进程发生调度时, 只有当前内核发生当前进程因为主动或者被动需要放弃CPU时, 内核才会选择一个与当前活动进程不同的进程来抢占...所使用的地址空间 由于不同架构下地址映射的机制有所区别, 而寄存器等信息弊病也是依赖于架构的, 因此switch_mmswitch_to两个函数均是体系结构相关的 3.1 context_switch...switcth_to使用前两个参数prevnext就够了.

    4.4K31

    Linux内核36-内核同步之禁止中断

    笔者比较熟悉的μC/OS-II或III,就是使用禁止中断保护临界代码段。当然了,这样的临界代码段一般较短,就几行代码而已。如果太长,会影响整个系统任务的调度,也有可能导致中断信号的丢失。...所以,在多核系统中,内核数据结构的保护一般是禁止中断搭配自旋锁一起使用。...为了确保及时执行长时间等待的线程,local_bh_enable()对软中断计数器执行减1操作之后,还有执行两个重要的操作: 检查preempt_count中的硬中断计数器软中断计数器。...检查局部CPU的 TIF_NEED_RESCHED标志是否被设置;如果被设置,说明此时有进程正在请求调度,然后调用preempt_schedule()执行抢占调度。...3 总结 总之一句话,禁止中断包含禁止硬中断软中断两种。禁止硬中断肯定就包含禁止软中断;但禁止软中断不会影响硬中断的响应。它们都有各自的使用场景。

    1.4K21

    Azkaban 任务调度系统(使用小技巧)

    上节主要介绍了安装搭建和简单的运行一个job,但是真正使用到实际场景还是需要了解更多的知识,比如任务怎么互相依赖,可以选择指定的节点来执行吗等等一些相关的操作会在本节中进行介绍 附上: 喵了个咪的博客:...官网: https://azkaban.github.io 官方文档地址: http://azkaban.github.io/azkaban/docs/latest 一 ,任务依赖 之前说的都是部署方式一个简单的运行例子...azkaban_job/ 二 ,指定exec运行对应的任务 笔者遇到了难题,现在Azkaban管着3个exec,其中2个是hadoop的一个是docker相关的,但是Azkaban选择执行任务的节点是更具节点的资源来调度的...在运行任务的时候添加一个变量 PS:局限虽然可以指定在一台节点上执行,但是失去了高可用的优势,如果有不同类型的任务建议用多套azkaban 三 , 参数传递 当我在编写程序的时候常常会用到变量来去传递使用...,使用变量的好处在于程序会应该不同的变量完成不同的事情,那么对于任务来说也是同样一个道理,比如我传递的数据库的链接地址的不同就决定了从哪个数据库获取源数据,为了程序的泛用性变量是不可缺少的,azkaban

    1.1K20

    linux进程调度

    前者适用SCHED_NORMAL调度策略,后者可选SCHED_FIFO或SCHED_RR调度策略。...任何时候,实时进程的优先级都高于普通进程,实时进程只会被更高级的实时进程抢占,同级实时进程之间是按照FIFO(一次机会做完)或者RR(多次轮转)规则调度的。...系统调度时,还会考虑其他因素,因而会计算出一个叫进程动态优先级的东西,根据此来实施调度。因为,不仅要考虑静态优先级,也要考虑进程的属性。...例如如果进程属于交互式进程,那么可以适当的调高它的优先级,使得界面反应地更加迅速,从而使用户得到更好的体验。Linux2.6 在这方面有了较大的提高。...Linux2.6认为,交互式进程可以从平均睡眠时间这样一个measurement进行判断。进程过去的睡眠时间越多,则越有可能属于交互式进程。

    3.2K140

    Linux 软中断机制分析

    在linux系统的进程数据结构里,有这么一个数据结构 #define preempt_count()(current_thread_info()->preempt_count), 利用preempt_count...preempt_count的8~23位记录中断处理软件中断处理过程的计数。如果有计数,表示系统在硬件中断或者软件中断处理过程中。...处理软中断内核线程 之前我说到不能让CPU长时间来处理中断事务,这样会影响系统的响应时间,严重影响用户系统之间的交互式体验。...这就跟下面ksoftirqd处理过程一样,该狠的时候禁止抢占,其它进程别想调度到哦,但是自己占用CPU时间过长的话,也自觉的问一问是不是该释放CPU给其它进程了。...内层的循环处理软件中断,并每循环一次都试探一次是否过长时间占据了CPU,需要调度释放CPU给其它进程。具体的操作在注释中做了解释。

    8.7K91

    深入理解Linux内核之进程唤醒

    find_matching_se(&se, &pse); //寻找匹配的调度实体(如果sepse不是同一个层级任务组, 让sepse处于同一调度组,一般都属于根任务组) if (...,如唤醒进程是否是运行队列当前进程、是否已经设置了重新调度标志、抢占idle进程处理等,然后调整唤醒进程的调度实体运行队列当前进程调度实体在同一层次任务组中,最后进行关键的唤醒抢占条件判断,满足条件则进行唤醒抢占处理...set_preempt_need_resched(); //设置抢占重新调度标志 return; } 如果唤醒进程的cpu是本地cpu,则直接设置重新调度标志抢占重新调度标志即可...cpu就不一样,本地cpu直接设置了两个标志即可,而远程需要发生ipi触发处理器间中断将TIF_NEED_RESCHED标志折叠到preempt_count中(即设置task->thread_info-...resched_curr主要用于设置重新调度标志抢占重新调度标志,会考虑是本地cpu还是远程cpu的情况,并不是发生调度,需要等到最近的调度点到来时发生调度(可能是重新开启抢占的时候,也可能是中断返回前夕

    3.1K20
    领券