linux 系统CPU 上下文切换(Context Switch)概念

news/2024/12/21 20:28:10/文章来源:https://www.cnblogs.com/rtnb/p/18451478

CPU 上下文切换(Context Switch) 是操作系统调度程序在不同任务之间切换 CPU 执行的过程。上下文切换的核心是保存当前任务的状态(也叫“上下文”),然后恢复下一个任务的状态,最终交给 CPU 执行。这种切换可能发生在进程、线程或者内核级别的不同上下文之间。

上下文切换的详细过程

  1. 保存当前任务的上下文

    • 当前任务可能是一个进程或线程,它在执行时会占用 CPU 的各种资源,如寄存器、程序计数器、栈指针等。
    • 当操作系统决定让 CPU 执行另一个任务时,必须先把当前任务的这些状态信息保存到内存中,以便在以后恢复。
  2. 选择下一个任务

    • 操作系统的调度程序(scheduler)会根据一定的策略来决定下一个应该执行的任务。这种策略可以是先到先服务、优先级调度、轮转调度等。
    • 调度程序查找任务队列,决定哪个任务接下来要被运行。
  3. 加载新任务的上下文

    • 一旦下一个任务被选定,操作系统需要恢复这个任务之前保存的上下文。
    • 这包括恢复该任务的寄存器状态、程序计数器等,确保这个任务从它上次中断的地方继续执行。
  4. 切换控制权到新任务

    • 最后,CPU 控制权会被交给新任务,该任务开始在 CPU 上运行。
    • 这样,CPU 就从一个任务切换到了另一个任务,完成一次上下文切换。

上下文切换的类型

  1. 进程上下文切换

    • 进程是具有独立内存空间的程序实例,因此进程切换时,需要保存和恢复的状态较多。
    • 切换进程时,操作系统需要切换 CPU 的寄存器、程序计数器、堆栈指针等,还要更新内存映射表(因为每个进程都有独立的内存地址空间)。
  2. 线程上下文切换

    • 线程是进程中的执行单元,它们共享进程的内存空间,因此线程切换相对于进程切换要轻量一些。
    • 线程切换只需要保存和恢复线程特有的寄存器状态、程序计数器等,而不需要切换内存空间。
  3. 用户态和内核态之间的上下文切换

    • 当用户态的应用程序调用系统调用进入内核态时,也会发生上下文切换。
    • 这种切换通常比进程或线程之间的切换更快,因为涉及的状态较少。

上下文切换的开销

虽然上下文切换对多任务操作系统至关重要,但它也有一定的开销,主要包括以下几个方面:

  1. CPU 时间

    • 上下文切换不是无成本的操作。每次切换都要花费 CPU 时间保存和恢复上下文,这个过程涉及多次内存访问和寄存器操作。
    • 高频繁的上下文切换可能会消耗大量的 CPU 时间,导致系统性能下降。
  2. 缓存污染

    • CPU 有高速缓存(cache),用于存储常用数据。当切换到另一个任务时,之前的任务数据可能还留在缓存中,但新任务需要不同的数据,这会导致缓存未命中,从而降低性能。
  3. 内存管理

    • 对于进程切换,还需要更新内存管理单元(MMU)中的页面表或 TLB(Translation Lookaside Buffer,地址转换高速缓存)。这个过程会产生额外的开销。

上下文切换的原因

  • 时间片耗尽:在时间片轮转调度算法中,每个任务都被分配一定的 CPU 时间,当时间片用完后,操作系统会进行上下文切换,将 CPU 分配给其他任务。
  • 高优先级任务出现:当一个优先级更高的任务需要执行时,操作系统会中断当前任务,进行上下文切换。
  • 阻塞/等待资源:如果一个任务在执行过程中需要等待某个资源(如 I/O 操作),它会被挂起,操作系统会切换到其他任务。
  • 系统调用:当用户态的程序请求内核服务时,CPU 会从用户态切换到内核态,并执行系统调用,完成后再切回用户态。

上下文切换的优化

  1. 减少上下文切换频率:通过优化应用程序的任务调度,减少不必要的切换。
  2. 提升调度策略:更智能的调度算法可以减少无谓的切换,例如避免 CPU 在多个低优先级任务之间频繁切换。
  3. 硬件支持:现代 CPU 提供硬件级别的优化,例如 TLB 缓存技术,用于加快地址转换,减少上下文切换的开销。

总结

