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

ARMv8-AArch64 的异常处理模型详解之异常类型 Exception types

异常类型详解 Exception types

  • 一, 什么是异常
  • 二,同步异常(synchronous exceptions)
    • 2.1 无效的指令和陷阱异常(Invalid instructions and trap exceptions)
    • 2.2 内存访问产生的异常
    • 2.3 产生异常的指令
    • 2.4 调试异常 Debug exceptions
  • 三, 异步异常 Asynchronous exceptions
    • 3.1 物理中断 Physical interrupts
    • 3.2 系统错误异常 SError
    • 3.3 IRQ和FIQ 中断
    • 3.4 虚拟中断 Virtual interrupts
  • 四,异常屏蔽(Masking)

一, 什么是异常

异常(Exception)通俗点来讲,就是系统在正常运行的时候出现的非正常事件,这个非正常事件会导致系统状态更改或者其他错误,为了确保系统功能能正常运行,需要一些带有特权的软件代码(exception handler)来采取一些补救措施或者更新系统状态,这个过程被称为异常处理,系统会停止当前程序,并进入handler,在handler处理完成之后,系统会从handler返回,再继续正常运行。
所以可以说,异常就是可以导致当前正常程序被挂起的任何事件。
如下图所示,程序正常执行过程中,发生了异常,程序挂起,并跳转到异常处理函数,在处理完异常后,从异常返回,程序恢复正常运行:
在这里插入图片描述
有些处理器架构可能会讲上述过程描述为一个中断,但是在ARM AArch64中,中断是一种由外部产生的,特殊类型的异常。

异常的用途非常广泛,包括以下:

  • 模拟虚拟设备
  • 虚拟内存管理
  • 处理软件错误
  • 处理硬件错误
  • 调试
  • 异常等级跳转或者安全状态切换
  • 处理中断(定时器或者外设间的交互)
  • 执行状态切换(AArch64和AArch32),也就是interprocessing

当异常发生时,处理器将会停止当前程序的运行,跳转到一段称为异常处理函数的代码来处理该异常,处理结束后将从exception handler返回到之前程序停止的地方继续执行。每一种异常类型都有属于自己的异常处理函数。此外,ARM架构将异常分为同步异常(synchronous exceptions)和异步异常(asynchronous exceptions)。

二,同步异常(synchronous exceptions)

同步异常用一句话概括就是:由处理器执行指令所产生的异常。同步异常和当前处理器所执行的指令流是同步的,因为正是处理器执行了某条指令才导致异常发生。比如,MMU定义了某个内存区间为只读属性,如果CPU对该区间某地址执行了写的指令(如STR),此时一个同步异常将会发生。
同步异常有如下特点:

  • 同步异常是由于直接或试图执行指令而产生的。
  • 处理异常后返回的地址(返回地址)与导致异常的指令之间的关系,是由arm体系结构定义的。
  • 同步异常也称为 精准(precise)异常,因为我们可以知道具体是哪条指令导致的异常,可以精准地知道执行了哪条指令之后系统状态才开始发生变化,并且进入异常处理函数。
    同步异常也分了很多种,并且也可能存在 执行一条指令,导致多个同步异常的产生的情况,为了处理多个同步异常同时产生的情况,ARM架构为每种同步异常规定了固定的优先级来处理。

2.1 无效的指令和陷阱异常(Invalid instructions and trap exceptions)

无效的指令有很多种情况,比如:

  • Cortex-A73支持的某些指令或者寄存器,A53不支持,对于A53来讲就是无效的指令,如果执行这样的指令或者访问不支持的寄存器,处理器将进入 未定义的异常(UNDEFINED Exception)。
  • 有些指令或者寄存器只针对特定的异常等级有效,如果在其他的异常等级下执行这样的指令或者访问这些寄存器,也将进入未定义的异常(UNDEFINED Exception)。
    此外,ARM架构还允许操作系统或者hypervisor为更低异常等级的某些操作(比如读取一个特定的寄存器)设置陷阱。当处理器在这些更低异常等级执行这些操作的时候,将会触发一个异常。
    例如,EL1上的操作系统内核可能会在EL0上禁用使用浮点指令,以节省在应用程序之间进行上下文切换时的时间(浮点寄存器通常有128-bit的宽度,是普通通用寄存器的两倍,上下文切换时,需要将所有GPR的值压入栈或者从栈中恢复到GPR)。这被称为惰性上下文切换;例如,如果在上下文切换之前没有使用SIMD/浮点(FP)单元(NEON),则出栈入栈的寄存器数量可以减少。所以,一般情况下,在应用程序跑的EL0异常等级下,禁用浮点指令,并且使用一个陷阱异常来处理边缘情况(少数情况下,某些应用程序需要开启浮点运算)。
    在这种情况下,OS内核可以通过禁用SIMD/FP单元来监视SIMD/FP操作的状态。当执行FP或SIMD指令时,陷阱异常被带到EL1的OS内核。然后,内核可以启用SIMD/FP单元,以执行之前失败的指令,并设置一个标志,说明已经使能了SIMD/FP单元。这确保了在下一个上下文交换中,将大型SIMD/FP寄存器文件包含在上下文切换的寄存器上下文中。如果在下一个上下文切换中没有发现这个使能标志,则不需要包含SIMD/FP寄存器。
    这种设置陷阱异常的能力对于虚拟化尤为重要。关于AArch64 的虚拟化操作,可以参考:AArch64 virtualization guide。

