问:进程/线程上下文切换场景及相关概念?
进程、线程以及上下文切换是操作系统和并发编程中不可或缺的概念。这些概念不仅理论意义重大,而且在实际应用中起着至关重要的作用。掌柜将通过具体场景,探讨它们之间的关联以及上下文切换过程。_
一、进程与线程
进程(有时也称为任务)是程序运行的一个实例。每个进程都有自己独立的地址空间、系统资源以及运行状态。进程是操作系统进行资源分配和调度的基本单位。
线程则是进程中的一个执行单元,是进程内能够并行运行的轻量级进程。线程与父进程共享同一地址空间和其他资源,这使得线程间的通信和数据共享更加高效。线程是CPU调度的最小单位。
在Linux系统中,线程与进程之间的界限较为模糊,因为Linux实现了一种称为“轻量级进程”(LWP)的机制,使得线程在内核层面看起来像是普通的进程,但它们共享更多的资源(如地址空间、文件描述符等)。
示例:
假设我们有一个Java程序,它启动了一个名为“线程B”的新线程,并等待该线程执行完毕后再继续主线程的执行。代码如下:
public class ThreadExample {public static void main(String[] args) {System.out.println(Thread.currentThread().getName() + "线程运行开始!");Thread thread1 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "正在执行!");try {Thread.sleep(2000); // 模拟线程执行耗时操作} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "执行完毕!");}});thread1.setName("线程 B");try {thread1.start();thread1.join(); // 等待线程B执行完毕} catch (InterruptedException e) {e.printStackTrace();}System.out.println("这时 thread1 执行完毕之后才能执行主线程");}
}
在这个示例中,主线程首先输出“main线程运行开始!”,然后创建一个名为“线程 B”的新线程,并启动它。thread1.join()方法使得主线程等待“线程 B”执行完毕后再继续。这样,主线程在“线程 B”执行期间处于阻塞状态,直到“线程 B”完成并输出“线程 B执行完毕!”,主线程才继续执行并输出“这时 thread1 执行完毕之后才能执行主线程”。
二、上下文与寄存器
上下文是指在某一时间点,CPU寄存器和程序计数器的内容。寄存器是CPU内部的高速存储单元,用于存放指令、数据和地址等信息。程序计数器则是一个专用的寄存器,用于指明当前正在执行的指令位置或下一个将要执行的指令位置。
上下文切换是操作系统内核在CPU上对不同进程或线程进行切换的过程。在切换过程中,当前进程的上下文(即CPU寄存器和程序计数器等状态信息)会被保存到内存中的某处,然后下一个进程的上下文会被加载到CPU中,从而恢复该进程的执行状态。
寄存器与程序计数器的作用:
-
寄存器:寄存器通过对常用值(如运算的中间结果)的快速访问,显著提高计算机程序的运行速度。由于寄存器数量有限,因此它们通常用于存放那些频繁访问的数据。
-
程序计数器:程序计数器存储当前正在执行的指令的地址或下一个将要执行的指令的地址。在CPU执行指令的过程中,程序计数器不断更新,以指向下一条要执行的指令。
三、PCB与上下文切换过程
**PCB(Process Control Block,进程控制块)**是操作系统内核中用于存储进程或线程状态信息的数据结构。PCB有时也被称为“切换桢”(switchframe),因为它包含了在上下文切换过程中需要保存和恢复的所有状态信息。
上下文切换过程通常包括以下三个步骤:
- 挂起当前进程:将当前进程在CPU中的状态(上下文)保存到内存中的PCB中。
- 恢复下一个进程的上下文:从内存中的PCB中检索下一个进程的上下文,并将其加载到CPU的寄存器中。
- 跳转到程序计数器所指向的位置:根据程序计数器中的值,跳转到下一个进程被中断时的代码行,以恢复该进程的执行。
四、上下文切换的场景与原因
上下文切换是操作系统进行多任务处理的核心机制之一。在多任务操作系统中,多个进程或线程可能同时处于运行状态,但CPU资源是有限的。因此,操作系统需要通过上下文切换来合理地分配CPU时间,从而实现多任务并发执行。
上下文切换的常见场景:
-
时间片用完:
- 场景:在基于时间片的调度算法中,每个进程或线程被分配一个固定的时间片(即CPU执行时间)。当时间片用完时,操作系统会进行上下文切换,将当前进程挂起,并调度下一个进程执行。
- 示例:在轮转调度算法中,假设每个进程的时间片为100毫秒。当进程A的时间片用完时,操作系统会保存进程A的上下文到其PCB中,并调度进程B执行。此时,进程B的上下文会被加载到CPU中,从而恢复进程B的执行状态。
-
IO阻塞:
- 场景:当进程在执行过程中遇到IO操作(如磁盘读写、网络通信等)时,由于IO设备的速度通常远慢于CPU的速度,因此进程可能会被挂起,等待IO操作完成。此时,操作系统会进行上下文切换,调度其他进程执行。
- 示例:假设进程A在执行过程中需要读取一个磁盘文件。当进程A发出读取请求后,由于磁盘读取操作较慢,操作系统会将进程A挂起,并调度进程B执行。当磁盘读取操作完成后,操作系统会重新调度进程A执行,并恢复其上下文。
-
锁资源竞争:
- 场景:在多线程编程中,多个线程可能同时竞争同一个锁资源(如同步锁、互斥锁等)。当某个线程没有抢到锁资源时,它会被挂起,等待锁资源可用。此时,操作系统会进行上下文切换,调度其他线程执行。
- 示例:假设线程A和线程B都需要访问同一个共享资源(如一个变量或对象)。为了保证数据的一致性,它们需要使用同步锁来避免竞争条件。当线程A抢到锁资源时,线程B会被挂起,等待锁资源释放。此时,操作系统会调度其他线程(如线程C)执行。当线程A释放锁资源后,操作系统会重新调度线程B执行,并恢复其上下文。
-
用户代码挂起:
- 场景:在某些情况下,用户代码可能会主动挂起当前线程,让出CPU时间给其他线程或进程执行。这通常是通过调用操作系统提供的API函数来实现的。
- 示例:在Java中,我们可以使用
Thread.sleep()方法让当前线程休眠一段时间。当线程调用sleep()方法时,它会被挂起,并等待指定的时间过去后再被唤醒。此时,操作系统会调度其他线程执行。当睡眠时间结束后,操作系统会重新调度该线程执行,并恢复其上下文。
-
硬件中断:
- 场景:硬件中断是由硬件设备(如键盘、鼠标、定时器等)触发的中断信号。当硬件设备需要CPU处理时,它会发出中断信号,请求CPU中断当前进程的执行,并转向处理中断服务程序。此时,操作系统会进行上下文切换,保存当前进程的上下文到其PCB中,并加载中断服务程序的上下文到CPU中。
- 示例:当用户按下键盘上的某个键时,键盘设备会发出一个中断信号给CPU。CPU接收到中断信号后,会中断当前进程的执行,并转向处理键盘中断服务程序。中断服务程序会读取键盘的输入信息,并将其存储到相应的缓冲区中。处理完中断后,操作系统会恢复被中断进程的上下文,并继续执行该进程。
五、结语
进程、线程以及上下文切换是操作系统和并发编程中的核心概念。它们之间的关联和相互作用构成了操作系统进行多任务处理的基础。通过理解这些概念及其应用场景,可以更好地理解和设计高效的并发程序和系统。
相关文章:
问:进程/线程上下文切换场景及相关概念?
进程、线程以及上下文切换是操作系统和并发编程中不可或缺的概念。这些概念不仅理论意义重大,而且在实际应用中起着至关重要的作用。掌柜将通过具体场景,探讨它们之间的关联以及上下文切换过程。_ 一、进程与线程 进程(有时也称为任务&…...
神经网络(一):神经网络入门
文章目录 一、神经网络1.1神经元结构1.2单层神经网络:单层感知机1.3两层神经网络:多层感知机1.4多层神经网络 二、全连接神经网络2.1基本结构2.2激活函数、前向传播、反向传播、损失函数2.2.1激活函数的意义2.2.2前向传播2.2.3损失函数、反向传播2.2.4梯…...
卸载apt-get 安装的PostgreSQL版本
文章目录 卸载apt-get 安装的PostgreSQL版本查找已安装的PostgreSQL包卸载PostgreSQL:检查并删除残留文件验证卸载 卸载apt-get 安装的PostgreSQL版本 卸载通过apt-get安装的PostgreSQL 就版本,可以按照以下步骤进行。 查找已安装的PostgreSQL包 在卸…...
低代码用户中心:构建高效便捷的用户管理平台
什么是低代码用户中心? 低代码用户中心是一种利用低代码开发平台构建的用户管理系统,允许企业快速创建、部署和管理用户信息、权限及互动记录。通过可视化界面和预置组件,企业可以在短时间内实现灵活的用户管理解决方案,而无需编…...
3款免费的GPT类工具
前言 随着科技的飞速发展,人工智能(AI)的崛起与发展已经成为我们生活中不可或缺的一部分。它的出现彻底改变了我们与世界互动的方式,并为各行各业带来了前所未有的便利。 一、Kimi 网址:点我前往 国产AI模型Kimi是一…...
Mixture-of-Experts (MoE): 条件计算的诞生与崛起【上篇】
大型语言模型(LLM)的现代进步主要是缩放定律的产物[6]。 假设模型是在足够大的数据集上训练出来的,那么随着底层模型规模的增加,我们会看到性能的平滑提升。 这种扩展规律最终促使我们创建了 GPT-3 以及随后的其他(更强…...
【算法】分治:归并排序之LCR 170.交易逆序对的总数(hard)
系列专栏 双指针 模拟算法 分治思想 目录 1、题目链接 2、题目介绍 3、解法 4、代码 1、题目链接 LCR 159. 库存管理 III - 力扣(LeetCode) 2、题目介绍 在股票交易中,如果前一天的股价高于后一天的股价,则可以认为存在一…...
2024.9.28 作业+思维导图
widget.cpp #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {this->setFixedSize(320,448);this->setWindowFlag(Qt::FramelessWindowHint);//QPushButtonQPushButton *PushButton1 new QPushButton("登录",this);PushButto…...
树莓派外挂Camera(基操)(TODO)
(TODO) 手上有OV5647,OV2640,看这次能不能驱动吧。。。 树莓派3B CSI摄像头配置-阿里云开发者社区 你可以使用树莓派3B的CSI接口连接相机模块。首先,确保相机模块正确连接到CSI接口。然后,使用raspi-config…...
讯飞星火编排创建智能体学习(二)决策节点
目录 概述 决策节点 文生图节点 连接节点 测试结果 概述 在上一篇博文讯飞星火编排创建智能体学习(一)最简单的智能体构建-CSDN博客,我介绍了编排创作智能体,这篇来介绍一下“决策节点”。 决策节点 在编排创作智能体中&…...
YOLOv5改进:Unified-loU,用于高品质目标检测的统一loU ,2024年8月最新IoU
💡💡💡现有IoU问题点:IoU (Intersection over Union)作为模型训练的关键,极大地显示了当前预测框与Ground Truth框之间的差异。后续研究者不断在IoU中加入更多的考虑因素,如中心距离、纵横比等。然而,仅仅提炼几何差异是有上限的;而且新的对价指数与借据本身存在潜在…...
力扣 简单 112.路径总和
文章目录 题目介绍题解 题目介绍 题解 class Solution {public boolean hasPathSum(TreeNode root, int targetSum) {// 只在最开始的时候判断树是否为空if (root null) {return false;}targetSum - root.val;if (root.left null && root.right null) { // root 是…...
OpenMV与STM32通信全面指南
目录 引言 一、OpenMV和STM32简介 1.1 OpenMV简介 1.2 STM32简介 二、通信协议概述 三、硬件连接 3.1 硬件准备 3.2 引脚连接 四、软件环境搭建 4.1 OpenMV IDE安装 4.2 STM32开发环境 五、UART通信实现 5.1 OpenMV端编程 5.2 STM32端编程 六、SPI通信实现 6.1 …...
Python库matplotlib之二
Python库matplotlib之二 figureAxessubplot figure matplotlib.pyplot.figure(numNone, figsizeNone, dpiNone, facecolorNone, edgecolorNone, frameonTrue, FigureClass<class ‘matplotlib.figure.Figure’>, clearFalse, **kwargs) num,int 或 str 或 fi…...
DAY17||654.最大二叉树 |617.合并二叉树 |700.二叉搜索树中的搜索 |
654.最大二叉树 题目:654. 最大二叉树 - 力扣(LeetCode) 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树…...
读构建可扩展分布式系统:方法与实践16读后总结与感想兼导读
1. 基本信息 构建可扩展分布式系统:方法与实践 [美]伊恩戈顿(Ian Gorton)著 机械工业出版社,2024年5月出版 1.1. 读薄率 书籍总字数188千字,笔记总字数49688字。 读薄率49688188000≈26.4% 1.2. 读厚方向 设计模式:可复用面向对象软件的…...
Anaconda 安装
目录 - [简介](#简介) - [安装Anaconda](#安装anaconda) - [启动Anaconda Navigator](#启动anaconda-navigator) - [创建环境](#创建环境) - [管理包](#管理包) - [常用命令行操作](#常用命令行操作) - [Jupyter Notebook 快速入门](#jupyter-notebook-快速入门) - [结…...
优雅使用 MapStruct 进行类复制
前言 在项目中,常常会遇到从数据库读取数据后不能直接返回给前端展示的情况,因为还需要对字段进行加工,比如去除时间戳记录、隐藏敏感数据等。传统的处理方式是创建一个新类,然后编写大量的 get/set 方法进行赋值,若字…...
第19周JavaWeb编程实战-MyBatis实现OA系统 1-OA系统
办公OA系统项目开发 课程简介 本课程将通过慕课办公OA平台的开发,讲解实际项目开发中必须掌握的技能和设计技巧。课程分为三个主要阶段: 需求说明及环境准备: 基于RBAC的访问控制模块开发: 多级请假审批流程开发: …...
仿黑神话悟空跑动-脚下波纹特效(键盘wasd控制走动)
vue使用three.js实现仿黑神话悟空跑动-脚下波纹特效 玩家角色的正面始终朝向鼠标方向,且在按下 W 键时,玩家角色会朝着鼠标方向前进 空格建跳跃 <template><div ref"container" class"container" click"onClick"…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
