问:进程/线程上下文切换场景及相关概念?

进程、线程以及上下文切换是操作系统和并发编程中不可或缺的概念。这些概念不仅理论意义重大,而且在实际应用中起着至关重要的作用。掌柜将通过具体场景,探讨它们之间的关联以及上下文切换过程。_

一、进程与线程

进程(有时也称为任务)是程序运行的一个实例。每个进程都有自己独立的地址空间、系统资源以及运行状态。进程是操作系统进行资源分配和调度的基本单位。

线程则是进程中的一个执行单元,是进程内能够并行运行的轻量级进程。线程与父进程共享同一地址空间和其他资源,这使得线程间的通信和数据共享更加高效。线程是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),因为它包含了在上下文切换过程中需要保存和恢复的所有状态信息。

上下文切换过程通常包括以下三个步骤:

  1. 挂起当前进程:将当前进程在CPU中的状态(上下文)保存到内存中的PCB中。
  2. 恢复下一个进程的上下文:从内存中的PCB中检索下一个进程的上下文,并将其加载到CPU的寄存器中。
  3. 跳转到程序计数器所指向的位置:根据程序计数器中的值,跳转到下一个进程被中断时的代码行,以恢复该进程的执行。
四、上下文切换的场景与原因

上下文切换是操作系统进行多任务处理的核心机制之一。在多任务操作系统中,多个进程或线程可能同时处于运行状态,但CPU资源是有限的。因此,操作系统需要通过上下文切换来合理地分配CPU时间,从而实现多任务并发执行。

上下文切换的常见场景

  1. 时间片用完

    • 场景:在基于时间片的调度算法中,每个进程或线程被分配一个固定的时间片(即CPU执行时间)。当时间片用完时,操作系统会进行上下文切换,将当前进程挂起,并调度下一个进程执行。
    • 示例:在轮转调度算法中,假设每个进程的时间片为100毫秒。当进程A的时间片用完时,操作系统会保存进程A的上下文到其PCB中,并调度进程B执行。此时,进程B的上下文会被加载到CPU中,从而恢复进程B的执行状态。
  2. IO阻塞

    • 场景:当进程在执行过程中遇到IO操作(如磁盘读写、网络通信等)时,由于IO设备的速度通常远慢于CPU的速度,因此进程可能会被挂起,等待IO操作完成。此时,操作系统会进行上下文切换,调度其他进程执行。
    • 示例:假设进程A在执行过程中需要读取一个磁盘文件。当进程A发出读取请求后,由于磁盘读取操作较慢,操作系统会将进程A挂起,并调度进程B执行。当磁盘读取操作完成后,操作系统会重新调度进程A执行,并恢复其上下文。
  3. 锁资源竞争

    • 场景:在多线程编程中,多个线程可能同时竞争同一个锁资源(如同步锁、互斥锁等)。当某个线程没有抢到锁资源时,它会被挂起,等待锁资源可用。此时,操作系统会进行上下文切换,调度其他线程执行。
    • 示例:假设线程A和线程B都需要访问同一个共享资源(如一个变量或对象)。为了保证数据的一致性,它们需要使用同步锁来避免竞争条件。当线程A抢到锁资源时,线程B会被挂起,等待锁资源释放。此时,操作系统会调度其他线程(如线程C)执行。当线程A释放锁资源后,操作系统会重新调度线程B执行,并恢复其上下文。
  4. 用户代码挂起

    • 场景:在某些情况下,用户代码可能会主动挂起当前线程,让出CPU时间给其他线程或进程执行。这通常是通过调用操作系统提供的API函数来实现的。
    • 示例:在Java中,我们可以使用Thread.sleep()方法让当前线程休眠一段时间。当线程调用sleep()方法时,它会被挂起,并等待指定的时间过去后再被唤醒。此时,操作系统会调度其他线程执行。当睡眠时间结束后,操作系统会重新调度该线程执行,并恢复其上下文。
  5. 硬件中断

    • 场景:硬件中断是由硬件设备(如键盘、鼠标、定时器等)触发的中断信号。当硬件设备需要CPU处理时,它会发出中断信号,请求CPU中断当前进程的执行,并转向处理中断服务程序。此时,操作系统会进行上下文切换,保存当前进程的上下文到其PCB中,并加载中断服务程序的上下文到CPU中。
    • 示例:当用户按下键盘上的某个键时,键盘设备会发出一个中断信号给CPU。CPU接收到中断信号后,会中断当前进程的执行,并转向处理键盘中断服务程序。中断服务程序会读取键盘的输入信息,并将其存储到相应的缓冲区中。处理完中断后,操作系统会恢复被中断进程的上下文,并继续执行该进程。
