单核CPU调度

CPU MLFQ 调度

MLFQ即多级反馈队列调度。在给定时间片中,任务存在不同优先队列之中等待被执行,MLFQ根据优先级去决定哪个任务在该时间片执行

Round Robin

Round Robin即RR,是基于时间片的轮询调度算法。给每个任务分配一个时间片,当任务时间片用完之后,会中断当前任务,切换到下一个

改变优先级的第一次尝试

初始规则如下

  1. 若任务A优先级高于任务B,则调度A
  2. 若任务A、B优先级一致,则根据RR调度A、B

根据上述两条规则,若存在任务C优先级低于A和B,那么C就会一直不被执行,导致饥饿。因此引入第三条规则

第四条规则则是考虑到对于需要高响应的任务多是短执行的,所以会频繁让出CPU,因此为了保证响应时间,就保持现有优先级

而对于CPU密集型,则不太需要高响应,所以可以降低优先级

  1. 当新任务到达之后放置最高优先级队列

  2. 如果任务A运行了一个时间片都没有主动让出CPU(比如I/O操作),则优先级降低一级

    如果任务A在时间片用完之前,有主动让出CPU,则优先级保持不变

在上面的尝试中仍然存在以下问题

  • 仍然存在饥饿问题。若存在大量短执行任务,就会导致长执行任务无法得到执行
  • 被利用导致某些任务一直处于高优先级。

公平还是公平

为了解决饥饿问题,可以引入一个很简单的规则

  1. 系统运行S时长后,将所有任务放到最高优先级

这就确保所有的任务都会最终处于一个优先级中,那么所有任务即使是最低优先级的都有可能被调用,所以至少此时,众生平等

不要被利用

在解决了饥饿问题之后,恶意利用还是存在。

这样必须对规则4进行改变

  1. 给每个优先级分配一个时间片,当任务用完该优先级的时间片后,优先级降一级

最终尘埃落定

最终规则如下

  1. 若任务A优先级高于任务B,则调度A
  2. 若任务A、B优先级一致,则根据RR调度A、B
  3. 当新任务到达之后放置最高优先级队列
  4. 给每个优先级分配一个时间片,当任务用完该优先级的时间片后,优先级降一级
  5. 系统运行S时长后,将所有任务放到最高优先级

流程如下

  1. 新进程插入到最高优先队列尾

  2. 一段时间后,进程到达队列头并分配CPU

  3. 如果进程在给定时间片内完成,将离开调度系统

    如果进程自愿放弃CPU执行,则会在再次就绪时,插入原放弃队列尾部

    如果进程使用所有配额CPU时间,则会被抢占并插入到下一个较低队列尾部

    低级别队列CPU配额比高级别队列低

调度器总是从高级别队列头开始选择进程进行分配,在高级别队列为空之后,才会接管低级别队列。

进程在队列的迁移总是插入到目标队列尾部,并且进程在给定队列级别只有一次完成任务的机会,然后就会被下放到较低级别的队列

Linux CFS调度

CFS代表完全公平的调度器。CFS的设计理念是在真实硬件上实现理想的、精确的多任务CPU。CFS调度器和以往的调度器不同之处在于没有时间片的概念,而是分配cpu使用时间的比例。例如:2个相同优先级的进程在一个cpu上运行,那么每个进程都将会分配50%的cpu运行时间。这就是要实现的公平

调度类

调度类是表示一种特定的调度策略和算法,定义了如何选择下一个要运行的任务,如何将任务插入到运行队列中,以及如何处理任务的唤醒和睡眠等

在Linux内核中有以下调度类

  • CFS调度类(SCHED_NORMAL): 默认的调度类,用于大多数普通的非实时任务。它使用完全公平调度器(CFS)算法,以实现公平和高效的CPU调度
  • 实时调度类: 用于实时任务
    • SCHED_FIFO: 先进先出。
    • SCHED_RR: 处于runqueue中的线程轮流获取时间片
  • Deadline调度类(SCHED_DEADLINE): 针对有明确截止时间要求的实时任务的调度类。它使用EDF(最早截止时间优先)算法和CBS(恒定带宽服务器)算法,以确保所有的实时任务都能在截止时间之前完成
  • Idle调度类(SCHED_IDLE): 优先级最低的调度类,只有当系统中没有其他任何任务需要运行时,才会运行属于这个调度类的任务。

