07. 就该这么学并发 - 上下文切换

操作系统(八)上下文切换的开销?如何减少上下文切换开销? 本文深入分析了上下文切换的开销,包括任务状态保存、选择下一个待执行任务及其上下文恢复的过程。直接开销涉及寄存器数据量的保存与恢复,特别是对于具有大量数据的FPU、MMX、SSE、AVX等寄存器,以及内核更新统计数据和调度算法的选择。间接开销主要与缓存失效(如L1~L3 cache miss和TLB cache miss)相关,可能导致显著的性能损耗。文章还讨论了PCID对TLB管理的影响,以及在不同场景下可能带来的开销。此外,提到了启动新线程或进程时的非紧密相关开销,以及量化上下文切换开销的复杂性,包括硬件 阅读详情

前言

前面的几章, 我们有提到个名词“上下文切换”

这是个什么东西呢?

其实很好理解, 我们看一本书籍时,往往间隔的看(很少有人一天看完的吧?!), 那么如何保证自己下次是从上一次断点处看呢? 显而易见, 我们用书签!

“上下文切换”就是计算机的“书签”.

本章,我们来学习“上下文切换”原理以及如何减少“上下文切换”.

在此之前, 还得先复习下前面提到的进程和线程, 因为上下文切换的对象就是进程和线程.

线程与进程

进程是操作系统的管理单位,也是系统分配资源的基本单位;

线程则是进程的管理单位, 也是是CPU调度的基本单位;

线程依托于进程, 一个进程至少包含一个线程;

线程在Linux系统中就是能并行运行并且与他们的父进程(创建他们的进程)共享同一地址空间(一段内存区域)和其他资源的轻量级进程

一个线程指的是进程中一个单一顺序的控制流

不管是在单线程还是多线程中, 每个线程都有

  • 一个程序计数器

记录要执行的下一条指令;

程序计数器是一个专用的寄存器,用于表明指令序列中 CPU 正在执行的位置,存的值为正在执行的指令的位置或者下一个将要被执行的指令的位置,具体依赖于特定的系统.

  • 一组寄存器

保存当前线程的工作变量

寄存器是CPU 内部数量较少但是速度很快的内存(与之对应的是 CPU 外部相对较慢的 RAM 主内存).寄存器通过对常用值(通常是运算的中间值)的快速访问来提高计算机程序运行的速度.

  • 堆栈

记录执行历史,其中每一帧保存了一个已经调用但未返回的过程

进程&线程表项

上下文切换

上下文切换针对的是多任务处理的系统,

多任务处理系统指的是同时运行两个或多个程序的系统.

在多任务处理系统中, CPU需要处理所有程序的操作, 当用户来回切换它们时, 需要记录这些程序执行到哪里.

上下文切换就是这样一个过程:

允许CPU记录并恢复各种正在运行程序的状态,使它能够完成切换操作

多任务系统往往需要同时执行多道作业, 作业数往往大于机器的CPU数.

然而, 一颗CPU同时只能执行一项任务, 如何让用户感觉这些任务正在同时进行呢?

操作系统的设计者 巧妙地利用了时间片轮转的方式:

CPU给每个任务都运行一定的时间, 然后把当前任务的状态保存下来,
再加载下一任务的状态后, 继续服务下一任务.

任务的状态保存及再加载,这段过程就叫做上下文切换.

时间片轮转的方式使多个任务在同一颗CPU上执行变成了可能.

任务的状态保存及再加载, 这段过程就叫做上下文切换

上下文切换(有时也称做进程切换或任务切换)是指:

CPU从一个进程或线程切换到另一个进程或线程.

上下文切换可以认为是内核(操作系统的核心)在 CPU 上对于进程(或线程)进行以下的活动:

  • 挂起一个进程

将这个进程在 CPU 中的状态(上下文)存储于内存中的某处

  • 恢复一个进程

在内存中检索下一个进程的上下文并将其在 CPU 的寄存器中恢复

  • 跳转到程序计数器所指向的位置

即跳转到进程被中断时的代码行, 以恢复该进程

切换种类

上下文切换在不同的场合有不同的含义

上下文切换种类描述
线程切换同一进程中的两个线程之间的切换
进程切换两个进程之间的切换
模式切换在给定线程中,用户模式和内核模式的切换
地址空间切换将虚拟内存切换到物理内存