五、结语

进程、线程以及上下文切换是操作系统和并发编程中的核心概念。它们之间的关联和相互作用构成了操作系统进行多任务处理的基础。通过理解这些概念及其应用场景,可以更好地理解和设计高效的并发程序和系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1549900.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

I/O中断处理过程

中断控制器位于CPU和外设之间,用于处理I/O中断请求。以下是一个简化的中断控制器: 现在有A,B,C三个中断源。中断响应优先级:A>B>C,中断处理优先级:C>B>A 假设CPU正在处理A中断源的中断请求,此时…

Mixture-of-Experts (MoE): 条件计算的诞生与崛起【上篇】

大型语言模型(LLM)的现代进步主要是缩放定律的产物[6]。 假设模型是在足够大的数据集上训练出来的,那么随着底层模型规模的增加,我们会看到性能的平滑提升。 这种扩展规律最终促使我们创建了 GPT-3 以及随后的其他(更强…

Excel技巧:Excel批量提取文件名

Excel是大家经常用来制作表格的文件,比如输入文件名,如果有大量文件需要输入,用张贴复制或者手动输入的方式还是很费时间的,今天和大家分享如何批量提取文件名。 打开需要提取文件名的文件夹,选中所有文件&#xff0c…

在线翻译器工具横评:性能、准确率大比拼

无论是旅行者在异国他乡探寻风土人情,学者研究国外的前沿学术成果,还是商务人士与国际伙伴洽谈合作,都离不开一种高效、准确的语言沟通工具。而翻译器在线翻译能很好的帮我们解决这个问题。今天我们一起来探讨有那些好用的翻译工具。 1.福昕…

Golang | Leetcode Golang题解之第443题压缩字符串

题目: 题解: func compress(chars []byte) int {write, left : 0, 0for read, ch : range chars {if read len(chars)-1 || ch ! chars[read1] {chars[write] chwritenum : read - left 1if num > 1 {anchor : writefor ; num > 0; num / 10 {…

【题解】2022ICPC杭州-K

翻译 原题链接   简述一下就是每次询问重新定义一个字母排序表&#xff0c;问在这个顺序下n个字符串的序列的逆序数是多少。 字典树计算逆序数 先考虑初始状况下&#xff0c;即 a < b < . . . < z a<b<...<z a<b<...<z的情况下&#xff0c;逆序…

Arch - 架构安全性_验证(Verification)

文章目录 OverView导图1. 引言&#xff1a;数据验证的重要性概述2. 数据验证的基本概念3. 数据验证的层次前端验证后端验证 4. 数据验证的标准做法5. 自定义校验注解6. 校验结果的处理7. 性能考虑与副作用8. 小结 OverView 即使只限定在“软件架构设计”这个语境下&#xff0c…

金融科技革命:API接口开放平台,畅通金融服务之路

金融科技是近年来蓬勃发展的领域&#xff0c;它利用先进的技术手段来改善和创新金融服务。在金融科技的革命中&#xff0c;API接口开放平台扮演着重要的角色&#xff0c;它通过提供统一的接口服务&#xff0c;让金融机构和其他行业能够更方便地进行数据交换和合作。本文将以挖数…

聚星文社最新风格图库角色

聚星文社最新风格图库角色涵盖了各种不同的风格和类型。以下是一些可能的角色风格&#xff1a; Docs聚星文社https://iimenvrieak.feishu.cn/docx/ZhRNdEWT6oGdCwxdhOPcdds7nof 现代都市风格角色&#xff1a;这种角色通常穿着时尚的衣服&#xff0c;有时尚的发型和化妆。他们可…

STM32+PWM+DMA驱动WS2812 —— 2024年9月24日

一、项目简介 采用STM32f103C8t6单片机&#xff0c;使用HAL库编写。项目中针对初学者驱动WS2812时会遇到的一些问题&#xff0c;给出了解决方案。 二、ws2812驱动原理 WS2812采用单线归零码的通讯方式&#xff0c;即利用高低电平的持续时间来确定0和1。这种通信方式优点是只需…

IO端口与IO接口

I/O端口和I/O接口是计算机系统中用于连接外部设备的关键组成部分&#xff0c;两者密切相关&#xff0c;但又有明显的区别&#xff1a; I/O端口 (I/O Port): 定义: I/O端口是内存地址空间中的一组特殊地址&#xff0c;用于与外部设备进行数据交换。CPU通过向这些特定的地址写入…

muduo网络库介绍

文章目录 MuduoServer常见接口TcpServer类EventLoop类TcpConnection类 服务器搭建Client常见接口TcpClient类 客户端搭建 Muduo Muduo是陈硕大佬开发的,一个基于非阻塞IO和事件驱动的C高并发网络编程库 这是一个基于主从Reactor模型的网络编程库,线程模型是one loop per thre…

加法器以及标志位

加法器的结构&#xff1a; OF&#xff08;溢出标志位&#xff09;&#xff0c;SF&#xff08;符号标志位&#xff09;&#xff0c;ZF&#xff08;0标志位&#xff09;&#xff0c;ZF&#xff08;进位/借位标志位&#xff09; 有符号数看标志位&#xff1a;OF&#xff0c;SF 无符…

Stable Diffusion绘画 | 插件-Deforum:动态视频生成

Deforum 与 AnimateDiff 不太一样&#xff0c; AnimateDiff 是生成丝滑变化视频的&#xff0c;而 Deforum 的丝滑程度远远没有 AnimateDiff 好。 它是根据对比前面一帧的画面&#xff0c;然后不断生成新的相似图片&#xff0c;来组合成一个完整的视频。 Deforum 的优点在于可…

AI Agent应用出路到底在哪?

1 Agent/Function Call 的定义 Overview of a LLM-powered autonomous agent system&#xff1a; Agent学会调用外部应用程序接口&#xff0c;以获取模型权重中缺失的额外信息&#xff08;预训练后通常难以更改&#xff09;&#xff0c;包括当前信息、代码执行能力、专有信息源…

【Godot4.3】简单物理模拟之圆粒子碰撞检测

概述 最近开始研究游戏物理的内容&#xff0c;研究运动、速度、加速度之类的内容。也开始模仿一些简单的粒子模拟。这些都是一些基础、简单且古老的算法&#xff0c;但是对于理解游戏内的物理模拟很有帮助。甚至你可以在js、Python或者其他程序语言中实现它们。 图形的碰撞检…

详解JavaScript中属性的特性getOwnPropertyDescriptor()等

属性的特性 可以认为一个属性包含一个名字和4个特性&#xff0c;它的值&#xff0c;可写性&#xff0c;可枚举性&#xff0c;可配置性。 因此&#xff0c;存储器属性的4个特性&#xff0c;读取&#xff0c;写入&#xff0c;可枚举&#xff0c;可配置。 定义了一个“属性描述…

Unity实战案例全解析:RTS游戏的框选和阵型功能(2) 生成选择框

前篇&#xff1a;Unity实战案例全解析&#xff1a;RTS游戏的框选和阵型功能&#xff08;1&#xff09; 基础要素-CSDN博客 本案例来源于unity唐老狮&#xff0c;有兴趣的小伙伴可以去泰克在线观看该课程 【唐老狮】Unity实现 即时战略游戏 阵型功能 - 泰课在线 -- 志存高远&…

C++入门基础知识90(实例)——实例15【求两数的最大公约数】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于求两数的最大公约数的相关内容&#xff…

Linux网络:网络编程套接字

socket 套接字 socket常见API 创建套接字&#xff1a;&#xff08;TCP/UDP&#xff0c;客户端服务器&#xff09; int socket(int domain, int type, int protocol);绑定端口号&#xff1a;&#xff08;TCP/UDP&#xff0c;服务器&#xff09; int listen(int sockfd, int …