核心结构

  • vruntime: 表示进程在所有CPU的总执行时间

    v r u n t i m e + = 实际运行时间 ∗ 1024 / 进程权重 vruntime += 实际运行时间*1024/进程权重 vruntime+=实际运行时间1024/进程权重

  • runqueue: 每个CPU上的可运行进程队列

  • 基于时序的红黑树: 每个CPU上根据vruntime组织所有进程

CFS调度策略

常规调度分为

  • SCHED_NORMAL: 用于常规任务的调度策略
  • SCHED_BATCH: 运行长,能更好利用缓存,但损失响应性
  • SCHED_IDLE: 并不是一个真正的空闲定时器调度器,以避免优先级反转问题,防止机器死锁。

其中CFS属于SCHED_NORMAL

CFS调度利用红黑树优先调度执行总时间更低的,在每次时间片执行完会对执行的进程累加执行时间,并重新选择最低执行时间的进程进行执行

这也就意味着执行越久,执行优先级越低。那么计算密集型执行优先级低,IO密集型执行优先级高

当然这样的调度也会使得同一个进程连续执行多次,不过这也不是坏事,毕竟之前用的上下文还能接着用

SCHED_RR与SCHED_NORMAL对比

sched_RRSched_normal
调度进程类型实时进程普通进程
时间片静态动态。根据系统进程数量变化
下一个进程的选择从runqueue选择下一个从红黑树选择vruntime最小的

CPU限额问题

配额机制限制了每个容器的摊销CPU使用率,但它没有限制任务在任何给定时刻可以使用多少个内核。相反,如果一个任务“想”在一个配额的时间片上使用更多的内核,它就会在短时间内使用多于配额的内核,然后进入节流状态,也就是说基本上进入睡眠状态,以保持它的摊销内核使用量低于配额,这对于尾延迟来说是灾难性的

比如垃圾回收器,可能在一次GC期间,所有这些GC线程将同时运行,迅速耗尽cpu配额,从而导致节流。由此产生的效果是,次秒级的GC暂停可能需要数秒的时间才能完成。

Ref

  1. https://pages.cs.wisc.edu/~remzi/OSTEP/cpu-sched-mlfq.pdf
  2. https://en.wikipedia.org/wiki/Multilevel_feedback_queue
  3. https://github.com/torvalds/linux/blob/v5.10/Documentation/scheduler/sched-design-CFS.rst
  4. https://arthurchiao.art/blog/linux-cfs-design-and-implementation-zh/
  5. https://danluu.com/cgroup-throttling/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/11009.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pixhawk无人机飞控解锁

飞控解锁 GitBook 左手油门的遥控解锁是油门右下角拨,右手油门是油门最低,方向最右。 飞控如何加锁? 左手油门:油门左下角 右手油门:油门最低,方向最左 飞控解锁成功后,不推油门的情况下,…

基于SSM+Vue的物流管理系统

运行截图 获取方式 Gitee仓库

大众点评全国店铺基础信息采集-学习培训店铺-2024年5月

2024年5月最新采集大众点评全国(内地)-学习培训大类-店铺基础信息,93余万家 学习培训类店铺示例: 店铺id k40VtNBN3bixFJIU 店铺名称 梦想钢琴成人钢琴(珠江新城总部) 十分制效果评分 9.4 十分制服务评分 9.4 十分制环境评分 9.4 人均价格 1233 …

为什么数据库字符编码不一致会导致索引失效

引言 数据库字符编码不一致是数据库管理和优化过程中经常遇到的问题之一,尤其在涉及多语言环境和多应用时更为显著。本文旨在深入探讨字符编码不匹配如何影响SQL查询性能,导致索引失效,以及其背后的原理。 1. 字符编码与索引基础 字符编码…

【TypeScript模块简介以及使用方法】

TypeScript模块简介 TypeScript中的模块(Modules)是代码的封装体,它们可以包含变量、函数、类和接口等。在TypeScript中,模块可以被其他模块引用和使用,从而实现代码的复用和模块化开发。 TypeScript支持两种模块系统…

LORA学习笔记2——训练集处理

前言 对于ai训练来说,处理训练集是模型训练的重要环节。训练集的质量对最终模型的质量影响巨大。这里以二次元角色为例,记录下训练集处理的流程和一些心得。 素材准备 素材准备有以下几个需要注意的点: 通常训练二次元角色需要30张以上的…

14:HAL---CRC校验

103系列只有一个CRC 前言: CRC(Cyclic Redundancy Check),即循环冗余校验,是一种根据网络数据包或电脑文件等数据产生简短固定位数校核码的快速算法,主要用来检测或校核数据传输或者保存后可能出现的错误。…