切换步骤

在上下文切换过程中, CPU会停止处理当前运行的程序, 并保存当前程序运行的具体位置以便之后继续运行.

从这个角度来看, 上下文切换有点像我们同时阅读几本书,来回切换书本的同时, 我们需要记住每本书当前读到的页码.

在程序中, 上下文切换过程中的“页码”信息是保存在进程控制块(PCB, process control block)中的, PCB还经常被称作“切换桢”(switchframe).

“页码”信息会一直保存到CPU的内存中,直到他们被再次使用.

PCB通常是系统内存占用区中的一个连续存区,
它存放着操作系统用于描述进程情况及控制进程运行所需的全部信息.

它的作用主要是“使一个在多道程序环境下不能独立进行的程序(含数据), 成为一个能独立运行的基本单位, 一个能与其他进程并发执行的进程.

或者说, 操作系统是根据PCB来对并发执行的进程进行控制和管理.

举个例子, 两个进程A和B, 系统需要从A切换到B:

  1. 保存进程A的状态(寄存器和操作系统数据);
  2. 更新PCB中的信息,对进程A的“运行态”做出相应更改;
  3. 将进程A的PCB放入相关状态的队列;
  4. 将进程B的PCB信息改为“运行态”,并执行进程B;
  5. B执行完后,从队列中取出进程A的PCB,恢复进程A被切换时的上下文,继续执行A;

进程/线程上下文切换差异

线程切换和进程切换的步骤是有差异的

主要体现在性能和地址空间上.

  • 性能上

进程的上下文切换需要两步

  1. 切换页目录以使用新的地址空间;
  2. 切换内核栈和硬件上下文;

线程的上下文切换只需一步

  1. 切换内核栈和硬件上下文;

进程上下文切换比线程上下文切换多了步骤1, 所以明显是进程切换代价大.

  • 地址空间

对于Linux来说, 线程和进程的最大区别就在于地址空间.
线程的切换虚拟内存空间依然是相同的,
而进程切换是不同的.

这两种上下文切换的处理都是通过操作系统内核来完成的.

内核的这种切换过程最显著的性能损耗是将寄存器中的内容切换出.

一个正在执行的进程包括程序计数器、寄存器、变量的当前值等,

这些数据都是保存在CPU的寄存器中的,并且这些寄存器只能是正在使用CPU的进程才能使用.

在进程切换时,

首先得保存上一个进程的这些数据

主要为了下次获得CPU的使用权时,从上次的中断处开始继续顺序执行,
而不是返回到进程开始,否则每次进程重新获得CPU时所处理的任务都是上一次的重复,永远也到不了进程的结束,
因为一个进程几乎不可能执行完所有任务后才释放CPU

然后将本次获得CPU的进程的这些数据装入CPU的寄存器, 从上次断点处继续执行剩下的任务.

操作系统为了便于管理系统内部进程,为每个进程创建了一张进程表项:

进程表项

切换查看

在Linux系统下可以使用vmstat命令来查看上下文切换的次数

image.png

vmstat 1指每秒统计一次, 其中cs列就是指上下文切换的数目.

切换原因

引起线程上下文切换的原因,主要存在三种情况如下:

  • 中断处理

在中断处理中, 其他程序”打断”了当前正在运行的程序.
当CPU接收到中断请求时, 会在正在运行的程序和发起中断请求的程序之间进行一次上下文切换.
中断分为硬件中断和软件中断,
软件中断包括因为IO阻塞、未抢到资源或者用户代码等原因,线程被挂起.

  • 多任务处理

在多任务处理中,CPU会在不同程序之间来回切换,每个程序都有相应的处理时间片,CPU在两个时间片的间隔中进行上下文切换.

  • 用户态切换

对于一些操作系统,当进行用户态切换时也会进行一次上下文切换,虽然这不是必须的.

对于我们经常使用的抢占式操作系统而言,引起线程上下文切换的原因大概有以下几种:

  • 当前执行任务的时间片用完之后,系统CPU正常调度下一个任务

  • 当前执行任务碰到IO阻塞,调度器将此任务挂起,继续下一任务

  • 多个任务抢占锁资源,当前任务没有抢到锁资源,被调度器挂起,继续下一任务

  • 用户代码挂起当前任务,让出CPU时间

  • 硬件中断