2.2 内存访问产生的异常

在访问内存时也会产生同步异常。可能的原因有:

  • MMU使能后,MMU进行地址转换时进行检查产生的。
  • 由内存系统(比如DDR)返回的错误。
    比如,将MMU使能后,使用Load或者store指令访问内存的操作将会受到MMU的检查。比如对一些地址空间的内存属性设置了只读,这时候CPU对该区域进行写操作,还比如对一些地址空间设置了只有较高的异常等级才能去访问(即该区域具有特权),此时若CPU处于非特权状态去访问该区域,MMU对这些操作都会进行检查,并将这些操作拦截,然后触发一个MMU 错误的异常。由于MMU产生的错误是同步的,所以该异常的产生将会在内存访问之前。
    此外,内存访问也同样会产生异步异常,比如SEerror。这个将会在下文中描述。
    在AArch64中,同步的Data abort(数据访问中止)将会产生一个同步异常,如果是异步的abort,将会产生一个SError中断异常。

2.3 产生异常的指令

ARM架构提供了一些显式的指令,用于产生一个异常。这些指令用于实现系统调用接口,以允许低特权的软件向高特权的软件请求服务。这些方法有时被称为系统调用,通常用于基于软件的API。
ARM架构包含三个异常产生的指令:SVC,HVC以及SMC。这三个指令仅仅是用于产生一个异常,并以此让处理器在各个异常等级中切换:

  • Supervisor Call (SVC),SVC指令用于EL0切换到EL1,比如一个工作在EL0的用户程序,可以使用SVC指令,请求一个工作在EL1操作系统的服务。

  • Hypervisor Call (HVC),如果虚拟化在当前架构中被实现,比如在虚拟机程序中,工作在EL1的操作系统可以通过HVC指令,向工作在EL2的hypervisor请求服务,可以进行不同的OS间的切换。

  • Secure Monitor Call (SMC),如果安全扩展功能在当前架构中被实现,则程序如果想要在安全世界(secure world)和非安全世界(normal world,non-secure world)切换,需要通过使用SMC指令来实现。

  • 此外,异常等级切换(低等级向高等级切换)需要遵守如下图规则:
    这些指令
    如果当前处理器处于EL0,则它不能直接使用HVC或者SMC,切换到更高等级。只能使用HVC指令先进入EL1,才可以切换到其他更高的异常等级。
    由于异常无法向更低等级切换,换句话说,如果是由高等级切到低等级,而是使用ERET指令。总结如下:

  • 系统调用(System Call),切换(SVC,HVC,SMC)到更高等级。

  • 返回(ERET,exception return)到更低等级。

所以,如果处于EL2的处理器执行SVC指令是不会切到EL1的。

2.4 调试异常 Debug exceptions

调试异常也是同步异常,该异常会被路由到当前调试器所处的异常等级。然后,调试器代码执行得很像异常处理程序代码一样。调试异常有很多种,包括如下:

  • Breakpoint Instruction exceptions
  • Breakpoint exceptions
  • Watchpoint exceptions
  • Vector Catch exceptions
  • Software Step exceptions
    关于调试异常的具体介绍,可以查看AArch64 self-hosted debug guide。

三, 异步异常 Asynchronous exceptions

上文我们提到过,同步异常是由于处理器执行指令触发的异常,而有些异常是产生于处理器外部,因此无法和CPU当前执行的指令流同步,这种和CPU当前执行的指令没有直接关系的异常,我们称为异步异常(Asynchronous exceptions),并且这种异常一般是由CPU外部的系统事件产生的,这可能是软件需要响应的系统事件,如计时器的活动或屏幕的触摸,但是我们并不知道它们什么时候会发生。
根据定义,如果一个异常不是同步的,则该异常是异步异常。中断(interrupts)实际上就是异步异常的一种。
在发生异步异常时,程序流将被中断,并传递给handler以专门处理此外部请求。因为不可能准确地保证何时会发生异步异常,所以AArch64架构只要求它在有限的时间内发生

