• sched linux调度 CFS


    copy from https://www.cnblogs.com/alantu2018/p/8457506.html

     RT调度器有两种调度策略:FIFO(first-in-first-out)和RR(round-robin)。

    无论FIFO还是RR,RT调度器都是根据任务的实时优先级(Linux进程描述符中的rt_priority成员)进行调度。最高优先级的任务将最先获得CPU资源。在实时理论中,这种调度器被归类为固定优先级调度器(fixed-priority scheduler,即每一个rt任务都固定分配一个优先级)。当实时优先级不同的时候,FIFO和RR没有什么不同,只有在两个任务具有相同优先级的时候,我们才可以看出FIFO和RR之间的区别。

    对于FIFO调度器,最先进入runnable状态的任务将首先获取CPU资源,并且一直占用该资源,直到该进程进入睡眠状态。

    而对于RR调度器,具有相同优先级的任务将以轮流执行的方式共享处理器资源。

    当某个RR任务开始运行后,如果该任务不会阻塞,那么它将一直运行,直到分配给该任务的时间片到期。

    当时间片用完,调度器将把该任务放在任务链表的末端(注意,只有相同优先级的任务才会放到一个链表中,不同优先级在不同的链表中),并从任务链表中选择下一个任务去执行。

    copy from https://www.cnblogs.com/linhaostudy/p/10298511.html

    inux中主要包含dl_sched_class、rt_sched_class、fair_sched_class及idle_sched_class等调度类。每一个进程都对应一种调度策略,每一种调度策略又对应一种调度类(每一个调度类可以对应多种调度策略)。例如实时调度器以优先级为导向选择优先级最高的进程运行。每一个进程在创建之后,总是要选择一种调度策略。针对不同的调度策略,选择的调度器也是不一样的。不同的调度策略对应的调度类如下表。

    调度类描述调度策略
    dl_sched_class deadline调度器 SCHED_DEADLINE
    rt_sched_class 实时调度器 SCHED_FIFO、SCHED_RR
    fair_sched_class 完全公平调度器 SCHED_NORMAL、SCHED_BATCH
    idle_sched_class idle task SCHED_IDLE

    针对以上调度类,系统中有明确的优先级概念。每一个调度类利用next成员构建单项链表。优先级从高到低示意图如下:

    sched_class_highest----->stop_sched_class
                             .next---------->dl_sched_class
                                             .next---------->rt_sched_class
                                                             .next--------->fair_sched_class
                                                                            .next----------->idle_sched_class
                                                                                             .next = NULL 

    CFS是Completely Fair Scheduler简称,即完全公平调度器

    分配给进程的时间 = 总的cpu时间 * 进程的权重/就绪队列(runqueue)所有进程权重之和

    CFS调度器针对优先级又提出了nice值的概念,其实和权重是一一对应的关系。nice值就是一个具体的数字,取值范围是[-20, 19]。数值越小代表优先级越大,同时也意味着权重值越大,nice值和权重之间可以互相转换。内核提供了一个表格转换nice值和权重。

    const int sched_prio_to_weight[40] = {
     /* -20 */     88761,     71755,     56483,     46273,     36291,
     /* -15 */     29154,     23254,     18705,     14949,     11916,
     /* -10 */      9548,      7620,      6100,      4904,      3906,
     /*  -5 */      3121,      2501,      1991,      1586,      1277,
     /*   0 */      1024,       820,       655,       526,       423,
     /*   5 */       335,       272,       215,       172,       137,
     /*  10 */       110,        87,        70,        56,        45,
     /*  15 */        36,        29,        23,        18,        15,
    }; 
     数组的值可以看作是公式:weight = 1024 / 1.25^nice计算得到。公式中的1.25取值依据是:进程每降低一个nice值,将多获得10% cpu的时间。公式中以1024权重为基准值计算得来,1024权重对应nice值为0,其权重被称为NICE_0_LOAD。默认情况下,大部分进程的权重基本都是NICE_0_LOAD。
  • 相关阅读:
    onlyoffice 宋体显示问题排查
    【记录】shell脚本简写
    java 读取jar包内文件方法
    clickhouse升级
    grafana安装升级部署
    grafana新增插件
    ogg复制进程集成模式与经典模式之间切换
    ogg主库目录迁移
    goldengate从库目录迁移
    goldengate如何判断数据是否完成同步
  • 原文地址:https://www.cnblogs.com/chjgongzuo/p/15881392.html
Copyright © 2020-2023  润新知