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

Java基础夯实——2.7 线程上下文切换

线程上下文切换(Thread Context Switching)是操作系统在多线程环境中,切换CPU从执行一个线程的上下文到另一个线程的上下文的过程。这种切换是实现多线程并发执行的核心机制之一。

1 上下文:

线程的上下文指线程在某一时刻的执行状态,如:

  1. CPU寄存器状态:线程当前的指令地址(程序计数器)以及其他寄存器的值。
  2. 栈信息:线程的调用栈,包含函数调用信息和局部变量。
  3. 线程本地存储:线程相关的局部变量和特定资源。
  4. 线程控制块(TCB):操作系统维护的线程管理数据结构,记录线程的优先级、状态等。

2 上下文切换过程

保存当前线程的上下文
操作系统暂停当前线程的执行,并保存其上下文信息到线程控制块(Thread Control Block, TCB)中。

选择下一个要运行的线程
操作系统的调度器根据调度策略(如优先级、时间片轮转等)从就绪队列中选出一个可以运行的线程。

加载目标线程的上下文
调度器将选中的目标线程的上下文从其线程控制块(TCB)中恢复到CPU中。恢复的内容包括:

  • 恢复程序计数器,使CPU能够继续执行目标线程的下一条指令。
  • 恢复寄存器的状态,确保目标线程的执行环境与切换前一致。
  • 恢复堆栈指针和线程本地存储,保证调用栈和局部变量的正确性。

更新线程状态

  • 将目标线程的状态从“就绪”更新为“运行”。
  • 将前一个线程的状态更新为“阻塞”或“就绪”(取决于切换原因)。

恢复执行目标线程
目标线程的上下文完全加载到CPU后,操作系统将控制权交还给CPU,继续执行目标线程的下一条指令。这一过程对程序透明,线程不会感知到发生了上下文切换。

3 线程上下文切换的关键点

  • 中断机制:大多数上下文切换通过中断触发,确保系统能够在适当时机检查需要切换的条件。
  • 线程控制块(TCB):保存和管理线程上下文的核心数据结构。
  • 调度器决策:根据调度算法选择下一线程,平衡系统性能和资源利用率。

4 上下文切换的触发条件

线程上下文切换通常发生在以下情况:

  1. 时间片耗尽:在时间片轮转调度中,当前线程运行时间用尽,操作系统切换到下一个线程。
  2. 线程阻塞:线程因I/O操作或资源不可用进入阻塞状态,操作系统调度其他线程执行。
  3. 高优先级线程就绪:更高优先级的线程准备好运行时,操作系统可能抢占当前线程。
  4. 用户主动切换:通过API(如yield)让出CPU使用权。

5 上下文切换的开销

线程上下文切换会引入一定的性能开销,包括:

  1. CPU开销:保存和恢复寄存器状态以及其他上下文信息。
  2. 缓存污染:切换线程可能导致CPU缓存失效(Cache Miss),因为新线程的数据未必在缓存中。
  3. 操作系统调度延迟:调度器需要决定下一个运行的线程,这也会耗费时间。

6 减少上下文切换的方法

  1. 使用协程:协程切换在用户态完成,开销比线程切换小。
  2. 优化线程数:根据实际工作负载合理分配线程,避免过多线程导致频繁切换。
  3. 提高代码效率:减少线程阻塞的可能性,尽量让线程在可运行状态下持续工作。

7 相关问题

1. 什么是线程上下文切换?

线程上下文切换是指操作系统将CPU的执行权从一个线程切换到另一个线程的过程,用于实现并发执行。

核心概念:

  • 线程上下文:指线程的执行状态,包括:
    • 程序计数器(PC):记录线程正在执行的指令位置。
    • CPU寄存器内容:保存线程正在处理的数据和指令信息。
    • 栈指针(SP):指向线程的调用栈,用于管理函数调用和局部变量。
    • 线程控制块(TCB):记录线程的元信息,如优先级、状态等。

切换过程:

  • 保存当前线程状态:暂停线程运行,将其上下文保存到内存。
  • 加载目标线程状态:从目标线程的线程控制块中恢复其上下文,准备继续执行。

