实时调度器

LINUX调度器关系图

所谓调度,就是按照某种调度的算法,从进程的就绪队列中选取进程分配CPU,主要是协调对CPU等的资源使用。进程调度的目标是最大限度利用CPU时间

image-20221127111427338

linux里的调度器

RT调度器, rt_sched_class:实时调度器,为每个优先级维护一个队列

CFS调度器, cfs_sched_class:完全公平调度器,采用完全公平调度算法,引入虚拟运行时间概念,采用红黑树实现进程实体的存放;

调度策略FIFO、RR

linux的进程分为两大类:实施进程和普通进程

二者的根本不同在于:如果系统中有一个实时进程可以运行,那么调度器总是会选择它,除非另有一个优先级更高的实时进程

实时进程分为两种策略进行调度:

SCHED_FIFO:没有时间片,在被调度器选择之后,可以运行任意长时间。

SCHED_RR:有时间片,其值在进程运行时会减少。在所有的时间段都到期后,则该值重置为初始值,而进程则置于队列末尾。这确保了在有几个优先级相同的SCHED_RR进程的情况下,它们总是依次执行。

runqueue 运行队列

img
  • 每个CPU都有一个运行队列,每个调度器都作用于运行队列;

  • 分配给CPU的task,作为调度实体加入到运行队列中;

rt_rq的结构

image-20221127111507059

这里每一个CPU的运行队列rq内都有一个实时进程运行队列rt_rq,制定了优先级链表,链表个数为优先级个数,每个链表存放对应就绪状态的进程实体

调度程序

  1. enqueue_task_rt(struct rq *rq, struct process_control_block *p, int flags)

将进程添加到对应rt_rq的优先级的队列中去

  1. dequeue_task_rt(struct rq *rq, struct process_control_block *p, int flags)

从rt_rq的优先级队列中取出某一个进程

  1. pick_next_task_rt()

从优先级队列中取出当前优先级最高的进程

  1. sched_rt()
  • 此函数是进程调度的核心函数

  • 核心逻辑:选择另一个进程来替换掉当前的运行进程。具体替换进程的选择是通过pick_next_task_rt()函数来实现的

image-20221127111532683

参考链接

sched(7) - Linux manual page (man7.org)

【原创】(一)Linux进程调度器-基础 - LoyenWang - 博客园 (cnblogs.com)

Linux进程管理 (9)实时调度类分析,以及FIFO和RR对比实验 - ArnoldLu - 博客园 (cnblogs.com)

RT调度学习笔记(1) - Hello-World3 - 博客园 (cnblogs.com)

(15条消息) Kernel Scheduler学习之五:RT 调度器_sucjhwaxp的博客-CSDN博客


实时调度器
https://kkkkkong.github.io/posts/46423.html
作者
Kong Weichao
发布于
2022年11月26日
许可协议