真实的处理器调度

真实的处理器调度

2024 南京大学《操作系统:设计与实现》
真实的处理器调度

不要高兴得太早 (1)

void jyy@nju.edu.cn() {
    nice(10);
    mutex_lock(&restroom_lock);
}

void changxu@nju.edu.cn() {
    nice(0);
    while (1) ;
}

void xxm@nju.edu.cn() {
    nice(-10);
    mutex_lock(&restroom_lock);
}

只有一个处理器

  • jyy 在持有互斥锁的时候被中优先级进程赶下了处理器……
2024 南京大学《操作系统:设计与实现》
真实的处理器调度

这个 “事故” 曾经在火星上发生过

center

Sojourner “探路者” (PathFinder),1997 年 7 月 4 日登陆火星
2024 南京大学《操作系统:设计与实现》
真实的处理器调度

Sojourner “探路者” (PathFinder)

2024 南京大学《操作系统:设计与实现》
真实的处理器调度

“The First Bug on Mars”

登上火星的计算机系统

  • Lander (登陆舱)
    • IBM Rad6000 SC (20 MIPS), 128 MiB RAM, 6 MiB EEPROM
  • Rover (火星车)
    • Intel 80C85 (0.1 MIPS), 512K RAM, 176K Flash
  • VxWorks “实时” 任务操作系统
2024 南京大学《操作系统:设计与实现》
真实的处理器调度

The First Bug on Mars (cont'd)

center

  • (低优先级) select → pipeIoctl → selNodeAdd → mutex_lock
  • (高优先级) pipeWrite → mutex_lock
2024 南京大学《操作系统:设计与实现》
真实的处理器调度

解决优先级反转问题

Linux: 解决不了

  • CFS 凑合用吧

实时系统:火星车在 CPU Reset,不能摆烂 😂

  • 优先级继承 (Priority Inheritance)/优先级提升 (Priority Ceiling)
    • 持有 mutex 的线程/进程会继承 block 在该 mutex 上进程的最高优先级
    • 但也不是万能的 (例如条件变量唤醒)
  • 避免高/低优先级的任务争抢资源
    • 对潜在的优先级反转进行预警 (lockdep)
    • TX-based: 冲突的 TX 发生时,总是低优先级的 abort
2024 南京大学《操作系统:设计与实现》
真实的处理器调度

不要高兴得太早 (2)

今天的计算机系统:SMP (Symmetric Multi-processing)

  • Since Linux Kernel 2.0 (1996)

center

2024 南京大学《操作系统:设计与实现》
真实的处理器调度

多处理器调度:被低估的复杂性

“And you have to realize that there are not very many things that have aged as well as the scheduler. Which is just another proof that scheduling is easy.”
——Linus Torvalds, 2001

Linus 以为调度是个挺简单的问题?

  • As a central part of resource management, the OS thread scheduler must maintain the following, simple, invariant: make sure that ready threads are scheduled on available cores... this invariant is often broken in Linux. Cores may stay idle for seconds while ready threads are waiting in runqueues. (The Linux scheduler: A decade of wasted cores)
2024 南京大学《操作系统:设计与实现》
真实的处理器调度

多处理器调度的困境

既不能简单地 “分配线程到处理器”

  • 线程退出,瞬间处理器开始围观

也不能简单地 “谁空丢给谁”

  • 在处理器之间迁移会导致 cache/TLB 全都白给

多处理器调度的两难境地

  • 迁移?可能过一会儿还得移回来
  • 不迁移?造成处理器的浪费
    • 建模、预测、决策,没有一个是容易做的
2024 南京大学《操作系统:设计与实现》
真实的处理器调度

不要高兴得太早 (3)

实际情况 (1): NUMA

  • Non-uniform memory access
  • 共享内存密集型程序在远/近 CPU 上性能差达到数倍

实际情况 (2): 多用户

  • 单线程的 A 和 10,000 线程的 B 在 CFS 上共享 CPU……?
    • Linux 有了 namespaces (2002) 和 cgroups (2008)
    • 操作系统中的 “虚拟操作系统”

实际情况 (3): 异构处理器

  • Intel Core Ultra 7: 6P (×\times 2T) + 8E + 2LPE
2024 南京大学《操作系统:设计与实现》
真实的处理器调度

不要高兴得太早 (4)

程序执行比你想象得复杂

  • 基本的假设可能不再成立
  • 例子: more CPU time, more progress
    • 让我们看看求和
$ time taskset -c 0   sum-atomic
$ time taskset -c 0,1 sum-atomic

更少的处理器,反而更快

  • 系统里进程的行为和交互是非常复杂的……
    • NUMA 里尤其重要
    • (当然上面的例子是个 performance bug)
2024 南京大学《操作系统:设计与实现》
真实的处理器调度

不要高兴得太早 (5)

CPU Hot-plug

  • 这是一个 Kernel feature
    • 我们的 CPU 是有缺陷
    • (当然,也有的系统支持物理的 hot-plug)
  • 😂😂😂 我讲不下去了

复杂的系统无人可以掌控

2024 南京大学《操作系统:设计与实现》
真实的处理器调度

不要高兴得太早 (6)

分布式系统

  • 单个机器无法胜任计算任务,多个机器来凑
  • 无法避免的节点失效网络延迟

异构计算

  • CPU 无法胜任计算任务,GPU/NPU 来凑

期待一个调度问题的终极解决方案

  • 建模:“系统是什么”、“发生了什么”、“我们能做什么”
  • 预测:在假想的 “做什么” 基础上预测未来系统的行为
  • 决策:评估预测结果,作出对系统最有利的选择
2024 南京大学《操作系统:设计与实现》