什么是时间片?


一则或许对你有用的小广告

欢迎加入小哈的星球,你将获得:专属的实战项目(4个项目都能学) / 1v1 提问 / 简历修改 / Java 学习路线 / 社群讨论 / 学习打卡 / 每月赠书

  • 《Spring AI 项目实战(问答机器人、RAG 智能客服、联网搜索)》已完结,基于 Spring AI + Spring Boot 3.x + JDK 21...查看介绍

  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...查看介绍;演示链接:http://116.62.199.48:7070/

  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接:http://116.62.199.48/

  • 新开坑项目:《从零手撸:秒杀系统高并发优化实战》 正在更新中...,查看介绍

截止目前,星球内专栏累计输出 150w+ 字,讲解图 5110+ 张,还在持续爆肝中.. 后续还会上新更多项目,已有 4700+ 小伙伴加入学习,欢迎点击围观

面试考察点

  1. 基础概念掌握度:面试官想知道你是否清楚时间片的定义、作用,以及它在分时系统里的地位。
  2. 调度算法理解:时间片是轮转调度(RR)、CFS 这类调度算法的核心参数,面试官想看看你能不能顺着时间片把调度算法串起来。
  3. 性能权衡意识:时间片设大了像独占,设小了上下文切换太频繁,考察你对性能取舍的理解。

核心答案

时间片(Time Slice / Time Quantum),也叫 时间配额时间额度,就是操作系统在分时调度中分配给每个就绪进程/线程占用 CPU 跑的一小段固定时间。

一句话总结:CPU 时间被切成一小段一小段,轮流分给每个进程,谁也别想一直霸占

时间片轮流调度
时间片轮流调度

项目 说明
本质 CPU 时间的一段配额
典型大小 几毫秒到几十毫秒(Linux CFS 中通过 sched_latency 动态计算)
用完之后 触发时钟中断,调度器切换到下一个就绪进程
作用 实现分时、公平调度、避免某个进程独占 CPU

深度解析

一、时间片是怎么工作的

CPU 被切分成一段段时间,每个进程按调度算法排队轮流上 CPU 执行。时间片用完,操作系统强制把它从 CPU 上 "拽" 下来,换下一个进程。

时间片轮转调度
时间片轮转调度

上图展示的就是经典 轮转调度(Round Robin, RR) 的执行过程:

  • 公平排队:每个进程获得同样长度的时间片,谁也不能霸占 CPU
  • 时钟中断驱动:时间片到点,硬件时钟会发出中断,CPU 被动让出执行权,操作系统接管
  • 上下文切换:切换时要保存当前进程的寄存器、PC、内存映射等信息,再恢复下一个进程的状态,这个过程有开销

这块当年我学的时候绕了挺久,关键是理解 "时间片用完 → 时钟中断 → 调度器介入 → 上下文切换" 这条链路。

时间片调度切换
时间片调度切换

二、时间片大小怎么定

时间片的大小是个典型的 trade-off

  • 太大:接近独占模式,响应慢,交互体验差,但上下文切换开销小
  • 太小:看起来更公平,响应快,但上下文切换频繁,CPU 时间大量浪费在切换上

经验上,时间片一般设为 10ms - 200ms 之间,既得让用户感觉不到延迟,又不能让切换开销吃掉太多 CPU。

三、Linux 是怎么做的:CFS 完全公平调度

传统的 RR 给每个进程同样的时间片,但 Linux 从 2.6.23 开始引入了 CFS(Completely Fair Scheduler,完全公平调度),由内核开发者 Ingo Molnar 实现,思路完全不同,不再分配固定时间片,改成按进程权重动态分配。

CFS 的核心是 sched_latency(调度延迟),常见默认值 6ms(实际值按 750000 * (1 + ilog(ncpus)) 动态计算,会随 CPU 数量变化,新内核版本中可能更高,比如 24ms,可通过 /proc/sys/kernel/sched_latency_ns 查询调整)。它表示所有可运行进程 "跑完一轮" 的目标总时间。每个进程的实际时间片就等于 sched_latency / 进程数

举个例子:sched_latency 为 6ms,当前有 3 个同优先级进程,那么每个进程分到 2ms。进程多了,每个分到的就少;进程少了,每个分到的就多。优先级高的进程权重高,时间片也会更长。

另外,CFS 还有一个 sched_min_granularity(最小调度粒度),默认 0.75ms,确保每个进程至少能跑这么久,避免时间片被切得太碎。

/proc/sys/kernel/sched_latency_ns      # 目标调度延迟,默认 6000000ns = 6ms
/proc/sys/kernel/sched_min_granularity # 单个进程最小运行粒度,默认 0.75ms
/proc/sys/kernel/sched_wakeup_granularity # 唤醒抢占粒度

时间片大小与 CFS
时间片大小与 CFS

顺带提一句:CFS 在 Linux 6.6(2023 年) 已经被更新的 EEVDF 调度器(Earliest Eligible Virtual Deadline First)替代。新内核的同学查到的资料可能跟上面写的不一样,这很正常。

四、和时间片绑定的几个关键概念

  • 上下文切换(Context Switch):时间片用完后的动作,现代 x86 Linux 上单次开销大概在 1-7 微秒 之间,常见范围 1.3-3.5 µs。听着不大,但高并发场景下累积起来很可观
  • 抢占式调度(Preemptive):时间片到点会强制抢占,不管进程愿不愿意
  • 时钟中断(Timer Interrupt):硬件定时器周期性触发,是时间片机制的物理基础

面试高频追问

  1. 时间片用完后,进程状态怎么变化?
    • 从 "运行态" 变成 "就绪态",进入就绪队列等待下次调度。
  2. 时间片设大设小各有什么问题?
    • 太大退化成独占,响应慢;太小上下文切换开销大,CPU 利用率低。
  3. Linux CFS 是怎么决定时间片的?
    • 基于 sched_latency 和进程权重动态分配,不再是固定值。
  4. 什么是上下文切换?为什么它影响性能?
    • 保存旧进程状态、加载新进程状态的过程,频繁切换会大量消耗 CPU。

常见面试变体

  • "为什么需要时间片?"
  • "时间片大小如何影响系统性能?"
  • "Linux 的 CFS 调度器和传统轮转调度有什么区别?"
  • "上下文切换的开销主要在哪?"

记忆口诀

时间片 = CPU 时间的 "切片面包",一人一片轮流吃,吃完排队下一轮;设大像独占,设小全在切,Linux 用 CFS 按权重动态分。

总结

时间片是操作系统实现分时、公平调度的最小时间单位。光记住 "一段 CPU 时间" 这个定义不够,还得把它和时钟中断、上下文切换、调度算法(RR、CFS)串起来想,这才是面试官真正想看到的。