首页 > 系统相关 >Linux中的调度策略及其原理

Linux中的调度策略及其原理

时间:2023-10-26 23:00:41浏览次数:34  
标签:task 优先级 sched 调度 Linux 进程 原理 class

对于操作系统来讲,它面对的 CPU 的数量是有限的,干活儿都是它们,但是进程数目远远超过 CPU 的数目,因而就需要进行进程的调度,有效地分配 CPU 的时间,既要保证进程的最快响应,也要保证进程之间的公平。这也是一个非常复杂的、需要平衡的事情。

在 Linux 里面,进程大概可以分成两种。

一种称为实时进程,也就是需要尽快执行返回结果的那种。这就好比我们是一家公司,接到的客户项目需求就会有很多种。有些客户的项目需求比较急,比如一定要在一两个月内完成的这种,客户会加急加钱,那这种客户的优先级就会比较高。

另一种是普通进程,大部分的进程其实都是这种。这就好比,大部分客户的项目都是普通的需求,可以按照正常流程完成,优先级就没实时进程这么高,但是人家肯定也有确定的交付日期。

在 task_struct 中,有一个成员变量,我们叫调度策略。优先级其实就是一个数值,对于实时进程,优先级的范围是 0~99;对于普通进程,优先级的范围是 100~139。数值越小,优先级越高。从这里可以看出,所有的实时进程都比普通进程优先级要高。

对于调度策略,其中 SCHED_FIFO、SCHED_RR、SCHED_DEADLINE 是实时进程的调度策略。

对于普通进程的调度策略有,SCHED_NORMAL、SCHED_BATCH、SCHED_IDLE。

sched_class 有几种实现:

  • stop_sched_class 优先级最高的任务会使用这种策略,会中断所有其他线程,且不会被其他任务打断;
  • dl_sched_class 就对应上面的 deadline 调度策略;
  • rt_sched_class 就对应 RR 算法或者 FIFO 算法的调度策略,具体调度策略由进程的 task_struct->policy 指定;
  • fair_sched_class 就是普通进程的调度策略;
  • idle_sched_class 就是空闲进程的调度策略。

所有可运行的进程通过不断地插入操作最终都存储在以时间为顺序的红黑树中,vruntime 最小的在树的左侧,vruntime 最多的在树的右侧。 CFS 调度策略会选择红黑树最左边的叶子节点作为下一个将获得 CPU 的任务。

CPU 也是这样的,每个 CPU 都有自己的 struct rq 结构,其用于描述在此 CPU 上所运行的所有进程,其包括一个实时进程队列 rt_rq 和一个 CFS 运行队列 cfs_rq,在调度时,调度器首先会先去实时进程队列找是否有实时进程需要运行,如果没有才会去 CFS 运行队列找是否有进程需要运行。

当有一天,某个 CPU 需要找下一个任务执行的时候,会按照优先级依次调用调度类,不同的调度类操作不同的队列。当然 rt_sched_class 先被调用,它会在 rt_rq 上找下一个任务,只有找不到的时候,才轮到 fair_sched_class 被调用,它会在 cfs_rq 上找下一个任务。这样保证了实时任务的优先级永远大于普通任务。

 sched_class 定义的与调度有关的函数。

  • enqueue_task 向就绪队列中添加一个进程,当某个进程进入可运行状态时,调用这个函数;
  • dequeue_task 将一个进程从就绪队列中删除;
  • pick_next_task 选择接下来要运行的进程;
  • put_prev_task 用另一个进程代替当前运行的进程;
  • set_curr_task 用于修改调度策略;
  • task_tick 每次周期性时钟到的时候,这个函数被调用,可能触发调度。

调用路径如下:pick_next_task_fair->pick_next_entity->__pick_first_entity。



标签:task,优先级,sched,调度,Linux,进程,原理,class
From: https://blog.51cto.com/key3feng/8044119

相关文章

  • linux用docker
    1.查看docker运行状态systemctlstatusdocker2.查看docker服务是否自启动systemctlis-enabled docker 3.查看docker下运行的所有容器4.启动docker systemctlstart docker5.启动docker下的容器docker-compose-fdocker-compose.yml up-d或启动指定的容器......
  • python进阶知识体系md笔记14大体系200页,第2章:linux基础命令学习
    本文从14大模块展示了python高级用的应用。分别有Linux命令,多任务编程、网络编程、Http协议和静态Web编程、html+css、JavaScript、jQuery、MySql数据库的各种用法、python的闭包和装饰器、mini-web框架、正则表达式等相关文章的详细讲述。完整版笔记直接地址:请移步这里共14......
  • Linux ls命令:查看目录下文件
    ls命令,list的缩写,是最常见的目录操作命令,其主要功能是显示当前目录下的内容。此命令的基本格式为:[root@localhost~]#ls[选项]目录名称ls命令常用的选项以及各自的功能。注意,当ls命令不使用任何选项时,默认只会显示非隐藏文件的名称,并以文件名进行排序,同时会根据文件的具体......
  • 使用Kali Linux进行主机发现实验
    主机发现【实训目的】掌握主机扫描的工作原理,学会使用ping等扫描工具,发现网络当中活跃的主机。【场景描述】在虚拟机环境下配置4个虚拟系统“WinXP1”“WinXP2”“KaliLinux”和“Metasploitable2”,使得4个系统之间能够相互通信。实训均在如图1所示场景中实现。 图1......
  • Linux p10 文件目录指令
    【学习课程】:【【小白入门通俗易懂】2021韩顺平一周学会Linux】https://www.bilibili.com/video/BV1Sv411r7vd/?p=14&share_source=copy_web&vd_source=2c07d62293f5003c919b2df9b2e0549e文件目录指令文件路径指令pwd指令基本语法:pwd功能描述:显示当前工作目录的绝对路......
  • 《Unix/Linux系统编程》教材学习笔记第四章
    chapter4并行计算早期计算机大多数受到硬件限制,计算机程序通常为串行计算编写的。但是基于分治原则的算法经常表现出高度的并行性,可通过并行或并发执行来提高计算速度。顺序算法与并行算法在描述顺序算法时,常用的方法是用一个begin-end代码块列出算法,如下图左侧所示。begin-en......
  • Linux基础知识与命令 三
    目录和文件管理cat 查看文件格式:cat [选项] [文件]cat可以支持标准输入命令-A 显示隐藏字符 -n显示行号 -b跳过空行 -s压缩 (相当于把连空行压缩到一个空行)重定向:> >>>> 表示追加   tac 反方向查看 rev 同一行内容逆向显示 h......
  • 模拟实现常见的strlen、strcpy、strcmp库函数,深入理解它们的原理
    ⛩️博主主页:@威化小餅干......
  • Linux学习总结
    1Linux简介在Linux出现之前,市场上已经存在稳定且成熟的操作系统UNIX。Linux由UNIX演变而来,在UNIX的技术和用户界面基础上进行了独创的技术改进。Linux在服务器市场拥有强劲的竞争力,对安全漏洞有极快的解决速度。Linux也是一种操作系统,要想知道Linux是什么,首先得说一说什......
  • Chromium Command Buffer原理解析
    CommandBuffer 是支撑Chromium多进程硬件加速渲染的核心技术之一。它基于OpenGLES2.0定义了一套序列化协议,这套协议规定了所有OpenGLES2.0命令的序列化格式,使得应用对OpenGL的调用可以被缓存并传输到其他的进程中去执行(GPU进程),从而实现多个进程配合的渲染机制。1. Com......