切换损耗

上下文切换会带来直接和间接两种因素影响程序性能的消耗.

  • 直接消耗
  • CPU寄存器需要保存和加载
  • 系统调度器的代码需要执行
  • TLB实例需要重新加载
  • CPU 的pipeline需要刷掉
  • 间接消耗
  • 多核的cache之间得共享数据
    间接消耗对于程序的影响要看线程工作区操作数据的大小;

如何减少切换

上下文切换会导致额外的开销, 因此减少上下文切换次数便可以提高多线程程序的运行效率.

但上下文切换又分为2种:

  • 让步式上下文切换

即执行线程主动释放CPU,与锁竞争严重程度成正比;
可通过减少锁竞争来避免;

  • 抢占式上下文切换

指线程因分配的时间片用尽, 而被迫放弃CPU或者被其他优先级更高的线程所抢占;
一般由于线程数大于CPU可用核心数引起;
可通过调整线程数,适当减少线程数来避免.

减少上下文切换的方法如下

  • 无锁并发

多线程竞争时,会引起上下文切换;
所以多线程处理数据时,可以用一些办法来避免使用锁;
如将数据的ID按照Hash取模分段,不同的线程处理不同段的数据;

  • CAS算法

Java的Atomic包使用CAS算法来更新数据,而不需要加锁;

  • 最少线程

避免创建不需要的线程;
比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态;

  • 使用协程

在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换;

合理控制线程数目

合理设置线程数目,关键点是

  • 尽量减少线程切换和管理的开支

要求线程数尽量少,这样可以减少线程切换和管理的开支;

  • 最大化利用CPU

要求尽量多的线程,以保证CPU资源最大化的利用;

针对不同的实际情况,我们需要采取合理的措施:

  • 对于任务耗时短的情况:

要求线程尽量少,如果线程太多,有可能出现线程切换和管理的时间,大于任务执行的时间, 那效率就低了;

  • 对于耗时长的任务:

要分是CPU任务,还是IO等类型的任务.
如果是CPU类型的任务,线程数不宜太多;
如果是IO类型的任务,线程多一些更好,可以更充分利用CPU.

  • 对于高并发,低耗时的情况:

建议少线程, 只要满足并发即可;
因为上下文切换本来就多,并且高并发就意味着CPU是处于繁忙状态的,
增加更多地线程也不会让线程得到执行时间片,反而会增加线程切换的开销;
例如并发100,线程池可能设置为10就可以.

  • 对于低并发,高耗时的情况:

建议多线程, 保证有空闲线程, 接受新的任务.
例如并发10,线程池可能就要设置为20;

  • 对于高并发高耗时:
  • 要分析任务类型;
  • 增加排队;
  • 加大线程数;

请关注我的订阅号

订阅号.png

告别虚拟机!在Windows上用WSL+VSCode搞定ArduPilot开发环境(保姆级避坑指南) 本文提供了一份详细的保姆级指南,介绍如何在Windows上使用WSL和VSCode搭建高效的ArduPilot开发环境,告别虚拟机性能损耗。从WSL安装、VSCode配置到ArduPilot固件编译和调试技巧,涵盖开发全流程中的关键步骤和常见问题解决方案,帮助无人机开发者快速构建专业级开发环境。 阅读详情

相关推荐

OpenDRIVE车道计算避坑指南:为什么你的poly3曲线总对不齐?

本文深入解析OpenDRIVE标准中车道几何计算的三大核心难题:参数化三次多项式(ParamPoly3)的坐标系转换与参数映射、车道偏移与宽度的优先级判定,以及螺旋线(Spiral)接续的平滑性保障。通过实战案例与代码示例,提供了一套避免车道线错位与曲率不连续的精确计算与验证方法,是高精地图开发与仿真场景构建的实用避坑指南。

q9w8e7r6t5的博客 421

计算机综合面经

