问:进程/线程上下文切换场景及相关概念?
进程、线程以及上下文切换是操作系统和并发编程中不可或缺的概念。这些概念不仅理论意义重大,而且在实际应用中起着至关重要的作用。掌柜将通过具体场景,探讨它们之间的关联以及上下文切换过程。_
一、进程与线程
进程(有时也称为任务)是程序运行的一个实例。每个进程都有自己独立的地址空间、系统资源以及运行状态。进程是操作系统进行资源分配和调度的基本单位。
线程则是进程中的一个执行单元,是进程内能够并行运行的轻量级进程。线程与父进程共享同一地址空间和其他资源,这使得线程间的通信和数据共享更加高效。线程是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"…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
