《深入Linux内核架构》第2章 进程管理和调度 (5)

news/2024/9/18 2:53:42

目录

2.7 实时调度类

2.7.1 性质

2.7.2 数据结构

2.7.3 调度器操作


2.7 实时调度类

完全公平调度器类,即CFS。

        作用:调度普通进程。

实时调度器类,即RT。

        作用:调度实时进程。

2.7.1 性质

RT调度类包含两种策略policy:

        SCHED_RR:

                即循环调度。每个进程分配固定时间片,优先级高的进程先执行,时间片用完的进程移到就绪队列尾部,所有进程时间片用完后,重新配置时间片,相同优先级依次执行。

        SCHED_FIFO:

                不依赖时间片,进程被调度后除非主动放弃CPU,否则一直运行,按队列顺序依次执行。

CFS调度器:

        通过红黑树来组织进程的调度实体se,选择树的最左节点为下一个待执行进程。

RT调度器:

        通过优先级队列(优先级数组链表)组织实时调度实体。

2.7.2 数据结构

struct sched_class rt_sched_class = {

    .next = &fair_sched_class, //下一个调度类

    .enqueue_task = enqueue_task_rt,

    .dequeue_task = dequeue_task_rt,

    .yield_task = yield_task_rt,

    .check_preempt_curr = check_preempt_curr_rt,

    .pick_next_task = pick_next_task_rt,

    .put_prev_task = put_prev_task_rt,

    .select_task_rq = select_task_rq_rt,

    .set_cpus_allowed = set_cpus_allowed_rt,

    .set_curr_task = set_curr_task_rt,

    .task_tick = task_tick_rt,

    .update_curr = update_curr_rt,

};

RT比CFS简单

struct rq {    //每个CPU一个struct rq

    struct cfs_rq cfs;

    struct rt_rq  rt; 表示RT调度类的就绪队列
    
}

struct rt_rq {

    struct rt_prio_array active;

    unsigned int rt_nr_running; RT队列中进程数量

}

struct rt_prio_array {

    unsigned long bitmap[BITS_TO_LONGS(MAX_RT_PRIO+1)];

        //MAX_RT_PRIO=99

    struct list_head queue[MAX_RT_PRIO];

};

bitmap:

    每个优先级一个bit,一个long数组成员可表示32位,99个优先级需要4个数组成员。

    位图:表示对应优先级链表是否有进程。

相同优先级的实时进程在同一链表中,表头是:

        struct rt_prio_array active.queue[prio]

update_curr_rt:

        更新rt_se的sum_exec_runtime。

        计算时间是实际时间,不是CFS那种虚拟时间。

2.7.3 调度器操作

const struct sched_class rt_sched_class = {

    .enqueue_task = enqueue_task_rt,    将进程加入rt队列。

    .dequeue_task = dequeue_task_rt,    将进程移出rt队列。

}

enqueue_task_rt和dequeue_task_rt:

        都会操作active.queue[p->prio]对应链表,实现加入、删除进程。

加入:设置bitmap中对应优先级的bit。

删除:清除bitmap对应优先级的bit。

RT两个调度策略policy:

        SCHED_FIFO:

                必须显式自动放弃CPU(yield_task_rt),否则一直执行。

        SCHED_RR:

                时间片用尽后,重新设置时间片并排队到RT就绪队列末尾,并设置TIF_NEED_RESCHED。

系统调用sched_setscheduler:

        作用:修改进程的优先级,调度类,调度策略:

                即更改task_struct->prio,task_struct->sched_class,task_struct->policy


http://lihuaxi.xjx100.cn/news/2108853.html

相关文章

C语言经典算法-8

文章目录 其他经典例题跳转链接41.基数排序法42.循序搜寻法(使用卫兵)43.二分搜寻法(搜寻原则的代表)44.插补搜寻法45.费氏搜寻法 其他经典例题跳转链接 C语言经典算法-1 1.汉若塔 2. 费式数列 3. 巴斯卡三角形 4. 三色棋 5. 老鼠…

Excle里,用公式求格子里“ “ 号内的内容。一行公式实现。

写着样版程序,想快速将内容求出。文本内多行数据里,带”“号内的数据。 直接复制到Excle里,用一行公式实现,多,快,好,省。 {"abs", math_abs},{"绝对值", math_abs},{"…

AI预测福彩3D第13弹【2024年3月20日预测--第3套算法重新开始计算第3次测试】

今天咱们继续对第3套算法进行第3次测试,第3套算法加入了012路的权重。废话不多说了,直接上结果吧~ 最终,经过研判分析,2024年3月20日福彩3D的七码预测结果如下: 百位:7 4 8 3 6 9 0(5换0&#x…

go 解决货币计算的难题:避免浮点数陷阱

在开发的初始阶段,我们经常会遇到“浮点数精度”和“货币值表示”的问题。 那么,如何处理货币,如何存储和传递它们。 为什么是问题? Go语言中的标准浮点类型具有一定的精度(像其他任何语言一样)&#xf…

Games101-光栅化(深度测试与抗锯齿)

采样 照片:像素在不同位置的光的采样 采样不仅可以发生在不同的位置,还可以发生不同的时间 动画实际上就是在时间上进行的采样 Sample Artifacts Artifacts:一切觉得不太对的东西 锯齿 摩尔纹 左边这张图的奇数行和奇数列全部去掉&#…

华为ensp中rip动态路由协议原理及配置命令(详解)

CSDN 成就一亿技术人! 作者主页:点击! ENSP专栏:点击! CSDN 成就一亿技术人! ————前言————— RIP(Routing Information Protocol,路由信息协议)是一种距离矢…

文件路径中‘/’与‘\’用法详解,与等效使用方法介绍

1、两种符号详解 在数据处理时,使用C或python语言读入数据时,涉及到文件路径的输入,文件路径在windows下,默认形式为但斜线‘\’,如下图: 若输入路径时,直接写成如下形式:“E:\codin…

Wpf-自定义图标Button

FontFamily&#xff1a;指定图标字体资源文件&#xff1b;&#xff08;推荐iconfont阿里矢量图标&#xff09; 示例代码&#xff1a; <Style x:Key"MyIconButtonStyle" TargetType"Button"><Setter Property"Width" Value"40&quo…