当前位置: 首页 > article >正文

深入理解Linux系统进程切换

目录

引言

一、什么是进程切换?

二、进程切换的触发条件

三、进程切换的详细步骤

1、保存当前进程上下文:

2、更新进程控制块(PCB):

3、选择下一个进程:

4、恢复新进程上下文:

5、切换地址空间:

6、恢复执行:

四、Linux中的实现细节

五、x86架构下的进程切换

六、进程切换的性能开销 

七、进程切换 vs 线程切换

八、实际观察进程切换

总结:


引言

        在Linux这样的多任务操作系统中,进程切换(context switching)是核心功能之一。它允许多个进程"同时"运行在单个CPU上,通过快速切换创造并行执行的假象。理解进程切换的机制对于系统性能调优、内核开发以及深入理解操作系统原理都至关重要。

一、什么是进程切换?

        进程切换是指操作系统将CPU从一个正在运行的进程转移到另一个就绪进程的过程。这一过程需要保存当前进程的状态(上下文),并恢复下一个进程的保存状态。

        关键点:

  • 上下文(Context):包含CPU寄存器、程序计数器、栈指针等
  • 由内核调度器触发
  • 是抢占式多任务的基础

二、进程切换的触发条件

  1. 时间片耗尽:进程用完分配的时间量(由完全公平调度器CFS决定)
  2. 系统调用:进程执行系统调用导致阻塞(如I/O操作)
  3. 中断处理:硬件中断导致当前进程被抢占 
  4. 优先级变化:更高优先级进程变为可运行状态

三、进程切换的详细步骤

1、保存当前进程上下文:

  • 保存通用寄存器

  • 保存程序计数器(PC)

  • 保存栈指针(SP)

  • 保存程序状态字(PSW)

2、更新进程控制块(PCB)

  • 更新进程状态(从运行→就绪/阻塞)
  • 保存内存管理信息(如页表)

3、选择下一个进程:

  • 调度器根据策略选择最合适的进程

4、恢复新进程上下文:

  • 恢复寄存器
  • 恢复程序计数器
  • 恢复栈指针
  • 恢复程序状态字

5、切换地址空间:

  • 切换页表(如果新进程有不同的地址空间)
  • 刷新TLB

6、恢复执行:

  • 从保存的程序计数器位置继续执行

四、Linux中的实现细节

        在Linux内核中,进程切换主要通过context_switch()函数实现(位于kernel/sched/core.c):

static __always_inline struct rq *
context_switch(struct rq *rq, struct task_struct *prev,struct task_struct *next, struct rq_flags *rf)
{struct mm_struct *mm, *oldmm;prepare_task_switch(rq, prev, next);mm = next->mm;oldmm = prev->active_mm;// 地址空间切换if (!mm) {next->active_mm = oldmm;mmgrab(oldmm);enter_lazy_tlb(oldmm, next);} elseswitch_mm_irqs_off(oldmm, mm, next);// 切换寄存器状态和栈switch_to(prev, next, prev);return finish_task_switch(prev);
}

        关键组成部分:

1.  switch_mm():处理内存管理单元(MMU)相关的切换  

2.  switch_to():架构相关的寄存器切换(通常用汇编实现)  

3.  TLB处理:处理转换后备缓冲区的刷新

五、x86架构下的进程切换

        在x86架构中,switch_to宏最终会展开为类似以下的汇编代码:

movq %rsp, TASK_threadsp(%rdi)  # 保存旧进程的栈指针
movq TASK_threadsp(%rsi), %rsp  # 加载新进程的栈指针# 保存和恢复其他寄存器
pushq %rbp
pushq %rbx
pushq %r12
pushq %r13
pushq %r14
pushq %r15movq %rsp, TASK_threadsp(%rdi)
movq TASK_threadsp(%rsi), %rsppopq %r15
popq %r14
popq %r13
popq %r12
popq %rbx
popq %rbp

六、进程切换的性能开销 

        进程切换不是免费的,主要开销来自:

        1.  直接开销:

  • 保存/恢复寄存器
  • TLB刷新导致的缓存失效
  •  调度器决策时间    

         2.  间接开销:

  • 缓存污染(新进程使用不同内存区域)
  • 分支预测器需要重新学习

优化方法:

  • 减少不必要的切换(调整调度器参数)

  • 使用线程代替进程(共享地址空间)

  • 考虑CPU亲和性(减少缓存失效)

