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

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

admin5个月前 (05-04)数码20

在当今计算机领域,操作系统扮演着至关重要的角色,而其中的调度策略和内核结构体更是它多任务处理的核心。本文将引领你深入探索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机试,把握更多低劣的算法。 上方这道题,是很经典的深度优先搜查...

探索个性化推荐的新维度-面向推荐系统的深度强化学习算法研究与应用

探索个性化推荐的新维度-面向推荐系统的深度强化学习算法研究与应用

引言 随着互联网的快速发展,推荐系统在各个领域中扮演着重要的角色。传统的推荐算法在面对大规模、复杂的数据时存在一定的局限性。为了解决这一问题,深度强化学习算法应运而生。本文将探讨面向推荐系统的深...

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

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

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

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

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

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

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

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

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

掌握算法并提升编程技能-程序员算法精通指南 (掌握算法的基本概念)

掌握算法并提升编程技能-程序员算法精通指南 (掌握算法的基本概念)

作为一名程序员,掌握算法对于解决复杂问题至关重要。在面试过程中,算法问题经常被问到,本文将介绍一些重要的算法,以及如何在面试中系统地准备算法。 深度优先搜索 深度优先搜索(DFS)是一...

马尔科夫随机场算法-建模图像和语音的强大方法 (马尔科夫随机场mrf)

马尔科夫随机场算法-建模图像和语音的强大方法 (马尔科夫随机场mrf)

马尔科夫随机场(Markov Random Field,简称 MRF)是一种用于建模图像和语音等数据的概率图模型。它基于马尔科夫性质,能够捕捉数据中的空间或时间相关性,从而提供了一种有效的方法来描...

Snowflake-一种翻新的散布式数据架构-探求-算法 (snowflakes)

Snowflake-一种翻新的散布式数据架构-探求-算法 (snowflakes)

雪花算法引见 雪花算法(Snowflake)是一种散布式惟一ID生成算法,用于生成全局惟一的ID。它的设计指标是在散布式系统中生成ID,保障ID的惟一性、有序性和趋向递增。雪花算法的外围现实...