精华内容
下载资源
问答
  • 多核平台上基于相关任务分解的分区固定优先级实时调度
  • 实时优先级:(定义在进程描述符中的:rt_priority)   静态优先级:  定义:他不随时间改变,内核不会主动修改它,只能通过系统调用nice去修改static_prio 动态优先级:  定义:调度程序通过或减少进程静态优先级...

    静态优先级:(定义在进程描述符中的:static_prio)

    动态优先级:(定义在进程描述符中的:prio)

    实时优先级:(定义在进程描述符中的:rt_priority)

     

    静态优先级:

        定义:他不随时间改变,内核不会主动修改它,只能通过系统调用nice去修改static_prio

    动态优先级:

       定义:调度程序通过或减少进程静态优先级来奖励IO消耗型进程或惩罚CPU消耗进程,调整后的优先级为动态优先级(prio)

    实时优先级:

      实时优先级只对实时进程有效

     

    宏定义:

    MAX_PRIO:140

    MAX_RT_PRIO:100

    nice:[-20,19]

     

    进程的动态优先级取值范围:[0,MAX_PRIO-1],即[0,139]

         针对进程划分为两个范围优先级:

     

         普通进程:[0,MAX_RT_PRIO-1]即[0,99]

                计算方法:静态优先级与进程交互性函数计算出来的,随任务的实际运行情况调整

     

         实时进程:[MAX_RT_PRIO,MAX_PRIO]即[100,139]

                计算方法:prio=MAX_RT_PRIO-1 - rt_priority

         实时进程的优先级与动态优先级成线性关系,不随时程运行而改变

         也就是说,如果一个进程是实时进程即在[0,99]之间优先级prio 与rt_priority之间的关系是固定的

     

    静态优先级与nice 关系  

    static_prio=MAX_RT_PRIO+nice+20

     

     

     

     

     

     

      

    展开全文
  • 指定进程优先级实时
  • 实时进程的动态优先级会在进程运行过程中动态计算而实时进程的动态优先级不会改变。 2.3  real time priority 每个实时进程都有一与其相关的实时优先级,取值范围0-MAX_RT_PRIO-1。 其大小可以...

    Table of Contents

    • 1 convential process
      • 1.1 static priority
      • 1.2 dynamic priority
    • 2 real-time process
      • 2.1 static priority
      • 2.2 dynamic priority
      • 2.3 real time priority
    • 3 调度策略

    1 convential process

     

    1.1 static priority

    范围为100-139(MAX_RT_PRIO - MAX_PRIO-1)
    内核2.6中的静态优先级相当于内核2.4中的nice值,但转到MAX_RT_PRIO到MAX_PRIO-1取值范围,其公式为:
    static priority = nice + 20 + MAX_RT_PRIO
    内核定义两个宏来实现此转化:nice_to_prio() and prio_to_nice()

     

    #define NICE_TO_PRIO(nice)  (MAX_RT_PRIO + (nice) + 20)
    #define PRIO_TO_NICE(prio)  ((prio) - MAX_RT_PRIO - 20)
    

    在进程task_struct中用int static_prio表示。
    一个进程继承其父进程的静态优先级。也可以通过nice() or setpriority()指定。决定了Base Time Quantum大小。

     
    static priorityBase Time Quantum
    < 120 (140 - static priority) × 20
    >= 120 (140 - static priority) × 5
    静态优先级数值越大,进程的优先级越小,分配的基时间量就越少。

    1.2 dynamic priority

    范围与静态优先级相同。
    动态优先级是调度器选择一个进程时实际参考的值。
    dynamic priority = max( 100, min((static priority - bonus + 5), 139))
    即动态优先级与静态优先级和bonus值有关,而bonus取值范围为0-10,其值大小与平均睡眠时间(average sleeping time)有关。
    平均睡眠时间越大,bonus值越大,其动态优先级越大。(睡眠时间长了自然要提高其动态优先级以避免发生饥饿现象)
    在task_struct中用int prio来表示。
    动态优先级的计算过程在各个进程的运行过程中进行,同时影响动态优先级大小的因素集中反映在sleep_avg上。
    task_struct中的成员 unsigned long sleep_avg;
    进程创建时,在wake_up_forked_process()中子进程继承了父进程的动态优先级,并添加到父进程的就绪队列中,如果父进程不在任何就绪队列中,则通过effective_prio()来计算出子进程的动态优先级并根据计算结果将子进程放置到相应的就绪队列中。
    动态优先级的计算只要由effective_prio()函数来完成:

     

    static int effective_prio(task_t *p)
    {
        int bonus, prio;
    
        if (rt_task(p))             ;;如果是实时进程则返回(实时进程的动态优先级是由setscheduler()函数设置且一经设置不再改变)
            return p->prio;
    
        bonus = CURRENT_BONUS(p) - MAX_BONUS / 2; ;;根据睡眠时间设置bonus值
    
        prio = p->static_prio - bonus; ;;由静态优先级和bonus值来设置动态优先级
        if (prio < MAX_RT_PRIO)        ;;动态优先级范围不能小于MAX_RT_PRIO也不能超过MAX_PRIO,所以此处做下判断。
            prio = MAX_RT_PRIO;
        if (prio > MAX_PRIO-1)
            prio = MAX_PRIO-1;
        return prio;
    }
    
    #define CURRENT_BONUS(p) \
        (NS_TO_JIFFIES((p)->sleep_avg) * MAX_BONUS / \ ;;把睡眠时间转化为bonus值
            MAX_SLEEP_AVG)
    

    最大bonus值的计算如下:

     

    #define USER_PRIO(p)        ((p)-MAX_RT_PRIO)
    #define MAX_USER_PRIO       (USER_PRIO(MAX_PRIO))       ;;40
    #define PRIO_BONUS_RATIO     25
    #define MAX_BONUS       (MAX_USER_PRIO * PRIO_BONUS_RATIO / 100) ;;结果为10
    

    最大平均睡眠时间计算如下:

     

    #define DEF_TIMESLICE       (100 * HZ / 1000)
    #define MAX_SLEEP_AVG       (DEF_TIMESLICE * MAX_BONUS)
    

    2 real-time process

     

    2.1 static priority

    与非实时进程相同。

    2.2 dynamic priority

    其值是在setscheduler()中设置的且一经设置便不再改变。
    非实时进程的动态优先级会在进程运行过程中动态计算而实时进程的动态优先级不会改变。

    2.3 real time priority

    每个实时进程都有一与其相关的实时优先级,取值范围0-MAX_RT_PRIO-1。
    其大小可以通过sched_setscheduler()和sched_setparam()来改变。
    实时进程被一个进程替换,可能的情况有:

    1. 进程被拥有更高优先级的进程抢占。
    2. 进程发生阻塞进入睡眠状态。
    3. 进程被终止(状态为TASK_STOPPED OR TASK_TRACED)或者被杀死(EXIT_DEAD OR EXIT_ZOMBIE)。
    4. 进程通过调用sched_yield()自愿放弃处理器。
    5. 进程是轮回实时(SCHED_RR)且其时间片执行完毕。

    当在SCHED_RR时调用nice()和set_priority()函数并不影响实时优先级,只会影响静态优先级(从而影响基时间片)。

    3 调度策略

    task_struct中unsigned long policy;指定调度策略,其值可以取:

     

    #define SCHED_NORMAL    0       //非实时进程,基于优先级的轮回法(Round Robin)
    #define SCHED_FIFO      1       //实时进程,先进先出
    #define SCHED_RR        2       //实时进程,基于优先级的轮回法(Round Robin)

    转载于:https://www.cnblogs.com/Daniel-G/p/3306645.html

    展开全文
  • 1 convential process   1.1 static priority ...内核2.6中的静态优先级相当于内核2.4中的nice值,但转到MAX_RT_PRIO到MAX_PRIO-1取值范围,其公式为: static priority = nice + 20 + MAX_RT_PRIO 内核定义

    1 convential process

     

    1.1 static priority

    范围为100-139(MAX_RT_PRIO - MAX_PRIO-1)
    内核2.6中的静态优先级相当于内核2.4中的nice值,但转到MAX_RT_PRIO到MAX_PRIO-1取值范围,其公式为:
    static priority = nice + 20 + MAX_RT_PRIO
    内核定义两个宏来实现此转化:nice_to_prio() and prio_to_nice()

     

    #define NICE_TO_PRIO(nice)  (MAX_RT_PRIO + (nice) + 20)
    #define PRIO_TO_NICE(prio)  ((prio) - MAX_RT_PRIO - 20)
    

    在进程task_struct中用int static_prio表示。
    一个进程继承其父进程的静态优先级。也可以通过nice() or setpriority()指定。决定了Base Time Quantum大小。

     
    static priority Base Time Quantum
    < 120 (140 - static priority) × 20
    >= 120 (140 - static priority) × 5
    静态优先级数值越大,进程的优先级越小,分配的基时间量就越少。

    1.2 dynamic priority

    范围与静态优先级相同。
    动态优先级是调度器选择一个进程时实际参考的值。
    dynamic priority = max( 100, min((static priority - bonus + 5), 139))
    即动态优先级与静态优先级和bonus值有关,而bonus取值范围为0-10,其值大小与平均睡眠时间(average sleeping time)有关。
    平均睡眠时间越大,bonus值越大,其动态优先级越大。(睡眠时间长了自然要提高其动态优先级以避免发生饥饿现象)
    在task_struct中用int prio来表示。
    动态优先级的计算过程在各个进程的运行过程中进行,同时影响动态优先级大小的因素集中反映在sleep_avg上。
    task_struct中的成员 unsigned long sleep_avg;
    进程创建时,在wake_up_forked_process()中子进程继承了父进程的动态优先级,并添加到父进程的就绪队列中,如果父进程不在任何就绪队列中,则通过effective_prio()来计算出子进程的动态优先级并根据计算结果将子进程放置到相应的就绪队列中。
    动态优先级的计算只要由effective_prio()函数来完成:

     

    static int effective_prio(task_t *p)
    {
        int bonus, prio;
    
        if (rt_task(p))             ;;如果是实时进程则返回(实时进程的动态优先级是由setscheduler()函数设置且一经设置不再改变)
            return p->prio;
    
        bonus = CURRENT_BONUS(p) - MAX_BONUS / 2; ;;根据睡眠时间设置bonus值
    
        prio = p->static_prio - bonus; ;;由静态优先级和bonus值来设置动态优先级
        if (prio < MAX_RT_PRIO)        ;;动态优先级范围不能小于MAX_RT_PRIO也不能超过MAX_PRIO,所以此处做下判断。
            prio = MAX_RT_PRIO;
        if (prio > MAX_PRIO-1)
            prio = MAX_PRIO-1;
        return prio;
    }
    
    #define CURRENT_BONUS(p) \
        (NS_TO_JIFFIES((p)->sleep_avg) * MAX_BONUS / \ ;;把睡眠时间转化为bonus值
            MAX_SLEEP_AVG)
    

    最大bonus值的计算如下:

     

    #define USER_PRIO(p)        ((p)-MAX_RT_PRIO)
    #define MAX_USER_PRIO       (USER_PRIO(MAX_PRIO))       ;;40
    #define PRIO_BONUS_RATIO     25
    #define MAX_BONUS       (MAX_USER_PRIO * PRIO_BONUS_RATIO / 100) ;;结果为10
    

    最大平均睡眠时间计算如下:

     

    #define DEF_TIMESLICE       (100 * HZ / 1000)
    #define MAX_SLEEP_AVG       (DEF_TIMESLICE * MAX_BONUS)
    

    2 real-time process

     

    2.1 static priority

    与非实时进程相同。

    2.2 dynamic priority

    其值是在setscheduler()中设置的且一经设置便不再改变。
    非实时进程的动态优先级会在进程运行过程中动态计算而实时进程的动态优先级不会改变。

    2.3 real time priority

    每个实时进程都有一与其相关的实时优先级,取值范围0-MAX_RT_PRIO-1。
    其大小可以通过sched_setscheduler()和sched_setparam()来改变。
    实时进程被一个进程替换,可能的情况有:

    1. 进程被拥有更高优先级的进程抢占。
    2. 进程发生阻塞进入睡眠状态。
    3. 进程被终止(状态为TASK_STOPPED OR TASK_TRACED)或者被杀死(EXIT_DEAD OR EXIT_ZOMBIE)。
    4. 进程通过调用sched_yield()自愿放弃处理器。
    5. 进程是轮回实时(SCHED_RR)且其时间片执行完毕。

    当在SCHED_RR时调用nice()和set_priority()函数并不影响实时优先级,只会影响静态优先级(从而影响基时间片)。

    3 调度策略

    task_struct中unsigned long policy;指定调度策略,其值可以取:

     

    #define SCHED_NORMAL    0       //非实时进程,基于优先级的轮回法(Round Robin)
    #define SCHED_FIFO      1       //实时进程,先进先出
    #define SCHED_RR        2       //实时进程,基于优先级的轮回法(Round Robin)
    展开全文
  • 实时进程的动态优先级会在进程运行过程中动态计算而实时进程的动态优先级不会改变。 2.3 real time priority 每个实时进程都有一与其相关的实时优先级,取值范围0-MAX_RT_PRIO-1。 其大小可以通过...

     

     

    1 convential process

     

    1.1 static priority

    范围为100-139(MAX_RT_PRIO - MAX_PRIO-1)
    内核2.6中的静态优先级相当于内核2.4中的nice值,但转到MAX_RT_PRIO到MAX_PRIO-1取值范围,其公式为:
    static priority = nice + 20 + MAX_RT_PRIO
    内核定义两个宏来实现此转化:nice_to_prio() and prio_to_nice()

     

    #define NICE_TO_PRIO(nice)  (MAX_RT_PRIO + (nice) + 20)
    #define PRIO_TO_NICE(prio)  ((prio) - MAX_RT_PRIO - 20)
    

    在进程task_struct中用int static_prio表示。
    一个进程继承其父进程的静态优先级。也可以通过nice() or setpriority()指定。决定了Base Time Quantum大小。

     
    static priorityBase Time Quantum
    < 120 (140 - static priority) × 20
    >= 120 (140 - static priority) × 5
    静态优先级数值越大,进程的优先级越小,分配的基时间量就越少。

    1.2 dynamic priority

    范围与静态优先级相同。
    动态优先级是调度器选择一个进程时实际参考的值。
    dynamic priority = max( 100, min((static priority - bonus + 5), 139))
    即动态优先级与静态优先级和bonus值有关,而bonus取值范围为0-10,其值大小与平均睡眠时间(average sleeping time)有关。
    平均睡眠时间越大,bonus值越大,其动态优先级越大。(睡眠时间长了自然要提高其动态优先级以避免发生饥饿现象)
    在task_struct中用int prio来表示。
    动态优先级的计算过程在各个进程的运行过程中进行,同时影响动态优先级大小的因素集中反映在sleep_avg上。
    task_struct中的成员 unsigned long sleep_avg;
    进程创建时,在wake_up_forked_process()中子进程继承了父进程的动态优先级,并添加到父进程的就绪队列中,如果父进程不在任何就绪队列中,则通过effective_prio()来计算出子进程的动态优先级并根据计算结果将子进程放置到相应的就绪队列中。
    动态优先级的计算只要由effective_prio()函数来完成:

     

    static int effective_prio(task_t *p)
    {
        int bonus, prio;
    
        if (rt_task(p))             ;;如果是实时进程则返回(实时进程的动态优先级是由setscheduler()函数设置且一经设置不再改变)
            return p->prio;
    
        bonus = CURRENT_BONUS(p) - MAX_BONUS / 2; ;;根据睡眠时间设置bonus值
    
        prio = p->static_prio - bonus; ;;由静态优先级和bonus值来设置动态优先级
        if (prio < MAX_RT_PRIO)        ;;动态优先级范围不能小于MAX_RT_PRIO也不能超过MAX_PRIO,所以此处做下判断。
            prio = MAX_RT_PRIO;
        if (prio > MAX_PRIO-1)
            prio = MAX_PRIO-1;
        return prio;
    }
    
    #define CURRENT_BONUS(p) \
        (NS_TO_JIFFIES((p)->sleep_avg) * MAX_BONUS / \ ;;把睡眠时间转化为bonus值
            MAX_SLEEP_AVG)
    

    最大bonus值的计算如下:

     

    #define USER_PRIO(p)        ((p)-MAX_RT_PRIO)
    #define MAX_USER_PRIO       (USER_PRIO(MAX_PRIO))       ;;40
    #define PRIO_BONUS_RATIO     25
    #define MAX_BONUS       (MAX_USER_PRIO * PRIO_BONUS_RATIO / 100) ;;结果为10
    

    最大平均睡眠时间计算如下:

     

    #define DEF_TIMESLICE       (100 * HZ / 1000)
    #define MAX_SLEEP_AVG       (DEF_TIMESLICE * MAX_BONUS)
    

    2 real-time process

     

    2.1 static priority

    与非实时进程相同。

    2.2 dynamic priority

    其值是在setscheduler()中设置的且一经设置便不再改变。
    非实时进程的动态优先级会在进程运行过程中动态计算而实时进程的动态优先级不会改变。

    2.3 real time priority

    每个实时进程都有一与其相关的实时优先级,取值范围0-MAX_RT_PRIO-1。
    其大小可以通过sched_setscheduler()和sched_setparam()来改变。
    实时进程被一个进程替换,可能的情况有:

    1. 进程被拥有更高优先级的进程抢占。
    2. 进程发生阻塞进入睡眠状态。
    3. 进程被终止(状态为TASK_STOPPED OR TASK_TRACED)或者被杀死(EXIT_DEAD OR EXIT_ZOMBIE)。
    4. 进程通过调用sched_yield()自愿放弃处理器。
    5. 进程是轮回实时(SCHED_RR)且其时间片执行完毕。

    当在SCHED_RR时调用nice()和set_priority()函数并不影响实时优先级,只会影响静态优先级(从而影响基时间片)。

    3 调度策略

    task_struct中unsigned long policy;指定调度策略,其值可以取:

     

    #define SCHED_NORMAL    0       //非实时进程,基于优先级的轮回法(Round Robin)
    #define SCHED_FIFO      1       //实时进程,先进先出
    #define SCHED_RR        2       //实时进程,基于优先级的轮回法(Round Robin)
    

    Author: visayafan <visayafan@gmail.com>

    Date: 2011-12-08 11:23:35

    HTML generated by org-mode 6.33x in emacs 23

    展开全文
  • 窥探 kernel --- 进程调度的目标,nice值,静态优先级,动态优先级实时优先级 本系列文章由张同浩编写,转载请注明出处:http://blog.csdn.net/muge0913/article/details/7562133 邮箱:muge0913@sina.com ...
  • 作者|个推资深研发专家 微风引言明天就是双十二了,面对井喷的推送需求、百亿级推送下发压力,服务了数十万App的个推,是如何持续优化技术方案,保障高优先级消息实时下发的?本文将从业务场景、方案设计思路、方案...
  • 实时程序员经常关注优先级倒置,可能发生如下:   低优先级任务一个获取资源,例如锁。   中优先级任务乙开始执行的CPU绑定,抢占低优先级任务A.   高优先级任务Ç尝试获取由低优先级任务甲保持的锁,...
  • 前言最近研发的产品出了点小bug,最后查到根本原因是,其中一个进程A使用基于FIFO的实时进程优先级,而另一个进程B是使用普通调度的进程优先级,而A和B两个进程是互相通信的,进程B会被饿死,而进程A也不能正常工作...
  • 最近研发的产品出了点小bug,最后查到根本原因是,其中一个进程A使用基于FIFO的实时进程优先级,而另一个进程B是使用普通调度的进程优先级,而A和B两个进程是互相通信的,进程B会被饿死,而进程A也不能正常工作。...
  • 基于优先级表的实时调度算法 基于优先级表的实时调度算法
  • 无论优先级高低,实时进程都会优先于SCHED_NORMAL中的所有进程先执行,因为后者里面都是普通的非实时进程。内核线程的优先级Linux内核会将大量(并且在不断增加中)工作放置在内核线程中,这些线程是在内核地址空间中...
  • 实时优先级和它的实时优先级成线性,不随进程的运行而改变。 3、实时优先级实时优先级只对实时进程有意义。在进程描述符rt_priority中。取值0~MAX_RT_PRIO-1。 [cpp] view plain copy ...
  • linux内核有五种调度方法:SCHED_FIFO 实时调度策略,first in first outSCHED_RR 实时调度策略,robin roundSCHED_OTHER 分时调度策略SCHED_BATCH 批处理SCHED_IDLE 优先级最低的策略实时进程和分时进程的调度算法...
  • 实时优先级和它的实时优先级成线性,不随进程的运行而改变。 3、实时优先级实时优先级只对实时进程有意义。在进程描述符rt_priority中。取值0~MAX_RT_PRIO-1。 [cpp]   view ...
  • 描述解决线程优先级翻转的优先级继承协议实现
  • 针对网络实时调度问题,提出实时调度系统体系...仿真实验结果表明,与调度尽力交付(BE)算法、最早截止时间优先(EDF)算法相比,基于多特征动态优先级的网络实时调度算法提高了任务调度成功率,缩短了平均响应时间。
  • linux内核有五种调度方法:SCHED_FIFO 实时调度策略,first in first outSCHED_RR 实时调度策略,robin roundSCHED_OTHER 分时调度策略SCHED_BATCH 批处理SCHED_IDLE 优先级最低的策略实时进程和分时进程的调度算法...
  • 今天查看了linux下的实时线程,FIFO和RR策略的调度,遇到一个问题:priority越大优先级越高呢?还是越小越高呢?回答这个问题要明白一个问题,首先,linux2.6内核将任务优先级进行了一个划分:0——99 实时进程100...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,622
精华内容 1,048
关键字:

优先级实时