经典面试题:进程、线程、协程开销问题,为什么进程切换的开销比线程的大?
上下文切换的过程?
上下文切换是操作系统在将CPU从一个进程切换到另一个进程时所执行的过程。它涉及保存当前执行进程的状态并加载下一个将要执行的进程的状态。下面是上下文切换的详细过程:
- 保存当前进程的上下文:
- 当操作系统决定切换到另一个进程时,首先需要保存当前正在执行的进程的执行状态。
- 这包括将当前进程的寄存器状态(如通用寄存器、程序计数器PC、栈指针等)保存到进程控制块(PCB)中。
- 操作系统还可能会保存其他与进程相关的状态信息,如页表、内存映射、打开的文件等。
- 选择新进程:
- 操作系统根据调度算法从就绪队列中选择下一个要执行的进程。
- 这个选择可能基于各种因素,如优先级、时间片大小、进程状态等。
- 加载新进程的上下文:
- 一旦新进程被选择,操作系统需要加载该进程的执行状态,以便CPU可以开始执行该进程。
- 这包括从该进程的PCB中恢复寄存器状态,如通用寄存器、程序计数器PC、栈指针等。
- 操作系统还可能恢复其他与进程相关的状态信息,如页表、内存映射、打开的文件等。
- 更新调度信息:
- 在进行上下文切换后,操作系统可能需要更新调度信息,如更新就绪队列、时间片计数等。
- 这确保了系统可以继续有效地调度进程,并避免出现死锁或其他资源争用问题。
- 切换到新进程执行:
- 一旦新进程的上下文被加载到CPU中,CPU开始执行新进程的代码。
- 新进程从其上次中断或被抢占的位置继续执行。
进程、线程、协程切换的开销?
- 进程切换的开销:
- 进程切换涉及到从一个进程切换到另一个进程,因此需要保存和恢复大量的上下文信息,包括寄存器状态、内存映射、文件描述符等。
- 进程切换的开销通常较大,因为它需要切换整个进程的上下文,可能涉及到内存的切换和页面交换等操作。
- 由于进程之间是相互隔离的,切换进程需要操作系统进行较多的工作,包括内存管理、权限检查等,因此进程切换的开销相对较大。
- 线程切换的开销:
- 线程是在同一个进程内部运行的,因此线程切换的开销相对较小。
- 线程切换只需要保存和恢复线程的寄存器状态和堆栈信息等少量上下文信息。
- 由于线程共享进程的地址空间和其他资源,线程切换无需进行内存管理或权限检查等操作,因此开销较进程切换要小。
- 协程切换的开销:
- 协程是轻量级的用户态线程,其切换开销比进程和线程都要小。
- 协程切换只需要保存和恢复协程的栈帧信息,以及一些额外的状态信息,如指令指针等。
- 由于协程是在用户态管理的,无需涉及操作系统的内核调度和内存管理,因此协程切换的开销最小。
为什么进程切换的开销比线程的大?
- 进程是系统资源的基本单位,它们之间是相互隔离的,切换进程需要操作系统进行大量的内存管理和权限检查等工作,因此开销较大。
- 各个进程之间可能拥有独立的内存空间,切换进程需要进行内存页的切换和可能的页面交换,把虚拟地址转换为物理地址需要查页表,查页表是很慢的过程,转换检测缓冲区 TLB 可以提高页表查询速度就是一个缓存,页表切换后 TLB 就会失效,命中率就会变低,切换过程就会慢,线程则不需要切换地址空间所以开销比较小。
为什么线程切换的开销比协程的大?
协程切换比线程切换开销小的主要原因有以下几点:
- 用户空间操作: 协程通常在用户空间内管理,切换时不需要陷入内核态,而线程切换涉及内核态和用户态之间的切换。由于内核态切换通常涉及到上下文的保存和恢复,以及内核数据结构的操作,开销较大。
- 轻量级调度: 协程的调度是由用户程序自行控制的,通常采用协作式调度,用户程序在适当的时机主动让出CPU,切换到其他协程。这种调度方式不需要内核的介入,开销较小。
- 上下文切换成本低: 协程切换通常只涉及保存和恢复协程的执行上下文,如栈指针、寄存器等,这个过程在用户空间内完成,不涉及内核调度器和内核态的切换,因此开销较小。
- 无需同步原语: 在线程切换时,通常需要考虑同步原语(如互斥锁、条件变量)的状态和处理,以确保线程间的数据一致性。而在协程切换时,通常不需要考虑这些同步原语,因为协程之间共享同一个线程的地址空间,不涉及多线程之间的竞争和同步。
协程切换比线程切换开销小的主要原因是协程在用户空间内管理,不涉及内核态和用户态之间的切换,调度方式轻量级,上下文切换成本低,且无需考虑同步原语等因素。这使得协程在高并发、IO密集型等场景下具有较好的性能和效率。
什么是 TLB?
TLB(Translation Lookaside Buffer,译码后备缓冲器)是一种硬件缓存,存储了最近使用的虚拟地址到物理地址的映射关系,用于加速虚拟地址到物理地址的转换过程。在现代计算机体系结构中,TLB通常被用于处理虚拟内存系统中的地址转换。由于TLB的容量有限,如果访问的虚拟地址不在TLB中,就会发生TLB缺失(TLB Miss),此时需要访问MMU进行地址转换,并将新的映射关系加载到TLB中。因此,TLB的命中率直接影响了系统的性能表现。
- 加速地址转换: TLB存储了虚拟地址到物理地址的映射关系,当CPU需要访问内存时,先在TLB中查找对应的物理地址,如果命中则直接获取物理地址,避免了访问内存管理单元(MMU)进行地址转换的开销。
- 减少内存访问延迟: 由于TLB位于CPU芯片内部,其访问速度远高于访问主存的速度,因此能够大大减少内存访问的延迟,提高程序执行效率。
- 提高性能: TLB的存在可以大幅度提高系统的性能,特别是在需要频繁进行地址转换的应用场景下,如多任务操作系统、虚拟化环境等。
为什么每次切换 TLB 都会失效?
TLB(Translation Lookaside Buffer,译码后备缓冲器)每次失效的原因主要有以下几点:
- 容量限制: TLB是一个硬件缓存,其容量通常比较有限。当系统中的虚拟地址空间非常大时,TLB无法存储所有的虚拟地址到物理地址的映射关系,因此会发生TLB失效。
- 进程切换: 在多任务操作系统中,每个进程都有自己的虚拟地址空间,当发生进程切换时,当前进程的虚拟地址空间会被替换为下一个进程的虚拟地址空间。由于不同进程的虚拟地址空间可能不同,因此TLB中存储的映射关系就会失效。
- 页表更新: 虚拟地址到物理地址的映射关系是由操作系统的页表管理的,当页表发生变化时(如页面置换、页表更新等),TLB中存储的映射关系也会失效。
- 地址空间切换: 在虚拟化环境中,虚拟机之间的地址空间是相互隔离的,当虚拟机切换时,TLB中存储的映射关系也会失效。
相关文章:
经典面试题:进程、线程、协程开销问题,为什么进程切换的开销比线程的大?
上下文切换的过程? 上下文切换是操作系统在将CPU从一个进程切换到另一个进程时所执行的过程。它涉及保存当前执行进程的状态并加载下一个将要执行的进程的状态。下面是上下文切换的详细过程: 保存当前进程的上下文: 当操作系统决定切换到另…...
鸿蒙 DevEco Studio 3.1 Release 下载sdk报错的解决办法
鸿蒙 解决下载SDK报错的解决方法 最近在学习鸿蒙开发,以后也会记录一些关于鸿蒙相关的问题和解决方法,希望能帮助到大家。 总的来说一般有下面这样的报错 报错一: Components to install: - ArkTS 3.2.12.5 - System-image-phone 3.1.0.3…...
QGIS开发笔记(二):Windows安装版二次开发环境搭建(上):安装OSGeo4W运行依赖其Qt的基础环境Demo
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/139136356 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
设计一套Kafka到RocketMQ的双写+双读技术方案,实现无缝迁移!
设计一套Kafka到RocketMQ的双写双读技术方案,实现无缝迁移! 1、背景2、方案3、具体逻辑 1、背景 假设你们公司本来线上的MQ用的主要是Kafka,现在要从Kafka迁移到RocketMQ去,那么这个迁移的过程应该怎么做呢?应该采用什…...
Mysql下Limit注入方法(此方法仅适用于5.0.0<mysql<5.6.6的版本)
SQL语句类似下面这样:(此方法仅适用于5.0.0<mysql<5.6.6的版本) SELECT field FROM table WHERE id > 0 ORDER BY id LIMIT (注入点) 问题的关键在于,语句中有 order by 关键字,mysql…...
Makefile学习笔记15|u-boot顶层Makefile01
Makefile学习笔记15|u-boot顶层Makefile01 希望看到这篇文章的朋友能在评论区留下宝贵的建议来让我们共同成长,谢谢。 这里是目录 版本号信息 # SPDX-License-Identifier: GPL-2.0VERSION 2024 PATCHLEVEL 01 SUBLEVEL EXTRAVERSION -rc4 NAME 这里定义了u-bo…...
C++笔记之Unix时间戳、UTC、TSN、系统时间戳、时区转换、local时间笔记
C++笔记之Unix时间戳、UTC、TSN、系统时间戳、时区转换、local时间笔记 ——2024-05-26 夜 code review! 参考博文 C++笔记之获取当前本地时间以及utc时间...
leetcode338-Counting Bits
题目 给你一个整数 n ,对于 0 < i < n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n 1 的数组 ans 作为答案。 示例 1: 输入:n 2 输出:[0,1,1] 解释: 0 --> 0 1 --&…...
sql server怎么存储图片
sql server怎么存储图片 在SQL Server中,可以使用VARBINARY数据类型来存储图片。以下是一个简单的例子,展示了如何将图片存储到数据库中,并从数据库中检索出来。 首先,创建一个表来存储图片数据: CREATE TABLE Image…...
大模型提示词Prompt学习
引言 关于chatGPT的Prompt Engineer,大家肯定耳朵都听起茧了。但是它的来由?,怎么能用好?很多人可能并不觉得并不是一个问题,或者说认定是一个很快会过时的概念。但其实也不能说得非常清楚(因为觉得没必要深…...
蓝桥杯python组备赛指南
文章目录 前言刷题网站idle操作常用标准库mathdatetime 常见Q&A 前言 最近结束了比赛,我对比赛的过程进行了详细的复盘,并计划撰写一篇文章。这篇文章旨在为准备参加蓝桥杯的学弟学妹们提供帮助,我希望我的文章和笔记能对你们有所裨益。…...
架构师系列-定时任务解决方案
定时任务概述 在很多应用中我们都是需要执行一些定时任务的,比如定时发送短信,定时统计数据,在实际使用中我们使用什么定时任务框架来实现我们的业务,定时任务使用中会遇到哪些坑,如何最大化的提高定时任务的性能。 我…...
新计划,不断变更!做自己,接受不美好!猪肝移植——早读(逆天打工人爬取热门微信文章解读)
时间不等人 引言Python 代码第一篇 做自己,没有很好也没关系第二篇结尾 引言 新计划: 早上一次性发几个视频不现实 所以更改一下 待后面有比较稳定的框架再优化 每天早上更新 早到8点 晚到10点 你刚刚好上班或者上课 然后偷瞄的看两眼 学习一下 补充知…...
【数据结构】二叉树-堆(上)
个人主页~ 二叉树-堆 一、树的概念及结构1、概念2、相关概念3、树的表示4、树的实际应用 二、二叉树的概念和结构1、概念2、特殊二叉树3、二叉树的性质4、二叉树的存储结构(1)顺序存储(2)链式存储 三、二叉树的顺序结构以及实现1、…...
【Spring Boot】在项目中使用Spring AI
Spring AI是Spring框架中用于集成和使用人工智能和机器学习功能的组件。它提供了一种简化的方式来与AI模型进行交互。下面是一个简单的示例,展示了如何在Spring Boot项目中使用Spring AI。 步骤 1: 添加依赖 首先,在pom.xml文件中添加Spring AI的依赖&…...
【java程序设计期末复习】chapter3 运算符、表达式和语句
运算符、表达式和语句 Java提供了丰富的运算符,如算术运算符、关系运算符、逻辑运算符、位运算符等。 Java语言中的绝大多数运算符和C语言相同,基本语句,如条件分支语句、循环语句等也和C语言类似,因此,本章就主要知识…...
【建议收藏】30个较难Python脚本,纯干货分享
本篇较难,建议优先学习上篇 ;20个硬核Python脚本-CSDN博客 接上篇文章,对于Pyhon的学习,上篇学习的结束相信大家对于Pyhon有了一定的理解和经验,学习完上篇文章之后再研究研究剩下的30个脚本你将会有所成就&…...
01-05.Vue自定义过滤器
目录 前言过滤器的概念过滤器的基本使用给过滤器添加多个参数 前言 我们接着上一篇文章01-04.Vue的使用示例:列表功能 来讲。 下一篇文章 02-Vue实例的生命周期函数 过滤器的概念 概念:Vue.js 允许我们自定义过滤器,可被用作一些常见的文本…...
C++系列-static成员
🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 概念 声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量,用static修饰的成员函数,称之为静态成…...
Git | 创建和管理Pull Request总结
如是我闻: 在使用 GitHub 进行项目协作时,掌握如何创建、更新和合并(squash)pull request 是非常有帮助的。本文将详细介绍这些操作,帮助我们更好地管理项目代码,并解释每个操作的原因和解决的问题。 1. 什…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
表单设计器拖拽对象时添加属性
背景:因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…...
Netty自定义协议解析
目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...
