问:进程/线程上下文切换场景及相关概念?
进程、线程以及上下文切换是操作系统和并发编程中不可或缺的概念。这些概念不仅理论意义重大,而且在实际应用中起着至关重要的作用。掌柜将通过具体场景,探讨它们之间的关联以及上下文切换过程。_
一、进程与线程
进程(有时也称为任务)是程序运行的一个实例。每个进程都有自己独立的地址空间、系统资源以及运行状态。进程是操作系统进行资源分配和调度的基本单位。
线程则是进程中的一个执行单元,是进程内能够并行运行的轻量级进程。线程与父进程共享同一地址空间和其他资源,这使得线程间的通信和数据共享更加高效。线程是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"…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...