当前位置: 首页 > news >正文

经典面试题:进程、线程、协程开销问题,为什么进程切换的开销比线程的大?

上下文切换的过程?

上下文切换是操作系统在将CPU从一个进程切换到另一个进程时所执行的过程。它涉及保存当前执行进程的状态并加载下一个将要执行的进程的状态。下面是上下文切换的详细过程:

  1. 保存当前进程的上下文
  • 当操作系统决定切换到另一个进程时,首先需要保存当前正在执行的进程的执行状态。
  • 这包括将当前进程的寄存器状态(如通用寄存器、程序计数器PC、栈指针等)保存到进程控制块(PCB)中。
  • 操作系统还可能会保存其他与进程相关的状态信息,如页表、内存映射、打开的文件等。
  1. 选择新进程
  • 操作系统根据调度算法从就绪队列中选择下一个要执行的进程。
  • 这个选择可能基于各种因素,如优先级、时间片大小、进程状态等。
  1. 加载新进程的上下文
  • 一旦新进程被选择,操作系统需要加载该进程的执行状态,以便CPU可以开始执行该进程。
  • 这包括从该进程的PCB中恢复寄存器状态,如通用寄存器、程序计数器PC、栈指针等。
  • 操作系统还可能恢复其他与进程相关的状态信息,如页表、内存映射、打开的文件等。
  1. 更新调度信息
  • 在进行上下文切换后,操作系统可能需要更新调度信息,如更新就绪队列、时间片计数等。
  • 这确保了系统可以继续有效地调度进程,并避免出现死锁或其他资源争用问题。
  1. 切换到新进程执行
  • 一旦新进程的上下文被加载到CPU中,CPU开始执行新进程的代码。
  • 新进程从其上次中断或被抢占的位置继续执行。

进程、线程、协程切换的开销?

  1. 进程切换的开销
  • 进程切换涉及到从一个进程切换到另一个进程,因此需要保存和恢复大量的上下文信息,包括寄存器状态、内存映射、文件描述符等。
  • 进程切换的开销通常较大,因为它需要切换整个进程的上下文,可能涉及到内存的切换和页面交换等操作。
  • 由于进程之间是相互隔离的,切换进程需要操作系统进行较多的工作,包括内存管理、权限检查等,因此进程切换的开销相对较大。
  1. 线程切换的开销
  • 线程是在同一个进程内部运行的,因此线程切换的开销相对较小。
  • 线程切换只需要保存和恢复线程的寄存器状态和堆栈信息等少量上下文信息。
  • 由于线程共享进程的地址空间和其他资源,线程切换无需进行内存管理或权限检查等操作,因此开销较进程切换要小。
  1. 协程切换的开销
  • 协程是轻量级的用户态线程,其切换开销比进程和线程都要小。
  • 协程切换只需要保存和恢复协程的栈帧信息,以及一些额外的状态信息,如指令指针等。
  • 由于协程是在用户态管理的,无需涉及操作系统的内核调度和内存管理,因此协程切换的开销最小。

为什么进程切换的开销比线程的大?

  • 进程是系统资源的基本单位,它们之间是相互隔离的,切换进程需要操作系统进行大量的内存管理和权限检查等工作,因此开销较大。
  • 各个进程之间可能拥有独立的内存空间,切换进程需要进行内存页的切换和可能的页面交换,把虚拟地址转换为物理地址需要查页表,查页表是很慢的过程,转换检测缓冲区 TLB 可以提高页表查询速度就是一个缓存,页表切换后 TLB 就会失效,命中率就会变低,切换过程就会慢,线程则不需要切换地址空间所以开销比较小。

为什么线程切换的开销比协程的大?

协程切换比线程切换开销小的主要原因有以下几点:

  1. 用户空间操作: 协程通常在用户空间内管理,切换时不需要陷入内核态,而线程切换涉及内核态和用户态之间的切换。由于内核态切换通常涉及到上下文的保存和恢复,以及内核数据结构的操作,开销较大。
  2. 轻量级调度: 协程的调度是由用户程序自行控制的,通常采用协作式调度,用户程序在适当的时机主动让出CPU,切换到其他协程。这种调度方式不需要内核的介入,开销较小。
  3. 上下文切换成本低: 协程切换通常只涉及保存和恢复协程的执行上下文,如栈指针、寄存器等,这个过程在用户空间内完成,不涉及内核调度器和内核态的切换,因此开销较小。
  4. 无需同步原语: 在线程切换时,通常需要考虑同步原语(如互斥锁、条件变量)的状态和处理,以确保线程间的数据一致性。而在协程切换时,通常不需要考虑这些同步原语,因为协程之间共享同一个线程的地址空间,不涉及多线程之间的竞争和同步。

