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.3 演进历史

2.3.4 O(1)调度器 - 简介

Previous2.3.3 O(n)调度器 - 调度时机Next2.3.5 O(1)调度器 - 调度逻辑

Last updated 3 years ago

Was this helpful?

O(n)调度器的实现思路非常简单,在它的年代也够用了,但随着多核架构的发展,其扩展性方面的问题越来越明显。其中最大的问题是系统中所有的CPU共享一个全局的运行队列,这个设计会导致如下问题:

  1. 并发访问的问题,系统需要通过加锁来同步对队列的访问

  2. 每次调度需要遍历整个队列,时间复杂度太高

  3. 实时任务与普通任务共用一个队列,影响实时任务的响应速度

  4. 任务在调度时,很容易在不同的CPU之间来回跳转,无法很好地利用CPU缓存

  5. 在每个调度周期后期,容易造成有的CPU在空跑,例如此时还有剩余时间的就绪任务的总量小于CPU数量的话,就一定有CPU此时处于idle状态

  6. 给任务分配调度时间时需要遍历系统的所有任务,效率过于低下,并且在该过程中其余的CPU实际上无事可做

总之,O(n) 调度器简单粗暴的实现很难适应SMP架构下的扩容问题,而随着系统任务数量的增加,其性能存在严重的缺陷,我们需要一种更精细化的策略来完成任务调度。

O(1)调度器就是对针对这种需求进行的优化,由Linux在2.6.0版本中引入,直到后来被CFS取代,本节我们基于的代码来简单探索一下该调度器的实现思路。

linux-2.6.11.1