上下文切换与性能:每个开发人员都应该知道的事情

主要观点:上下文切换是操作系统内核中最昂贵的操作之一,会影响系统性能,但在繁忙系统中是必要的。本文解码了上下文切换背后的硬件和软件动态。
关键信息

  • 进程的硬件上下文主要包括寄存器状态和页表表示的虚拟内存。
  • 上下文切换原因常见的是进程用完分配的 CPU 时间或阻塞自己。
  • 上下文切换有直接成本(执行切换所需的工作量)和间接成本(CPU 缓存、指令流水线等状态丢失)。
  • L1 数据和指令缓存、TLB、CPU 流水线、分支预测器状态等在上下文切换中会受影响。
  • 上下文切换会影响应用程序性能,直接成本约 1000 - 2000 CPU 周期,间接成本包括 TLB 缺失、缓存刷新、流水线刷新、分支预测错误等。
  • 现代处理器通过 ASID 等技术减少 TLB 刷新,但仍可能因竞争而导致 TLB 数据被驱逐。
  • 不同类型的 CPU 缓存在上下文切换中的处理方式不同,现代处理器通常不刷新 CPU 数据缓存。
  • 上下文切换会导致 CPU 流水线刷新,影响指令吞吐量,分支预测器状态在切换后会重建,可能导致分支预测错误。
  • 近年来出现的 Spectre 和 Meltdown 等漏洞促使内核采取措施,包括在上下文切换时进行 TLB、缓存等刷新,但这些措施的必要性在不断变化。
    重要细节
  • 硬件通过页表将虚拟地址转换为物理地址,内核在上下文切换时需保存和更新页表地址。
  • 上下文切换的具体机制较复杂,代码示例展示了 Linux 内核中的上下文切换过程。
  • 不同研究对上下文切换的直接成本测量有所不同,最新数据可能因硬件和内核而异。
  • 介绍了四种类型的缓存及其在上下文切换中的特性,如 VIPT 缓存通常不需要刷新。
  • 分支预测器利用 BTB 和 BHB 跟踪分支历史,上下文切换会影响其状态和性能。
  • 处理器制造商通过微代码更新和硬件改进减少上下文切换时的刷新需求。
  • 为避免关键进程被上下文切换,可将其固定在特定 CPU 上或使用用户空间线程和调度器。
  • 提供了相关研究和资料的链接,如关于上下文切换成本的研究报告等。
阅读 5
0 条评论