操作系统 ①进程和线程区别 进程是运⾏行行中的程序,线程是进程的内部的⼀一个执⾏行行序列列 进程是资源分配的单元,线程是执⾏单元 进程间切换代价大,线程间切换代价小 进程拥有资源多,线程拥有资源少 多个线程共享进程的资源 2、进程切换代价为什么比线程大: 进程切换时必须保存当前进程的状态,保存上下文 在进程内切换线程,进程的资源是各个线程共享的不用切换。 ②进程间有哪些通信方式 1.管道( pipe ):管道是⼀一种半双⼯工的通信⽅方式,数据只能单向流动,⽽而且只能在具有亲缘关 系的进程间使⽤用。进程的亲

weixin_46283997的博客 727

Flowable高级篇 -6.8.0 最全表结构说明-主要表结构字段注释

flowable 28张表 详细

billzhen的博客 1万+

线程上下文切换和进程上下文切换的区别

线程上下文切换和进程上下问切换一个最主要的区别是线程的切换虚拟内存空间依然是相同的,但是进程切换是不同的。这两种上下文切换的处理都是通过操作系统内核来完成的。内核的这种切换过程伴随的最显著的性能损耗是将寄存器中的内容切换出。 另外一个隐藏的损耗是上下文的切换会扰乱处理器的缓存机制。简单的说,一旦去切换上下文,处理器中所有已经缓存的内存地址一瞬间都作废了。还有一个显著的区别是当你改变虚拟内存空

wuxinke_blog的专栏 2503

STM32 Proteu直流电机正反转控制系统限位开关-0035

硬件组成:STM32F103C6单片机 +L298N电机控制电路+直流电机+3个按键(正转、反转、停止)+LED指示灯(正转、反转、停止)+限位开关(正限位 反限位) 1.通过3个按键(正转、反转、停止)控制电机的正转、反转、停止。 2.有3个LED指示灯,正转时正转指示灯亮。反转停止对应反转停止指示灯亮。 3.有自动正转反转停止功能,正转时当正限位按键按下时说明正转到最大距离。此时自动停止。反转一样。

zhaxiaobian_er的博客 2002

基于Python的SEC Edgar文件高效爬取:最新技术与实战指南

本文详细介绍了如何使用Python最新技术高效爬取SEC Edgar数据库中的金融文件。我们将探讨SEC Edgar系统的结构、合法爬取注意事项,并使用现代Python库如Requests-HTML、aiohttp和Playwright实现多种爬取方案。文章包含完整的代码示例、性能优化技巧以及数据处理方法,为金融数据分析师、研究人员和开发者提供全面指导。关键词:SEC Edgar、Python爬虫、金融数据、异步爬取、Playwright、XBRL解析。

2201_76125261的博客 633

线程切换怎么样一个流程?

点击上方“朱小厮的博客”,选择“设为星标”后台回复"书",获取后台回复“k8s”,可领取k8s资料进程切换分两步:1.切换页目录以使用新的地址空间2.切换内核栈和硬件上下文...

朱小厮的博客 3443

SAR合成孔径雷达成像及处理(附带Matlab源代码)

总结:本文介绍了SAR合成孔径雷达的基本原理,并提供了使用Matlab实现SAR成像和处理的源代码示例。然后,在慢时间域进行方位压缩处理,通过计算每个接收通道的延迟和频移,将多次接收的信号叠加得到最终的成像结果。SAR成像的基本原理是通过接收雷达发射的脉冲信号的回波,并利用多次接收的信号进行叠加处理。以多普勒频移校正为例,根据雷达飞行速度和方位角,计算实际的多普勒频率,并对每个接收通道的数据进行频移校正,以消除因目标运动引起的频率偏移。通过调整参数和算法,可以实现不同的SAR成像和处理效果。

ByteJolt的博客 688

进程上下文切换与和线程上下文切换有什么区别?

1、首先,需要搞明白什么是上下文切换?(面试题) 上下文切换就是从当前执行任务切换到另一个任务执行的过程。但是,为了确保下次能从正确的位置继续执行,在切换之前,会保存上一个任务的状态。 2、 然后,需要明白进程与线程的区别?(网上很多,这里简单说明) 1).线程是进程的一部分。 进程是表示资源分配的基本单位,又是调度运行的基本单位,是程序执行的一个实例; 线程是进程中执行运算的最小单位,即执行处理...

slass-mot-odet 2010

【异常】Claude Code 第三方API 400报错(thinking type should be enabled or disabled)解决方案