协程切换比线程切换开销小的主要原因是协程在用户空间内管理,不涉及内核态和用户态之间的切换,调度方式轻量级,上下文切换成本低,且无需考虑同步原语等因素。这使得协程在高并发、IO密集型等场景下具有较好的性能和效率。

什么是 TLB?

TLB(Translation Lookaside Buffer,译码后备缓冲器)是一种硬件缓存,存储了最近使用的虚拟地址到物理地址的映射关系,用于加速虚拟地址到物理地址的转换过程。在现代计算机体系结构中,TLB通常被用于处理虚拟内存系统中的地址转换。由于TLB的容量有限,如果访问的虚拟地址不在TLB中,就会发生TLB缺失(TLB Miss),此时需要访问MMU进行地址转换,并将新的映射关系加载到TLB中。因此,TLB的命中率直接影响了系统的性能表现。

  1. 加速地址转换: TLB存储了虚拟地址到物理地址的映射关系,当CPU需要访问内存时,先在TLB中查找对应的物理地址,如果命中则直接获取物理地址,避免了访问内存管理单元(MMU)进行地址转换的开销。
  2. 减少内存访问延迟: 由于TLB位于CPU芯片内部,其访问速度远高于访问主存的速度,因此能够大大减少内存访问的延迟,提高程序执行效率。
  3. 提高性能: TLB的存在可以大幅度提高系统的性能,特别是在需要频繁进行地址转换的应用场景下,如多任务操作系统、虚拟化环境等。

为什么每次切换 TLB 都会失效?

TLB(Translation Lookaside Buffer,译码后备缓冲器)每次失效的原因主要有以下几点:

  1. 容量限制: TLB是一个硬件缓存,其容量通常比较有限。当系统中的虚拟地址空间非常大时,TLB无法存储所有的虚拟地址到物理地址的映射关系,因此会发生TLB失效。
  2. 进程切换: 在多任务操作系统中,每个进程都有自己的虚拟地址空间,当发生进程切换时,当前进程的虚拟地址空间会被替换为下一个进程的虚拟地址空间。由于不同进程的虚拟地址空间可能不同,因此TLB中存储的映射关系就会失效。
  3. 页表更新: 虚拟地址到物理地址的映射关系是由操作系统的页表管理的,当页表发生变化时(如页面置换、页表更新等),TLB中存储的映射关系也会失效。
  4. 地址空间切换: 在虚拟化环境中,虚拟机之间的地址空间是相互隔离的,当虚拟机切换时,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语句类似下面这样&#xff1a;&#xff08;此方法仅适用于5.0.0<mysql<5.6.6的版本&#xff09; SELECT field FROM table WHERE id > 0 ORDER BY id LIMIT &#xff08;注入点&#xff09; 问题的关键在于&#xff0c;语句中有 order by 关键字&#xff0c;mysql…...

Makefile学习笔记15|u-boot顶层Makefile01

Makefile学习笔记15|u-boot顶层Makefile01 希望看到这篇文章的朋友能在评论区留下宝贵的建议来让我们共同成长&#xff0c;谢谢。 这里是目录 版本号信息 # 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 &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;[0,1,1] 解释&#xff1a; 0 --> 0 1 --&…...

sql server怎么存储图片

sql server怎么存储图片 在SQL Server中&#xff0c;可以使用VARBINARY数据类型来存储图片。以下是一个简单的例子&#xff0c;展示了如何将图片存储到数据库中&#xff0c;并从数据库中检索出来。 首先&#xff0c;创建一个表来存储图片数据&#xff1a; CREATE TABLE Image…...

大模型提示词Prompt学习

