当前位置:首页 > 数码 > 调度策略与-调度算法-深入了解-CFS-揭秘内核的奥秘-Linux (调度策略np问题)

调度策略与-调度算法-深入了解-CFS-揭秘内核的奥秘-Linux (调度策略np问题)

admin7个月前 (05-04)数码24

在当今计算机领域,操作系统扮演着至关重要的角色,而其中的调度策略和内核结构体更是它多任务处理的核心。本文将引领你深入探索Linux中的调度策略,理解不同策略如何影响线程的执行顺序,并研究CFS(完全公平调度器)调度算法的运作原理。我们还将涉及一些内核结构体的重要性,帮助你更好地理解Linux内核的运行机制。

敲开调度策略的门

在Linux中,调度器是内核的一部分,它的任务是决定下一个由CPU执行的可运行线程。每个线程都有一个关联的调度策略和一个静态调度优先级(sched_priority)。调度器基于系统上所有线程的调度策略和静态优先级来做出决策。

(1)普通调度策略与实时调度策略

  • 普通调度策略:主要用于常规进程,优先级较低,公平性优先。
  • 实时调度策略:主要用于关键任务,优先级较高,及时性优先。

(2)调度策略工作原理

调度策略的算法和机制因类型而异。CFS(完全公平调度器)是Linux中默认的普通调度策略,采用CFS调度算法。实时调度策略则使用实时优先级和优先级继承等机制。

内核结构体

内核结构体是内核用来管理和表示数据和信息的抽象数据类型。在调度方面,以下内核结构体至关重要:

sched_class结构:

  • 通过一组函数指针描述了调度器,包括:
    • next_task
    • load_balance
    • 调度算法
    • enqueue_task
  • 调度器优先级:优先级是编译时指定的,通过__begin_sched_classes和__end_sched_classes进行定位。

CFS调度算法

(1)调度介绍

CFS调度算法是Linux中的核心调度器,旨在提供公平的CPU时间分配。以下是CFS调度的关键要点:

  • 以虚拟时间为基础,每个线程都有自己的虚拟运行时间。
  • 通过比较虚拟时间和实际运行时间来确定线程的调度优先级。
  • 具有最高虚拟时间的线程有最高的调度优先级。

(2)CFS调度刷新机制

CFS的虚拟时间刷新通过scheduler_tick定时器实现。虚拟时间的更新依赖于scheduler_tick,task_tick_fair,entity_tick,update_curr,以及check_preempt_tick等机制。这确保了公平的调度和进程优先级的维护。

(3)进程调度与内核结构体的交互

Linux进行进程调度时,内核调用schedule->__schedule,通过pick_next_task选择下一个要运行的进程。这过程涉及到各种调度类的尝试,优先级比较和进程切换等操作。同时,当前进程的虚拟时间会得到更新,确保在下一次被调度时优先级正确。

总结

深度了解Linux的调度策略、CFS调度算法和内核结构体是优化系统性能和资源管理的关键一步。本文提供了详细的解释和工作原理,为你揭示了Linux内核的运行机制。通过充分了解这些核心概念,你将能够更好地掌控Linux系统,提高其性能和响应能力。


linux进程、线程及调度算法(三)

调度策略值得是大家都在ready时,并且CPU已经被调度时,决定谁来运行,谁来被调度。

两者之间有一定矛盾。 响应的优化,意味着高优先级会抢占优先级,会花时间在上下文切换,会影响吞吐。 上下文切换的时间是很短的,几微妙就能搞定。上下文切换本身对吞吐并多大影响, 重要的是,切换后引起的cpu 的 cache miss. 每次切换APP, 数据都要重新load一次。 Linux 会尽可能的在响应与吞吐之间寻找平衡。比如在编译linux的时候,会让你选择 kernal features -> Preemption model. 抢占模型会影响linux的调度算法。

所以 ARM 的架构都是big+LITTLE, 一个很猛CPU+ 多个 性能较差的 CPU, 那么可以把I/O型任务的调度 放在 LITTLE CPU上。需要计算的放在big上。

早期2.6 内核将优先级划分了 0-139 bit的优先级。数值越低,优先级越高。0-99优先级 都是 RT(即时响应)的 ,100-139都是非RT的,即normal。 调度的时候 看哪个bitmap 中的 优先级上有任务ready。可能多个任务哦。

在普通优先级线程调度中,高优先级并不代表对低优先级的绝对优势。会在不同优先级进行轮转。 100 就是比101高,101也会比102高,但100 不会堵着101。 众屌丝进程在轮转时,优先级高的:

初始设置nice值为0,linux 会探测 你是喜欢睡眠,还是干活。越喜欢睡,linux 越奖励你,优先级上升(nice值减少)。越喜欢干活,优先级下降(nice值增加)。所以一个进程在linux中,干着干着 优先级越低,睡着睡着 优先级越高。

后期linux补丁中

红黑树,数据结构, 左边节点小于右边节点 同时兼顾了 CPU/IO 和 nice。 数值代表着 进程运行到目前为止的virtual runtime 时间。

(pyhsical runtime) / weight * 1024(系数)。 优先调度 节点值(vruntime)最小的线程。权重weight 其实有nice 来控制。