摘要: Claude Code接入第三方API端点时出现400参数错误,主要因新版默认启用的Adaptive Thinking功能与旧版接口参数格式不兼容(需thinking: {type: "adaptive"},但第三方仅支持布尔值)。解决方案为修改本地settings.json配置文件,添加"CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING": "1"环境变量并重启客户端,即可恢复思考模式功能。Adaptive Th

奶爸的编程之路,也就一周冷个三天 1万+

学Simulink--基于风力发电系统的场景实例:海上风电场在复杂海况下的动态响应仿真

本实例将创建一个针对海上风电场在复杂海况下的动态响应模型。该模型不仅考虑了不同风速条件的影响,还引入了波浪和水流对风机塔架及基础结构的影响。通过仿真验证系统的有效性,并探索最佳控制参数设置以提高整体性能和稳定性。本教程展示了如何在Simulink中实现一个海上风电场在复杂海况下的动态响应仿真模型,并分析其性能。通过这种方式,我们不仅可以验证所提出的技术手段在提高海上风电场稳定性和效率方面的有效性,还能进一步探索优化参数以适应特定的应用场景。

xiaoheshang_123的博客 167

系统上下文切换分析

这是多任务操作系统的一个重要功能,但频繁的上下文切换可能会导致性能下降,因为每次上下文切换都涉及保存和恢复CPU状态,这会消耗CPU时间。在这种情况下,CPU的总使用率为6.9%(用户+系统),这表明CPU大部分时间是空闲的。在这种情况下,系统CPU使用率很高,特别是系统时间占比显著增加,同时上下文切换次数非常高,表明系统可能由于频繁的上下文切换导致性能瓶颈。在这种情况下,CPU使用率很低,表明系统大部分时间是空闲的,上下文切换次数虽然存在但并未对系统性能造成显著影响。表示上下文切换次数。

阿呆的专栏 1133

C#调用opencv的dll

opencv算法和界面配合,刚入职的时候尝试过,利用的MFC,调试起来很痛苦。 后来基本都没怎么用界面,DOS的黑窗口,opencv自带的显示界面及滑动条凑合着调试用。 最近有点时间,刚好双十一在一个视觉群里看到了一个讲C#调用opencv的dll的课程,鉴于群主也是那门课的讲师,在平时解答群员的问题的时候很细心,能力也很强,因此有了这篇文章。 根据相机不同动态调用相机默认的属性...

Learning by doing 2972

CPU 上下文切换理解

一、概念 Linux 是一个多任务操作系统,它支持远大于 CPU 数量的任务同时运行。当 然,这些任务实际上并不是真的在同时运行,而是因为系统在很短的时间内,将 CPU 轮流 分配给它们,造成多任务同时运行的错觉。 系统事先帮它设置好 CPU 寄存器和程序计数器,它们都是 CPU 在运行任何 任务前,必须的依赖环境,因此也被叫做 CPU 上下文。 CPU 上下文切换,就是先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转

yangzai_0551的博客 231

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

linux性能调优实战CPU性能篇(CPU上下文切换基础内容下)

Sysbench 是一个开源的模块化、跨平台的性能测试工具,主要用于评估和分析数据库和系统性能。它最初被设计为MySQL的基准测试工具,但随着时间的发展,它的功能已经扩展到支持多种数据库系统(如PostgreSQL、SQLite等)以及非数据库相关的系统性能测试,比如CPU、内存、线程、文件I/O等。主要特点:模块化设计:Sysbench包含多个模块,允许用户根据需求选择测试场景,包括CPU运算、内存操作、线程、I/O读写和数据库事务处理等。

qq_39523261的博客 1298

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

FreeRTOS任务调度(任务上下文切换)详解

在文章中对实时操作系统RTOS进行了移植。移植完成后由于PendSV_Handler、SVC_Handler、SysTick_Handler三个中断的影响使程序进入了硬件错误中断,。

weixin_46461874的博客 5625

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

07. Java线程上下文切换与死锁

理解线程的上下文切换,这是本节的辅助基础内容,从概念层面进行理解即可;了解什么是线程死锁,在并发编程中,线程死锁是一个致命的错误,死锁的概念是本节的重点之一;了解线程死锁的必备 4 要素,这是避免死锁的前提,了解死锁的必备要素,才能找到避免死锁的方式;掌握死锁的实现,通过代码实例,进行死锁的实现,深入体会什么是死锁,这是本节的重难点之一;掌握如何避免线程死锁,我们能够实现死锁,也可以避免死锁,这是本节内容的核心。定义。

