news 2026/6/29 18:06:30

第13天:上下文切换:进程切换的底层原理与开销分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第13天:上下文切换:进程切换的底层原理与开销分析

从"接力赛"到"换跑道":揭秘Linux进程切换的幕后故事

想象一下,在一个繁忙的体育场内,数十名运动员在不同的跑道上奔跑。裁判需要不断地吹哨,让运动员们轮流上场。这个场景,恰如Linux内核中的调度器——它需要在数十甚至数百个进程之间快速切换,让每个进程都有机会在CPU上"奔跑"。今天,让我们深入探究这个"换跑道"的过程——上下文切换,理解其底层原理与性能开销。


一、什么是上下文切换?

上下文切换(Context Switch) 是指操作系统内核暂停当前正在执行的进程,保存其执行状态(上下文),然后恢复另一个进程的上下文并使其继续执行的过程。

核心目的

  • 实现多任务并发执行
  • 公平地分配CPU时间给各个进程
  • 让用户感觉多个程序在同时运行

触发场景

  • 进程时间片用完(定时器中断)
  • 进程等待I/O操作
  • 高优先级进程就绪
  • 进程主动放弃CPU(如sleep)

二、上下文切换的核心数据结构

在Linux中,进程的上下文主要存储在task_struct结构体和相关的数据结构中:

struct task_struct {     volatile long state;    /* 进程状态 */     void *stack;            /* 进程内核栈指针 */     unsigned int flags;     /* 进程标志位 */     int prio, static_prio, normal_prio;  /* 优先级 */     struct list_head tasks; /* 进程链表 */     struct mm_struct *mm;   /* 内存描述符(用户空间) */     struct mm_struct *active_mm; /* 活跃内存描述符 */     struct files_struct *files; /* 文件描述符表 */     struct signal_struct *signal; /* 信号处理 */     struct thread_struct thread; /* CPU寄存器上下文 */     // ... 更多字段 };

thread_struct结构体 - 存储线程特定数据

struct thread_struct {     struct fpu_struct fpu;  /* FPU/SIMD状态 */     unsigned long cr2;      /* 页错误地址 */     unsigned long trap_no;  /* 陷阱号 */     unsigned long error_code; /* 错误码 */     struct task_struct *task;  /* 指向所属进程 */     // ... 更多字段 };

pt_regs结构体 - 中断/异常时的寄存器快照

struct pt_regs {     unsigned long r15;     unsigned long r14;     unsigned long r13;     unsigned long r12;     unsigned long bp;     unsigned long bx;     unsigned long r11;     unsigned long r10;     unsigned long r9;     unsigned long r8;     unsigned long ax;     unsigned long cx;     unsigned long dx;     unsigned long si;     unsigned long di;     unsigned long orig_ax;     unsigned long ip;       /* 指令指针 */     unsigned long cs;     unsigned long flags;     unsigned long sp;       /* 栈指针 */     unsigned long ss;     // ... 更多字段 };

关键上下文信息

  1. CPU寄存器状态:中断/异常时保存到pt_regs,线程切换时部分保存到内核栈
  2. 内存管理信息mm_struct包含页表(pgd)、虚拟地址空间映射
  3. 文件描述符表files_struct管理打开的文件句柄
  4. 信号处理状态:待处理的信号和信号处理函数
  5. FPU/SIMD状态:存储在thread_struct.fpu中,采用Lazy FPU机制延迟保存

三、上下文切换的执行流程

在Linux内核中,上下文切换主要通过switch_to宏实现,定义在arch/x86/include/asm/switch_to.h中。整个过程分为三个核心阶段:

阶段一:进程调度与准备

调度器首先从运行队列中选择下一个要执行的进程:

struct task_struct *pick_next_task(struct rq *rq) {     const struct sched_class *class;     struct task_struct *p;          for_
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/29 18:03:33

DeepEP 代码阅读指南

DeepEP 代码阅读指南 第一阶段:理解整体架构(30 分钟) 先看顶层结构,建立心智模型: deep_ep/ ← Python API(用户入口) ├── __init__.py ← 导出 Buffer, ElasticBuffer, EPHandle 等 ├── buffers/ │ ├── legacy.py ← V1 Buffer…

作者头像 李华
网站建设 2026/6/29 18:02:28

经典算法实例:有效的回旋镖

我们先来看题目描述:给定一个数组 points ,其中 points [ i ] [ xi, yi ] 表示 X-Y 平面上的一个点,如果这些点构成一个回旋镖则返回 true 。回旋镖定义为一组三个点,这些点各不相同且不在一条直线上 。示例 1 :输入:…

作者头像 李华
网站建设 2026/6/29 17:54:48

2026沧州黄金回收白银回收铂金回收旧料回收怎么选?五家高实价铂金白银线下门店测评清单 + 联系方式

沧州的大街小巷,黄金回收、白银回收、铂金回收的招牌鳞次栉比,旧料回收市场鱼龙混杂,市民想要甄别靠谱变现渠道实属不易。为帮大家火眼金睛挑出诚信商户,小编实地走访多家门店,筛选出本地正规回收清单。收录商户既有连…

作者头像 李华
网站建设 2026/6/29 17:53:51

猫抓浏览器扩展:视频资源嗅探与下载的终极解决方案

猫抓浏览器扩展:视频资源嗅探与下载的终极解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为无法保存网页视频而烦恼吗&am…

作者头像 李华
网站建设 2026/6/29 17:52:31

2026年企业安全运营中心建设:甲方视角下的实战指南

当前安全圈有一种论调特别流行:买SIEM、上SOAR、搞态势感知,就能建好安全运营中心。作为一个在甲方干了快10年安全的老兵,我负责任地说一句——全TM是扯淡。一、什么才是真正的安全运营中心SOC不是一套系统,不是一块大屏&#xff…

作者头像 李华