触发条件:

  • 时间片耗尽。
  • 当前线程阻塞(如等待I/O)。
  • 高优先级线程需要运行。
  • 用户主动调用切换API。

2. CPU时间片轮询机制

CPU时间片轮询机制(Time-Slice Round Robin)是一种操作系统调度策略,用于在多个线程或进程之间公平分配CPU资源。

  • 时间片(Time Slice):操作系统为每个线程分配的一段CPU执行时间。
  • 轮询机制(Round Robin):线程按照固定顺序排队,依次获得CPU时间片。

工作原理:

  1. 调度器将线程放入就绪队列。
  2. CPU运行队列中的第一个线程,并计时。
  3. 时间片耗尽:
    • 如果线程未完成任务,则保存其上下文,并将其放回队列末尾。
    • 如果线程完成任务,则从队列中移除。
  4. 调度器运行队列中的下一个线程。

适用场景:

  • 适用于对交互响应要求较高的系统,如桌面操作系统。
  • 不适合对实时性要求严格的系统。

相关文章:

Java基础夯实——2.7 线程上下文切换

线程上下文切换(Thread Context Switching)是操作系统在多线程环境中,切换CPU从执行一个线程的上下文到另一个线程的上下文的过程。这种切换是实现多线程并发执行的核心机制之一。 1 上下文: 线程的上下文指线程在某一时刻的执行状态,如&am…...

死锁相关习题 10道 附详解

2022 设系统中有三种类型的资源(A,B,C)和五个进程(P1,P2,P3,P4,P5),A资源的数量是17,B资源的数量是6,C资源的数量是19。在T0时刻系统的状态: 最大资源需求量已分配资源量A,B,CA,B,…...

VisionPro 机器视觉案例 之 彩色保险丝个数统计

第十四篇 机器视觉案例 之 彩色保险丝颜色识别个数统计 文章目录 第十四篇 机器视觉案例 之 彩色保险丝颜色识别个数统计1.案例要求2.实现思路2.1 方法一 颜色分离工具CogColorSegmenterTool将每一种颜色分离出来,得到对应的单独图像,使用斑点工具CogBlo…...

go-zero(七) RPC服务和ETCD

go-zero 实现 RPC 服务 在实际的开发中,我们是通过RPC来传递数据的,下面我将通过一个简单的示例,说明如何使用go-zero框架和 Protocol Buffers 定义 RPC 服务。 一、生成 RPC项目 在这个教程中,我们根据user.api文件&#xff0…...

Jenkins + gitee 自动触发项目拉取部署(Webhook配置)

目录 前言 Generic Webhook Trigger 插件 下载插件 ​编辑 配置WebHook 生成tocken 总结 前言 前文简单介绍了Jenkins环境搭建,本文主要来介绍一下如何使用 WebHook 触发自动拉取构建项目; Generic Webhook Trigger 插件 实现代码推送后,触…...

043 商品详情

文章目录 详情页数据表结构voSkuItemVo.javaSkuItemSaleAttrVo.javaAttrValueAndSkuIdVo.javaSpuAttrGroupVo.javaGroupAttrParamVo.java pom.xmlSkuSaleAttrValueDao.xmlSkuSaleAttrValueDao.javaAttrGroupDao.xmlAttrGroupServiceImpl.javaSkuInfoServiceImpl.javaSkuSaleAtt…...

【人工智能】Python与Scikit-learn的模型选择与调参:用GridSearchCV和RandomizedSearchCV提升模型性能

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在机器学习建模过程中,模型的表现往往取决于参数的选择与优化。Scikit-learn提供了便捷的工具GridSearchCV和RandomizedSearchCV,帮助我们在参数空间中搜索最佳组合以提升模型表现。本文将从理论和实践两个角度…...

深入探讨 Puppeteer 如何使用 X 和 Y 坐标实现鼠标移动

背景介绍 现代爬虫技术中,模拟人类行为已成为绕过反爬虫系统的关键策略之一。无论是模拟用户点击、滚动,还是鼠标的轨迹移动,都可以为爬虫脚本带来更高的“伪装性”。在众多的自动化工具中,Puppeteer作为一个无头浏览器控制库&am…...

