首页 > 系统相关 >linux 系统CPU 上下文切换(Context Switch)概念

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

时间:2024-10-08 13:45:01浏览次数:6  
标签:操作系统 任务 Switch 线程 切换 Context linux 上下文 CPU

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

 

标签:操作系统,任务,Switch,线程,切换,Context,linux,上下文,CPU
From: https://www.cnblogs.com/rtnb/p/18451478

相关文章

  • 从零搭建Xswitch进行测试
    1xswitch官网拉取社区版xwitchdocker镜像,编译之,修改.env文件,把docker跑起来,这个是核心服务跑起来如下,端口映射不需要管,他内部做好的,默认sip使用7060前端ws连接端口 8081wss连接端口8082 2自己照着官网ES6demo例子写Vetro例子,我是用的vue搞的前端页面3编译vue......
  • Linux文件系统锁示意图
    字节偏移锁:file结构体是内核对于打开文件的结构体表示,可以在其上对指定的偏移量进行加锁,只锁定需要读写的部分,主要为了避免加锁整个文件。文件加锁:直接对inode结构体进行加锁,因为inode结构体代表了一个文件,从而实现对文件的加锁。page加锁:page是文件系统在内存中的表示结构,inode......
  • Linux /proc/diskstats 各列输出详解
    /proc/diskstats文件是Linux内核提供的一种机制,用于展示系统中块设备的I/O统计信息。这些统计信息对于监控和分析磁盘性能至关重要。下面是对/proc/diskstats文件结构和各列含义的详细解释: 输出示例:2532vda2333371127173934622055545228915601127915234897706739......
  • Linux基础命令uptime详解
    uptime 命令在Linux中用于显示系统的运行时间、当前登录用户数以及系统负载信息。这个命令非常简单,但是它提供的信息对系统管理员和用户来说非常有用。基本语法uptime[OPTION...]输出说明当你运行 uptime 命令时,输出通常包含以下几个部分:当前时间:系统当前的时间。......
  • Linux--审计工具Audit
    一、简介Linux审计系统提供了一种方式来跟踪系统上与安全相关的信息,根据预配置的规则,审计会生成日志条目,来尽可能多地记录系统上所发生的事件的相关信息。对于关键任务环境而言至关重要,可用来确定安全策略的违反者及其所执行的操作,便于在发生网络入侵等安全事件时,能够为追踪溯源......
  • Linux配置conda环境
    Linux配置conda环境配置conda环境打开终端,输入命令下载##wget加网址,中间可以加-c参数,断点续传wgethttps://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh下载好了后,输入bash文件名来安装,等待一会后,在看完协议后按下yes确认,在默认......
  • 【内核】【转载】记一次Linux Hung Task分析过程
    vmcore-dmesg.txt截图如下,崩溃栈里面有我们产品的驱动,现在要分析出是不是我们导致的。系统崩溃是因为触发了hungtask检测条件,系统panic了。所谓hungtask,就是进程的状态为D状态,即TASK_UNINTERRUPTIBLE状态,短时间的D状态是正常的,长时间就会有问题了,可能系统IO有问题,也可能其他bug......
  • 4、Linux中断系统中的重要数据结构
    本节内容,可以从request_irq(include/linux/interrupt.h)函数一路分析得到。能弄清楚下面这个图,对Linux中断系统的掌握也基本到位了 最核心的结构体是irq_desc,之前为了易于理解,我们说在Linux内核中有一个中断数组,对于每一个硬件中断,都有一个数组项,这个数组就是irq_desc......
  • Centos linux6 中/etc/rc.d/rc.sysinit配置文件的作用
    系统初始化脚本功能设置主机名设置欢迎信息激活udev和selinux挂载/etc/fstab文件中定义的文件系统检测根文件系统,并以读写方式重新挂载根文件系统设置系统时钟激活swap设备根据/etc/sysctl.conf文件设置内核参数激活lvm及softwareraid设备加载额外设备的驱动程序清理操作......
  • 深入理解Linux进程调度(下)
    一、SMP管理在继续讲解之前,我们先来说一下多CPU管理(这里的CPU是指逻辑CPU,在很多语境中CPU都是默认指的逻辑CPU,物理CPU要特别强调是物理CPU)。最开始的时候计算机都是单CPU的,叫做UP(Uni-Processor),操作系统也只支持UP。后来计算机慢慢发展成了多CPU(包括多物理CPU和多核技术),于是......