七、进程切换 vs 线程切换

特性 进程切换线程切换
地址空间需要切换不需要切换
资源开销
TLB影响需要刷新通常不需要刷新
IPC需要显式机制可通过共享内存

八、实际观察进程切换

        可以使用Linux工具观察进程切换:

1、vmstat:查看系统范围的上下文切换次数

vmstat 1

2、pidstat:查看特定进程的上下文切换

pidstat -w 1

 3、perf:性能分析

perf stat -e context-switches,cpu-migrations <command>

总结:

        进程切换是Linux多任务能力的基石,理解其机制有助于:

         •  编写更高效的系统级代码  

         •  进行系统性能调优  

         •  深入理解操作系统原理  

         •  调试复杂的并发问题  

        虽然现代处理器和Linux内核已经对进程切换做了大量优化,但在高性能场景下,减少不必要的上下文切换仍然是提升性能的重要手段。

相关文章:

深入理解Linux系统进程切换

目录 引言 一、什么是进程切换&#xff1f; 二、进程切换的触发条件 三、进程切换的详细步骤 1、保存当前进程上下文&#xff1a; 2、更新进程控制块(PCB)&#xff1a; 3、选择下一个进程&#xff1a; 4、恢复新进程上下文&#xff1a; 5、切换地址空间&#xff1a; 6…...

网络安全运维实训室建设方案

一、网络安全运维人才需求与实训困境 在数字化时代&#xff0c;网络安全已成为国家安全、社会稳定和经济发展的重要基石。随着信息技术的飞速发展&#xff0c;网络安全威胁日益复杂多样&#xff0c;从个人隐私泄露到企业商业机密被盗&#xff0c;从关键基础设施遭受攻击到社会…...

DBeaver 连接mysql报错:CLIENT_PLUGIN_AUTH is required

DBeaver 连接mysql报错&#xff1a;CLIENT_PLUGIN_AUTH is required 一、必须要看这个 >> &#xff1a;参考文献 二、补充 2.1 说明 MySQL5、6这些版本比较老&#xff0c;而DBeaver默认下载的是MySQL8的连接库&#xff0c;所以连接旧版本mysql报错&#xff1a;CLIEN…...

联通专线赋能,亿林网络裸金属服务器:中小企业 IT 架构升级优选方案

在当今数字化飞速发展的时代&#xff0c;中小企业面临着日益增长的业务需求与复杂多变的市场竞争环境。如何构建高效、稳定且具性价比的 IT 架构&#xff0c;成为众多企业突破发展瓶颈的关键所在。而亿林网络推出的 24 核 32G 裸金属服务器&#xff0c;搭配联通专线的千兆共享带…...

Web3时代的数据保护挑战与应对策略

随着互联网技术的飞速发展&#xff0c;我们正步入Web3时代&#xff0c;这是一个以去中心化、用户主权和数据隐私为核心的新时代。然而&#xff0c;Web3时代也带来了前所未有的数据保护挑战。本文将探讨这些挑战&#xff0c;并提出相应的应对策略。 数据隐私挑战 在Web3时代&a…...

Qwen3与MCP协议:重塑大气科学的智能研究范式

在气象研究领域&#xff0c;从海量数据的解析到复杂气候模型的构建&#xff0c;科研人员长期面临效率低、门槛高、易出错的挑战。而阿里云推出的Qwen3大模型与MCP协议的结合&#xff0c;正通过混合推理模式与标准化协同机制&#xff0c;为大气科学注入全新活力。本文将深入解析…...

CppCon 2015 学习:Benchmarking C++ Code

关于性能问题与调试传统 bug&#xff08;如段错误&#xff09;之间差异的分析。以下是对这一页内容的详细解释&#xff1a; 主题&#xff1a;传统问题&#xff08;如段错误&#xff09;调试流程清晰 问题类型&#xff1a;段错误&#xff08;Segmentation Fault&#xff09; …...

URL 结构说明+路由(接口)的认识

一、URL 结构说明 以这个为例&#xff1a;http://127.0.0.1:5000/zhouleifeng 1.组成部分: http://&#xff1a;协议 127.0.0.1&#xff1a;主机&#xff08;本地地址&#xff09; :5000&#xff1a;端口号&#xff08;Flask 默认 5000&#xff09; /zhouleifeng&#xff1a…...

省赛中药检测模型调优