QX---mini51单片机学习---(8)8*8点阵屏

目录 1LED点阵屏简绍 2 8*8点阵屏电路图74 3 74HC595芯片 4实践编程 1LED点阵屏简绍 2 8*8点阵屏电路图74 怎么点亮,正极给高负极给低 不能同时静态显示,跟数码管动态显示一样,反复横跳,利用视觉效果 3 74HC595芯片 …

斐波那契数

509. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) F(n - 2),其中 …

第四届上海理工大学程序设计全国挑战赛---昨日方舟

知识点:模拟 题目描述 《昨日方舟》是一款塔防类游戏。在游戏中,我们要通过部署角色来抵御怪物的入侵。在这款游戏中,有一名角色名字为 “今”,他的能力为能够在地图上部署小蛇,小蛇在某些条件下可以与其他小蛇合体…

关于 IIS 开启匿名访问网站仍要账号密码登录网站的解决方法

欢迎关注公总号【云边小网安】 问题提出:发现虽然勾选了允许匿名访问网站,但在访问某一网站的时候仍然需要登录账号密码 解决方法一:登录管理员账号密码解决方法二:添加访问网站文件夹的用户 访问某一网站本质上来讲&#xff0…

C++入门必读-Qt的安装与配置

QT简介 Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立图形界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组件编程。 QT下载 访问下载网站: Index of /archive/qt 安装编译器 QT安装 建议安装之前将网络断…

1064 朋友数

solution 给出n个整数&#xff0c;统计可能的位数和&#xff0c;并按升序输出&#xff08;考虑用set实现&#xff09; #include<iostream> #include<set> using namespace std; int main(){set<int> st;int n, x, sum;scanf("%d", &n);while…

前端Vue架构

1 理解&#xff1a; 创建视图的函数&#xff08;render&#xff09;和数据之间的关联&#xff1b; 当数据发生变化的时候&#xff0c;希望render重新执行&#xff1b; 监听数据的读取和修改&#xff1b; defineProperty&#xff1a;监听范围比较窄&#xff0c;只能通过属性描…

Docker 直接运行一个 Alpine 镜像

由于镜像很小&#xff0c;下载时间往往很短&#xff0c;读者可以直接使用 docker run 指令直接运行一个 Alpine 容器&#xff0c;并指定运行的 Linux 指令&#xff0c;例如&#xff1a; PS C:\Users\yhu> docker run alpine echo 123 Unable to find image alpine:latest lo…

Commit failed (details follow):is out of date

Commit failed (details follow):is out of date 关于SVN提交时报out-of-date错误的解决方法 提交项目文件时&#xff0c;报如下的信息&#xff1a; Item is out-of-date svn: Commit failed (details follow): svn: Item ‘/xxx/xxx/xxx/xxx/xxx/xxx’ is out of date 原因&…

手写Spring5【笔记】

Spring5【笔记】 前言前言推荐Spring5【笔记】1介绍2手写 最后 前言 这是陈旧已久的草稿2022-12-01 23:32:59 这个是刷B站的时候&#xff0c;看到一个手写Spring的课程。 最后我自己好像运行不了&#xff0c;就没写。 现在2024-5-12 22:22:46&#xff0c;发布到[笔记]专栏中…

队列(详解)

一.队列的概念 队列&#xff08;Queue&#xff09;是一种常见的数据结构&#xff0c;它按照先进先出的原则管理数据。这意味着最先进入队列的元素将被最先移出队列&#xff0c;类似于现实生活中排队的场景。 在队列中&#xff0c;数据项被添加到队列的一端&#xff0c;称为队尾…

cmu15445 2023fall project3 详细过程(下)QUERY EXECUTION

QUERY EXECUTION task3/task4 Task #3 - HashJoin Executor and Optimization1、HashJoin1.1 思路1.2 代码 2 NestedLoopJoin优化为HashJoin2.1 思路2.2 代码 Task #4 Sort Limit Executors Top-N Optimization Window Functions1、Sort1.1 思路1.2 代码 2、Limit Executors2…

数据可视化第五天(读取文件获得男生女生身高信息,并且可视化在一个图像)

文件 需要学生文件的可以私信我 过程 利用numpy的loadtxt文件读取学号&#xff0c;性别&#xff0c;和身高。 import numpy as np import matplotlib.pyplot as pltfilename/Users/oommnn/Desktop/python学习/数据分析/网课资料/第04天/student-data.txtuser_infonp.dtype(…