3.1 物理中断 Physical interrupts

物理中断是指为了响应来自处理器外部的信号而产生的中断,通常是由外围设备产生的。处理器并不需要主动地不断轮询这种外部信号,系统会通过产生中断的方式来通知处理器,处理器收到中断后,会进入相应的中断处理函数以响应该信号。
比如,系统中可能使用UART(Universal Asynchronous Receiver/Transmitter)连接CPU,并与外界通信。当UART收到数据后,系统中需要有个机制来告诉CPU,UART收到新数据了,CPU这边需要接收并处理这些数据。其中一种机制就是中断:UART可以产生一个中断来通知CPU有新数据需要处理。
在复杂的SOC系统中,可能有非常多的带有优先级的中断源,并且包含中断嵌套的能力:在处理较低优先级的中断时,更高优先级的中断可以打断低优先级中断的处理,在处理完高优先级中断后,再接着处理低优先级中断。
处理器在处理这种嵌套中断的响应速度可能是系统设计中的一个关键问题,这被称为中断延迟(interrupt latency)。

3.2 系统错误异常 SError

当内存系统响应了一些不正常的事件,并反馈给处理器,将会产生一种 SError的异步异常。在正常操作流程中,我们不希望有这种异常发生,但是处理器有必要知道它的一些和内存系统的交互是否触发了这种异常。这种异常的上报是异步的,导致这种异常发生的指令(比如读写内存系统的指令,load/store)可能已经执行完了。
一种典型的SError异常就是来自外部的异步中止,比如有:

  • 内存总线上的错误,处理器发出一个访问内存的请求(比如读写),首先会经过MMU的检查(假设MMU被使能),MMU检查通过后,会传到内存总线上,在内存总线上遇到的错误。
  • 在一些RAM上进行 奇偶检验或者错误纠正(Parity or Error Correction Code (ECC)时发生的错误,比如一些内置的cache。
  • 将脏数据由cache line中写回到外部内存系统中发生的错误。

SErrors被视为一个单独的异步异常类型,因此用户代码通常对这些情况有单独的处理程序。并且SError异常的产生是由具体的架构实现来定义的。

3.3 IRQ和FIQ 中断

Arm体系结构有两种异步异常类型:IRQ和FIQ,旨在用于支持外围设备中断的处理。处理器会引出两个信号线:IRQ和FIQ,这些是用于传入外部事件,如设置的计时器(timer)超时了,这并不代表系统错误。IRQ和FIQ是外部信号与处理器的指令流之间的,虽然是异步的,但是预期的事件。IRQ和FIQ有独立的路由控制,通常用于实现安全和非安全中断。关于这两种中断类型的具体使用方式,由具体的架构实现来定义。
在老版本的Arm体系结构中,FIQ被用作更高优先级的快速中断。这与AArch64不同,在AArch64中,FIQ与IRQ具有相同的优先级。
在几乎所有的情况下,中断控制器(Generic Interrupt Controler)都与系统中的AArch64处理器成对使用,GIC用于收集、优先级排序和处理所有要发送到处理器的中断。所有的ARM架构实现都使用(GIC)架构来管理IRQs和FIQs。GIC执行中断管理、优先级和路由任务,为每个物理中断类型都提供一个中断号。详情可以参考 Arm Generic Interrupt Controller v3 and v4 guide。

3.4 虚拟中断 Virtual interrupts

如果系统中实现了虚拟化,则对中断处理有了更复杂的需求,一些中断可能由hypervisor处理,有些中断可以在VM(虚拟机程序)中处理。被虚拟机程序看到的中断就是虚拟中断。虚拟中断可以由软件产生,也可以由连接到中断控制器的外设产生。因此想要支持虚拟中断,必须要额外的机制,在AArch64架构中支持以下虚拟中断:

  • vSError, Virtual System Error
  • vIRQ, Virtual IRQ
  • vFIQ, Virtual FIQ
    虚拟中断按照其中断类型被控制,这些虚拟中断的功能与物理对应的中断相同,但是它们只能向EL1发出信号虚拟中断可以从EL2处的虚拟机管理程序或使用中断控制器生成。hypervisor必须在Hypervisor Configuration Register(HCR_EL2)中设置相应的控制bit。例如,要启用vIRQ信令,系统管理程序必须设置HCR_EL2的IMO位,此设置将物理IRQ异常路由到EL2,并允许将虚拟中断信号发送到EL1。
    在寄存器 HCR_EL2中,有三个bit来控制虚拟中断的产生:
  • VSE,设置这个bit将注册一个 vSError.
  • VI ,设置这个bit将注册一个vIRQ.
  • VF, 设置这个bit将注册一个 vFIQ.
    设置其中一个bit相当于一个中断控制器断言了其中一个虚拟中断信号到一个虚拟CPU。该方法的一个影响是:需要hypervisor来模拟虚拟机程序中的中断控制器的操作。当频繁地这样操作时,这可能会导致系统大量的开销,因此建议直接使用中断控制器模拟一个虚拟中断。
    GICv2及更高版本提供物理CPU接口和虚拟CPU接口,并且同时支持物理中断和虚拟中断。关于GIC的详细使用可以参考: Arm
    Generic Interrupt Controller v3 and v4.。关于虚拟中断,参考 AArch64 virtualization guide。

四,异常屏蔽(Masking)

对于异步异常:可以暂时屏蔽物理和虚拟的异步异常。这意味着异步异常可以保持在挂起状态,直到它们被停止屏蔽,并被处理器接收异常。这对于处理嵌套的异常特别有用。
对于同步异常:ARM架构无法屏蔽同步异常。这是因为同步异常是由指令的执行直接引起的,因此,如果它们被搁置或忽略,将会阻塞CPU的执行。
在2021年的扩展中,Armv8.8-A和Armv9.3-A增加了不可屏蔽的中断(Non-maskable interrupt,NMI)支持。当NMI被支持和启用时,可以通过该功能将具有超优先级(Superpriority)的中断发送给给处理器。

相关文章:

ARMv8-AArch64 的异常处理模型详解之异常类型 Exception types

异常类型详解 Exception types 一, 什么是异常二,同步异常(synchronous exceptions)2.1 无效的指令和陷阱异常(Invalid instructions and trap exceptions)2.2 内存访问产生的异常2.3 产生异常的指令2.4 调…...

Linux操作系统概念

绪论​: “心灵纯洁的人,生活充满甜蜜和喜悦。——列夫托尔斯泰”,本章的主要内容是介绍了硬件的组成结构冯诺依曼体系结构以及操作系统的概念和操作系统的作用,本章的内容主要是理论他起到承上启下的作用只有理解了操作系统的运行…...

Speech | 人工智能中关于语音务必需要了解的基础知识(信号处理)及代码

语音是指人们讲话时发出的话语,是一种人们进行信息交流的声音,是由一连串的音组成语言的声音,我们可以理解为语音(speech)声音(acoustic)语言(language)。 目录 0.声音的基本属性 0.1.音高(pitch) 0.2.音量(Volume) 0.3.音色(Timbre) 0…...

c# 单例模式实现

方式一: 在C#中,可以使用单例模式来确保一个类只有一个实例,并提供一个全局访问点。 public class Singleton {private static Singleton instance;private static readonly object lockObject new object();private Singleton(){// 私有构…...

万字长文详解Java线程池面试题

王有志,一个分享硬核 Java 技术的互金摸鱼侠 加入 Java 人的提桶跑路群:共同富裕的Java人 今天是《面霸的自我修养》第 6 篇文章,我们一起来看看面试中会问到哪些关于线程池的问题吧。数据来源: 大部分来自于各机构(J…...

【jQuery入门】链式编程、修改css、类操作和className的区别

文章目录 前言一、链式编程二、修改css2.1 获取css的值2.2 设置单个css属性2.3 设置类样式添加类移除类切换类 三、类操作与className的区别总结 前言 jQuery是一个流行的JavaScript库,广泛用于简化DOM操作和处理事件。在jQuery中,链式编程是一种强大的…...

使用的uview 微信高版本 头像昵称填写能力

<template><view><button class"cu-btn block bg-blue margin-tb-sm lg" tap"wxGetUserInfo">一键登录</button><view><!-- 提示窗示例 --><u-popup :show"show" background-color"#fff">&…...

Hadoop3完全分布式搭建

一、第一台的操作搭建 修改主机名 使用hostnamectl set-hostname 修改当前主机名 关闭防火墙和SELlinux 1&#xff0c;使用 systemctl stop firewalld systemctl disable firewalld 关闭防火墙 2&#xff0c;使用 vim /etc/selinux/config 修改为 SELINUXdisabled 使用N…...

中断——外部中断EXIT

前期疑问&#xff1a;中断可以分成外部中断和内部中断吗 文章目录 前言一、中断知识二、中断编程三、EXIT外部中断/事件控制器 3.1 中断事件线3.2 EXTI初始化结构体详解 四、软件设计 4.1 编程要点 五、代码回顾实现六、补充中断知识总结 前言 野火中断章节有这样一句话 【F…...

Kafka-服务端-副本机制

Kafka从0.8版本开始引入副本(Replica)的机制&#xff0c;其目的是为了增加Kafka集群的高可用性。 Kafka实现副本机制之后&#xff0c;每个分区可以有多个副本&#xff0c;并且会从其副本集合(Assigned Replica,AR)中选出一个副本作为Leader副本&#xff0c;所有的读写请求都由…...

银行数据仓库体系实践(4)--数据抽取和加载

1、ETL和ELT ETL是Extract、Transfrom、Load即抽取、转换、加载三个英文单词首字母的集合&#xff1a; E&#xff1a;抽取&#xff0c;从源系统(Souce)获取数据&#xff1b; T&#xff1a;转换&#xff0c;将源系统获取的数据进行处理加工&#xff0c;比如数据格式转化、数据精…...

云计算入门——Linux 命令行入门

云计算入门——Linux 命令行入门 前些天发现了一个人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;最重要的屌图甚多&#xff0c;忍不住分享一下给大家。点击跳转到网站。 介绍 如今&#xff0c;我们许多人都熟悉计算机&#xff08;台式机和笔记本电…...

自然语言处理(NLP)的发展

自然语言处理的发展 随着深度学习和大数据技术的进步&#xff0c;自然语言处理取得了显著的进步。人们正在研究如何使计算机更好地理解和生成人类语言&#xff0c;以及如何应用NLP技术改善搜索引擎、语音助手、机器翻译等领域。 方向一&#xff1a;技术进步 自然语言处理&…...

让uniapp小程序支持多色图标icon:iconfont-tools-cli

前景&#xff1a; uniapp开发小程序项目时&#xff0c;对于iconfont多色图标无法直接支持&#xff1b;若将多色icon下载引入项目则必须关注包体&#xff0c;若将图标放在oss或者哪里管理&#xff0c;加载又是一个问题&#xff0c;因此大多采用iconfont-tools工具&#xff0c;但…...

丹麦公司注册优势 丹麦公司注册条件 丹麦公司注册注意事项

丹麦公司注册优势 1、开-放的商业环境&#xff0c;拥有公平透明的商业法律和制度。 2、简化的注册流程&#xff0c;无需繁琐的审批程序和复杂的材料准备。 3、全球认可的声誉&#xff0c;有助于提升贵公司的国际形象。 4、该国的政-府在坚持适度紧缩的财政政策&#xff0c;…...

C++PythonC# 三语言OpenCV从零开发(4):视频流读取

文章目录 相关链接视频流读取CCSharpPython 总结 相关链接 C&Python&Csharp in OpenCV 专栏 【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程&#xff08;附带课程课件资料课件笔记&#xff09; OpenCV 教程中文文档|OpenCV中文 OpenCV教程中文文档|W3Csc…...

vue element MessageBox.prompt this.$prompt组件禁止显示右上角关闭按钮,取消按钮,及点击遮罩层关闭

vue element MessageBox.prompt this.$prompt组件禁止或取消显示右上角关闭按钮&#xff0c;取消按钮&#xff0c;及点击遮罩层关闭 实现效果&#xff1a; 实现代码 MessageBox.prompt(请先完成手机号绑定, 系统提示, {confirmButtonText: 提 交,showClose: false,closeOnClic…...

Oracle 日常健康脚本

文章目录 摘要常用脚本 摘要 保持 Oracle 数据库的良好健康状况对于系统的可靠性和性能至关重要。本文将介绍一些常用的 Oracle 日常健康脚本&#xff0c;帮助您监控数据库并及时识别潜在的问题&#xff0c;以保证数据库的稳定运行。 常用脚本 1.查询数据库实例和实例级别的…...

leetcode670最大交换

给定一个非负整数&#xff0c;你至多可以交换一次数字中的任意两位。返回你能得到的最大值。 示例 1 : 输入: 2736 输出: 7236 解释: 交换数字2和数字7。 示例 2 : 输入: 9973 输出: 9973 解释: 不需要交换。 注意: 给定数字的范围是 [0, 108] int maximumSwap(int num) {…...

XML 注入漏洞原理以及修复方法

漏洞名称&#xff1a;XML注入 漏洞描述&#xff1a;可扩展标记语言 (Extensible Markup Language, XML) &#xff0c;用于标记电子文件使其具 有结构性的标记语言&#xff0c;可以用来标记数据、定义数据类型&#xff0c;是一种允许用户对自己的标记语言进行定义的源语言。 XM…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...