目录 一、baseline性能二、baseline DETR head三、baseline RepC3K2四、baseline RepC3K2 SimSPPF五、baseline RepC3K2 SimSPPF LK-C2PSA界面1.引入库2.读入数据 总结 一、baseline性能 Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size120/120 …...

linux 故障处置通用流程-36计+1计

通用标准处置快速索引 编号 通 用 标 准 处 置 索 引 001 Linux操作系统标准关闭 002 Linux操作系统标准重启 003 Linux操作系统强行关闭 004 Linux操作系统强行重启 005 检查Linux操作系统CPU负载 006 查询占用CPU资源最多的进程 007 检查Linux操…...

​BEV和OCC学习-3:mmdet3d 坐标系

目录 坐标系 转向角 (yaw) 的定义 框尺寸的定义 与支持的数据集的原始坐标系的关系 KITTI Waymo NuScenes Lyft ScanNet SUN RGB-D S3DIS 坐标系 坐标系 — MMDetection3D 1.4.0 文档https://mmdetection3d.readthedocs.io/zh-cn/latest/user_guides/coord_sys_tuto…...

[蓝桥杯]图形排版

图形排版 题目描述 小明需要在一篇文档中加入 NN 张图片&#xff0c;其中第 ii 张图片的宽度是 WiWi​&#xff0c;高度是 HiHi​。 假设纸张的宽度是 MM&#xff0c;小明使用的文档编辑工具会用以下方式对图片进行自动排版&#xff1a; 1. 该工具会按照图片顺序&#xff0…...

【Linux仓库】冯诺依曼体系结构与操作系统【进程·壹】

&#x1f31f; 各位看官好&#xff0c;我是&#xff01; &#x1f30d; Linux Linux is not Unix &#xff01; &#x1f680; 今天来学习冯诺依曼体系结构与操作系统。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享给更多人哦&#xff0…...

CloudFront 加速详解:AWS CDN 怎么用?

让全球访问更快速稳定&#xff0c;深入解读 AWS 的内容分发网络 在上一篇中&#xff0c;我们介绍了 Amazon S3 对象存储&#xff0c;它非常适合托管静态资源&#xff0c;比如图片、视频、网页等。但你可能遇到过这样的问题&#xff1a; “我把网站静态文件部署到了 S3&#xf…...

《高级架构师》------- 考后感想

笔者来聊一下架构师考后的感想 复习备考 考前过了很多知识点&#xff0c;只是蜻蜓点水&#xff0c;没有起到复习的作用&#xff0c;即使考出来也不会&#xff0c;下次复习注意这个&#xff0c;复习到了&#xff0c;就记住&#xff0c;或者画出来&#xff0c;或者文件总结&…...

【iOS】YYModel源码解析

YYModel源码解析 文章目录 YYModel源码解析前言YYModel性能优势YYModel简介YYClassInfo解析YYClassIvarInfo && objc_ivarYYClassMethodInfo && objc_methodYYClassPropertyInfo && property_tYYClassInfo && objc_class YYClassInfo的初始化细…...

C++算法训练营 Day6 哈希表(1)

1.有效的字母异位词 LeetCode&#xff1a;242.有效的字母异位词 给定两个字符串s和t &#xff0c;编写一个函数来判断t是否是s的字母异位词。 示例 1: 输入: s “anagram”, t “nagaram” 输出: true 示例 2: 输入: s “rat”, t “car” 输出: false 解题思路&#xff…...

【C语言编译与链接】--翻译环境和运行环境,预处理,编译,汇编,链接

目录 一.翻译环境和运行环境 二.翻译环境 2.1--预处理(预编译) 2.2--编译 2.2.1--词法分析 2.2.2--语法分析 2.2.3--语义分析 2.3--汇编 2.4--链接 三.运行环境 &#x1f525;个人主页&#xff1a;草莓熊Lotso的个人主页 &#x1f3ac;作者简介&#xff1a;C研发…...

【JavaEE】多线程

8.线程状态 根据 Java 的Thread.state包&#xff0c;线程一共有六种状态&#xff1a; NEWRUNNABLEBLOCKEDWAITINGTIMED_WAITINGTERMINATED 二、每种状态的含义 1. NEW&#xff08;新建&#xff09; 当使用new 关键字创建一个线程对象&#xff0c;但尚未调用其start() 方法时…...

【项目】在线OJ(负载均衡式)