引言 关于chatGPT的Prompt Engineer&#xff0c;大家肯定耳朵都听起茧了。但是它的来由&#xff1f;&#xff0c;怎么能用好&#xff1f;很多人可能并不觉得并不是一个问题&#xff0c;或者说认定是一个很快会过时的概念。但其实也不能说得非常清楚&#xff08;因为觉得没必要深…...

蓝桥杯python组备赛指南

文章目录 前言刷题网站idle操作常用标准库mathdatetime 常见Q&A 前言 最近结束了比赛&#xff0c;我对比赛的过程进行了详细的复盘&#xff0c;并计划撰写一篇文章。这篇文章旨在为准备参加蓝桥杯的学弟学妹们提供帮助&#xff0c;我希望我的文章和笔记能对你们有所裨益。…...

架构师系列-定时任务解决方案

定时任务概述 在很多应用中我们都是需要执行一些定时任务的&#xff0c;比如定时发送短信&#xff0c;定时统计数据&#xff0c;在实际使用中我们使用什么定时任务框架来实现我们的业务&#xff0c;定时任务使用中会遇到哪些坑&#xff0c;如何最大化的提高定时任务的性能。 我…...

新计划,不断变更!做自己,接受不美好!猪肝移植——早读(逆天打工人爬取热门微信文章解读)

时间不等人 引言Python 代码第一篇 做自己&#xff0c;没有很好也没关系第二篇结尾 引言 新计划&#xff1a; 早上一次性发几个视频不现实 所以更改一下 待后面有比较稳定的框架再优化 每天早上更新 早到8点 晚到10点 你刚刚好上班或者上课 然后偷瞄的看两眼 学习一下 补充知…...

【数据结构】二叉树-堆(上)

个人主页~ 二叉树-堆 一、树的概念及结构1、概念2、相关概念3、树的表示4、树的实际应用 二、二叉树的概念和结构1、概念2、特殊二叉树3、二叉树的性质4、二叉树的存储结构&#xff08;1&#xff09;顺序存储&#xff08;2&#xff09;链式存储 三、二叉树的顺序结构以及实现1、…...

【Spring Boot】在项目中使用Spring AI

Spring AI是Spring框架中用于集成和使用人工智能和机器学习功能的组件。它提供了一种简化的方式来与AI模型进行交互。下面是一个简单的示例&#xff0c;展示了如何在Spring Boot项目中使用Spring AI。 步骤 1: 添加依赖 首先&#xff0c;在pom.xml文件中添加Spring AI的依赖&…...

【java程序设计期末复习】chapter3 运算符、表达式和语句

运算符、表达式和语句 Java提供了丰富的运算符&#xff0c;如算术运算符、关系运算符、逻辑运算符、位运算符等。 Java语言中的绝大多数运算符和C语言相同&#xff0c;基本语句&#xff0c;如条件分支语句、循环语句等也和C语言类似&#xff0c;因此&#xff0c;本章就主要知识…...

【建议收藏】30个较难Python脚本,纯干货分享

本篇较难&#xff0c;建议优先学习上篇 &#xff1b;20个硬核Python脚本-CSDN博客 接上篇文章&#xff0c;对于Pyhon的学习&#xff0c;上篇学习的结束相信大家对于Pyhon有了一定的理解和经验&#xff0c;学习完上篇文章之后再研究研究剩下的30个脚本你将会有所成就&…...

01-05.Vue自定义过滤器

目录 前言过滤器的概念过滤器的基本使用给过滤器添加多个参数 前言 我们接着上一篇文章01-04.Vue的使用示例&#xff1a;列表功能 来讲。 下一篇文章 02-Vue实例的生命周期函数 过滤器的概念 概念&#xff1a;Vue.js 允许我们自定义过滤器&#xff0c;可被用作一些常见的文本…...

C++系列-static成员

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 概念 声明为static的类成员称为类的静态成员&#xff0c;用static修饰的成员变量&#xff0c;称之为静态成员变量&#xff0c;用static修饰的成员函数&#xff0c;称之为静态成…...

Git | 创建和管理Pull Request总结

如是我闻&#xff1a; 在使用 GitHub 进行项目协作时&#xff0c;掌握如何创建、更新和合并&#xff08;squash&#xff09;pull request 是非常有帮助的。本文将详细介绍这些操作&#xff0c;帮助我们更好地管理项目代码&#xff0c;并解释每个操作的原因和解决的问题。 1. 什…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...