stop调度类

摘自笔者原创的《Linux原理》草稿相关段落。本文基于5.15.133版本讨论。

2.4.1 stop

2.4.1.1 stop简介

众所周知,Linux内核包含五个调度类。它们分别是stop,deadline,RT,CFS和Idle。每次调度,其调度的顺序按照排序先后进行。所以,stop调度类拥有每次调度的最高优先权。

在stop机制中,可以借用经济学中消费者和生产者的概念来比喻该机制运行中非常重要的两部分内容,即migration内核线程以及向该线程添加工作内容的各种机制。

2.4.1.2 消费者 - migration内核线程

与CFS调度类每次调度都从运行队列中挑选一个符合调度条件的任务来运行不同,stop调度类每次调度只有一个任务接受调度,它就是migration内核线程。

如果我们使用ps命令加grep命令寻找一下migration线程的存在,会发现每个CPU核心都有一个自己专属的migration线程。

上图是在一台CPU为Intel Core 11400, 运行Ubuntu 20.04操作系统的计算机上操作的结果。可以看到该计算机有12颗CPU核心,每个CPU核心都有与自己核心编号相对应的migration线程。

在分析migration线程的运行机制之前,我们先来了解一些与之密切相关的背景知识。 kernel/stop_machine.c中,Linux内核为每一刻CPU核心定义了cpu_stoppper结构体类型的变量cpu_stopper。

cpu_stopper结构体包含了该核心上运行

<think>好的,用户现在想了解Linux调度器的分类,特别是不同类型的调度器。我需要结合之前的对话和提供的引用资料来回答。 首先,回顾之前的回答,我提到了调度器的核心作用、工作机制,以及实时进程和普通进程的不同策略,比如CFS。用户现在进一步询问分类,需要更详细地展开调度类的层次结构。 查看用户提供的引用,引用5提到了停机调度类stop_sched_class、限期调度类dl_sched_class、实时调度类rt_sched_class、公平调度类fair_sched_class和空闲调度类idle_sched_class。这些应该是Linux调度器的主要分类。需要确认这些调度类的优先级顺序和作用。 之前的回答中提到了实时调度类和分时调度类,可能分时调度类对应的是公平调度类CFS。需要明确各个类的名称和对应的策略,比如SCHED_FIFO属于实时调度类,而CFS属于公平调度类。 另外,引用3提到了CFS的演变,从O(n)到O(1)再到CFS,这可能属于调度器的发展历史,但用户现在关注的是分类,所以需要集中在现有的调度类上。 用户的问题可能还希望了解每个调度类的具体功能和适用场景。例如,停机调度类用于最高优先级的任务,如CPU热插拔;限期调度类处理有严格时间限制的任务;实时调度类分FIFO和RR;公平调度类使用vruntime;空闲调度类在系统空闲时运行。 需要确保回答结构清晰,分点列出每个调度类,并解释其作用、优先级和调度策略。同时,结合引用中的信息,比如引用4提到的sched_min_granularity_ns,这可能与CFS的时间片管理有关,可以提及。 还要注意引用格式,每个引用对应的来源是否正确。例如,引用5提到了各个调度类,而引用3和4补充了CFS的细节。需要正确标注引用标记,如[^5][^3][^4]等。 最后,生成的相关问题需要与调度器分类相关,比如不同调度类的应用场景,如何配置调度类,或者CFS的具体实现机制。确保问题引导用户深入理解该主题。</think>### Linux调度器分类详解 Linux内核采用**多层级调度类架构**,不同调度类按优先级排列,优先级高的调度类优先处理进程。以下是5种核心调度类及其实现机制: --- #### 一、停机调度类stop_sched_class) - **优先级**:最高(覆盖所有其他类型) - **作用** 处理**CPU核心级紧急操作**,例如: - CPU热插拔(动态增减物理核心) - 核心间任务迁移 - 硬件错误隔离 - **特点** 独占CPU资源,禁止被抢占[^5] --- #### 二、限期调度类(dl_sched_class) - **优先级**:次高 - **适用场景** 管理**有严格时间约束的实时任务**(如工业控制系统、自动驾驶),需满足截止时间(Deadline)要求[^5]。 - **调度策略** 使用**Earliest Deadline First (EDF)** 算法: $$ \text{选择截止时间最早的进程优先执行} $$ - 通过`sched_setattr()`设置任务的`runtime/deadline/period`参数 - 示例代码: ```c struct sched_attr attr = { .size = sizeof(attr), .sched_policy = SCHED_DEADLINE, .sched_runtime = 10000000, // 10ms .sched_deadline = 20000000, // 20ms .sched_period = 20000000 // 周期20ms }; sched_setattr(pid, &attr, 0); ``` --- #### 三、实时调度类(rt_sched_class) - **优先级**:第三级 - **调度策略** 1. **`SCHED_FIFO`** - 先进先出队列,无时间片限制 - 进程持续运行直到主动释放CPU或被更高优先级实时进程抢占[^5] 2. **`SCHED_RR`** - 带时间片的轮转调度(默认时间片100ms) - 进程用完时间片后回到队列尾部 - **典型应用** 音视频实时流处理、高频交易系统 --- #### 四、公平调度类(fair_sched_class) - **优先级**:第四级(管理普通进程) - **核心机制** 使用**完全公平调度器(CFS)**,通过虚拟运行时间(vruntime)实现公平性[^3][^4]: $$ vruntime = \frac{\text{实际运行时间} \times \text{基准权重}}{\text{进程权重}} $$ - **红黑树结构**:按vruntime排序,选择最小vruntime进程执行 - **时间片控制**:通过`sched_min_granularity_ns`(默认1.5ms)设置最小执行粒度[^4] - **权重计算** 进程权重由`nice`值映射,例如`nice=0`对应权重1024(基准值),每增减1级权重变化约10%[^5] --- #### 五、空闲调度类(idle_sched_class) - **优先级**:最低 - **触发条件** 当所有CPU核心**无其他可运行任务**时激活 - **关键行为** - 执行`pid=0`的`swapper`进程 - 调用`cpuidle`指令进入低功耗状态 - 响应中断后立即退出空闲状态 --- ### 调度类优先级关系 $$ \text{停机类} > \text{限期类} > \text{实时类} > \text{公平类} > \text{空闲类} $$ 内核通过`for_each_class`宏按优先级遍历调度类,确保高优先级任务优先获得CPU[^5]。 --- #### 配置示例:查看进程调度策略 ```bash # 查看PID为1234的进程调度策略 chrt -p 1234 # 输出示例:pid 1234 当前调度策略为 SCHED_OTHER (CFS) ``` --- ### 相关问题 1. 如何通过`sched_setscheduler()`将进程设置为限期调度策略? 2. CFS调度器中`vruntime`的计算是否考虑多核负载均衡? 3. 实时进程使用`SCHED_FIFO`策略时如何防止系统卡死? 4. 空闲调度类在节能模式下的具体实现机制是什么? [^1]: 全局调度器调度类协作机制 [^2]: Linux调度器演进历程 [^3]: CFS调度器历史背景 [^4]: CFS时间片控制参数 [^5]: 调度类层级定义与权重计算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值