目录 一、项目目标 二、开发环境 1.技术栈 2.开发环境 三、项目树 目录结构 功能逻辑 编写思路 四、编码 1.complie_server 服务功能 代码蓝图 开发编译功能 日志功能 ​编辑 测试编译模块 开发运行功能 设置运行限制 jsoncpp 编写CR 如何生成唯一文件名 …...

贪心算法应用:在线租赁问题详解

贪心算法应用&#xff1a;在线租赁问题详解 贪心算法是一种在每一步选择中都采取当前状态下最优的选择&#xff0c;从而希望导致结果是全局最优的算法策略。在线租赁问题(Greedy Algorithm for Online Rentals)是一个经典的贪心算法应用场景&#xff0c;下面我将从多个维度全面…...

torch.zeros()用法简介

torch.zeros()是PyTorch中用于创建全零张量的核心函数&#xff0c;其功能和使用方法如下&#xff1a; 1. ‌基本语法‌ torch.zeros(*size, outNone, dtypeNone, layouttorch.strided, deviceNone, requires_gradFalse)参数说明&#xff1a; *size&#xff1a;定义张量形状的…...

Prj10--8088单板机C语言8259测试(1)

1.原理图 2.Deepseek示例代码 #include <dos.h> #include <conio.h> #include <stdio.h>#define PIC1_CMD 0x400 // 命令端口 (A00) #define PIC1_DATA 0x401 // 数据端口 (A01)volatile int int_count 0; // 中断计数器 void interrupt (*old_isr)(…...

3步在小米13手机跑DeepSeek R1

大家好&#xff01;我是羊仔&#xff0c;专注AI工具、智能体、编程。 一、从性能旗舰到AI主机 春节大扫除时&#xff0c;翻出尘封的小米13&#xff0c;这台曾以骁龙8 Gen2著称的性能小钢炮&#xff0c;如今正在执行更科幻的使命——本地运行DeepSeek R1。 想起两年前用它连续肝…...

数智管理学(十六)

二、分布式网络型结构的特点 分布式网络型结构是一种去中心化、扁平化和协作性的组织模式&#xff0c;与传统金字塔型结构形成鲜明对比。它通过赋予团队和个体更大的自主权&#xff0c;提升组织的灵活性和响应能力。 &#xff08;一&#xff09;节点化组织 1.模块化团队构成…...

注销微软账户

因为我的微软开发者账户丢失 Office E5 权限&#xff0c;因此需要注销。 若你需要注销微软账号&#xff0c;请点击下方超链接。 点击此处 注销之后仅剩一个正常的账户使用咯&#xff01;&#xff01;...

Ubuntu 服务器软件更新,以及常用软件安装 —— 一步一步配置 Ubuntu Server 的 NodeJS 服务器详细实录 3

前言 前面&#xff0c;我们已经 安装好了 Ubuntu 服务器系统&#xff0c;并且 配置好了 ssh 免密登录服务器 &#xff0c;现在&#xff0c;我们要来进一步的设置服务器。 那么&#xff0c;本文&#xff0c;就是进行服务器的系统更新&#xff0c;以及常用软件的安装 调整 Ubu…...

Mysql常用知识3:Kafka和数据库优化

文章目录 一、分布式消息系统&#xff08;Kafka相关问题5-10&#xff09;5. Kafka如何保证消息不丢失&#xff1f;6. 项目中Kafka具体怎么使用的&#xff1f;7. 消息异常未发送成功怎么解决&#xff1f;8. 重试具体怎么做的&#xff0c;循环吗&#xff1f;9. 重试多次失败怎么办…...

Milvus单机模式安装和试用

1.安装ollama的package包&#xff1b; # install package pip install -U langchain-ollama2.我们直接使用ChatOllama实例化模型&#xff0c;并通过invoke进行调用&#xff1b; from langchain_ollama import ChatOllamallm ChatOllama(model"deepseek-r1") messa…...

飞牛NAS+Docker技术搭建个人博客站:公网远程部署实战指南

文章目录 前言1. Docker下载源设置2. Docker下载WordPress3. Docker部署Mysql数据库4. WordPress 参数设置5. 飞牛云安装Cpolar工具6. 固定Cpolar公网地址7. 修改WordPress配置文件8. 公网域名访问WordPress总结 前言 在数字化浪潮中&#xff0c;传统网站搭建方式正面临前所未…...