Linux核心概念详解
  • 0. Linux核心概念详解
  • 1. 调试环境
  • 2. Linux 调度器
    • 2.1 任务
    • 2.2 核心概念
      • 2.2.1 核心概念 - 调度实体
      • 2.2.2 核心概念 - 调度类
      • 2.2.3 核心概念 - 调度策略
      • 2.2.4 核心概念 - 运行队列
      • 2.2.5 核心概念 - 优先级
    • 2.3 演进历史
      • 2.3.1 O(n)调度器 - 调度逻辑
      • 2.3.2 O(n)调度器 - 时间分配
      • 2.3.3 O(n)调度器 - 调度时机
      • 2.3.4 O(1)调度器 - 简介
      • 2.3.5 O(1)调度器 - 调度逻辑
      • 2.3.6 O(1)调度器 - 时间分配
      • 2.3.7 RSDL
      • 2.3.8 CFS
    • 2.4 DL调度器
      • 2.4.1 DL调度器 - 调度算法
      • 2.4.2 DL调度器 -核心代码
    • 2.5 RT调度器
    • 2.6 CFS
      • 2.6.1 公平性
      • 2.6.2 调度逻辑
      • 2.6.2.1 调度逻辑 - 数据结构
      • 2.6.2.2 调度逻辑 - vruntime
      • 2.6.2.3 调度逻辑 - 调度周期
      • 2.6.2.4 调度逻辑 - 调度节拍
      • 2.6.2.5 调度逻辑 - 任务抢占
      • 2.6.2.6 调度逻辑 - 调度时机
      • 2.6.3 组调度
      • 2.6.3.1 组调度 - 数据结构
      • 2.6.3.2 组调度 - 调度逻辑
      • 2.6.3.3 组调度 - 时间分配
      • 2.6.3.4 组调度 - 任务组权重
      • 2.6.4 带宽控制
      • 2.6.4.1 带宽控制 - 数据结构
      • 2.6.4.2 带宽控制 - 带宽时间
      • 2.6.4.3 带宽控制 - 挂起与解挂
      • 2.6.4.3 带宽控制 - 定时器
    • 2.7 负载追踪
      • 2.7.1 负载追踪 - 简介
      • 2.7.2 负载追踪 - 数据结构
      • 2.7.3 负载追踪 - 计算负载
      • 2.7.4 负载追踪 - 更新负载
    • 2.8 负载均衡
      • 2.8.1 简介
      • 2.8.2 CPU的拓扑结构
      • 2.8.3 数据结构
      • 2.8.4 算法思路
      • 2.8.5 触发时机
      • 2.8.6 总结
  • 3. LINUX 内存管理
    • 3.1 寻址模式
      • 3.1.1 地址
      • 3.1.2 地址转换
      • 3.1.3 Linux的地址空间
    • 3.2 物理内存
      • 3.2.1 数据结构
      • 3.2.2 初始化
      • 3.2.3 物理内存模型
      • 3.2.4 Buddy System(伙伴系统)
      • 3.2.5 SLAB/SLUB/SLOB
Powered by GitBook
On this page

Was this helpful?

  1. 2. Linux 调度器
  2. 2.7 负载追踪

2.7.2 负载追踪 - 数据结构

与负载相关的字段封装在数据结构 sched_avg 中:

/* file: include/linux/sched.h */
struct sched_avg {
    /* 上一次更新 load 的时间点,用来计算时间间隔 */
    u64 last_update_time;
    /* 基于可运行时间(runnable)的负载总和。
     * runnable状态指任务处于可运行状态的时间,其中包括在rq里等待的时间,以及在CPU上执行的时间
     */
    u64 load_sum;
    /* 在rq里等待的时间计算出来的负载总和 */
    u64 runnable_sum;
    /* 在cpu上执行的时间计算出来的负载总和 */
    u32 util_sum;
    /* 表示最近一次更新负载时,最近一个周期内的那部分时间,
     * 即accumulate_sum()函数上注释中标记为d3的时间
     */
    u32 period_contrib;
    /* 以下字段是平均值,同样基于上述的几个维度分别计算 */
    unsigned long load_avg;
    unsigned long runnable_avg;
    unsigned long util_avg;
    struct util_est util_est;
} ____cacheline_aligned;

当内核开启 CONFIG_SMP=y 时,cfsrq 与 schedentity 中都会包含跟踪负载的字段:

/* file: include/linux/sched.h */
struct sched_entity {
#ifdef CONFIG_SMP
    struct sched_avg avg;
#endif
};

/* file: kernel/sched/sched.h */
struct cfs_rq {
#ifdef CONFIG_SMP
    /* CFS load tracking */
    struct sched_avg avg;

    struct {
        raw_spinlock_t lock ____cacheline_aligned;
        int nr;
        unsigned long load_avg;
        unsigned long util_avg;
        unsigned long runnable_avg;
    } removed;

#endif /* CONFIG_SMP */
};
Previous2.7.1 负载追踪 - 简介Next2.7.3 负载追踪 - 计算负载

Last updated 3 years ago

Was this helpful?