调度策略与-调度算法-深入了解-CFS-揭秘内核的奥秘-Linux (调度策略np问题)
在当今计算机领域,操作系统扮演着至关重要的角色,而其中的调度策略和内核结构体更是它多任务处理的核心。本文将引领你深入探索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
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。