<OS 有关> ubuntu 24 不同版本介绍 安装 Vmware tools

原因 想用 apt-get download 存到本地 / NAS上,减少网络流浪。 看到 VMware 上的确实有 ubuntu,只是版本是16。 ubuntu 版本比较:LTS vs RR LTS: Long-Term Support 长周期支持, 一般每 2 年更新,会更可靠与更稳定…...

C#调用JAVA

参考教程:使用IKVMC转换Jar为dll动态库(含idea打包jar方法)-CSDN博客 已经实践过,好使。...

JavaEE-多线程基础知识

文章目录 前言与回顾创建一个多线程线程的创建以及运行机制简述step1: 继承Thread类step2: 实现Runable接口step3: 基于step1使用匿名内部类step4: 基于step2使用匿名内部类step5: 基于step4使用lambda表达式(推荐) Thread的常见方法关于jconsole监视线程的工具构造方法解析获取…...

Pulid:pure and lightning id customization via contrastive alignment

1.introduction 基于微调的方案,对每个id进行定制需要花费数十分钟。另一项研究则放弃了对每个id进行微调,而是选择在一个庞大的肖像数据集上预训练一个id适配器。这些方法通常利用编码器例如clip来提取id特征,提取的特征随后以特定方式例如嵌入到cross attention集成到基础…...

什么是GraphQL,有什么特点

什么是GraphQL? GraphQL 是一种用于 API(应用程序编程接口)的查询语言,由 Facebook 在 2012 年开发,并于 2015 年开源。它提供了一种更高效、强大的方式来获取和操作数据,与传统的 RESTful API 相比&#…...

Java项目-基于SpringBoot+vue的租房网站设计与实现

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...

【SQL Server】华中农业大学空间数据库实验报告 实验三 数据操作

1.实验目的 熟悉了解掌握SQL Server软件的基本操作与使用方法,以及通过理论课学习与实验参考书的帮助,熟练掌握使用T-SQL语句和交互式方法对数据表进行插入数据、修改数据、删除数据等等的操作;作为后续实验的基础,根据实验要求重…...

【大数据学习 | Spark】RDD的概念与Spark任务的执行流程

1. RDD的设计背景 在实际应用中,存在许多迭代式计算,这些应用场景的共同之处是,不同计算阶段之间会重用中间结果,即一个阶段的输出结果会作为下一个阶段的输入。但是,目前的MapReduce框架都是把中间结果写入到HDFS中&…...

ruoyi框架完成分库分表,按月自动建表功能

前提 这个分库分表功能,按月自动建表,做的比较久了,还没上线,是在ruoyi框架内做的,踩了不少坑,但是已经实现了,就分享一下代码吧 参考 先分享一些参考文章 【若依系列】集成ShardingSphere S…...

Antd中的布局组件

文章目录 一、Layout二、Menu三、Grid栅格 布局组件涉及项目框架的搭建,往往被忽略和低关注,毕竟不是经常用到,但是在调整项目结构的时候往往又需要重新设计布局,所以有必要提前归纳分析; 一、Layout Layout导出Sider,…...

一文详解kafka知识点

目录 1、kafka定义 2、消息队列 2.1、产品选择 2.2、应用场景 2.3、消息队列的两种模式 3、kafka架构 4、kafka生产者 4.1、kafka生产者原理 4.2、kafka生产者异步发送 4.3、同步发送 4.4、分区 4.4.1、kafka分区好处 4.4.2、分区策略 4.4.3、自定义分区 4.5、生成吞…...

C语言基础学习:抽象数据类型(ADT)

基础概念 抽象数据类型(ADT)是一种数据类型,它定义了一组数据以及可以在这组数据上执行的操作,但隐藏了数据的具体存储方式和实现细节。在C语言中,抽象数据类型(ADT)是一种非常重要的概念&…...

PHP和Node.js哪个更爽?

先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...

Monorepo架构: Nx Cloud 扩展能力与缓存加速

借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...