CPU 上下文切换是操作系统多任务处理的关键机制,通过在不同任务之间切换,操作系统可以让多个任务“并行”运行。但是,频繁的上下文切换会导致性能开销,因此在设计操作系统调度和应用程序时,需要尽量减少不必要的上下文切换,以提高系统性能。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/809922.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

phpvulhunter工具:静态 php 代码审计

phpvulhunter是一款PHP源码自动化审计工具,通过这个工具,可以对一些开源CMS进行自动化的代码审计,并生成漏洞报告。 1、安装 首先从github上进行获取: git clone https://github.com/OneSourceCat/phpvulhunter2、下载完成后,将工程目录放置于 WAMP 等 PHP-Web 运行环境中…

YOLOv8-seg训练与推理

1.YOLOv8-seg简介 YOLOv8-seg是YOLO系列模型的其中一个版本。YOLOv8-seg在继承YOLO系列模型高效性和准确性的基础上,增加了实例分割的能力。 2.数据集使用的数据集较简单,主要以下目录:images:存放原始图片(1500张),大小为128x128。部分如下: images_json:存放labelme标注的…

易基因: cfMeDIP-seq揭示cfDNA甲基化高效区分原发性和转移性前列腺|Nat Commun

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 前列腺癌(Prostate cancer,PCa)是男性中第二常见的恶性肿瘤,也是全球癌症相关死亡的第三大原因。虽然大多数原发性前列腺癌可以治愈,但转移性前列腺癌患者的5年生存率仍低至30%。大多数患者很快就会发展成…

从零搭建Xswitch进行测试

1 xswitch官网 拉取社区版xwitch docker镜像,编译之,修改.env文件 ,把docker跑起来,这个是核心服务 跑起来如下,端口映射不需要管,他内部做好的,默认sip使用7060 前端ws连接端口 8081 wss连接端口 8082 2 自己照着官网ES6 demo 例子写 Vetro 例子,我是用的vue搞的前端…

【日记】医生拆线居然还能没拆干净(1796 字)

正文早上拆线,医院的门诊登记簿上写名字排队。我前面人还挺多。不过医生问过前面的情况之后,就先给我做了,因为拆线快。等我到市里转车,吃过饭后才发现,那个医生拆线没拆干净…… 吃了饭感觉口腔里还是有奇怪的东西,那个粗糙的质感,确定是线头没错了……找了个酒店的卫生…

Docker 学习笔记-基本概念与安装

Docker 学习笔记 基本概念镜像:Docker 的镜像概念类似于虚拟机里的镜像,是一个只读的模板,一个独立的文件系统,包括运行容器所需的数据,可以用来创建新的容器。 DockerFile;镜像可以基于 DockerFile 构建,DockerFile 是一个描述文件,里面包含若干条命令,每条命令都会对…

面相快速入门教程7木型

7 木型 在本章中,我将介绍木型的基础知识,你将学会如何识别木型。首先,我们来快速参考一下木的特征:能量:向上、推动、活跃、早晨、春天、童年 特质:乐观、热情、活跃、人道主义、自信、愤怒、沮丧、冲动、反应灵敏、直接、敏锐、实际、逻辑性强、有条理、果断、有判断力…

1个月手把手教授搭建交易系统

1、资料领取 2、指导学习资料 3、完成观念的搭建 4、进行交易系统的初步搭建 5、对交易系统进行回测并且给予优化建议 6、完成交易系统的优化并且进行回测 学会了上述内容后,就能够自己搭建自己的交易系统了。 目前学费5万,线下教学,包教会。食宿由学员提供,只招收1人。

把token放到请求头中

1.前端(_axios + upload)2.后端(认证文件中)

操作系统错误点

一:操作系统概述 1. 用户界面是指用户接口 命令接口 程序接口操作环境2. 从用户观点看 操作系统就是用户与计算机硬件之间的接口 3. 从资源管理观点看 操作系统是计算机资源的管理者 4. 图形用户接口采用图形化操作界面 用于查看和操作应用程序或文档的是对话框 5. 用户程序请…

操作系统基础第三讲

操作系统基础第三讲 处理机调度与死锁考点一:处理机调度 1. 处理机调度的基本概念处理机调度的引入处理机调度的层次高级调度低级调度中级调度2. 处理机调度的方式抢占式方式非抢占式3,选择调度算法的若干准则面向用户的准则COU利用率:利用率=忙碌时间/总时间系统吞吐量系统…