这是一个web全栈开发的博客,取其精华去其糟粕,争取让大家一看就懂,一学就会,一用就成~ 1348

java上下文切换

它需要CPU停止当前进程的执行,保存状态,然后加载另一个进程的状态。恢复另一个任务的状态:操作系统接下来会选择另一个进程(或线程)执行,并加载该进程之前保存的执行上下文到CPU中,包括之前保存的程序计数器、寄存器值等。保存当前任务的状态:当操作系统决定将CPU从当前执行的进程(或线程)转移到另一个进程时,它首先需要保存当前进程的状态,包括程序计数器、寄存器值、内存状态等。继续执行新任务:一旦新的执行上下文被加载,操作系统就会开始执行新的进程(或线程),直到再次发生上下文切换或该进程完成其任务。

liu_rockefeller的博客 627

Java并发编程:多线程的代价(程序设计,上下文切换,资源消耗)

多线程虽然能显著提高程序的性能和响应性,但也带来了一些潜在的问题,如上下文切换的开销、资源消耗和程序设计复杂性。因此,在设计多线程程序时,应该仔细权衡这些因素,并采取适当的措施来减轻这些负面影响,比如合理地限制线程数量、使用线程池、选择合适的同步机制等。

qq_33240556的博客 777

Linux性能学习(1.4):CPU_如何查看CPU上下文切换参数

在前面大致了解了上下文切换的相关知识,那么如何在系统中查看上下文切换相关的参数?

Stoneshen的博客 1401

操作系统如何进行进程的上下文切换?

进程的上下文切换(Context Switch)是操作系统内核用来切换处理器执行的进程的机制。当进程的执行被中断,并且操作系统决定切换到另一个进程时,必须保存当前进程的状态(上下文)并恢复另一个进程的状态。上下文切换使得多个进程可以共享处理器资源,实现多任务操作。上下文切换是操作系统在多任务环境下管理进程的关键机制,尽管有一定的开销,但它使得操作系统能够高效地调度多个进程在单个处理器上运行。

m0_48022770的博客 872

2.2 CPU 上下文切换是什么意思?(下)

怎么查看系统的上下文切换情况 过多的上下文切换,会把 CPU 时间消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上,缩短进程真正运行的时间,成了系统性能大幅下降的一个 元凶。 使用 vmstat 这个工具,来查询系统的上下文切换情况。 vmstat 是一个常用的系统性能分析工具,主要用来分析系统的内存使用情况,也常用来分析 CPU 上下文切换和中断的次数。 vmstat 的使用示例: ...

Fadewalk 196

java 上下文一跳转就没了_java 上下文切换

上下文概念在高性能编程时,经常接触到多线程. 起初我们的理解是, 多个线程并行地执行总比单个线程要快, 就像多个人一起干活总比一个人干要快. 然而实际情况是, 多线程之间需要竞争IO设备, 或者竞争锁资源,导致往往执行速度还不如单个线程. 在这里有一个经常提及的概念就是: 上下文切换(Context Switch).上下文切换的精确定义可以参考:http://www.linfo.org/cont...

weixin_36165751的博客 239

线程是不是被描述为轻量级的?,线程之间的切换是否涉及改变内存上下文?

线程之间的切换确实涉及上下文切换,但这通常比进程间的上下文切换要轻量得多。线程切换主要涉及寄存器状态和堆栈指针的保存与恢复,而不会涉及内存上下文的改变,因为同一进程内的线程共享相同的内存空间。这种轻量级的特性使得线程成为实现并发执行的有效手段。

小超电子笔记 800

多线程上下文切换:详解与优化

多线程上下文切换是指CPU在执行多个线程时,快速切换它们的执行权,同时保存和恢复每个线程的运行状态(如寄存器、栈指针等)。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 5783
上一篇: 06. 就该这么学并发 - 如何保证线程安全
下一篇: 08. 今天, 小姐姐突然问了我一个问题……
码哥说
博客等级 码龄8年 5645粉丝 172原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码哥说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值