一个线程一旦被调度到,则物理运行时间增加,vruntime增加,往左边走。 weight的增加,也导致vruntime减小,往右边走。 总之 CFS让线程 从左滚到右,从右滚到左。即照顾了I/O(喜欢睡,分子小) 也 照顾了 nice值低(分母高).所以 由喜欢睡,nice值又低的线程,最容易被调度到。 自动调整,无需向nice一样做出奖励惩罚动作,个人理解权重其实相当于nice

但是 此时 来一个 0-99的线程,进行RT调度,都可以瞬间秒杀你!因为人家不是普通的,是RT的!

一个多线程的进程中,每个线程的调度的策略 如 fifo rr normal, 都可以不同。每一个的优先级都可以不一样。 实验举例, 创建2个线程,同时开2个:

运行2次,创建两个进程 sudo renice -n -5(nice -5级别) -g(global), 会明显看到 一个进程的CPU占用率是另一个的 3倍。

为什么cpu都已经达到200%,为什么系统不觉得卡呢?因为,我们的线程在未设置优先级时,是normal调度模式,且是 CPU消耗型调度级别其实不高。

利用chrt工具,可以将进程 调整为 50从normal的调度策略 升为RT (fifo)级别的调度策略,会出现:

chrt , nice renice 的调度策略 都是以线程为单位的,以上 设置的将进程下的所有线程进行设置nice值 线程是调度单位,进程不是,进程是资源封装单位!

两个同样死循环的normal优先级线程,其中一个nice值降低,该线程的CPU 利用率就会比另一个CPU的利用率高。

《深入理解LINUX内核》pdf下载在线阅读,求百度网盘云资源

《深入理解LINUX内核》(Daniel )电子书网盘下载免费在线阅读

资源链接:

链接:Ru Li Jie linuxNei He (Di - (Mei )Bo Wei ,Xi Si

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: 算法

“调度策略与-调度算法-深入了解-CFS-揭秘内核的奥秘-Linux (调度策略np问题)” 的相关文章

编程利器-面试法宝-刷题360-悟透算法真理 (面条式编程)

编程利器-面试法宝-刷题360-悟透算法真理 (面条式编程)

最近不时在刷算法题,刷华为OD算法题,有诸多好处: 宿愿用我自己疯狂刷题的劲头,感化大家,让大家爱上刷题,顺利经过华为OD机试,把握更多低劣的算法。 上方这道题,是很经典的深度优先搜查...

Dijkstra算法的深入探索-把握效率与最优性 (dijkstra 怎么读)

Dijkstra算法的深入探索-把握效率与最优性 (dijkstra 怎么读)

引言 在计算机科学和图论中,算法在有效解决复杂问题方面起着至关重要的作用。其中一个突出的算法是Dijkstra算法,它由荷兰计算机科学家Edsger W. Dijkstra于1956年开发。...

面向跨领域数据的迁移学习算法与模型研究 (什么是跨领域)

面向跨领域数据的迁移学习算法与模型研究 (什么是跨领域)

引言 随着数据的快速增长和跨领域应用的需求,如何利用已有的知识和数据来解决新领域的问题成为了一个重要的研究方向。迁移学习作为一种有效的机器学习方法,可以通过利用源领域的知识和数据来改善目标领...

如何选择和使用-业务模型与算法模型 (如何选择和使用注意事项)

如何选择和使用-业务模型与算法模型 (如何选择和使用注意事项)

数据模型:业务模型与算法模型的全面解析 导言 数据的世界离不开模型,但"模型"一词的使用往往令人困惑。从营销中的 4P 模型到机器学习中的 K-means 聚类,它们都被称为模型。那么,这些模型...

使用生成对抗网络实现图像风格转换的突破性新算法 (使用生成对抗性网络的舞蹈动作生成)

使用生成对抗网络实现图像风格转换的突破性新算法 (使用生成对抗性网络的舞蹈动作生成)

一、图像风格转换简介 图像风格转换是指将一张图像的风格转换为另一张图像的风格,而保持图像内容不变。传统的图像风格转换方法通常基于图像的像素级别操作,如调整亮度、对比度和色彩等。这些方法往往无...

程序开发中罕用的十种算法-你用过几种 (程序开发中罕见的语言)

程序开发中罕用的十种算法-你用过几种 (程序开发中罕见的语言)

当编写程序时,了解和经常使用不同的算法对处置疑问至关关键。以下是C#中罕用的10种算法,每个算法都随同着示例代码和详细说明。 1.冒泡排序(BubbleSort): 冒泡排序...

时序分析中的常用算法-都在这里了 (时序分析的特点)

时序分析中的常用算法-都在这里了 (时序分析的特点)

简介 时序分析是一种预测建模技术,它利用历史数据中事件的时间特征来预测未来事件的特征。它不同于回归分析,因为时序分析依赖于事件发生的顺序。 时序分析类型 时序分析分为两类: 静态时序分...

强化学习算法在资源调度与优化领域的革命性应用 (深度学习算法)

强化学习算法在资源调度与优化领域的革命性应用 (深度学习算法)

强化学习简介 强化学习是一种机器学习方法,通过智能体与环境的交互来学习最优策略。在资源调度与优化中,我们可以将资源调度问题看作是一个强化学习问题,其中智能体是资源调度器,环境是计...