[A-03] ARMv8/ARMv9-多级Cache架构

ver 0.1

前言

前面文章我介绍了Cache的基本架构、Cache的详细的结构,有了一定的cache的基础,对cache机制也有了sense。实际上Cache作为CPU架构中存储机制的核心组件和CPU的微架构以及系统的总线架构还是密切相关的,不同的体系下,Cache的类型、使用策略、同步策略也不尽相同。因此,在介绍具体的策略之前,我们还是先花一点时间对不同体系下的Cache类型,多级cache的连接方式等基础性的课题做一下梳理,然后结合具体的体系中Cache对策略展开讨论。本着研究质疑一切,论证一切的精神,我们一起来思考如下几个问题:
(1) 为什么前面cache的相关文章中,有的L2 Cache是多个PE-Core共享的,有的是PE-Core独占的?
(2) 多级cache架构下,为什么Cache Miss的时候,数据要逐级cache传递才能到PE,可不可以跨越传递?
(3) ARMv9的Cache架构和ARMv8是否一致,基于ARMv8的Cortext-A系列的芯片是否Cache架构都是一致的?
(4) 多级Cache是怎么链接在一起的,Cache和外存又是怎么关联到一起的?
(5) CPU读一个数据和写一个数据的时候,不同的策略下,Cache会发生什么事情?

正文

1 多级Cache

前文中我们已经了解到CPU的Cache分为三级L1、L2、L3,实际上随着CPU微架构的迭代,Cache的架构也在不断的向前迭代,所以我们要循着CPU微架构的步伐来介绍多级Cache的升级迭代,我们从一张SOC的架构框图开始多级Cache的架构探索。

1.1 SOC架构

先来简单回顾一下SOC的架构,如图1-1所示,现代芯片已经不是简单的计算单元,特别是在嵌入式领域将多个功能单元(Master)通过一个总线架构连接到一起,既节省物理空间,也降低了功耗,还能够有效提高整个系统的性能。各个Master包括CPU要按照总线架构中的接口(CHI
、ACE5-Lite DVM、AXI5、ACE-Lite)规范进行设计和开发,然后通过Coherent interconnect上的接口(CHI、ACE5-Lite DVM、AXI5、ACE-Lite)做接合,就构成一个完整、具备一定功能的SOC。接合本文讨论的主题,自然我们更加关注的Master包括Memory System 、CPU节点(CPU 内部的Memory System)。
SOC

图1-1 典型SOC架构

1.2 总线架构

通过上面的介绍,我们可以看出SOC上各个Master接合的枢纽就是“Coherent interconnect”,这个聚合的点就是总线架构,ARM系列的芯片采用的就是高级微控制器总线架构(Advanced Microcontroller Bus Architecture)。AMBA是一个协议簇,不是我们讨论的重点,我们更加关注的是ARM系列芯片设计中的具象化的实例,并通过实例来展现ARM芯片的Memory系统是如何串联到一起的。

1.2.1 缓存⼀致性总线-CCI

CCI是ARM架构中用于实现多核处理器之间缓存一致性的关键技术。它通过硬件管理的一致性机制,确保多个处理器核心和其他资源(如GPU、DMA控制器等)在访问共享内存时能够保持数据的一致性,从而提高系统性能和降低功耗。我们看一下手册中描述:

The CCI-550 is a programmable high-bandwidth interconnect that enables hardware-coherent systems.
Hardware-managed coherency can improve system performance and reduce system power by sharing on-chip data. Managing coherency in hardware has the benefits of:
• Reducing external memory accesses.
• Reducing the software overhead and complexity.
• Enabling use of Arm big.LITTLE ™ processing technology with multiple processor clusters.
The CCI-550 is a configurable interconnect that supports connectivity of:
• Up to six AMBA 4 ACE masters, such as the Arm Cortex ® -A57 or Cortex-A72 processors.
• Up to six AMBA 4 ACE-Lite masters, such as the Arm Mali ™ -T880 Graphics Processing Unit (GPU).
• Up to seven AMBA 4 AXI4 slaves, such as memory and system peripherals. This includes support for up to six memory interfaces.

下面来看一个具体CCI实例,如图1-2所示。
CCI-550

图1-2 CCI实例

通过CCI的实例可以看到外围的Master通过接入缓存一致性总线的接口ACE等接入到了SOC系统,这里就包括Cortex-A72 CPU簇和Cortex-A53 CPU簇。显然Cortex-A系列的微架构内肯定也要支持ACE接口规范才能够和CCI契合,进而才能够连接并接受总线规范约束,后面章节我们会论证这一点。

1.2.2 缓存⼀致性总线-CMN

缓存一致性总线CMN(Coherent Mesh Network)是一种先进的片上网络互连技术,基于Mesh拓扑结构,支持AMBA CHI/ACE-LITE等接口,内部采用路由结构转发数据,提供硬件一致性和系统缓存。旨在提供高性能、低延迟和高可靠性的缓存一致性解决方案。下面摘录手册中对CMN的一些官方介绍:

The CMN‑700 product is a scalable configurable coherent interconnect that is designed to meet the Power, Performance, and Area (PPA) requirements for Coherent Mesh Network systems that are used in high-end networking and enterprise compute applications.
CMN‑700 is a scalable mesh interconnect with 1-256 processor compute clusters.
CMN‑700 supports Arm ® AMBA ® 5 CHI Issue E, including the following features:
• MakeReadUnique, writes with optional data, and write zero with no data transactions
• Enhanced Exclusive transactions
• Various transaction optimizations and enhancements
• Connection of devices with multiple interfaces
• Connection of devices with replicated channels
• Extended TxnID and GroupID
• Distributed Virtual Memory (DVM) updates
• Memory tagging

下面来看一个CMN总线的接口,如图1-3所示。
CMN-700

图1-3 CMN接口

通过上图可以看出,CMN的主要作⽤是可以互联多个CHI Master 、 ACE - lite Master ,然后通过CHI接⼝协议,做到多个Master之间的缓存⼀致性。可以看出Master(CPU)要接入CMN总线需要支持CHI或者ACE接口规范,这里后面章节也会具体通过实例进行论证。

1.3 CPU微架构

上面的章节SOC架构、总线架构、总线架构的接口都准备好了,到这里该聊聊总线上功能单元Master了,围绕着本文的主题Cache,这里自然要介绍CPU这个节点。
当然其他总线上的其他Master节点,例如GPU、VPU、aDspc等处理内部微架构中也有Cache,理论上其实和Cortex-A系列是相通的,只不过其他的Master可能是基于Cortex-R、Cortex-M系列的微架构,但这里暂时不展开讨论。

1.3.1 big.Little架构

苹果高出了Iphone之后,移动电子设备迎来了蓬勃发展的黄金时期,研发人员、消费者都是受益者,这里要短暂的停留,致敬一下那些真正的科技产品的先驱。移动电子产品带给人们的便利自然不必细说,但是移动电子产品一直以来的一个问题就是功耗问题,电池的容量毕竟是有限的,所以除了不断加到电池的容量之外,提高电池的使用效率也是无数的研发人员主攻的方向。在这样的背景下,ARM公司采用了Big.Little架构方案。核心的思想如下:

Software can run on big or the LITTLE processors (or both) depending on performance requirements. When peak performance is equired software can be moved to run only on big processors. For normal tasks, software can be run perfectly well on LITTLE processors. Through this combination, big.LITTLE provides a solution capable of delivering the peak performance required by the latest mobile devices, within the thermal bounds of the system, and with maximum energy efficiency.

举例手机上一个音乐app在后台播放音乐,用户在跑步,那么就可以将这个task调度到低功耗的PE-Core上执行,当用户需要玩游戏的时候,由于游侠app需要重度算力需求的时候,这个时候就把游戏task调度到高功耗PE-Core上执行,此时用户会获得更好的使用体验。big.Little的具象场景就在这里。
下面我们看一个具体big.Little架构,如图1-4所示。
big.Little

图1-4 典型的big.Little架构

在 big . LITTLE 架构中,⼤核⼩核在不同的cluster中,做为两个不同的ACE或CHI Master,连接到缓存⼀致性总线上(CCI或CMN)。⼤核cluster和⼩核cluster的缓存⼀致性,也需要通过⼀致性总线来解决。big.LittleCluster中的PE-Core是支持可配置的,例如上图中就是小核A53和大核A57组成的两个Cluster。
现在我们需要看一下,这些Cortex-A系列的处理器是如何和总线架构CCI对接的,如图1-5。
A53-IF

图1-5 A53处理器配置实例

通过图1-5所示,A53处理器配置了ACE或者CHI接口以后,就可以和CCI总线的ACE或者CHI接口对接,进而联接到整个SOC系统中。那么这里我们可以得出一个结论只要是配置的ACE或者CHI接口的处理器都可以接入CCI总线(如图1-6所示),当两个算力有差异的Cluster都连接到SOC系统后,就形成了典型的Big.Little架构。
A72-IF

图1-6 A72处理器配置实例
1.3.2 DynamIQ架构

在big.LITTLE架构中,要求big处理器和LITTLE处理器位于不同的cluster内,big处理器cluster和LITTLE处理器cluster通过Cache Coherent Interconnect(CCI)进行数据传输,因此会不可避免地带来传输延迟,引起整体性能下降。于是ARM于2017年3月发布了DynamIQ技术。DynamIQ技术是big.LITTLE技术的升级,两者均为ARM提出的异构处理技术,big.LITTLE技术已经成为了DynamIQ技术的组成部分。与big.LITTLE技术不同,DynamIQ技术支持了将big处理器、LITTLE处理器和DynamIQ Shared Unit (DSU)集成在同一个cluster中,称为DynamIQ cluster,每个芯片可以集成多个DynamIQ cluster;在同一个cluster内,big处理器和LITTLE处理器的数据传输不必依赖big.LITTLE架构中的Cache Coherent Interconnect(CCI)硬件,而是通过DSU中的L3 Cache实现,从而简化了big处理器和LITTLE处理器间任务切换的数据共享复杂度,改善了传输延迟性能,提高了能效。与big.LITTLE技术相比,DynamIQ技术具有以下区别及相应的优势:
(1) 同1个DynamIQ cluster内支持同时集成big处理器和LITTLE处理器,最多集成8个不同种类的处理器,从而使得big处理器和LITTLE处理器的配置数量更加灵活;
(2) 同1个DynamIQ cluster内不同处理器的工作电压和频率可以通过DSU进行单独配置,有利于提高能效;
(3) 在保证高性能的同时,进一步提高了芯片能效。

下面看一个典型的基于DynamIQ的架构的SOC拓扑,如图1-7所示。
DSU

图1-7 典型基于DSU的总线架构

关于DSU的细节我们不展开讨论,这里直接说两个结论:
(1) 缓存一致性总线上(CCI or CMN)上可以接入2个基于DSU架构的CPU Cluster,稍后我们也会从接口层面论证这一结论。
(2) DSU内部的PE-Core支持异构架构,也可以通过Big.Little的方式组合,但是PE-Core数量的上限是8个。

下面我们看一下DSU的接口,来回应下前面遗留的课题,看一下DSU是如何接入到SOC系统总线上的,如图1-8所示。
DSU-IF

图1-8 典型DSU配置实例

通过上图可以看出DSU配置了ACE或者CHI接口之后,就可以和SOC的缓存一致性总线CCI或者CMN的ACE或者CHI接口契合,最终合入到SOC系统。注意这里的DSU其实是一个封装PE-Core的架构,它的内部还会按照异构架构设计模式自由组合,如图1-9所示。
710

图1-9 Cortex-A710配置实例

这里我们直接引用手册中的描述,介绍一下A710以及其月DSU的关系,可以看出新一代的ARM芯片基本都要依托DSU架构才能工作。

The Cortex ® ‑A710 core is a high-performance, low-power, and constrained area product that implements the Arm ® v9.0-A architecture. The Arm ® v9.0-A architecture extends the architecture defined in the Armv8-A architectures up to Arm ® v8.5-A. The Cortex ® ‑A710 core targets clamshell and premium high-end smartphone applications.
The Cortex ® ‑A710 core is implemented inside a DynamIQ ™ -110 cluster and is always connected to the DynamIQ ™ Shared Unit-110 (DSU-110) that behaves as a full interconnect with L3 cache and snoop control.

1.4 多级Cache架构

前面画了很多篇幅介绍了SOC的架构、总线架构、以及CPU的微架构,目的就是想让大家知道多级Cache在不同架构体系下的详细架构以及区别。“大夫的目的很简单,就是想让大家了解它们到底是怎么来的。(80后应该了解这句话的含义,哈哈)”。很多时候,如果不能把背景交代清楚,大家理解起来还是有困难的,总是觉得心里空唠唠的,所以我们花费一点笔墨是值得的。这里我们把Big.Little和DynamIQ架构下的多级Cache架构捏合在一起看,如图1-10、图1-11所示。
BG-Multi-Cache

图1-10 Big.Little架构下的多级Cache

DSU-Multi-cache

图1-11 DSU架构下的多级Cache

通过上面两图的展示和对比,我们可以总结归纳一下ARM体系下到目前为止的多级Cache的特征如下:
(1) 传统的Big.Little架构和DynamIQ架构下,无论PE-Core怎么分簇,都支持3级Cache架构(L1、L2、L3)。(其实L3在工程实践中是可选的,但是省下这一层cache硬件,就要花费更多的指令周期去做不同的CPU Cluster的数据同步。)
(2) 在Big.Little的架构中,L1是在core中的,是core私有的;L2是在cluster中的,对cluster中的core是共享的;L3则对所有cluster共享。
(3) 在DynamIQ的架构中,L1和L2都在core中的,都是core私有的;L3则是在cluster中的,对cluster中的core是共享的;如有L3或system cache,则是所有cluster共享。
搞清楚了多级Cache的架构之后,我们还不能停止步伐,下面来看两款具体的CPU实例来印证我们的结论。

基于Big.Little的PE-Core 多级Cache实例
通过图1-12,我们能够清晰的看到,早期的A72芯片的L2Cache是各个PE-Core共享的,儿L1级别的Cache是各个PE-Core独立,而且分成了指令Cache和数据Cache。从手册中摘录一下Cache的特征信息:

The Cortex-A72 processor includes the following features:
• Dynamic branch prediction with Branch Target Buffer (BTB) and Global History Buffer (GHB)
• RAMs, a return stack, and an indirect predictor.
• 48-entry fully-associative L1 instruction Translation Lookaside Buffer (TLB) with native support for 4KB, 64KB, and 1MB page sizes.
• 32-entry fully-associative L1 data TLB with native support for 4KB, 64KB, and 1MB page sizes.
• 4-way set-associative unified 1024-entry Level 2 (L2) TLB in each processor.
• Fixed 48K L1 instruction cache and 32K L1 data cache.
• Shared L2 cache of 512KB, 1MB, 2MB or 4MB configurable size.
• Optional Error Correction Code (ECC) protection for L2 cache, and optional ECC protection for L1 data cache and parity protection for L1 instruction cache.
• AMBA 4 AXI Coherency Extensions (ACE) or CHI master interface.

A72-Function BLock

图1-12 Cortex-A72 功能框图

基于DSU的PE-Core多级Cache实例
通过1-12,可以看出到了ARMv9的时代,比较新的芯片的L1和L2级别的Cache都变成PE-Core私有的了。这里同样摘录手册中对Cache相关Feature的描述:

Cache features
• Separate L1 data and instruction caches
• Private, unified data and instruction L2 cache
• Error protection on L1 instruction and data caches, L2 cache, and MMU Translation Cache (MMU TC) with parity or Error Correcting Code (ECC) allowing Single Error Correction and Double Error Detection (SECDED)
• Support for Memory System Resource Partitioning and Monitoring (MPAM)
A710

图1-13 Cortex-A710 功能框图

结语

这一篇文章创作的时候,开始只想讲讲Cache的策略,但是写着写着觉得有必要把Cache的多级架构的演变也写一写,于是推到重来,重新扎进手册里和前辈的文章里面,目的一方面就是对Cache的机制有更加全面深入的了解,才能理解与软件相关的Cache策略和接口的设计初衷。
本篇,我们以几个问题的思考开始,带大家从一个SOC的架构一直到多级Cache的诞生的过程,做了一个全景的展示,为我们后续的Cache策略和一致性的学习打下了基础。
谢谢大家,坚持到了这里,预计还有两篇文章,完成我们的Cache之旅。

Reference

[01] <DDI0487K_a_a-profile_architecture_reference_manual.pdf>
[02] <DEN0024A_v8_architecture_PG.pdf>
[03] <80-LX-MEM-yk0008_CPU-Cache-RAM-Disk关系.pdf>
[04] <80-ARM-ARCH-HK0001_一文搞懂CPU工作原理.pdf>
[05] <80-ARM-MM-Cache-wx0003_Arm64-Cache.pdf>
[06] <80-ARM-MM-HK0002_一文搞懂cpu-cache工作原理.pdf>
[07] <80-MM-yd0001_Caches-From-a-Mostly-OS-Software-Perspective.pdf>
[08] <80-MM-yd0002_Improving-Kernel-Performance-by-Unmapping-the-Page-Cache.pdf>
[09] <arm_cortex_a710_core_trm_101800_0201_07_en.pdf>
[10] <DDI0608B_a_armv9a_supplement_RETIRED.pdf>
[11] <arm_cortex_a520_core_trm_102517_0003_06_en.pdf>
[12] <arm_cortex_a720_core_trm_102530_0002_05_en.pdf>
[13] <79-LX-LK-z0002_奔跑吧Linux内核-V-2-卷1_基础架构.pdf>
[14] <80-ARM-MM-Cache-wx0001_Cache多核之间的一致性MESI.pdf>
[15] <80-ARM-MM-Cache-wx0002_深度学习armv8_armv9_cache的原理.pdf>
[16] <80-ARM-MM-Cache-ym0001_深入学习Cache系列-1-带着几个疑问-从Cache的应用场景学起.pdf>
[17] <80-ARM-MM-Cache-ym0002_深入学习Cache系列-2-Cache是如何工作的-概念以及工作过程.pdf>
[18] <80-ARM-MM-Cache-ym0003_深入学起Cache系列-3-多核多Cluster多系统之间的缓存一致性.pdf>
[19] <DDI0500J_cortex_a53_trm.pdf>
[20] <DDI0488H_cortex_a57_mpcore_trm.pdf>
[21] <cortex_a72_mpcore_trm_100095_0003_06_en.pdf>
[22] <corelink_cci550_cache_coherent_interconnect_technical_reference_manual_100282_0100_01_en.pdf>
[23] <80-ARM-DyIQ-wx0001_ARM架构系列(2)-DynamIQ技术.pdf>
[24] <ARM_DynamIQ_The_future_of_multi-core_computing.pdf>
[25] <cortex_a72_mpcore_trm_100095_0003_06_en.pdf>
[26] <arm_cortex_a710_core_trm_101800_0201_07_en.pdf>

Glossary

SRAM - Static Random-Access Memory
DRAM - Dynamic Random Access Memory
SSD - Solid state disk
HDD - Hard Disk Drive
SOC - System on a chip
AMBA - Advanced Microcontroller Bus Architecture 高级处理器总线架构
TLB - translation lookaside buffer(地址变换高速缓存)
VIVT - Virtual Index Virtual Tag
PIPT - Physical Index Physical Tag
VIPT - Virtual Index Physical Tag
AHB - Advanced High-performance Bus 高级高性能总线
ASB - Advanced System Bus 高级系统总线
APB - Advanced Peripheral Bus 高级外围总线
AXI - Advanced eXtensible Interface 高级可拓展接口
DSU - DynamIQ Share Unit
ACE - AXI Coherency Extensions
CHI - Coherent Hub Interface 一致性集线器接口
CCI - Cache Coherent Interconnect
ADB - AMBA Domain Bridge
CMN - Coherent Mesh Network

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

传统数据处理系统存在的问题

传统应用的数据系统架构设计时&#xff0c;应用直接访问数据库系统。当用户访问量增加时&#xff0c;数据库无法支撑日益增长的用户请求的负载&#xff0c;从而导致数据库服务器无法及时响应用户请求&#xff0c;出现超时的错误。 出现这种情况以后&#xff0c;在系统架构上就采…

【Axure高保真原型】中继器表格——移入显示详情卡片案例

今天和大家分享中继器表格——移入显示详情卡片的原型模板&#xff0c;鼠标移入员工号或姓名会弹出员工卡片&#xff0c;可以查看更详细的信息。这个表格是用中继器制作的&#xff0c;所以使用也很方便&#xff0c;只需要维护中继器表格里的信息&#xff0c;即可自动生成交互效…

第一百四十二节 Java数据类型教程 - Java字符数据类型

Java数据类型教程 - Java字符数据类型 Character类的一个对象包装一个char值。 字符类包含isLetter()和isDigit()方法来检查字符是否为字母和数字。 toUpperCase()和toLowerCase()方法将字符转换为大写和小写。 该类提供了一个构造函数和一个工厂valueOf()方法来从char创建对…

Kubernetes云原生存储解决方案openebs部署实践-4.0.1版本(helm部署)

Kubernetes云原生存储解决方案openebs部署实践-4.0.1版本&#xff08;helm部署&#xff09; 简介 OpenEBS 是一种开源云原生存储解决方案。OpenEBS 可以将 Kubernetes 工作节点可用的任何存储转化为本地或复制的 Kubernetes 持久卷。OpenEBS 帮助应用和平台团队轻松地部署需要…

深度学习图像生成与分割模型详解:从StyleGAN到PSPNet

文章目录 Style GANDeeplab-v3FCNAdversarial AutoencodersHigh-Resolution Image Synthesis with Latent Diffusion ModelsNeRF: Representing Scenes as Neural Radiance Fields for View SynthesisPyramid Scene Parsing Network Style GAN 输入是一个潜在向量 (z)&#xff…

[激光原理与应用-98]:南京科耐激光-激光焊接-焊中检测-智能制程监测系统IPM介绍 - 2 - 什么是激光器焊接

目录 一、什么是激光焊接 1.1 概述 1.2 激光焊接的优点 二、激光焊接的应用 2.1 哪些场合必须使用激光焊接 1. 汽车制造业 2. 航空航天领域 3. 电子行业&#xff1a;消费类电子3C 4. 医疗器械制造 5. 新能源锂电池行业 6. 其他领域 三、激光焊接的分类 3.1 按焊接…

【靶机实战】Apache Log4j2命令执行漏洞复现

# 在线靶场 可以通过访问极核官方靶场开启靶机实验&#xff1a;极核靶场 -> 漏洞复现靶场 -> Log4j2-RCE 原文&#xff1a;【靶机实战】Apache Log4j2命令执行漏洞复现 - 极核GetShell (get-shell.com) # 简介 Apache Log4j2 是一个广泛使用的 Java 日志记录库&#…

【ROS2】初级:CLI工具- 理解话题(或主题)

理解话题 目标&#xff1a;使用 rqt_graph 和命令行工具来内省 ROS 2 话题。 教程级别&#xff1a;初学者 时间&#xff1a;20 分钟 目录 背景 先决条件 任务 设置2 rqt_graph3 ros2 话题列表4 ros2 话题回声5 ros2 话题信息6 ros2 接口显示7 ros2 话题发布8 ros2 话题赫兹 清理…

技术革新引领钢材质量智能化检测新纪元,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建钢材工业生产场景下钢材缺陷智能检测识别系统

随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;其应用领域不断拓宽&#xff0c;正深刻改变着传统产业的运作模式。在钢材生产这一基础工业领域&#xff0c;AI的引入正为钢材的质量检测带来革命性的变革。 在传统的钢材生产流程中&#xff0c;质量检测是确…

基于Bootstrap Blazor开源的.NET通用后台权限管理系统

前言 今天大姚给大家分享一个基于Bootstrap Blazor开源的.NET通用后台权限管理系统&#xff0c;后台管理页面兼容所有主流浏览器&#xff0c;完全响应式布局&#xff08;支持电脑、平板、手机等所有主流设备&#xff09;&#xff0c;可切换至 Blazor 多 Tabs 模式&#xff0c;…

打破数据生产力的桎梏,打造数据分析驱动的新型组织

在当前的经济环境下&#xff0c;各行业面临着前所未有的挑战&#xff0c;降本增效成为企业普遍追求的目标。数字化转型被视为实现这一目标的关键路径。通过数字化手段&#xff0c;企业能够探索新的增长机会&#xff0c;提升运营效率&#xff0c;并有效控制成本支出。在这一转型…

纯前端低代码开发脚手架 - daelui/molecule

daelui/molecule低代码开发脚手架&#xff1a;分子组件开发、预览、打包 页面代码示例、大屏代码示例预览 可开发页面组件 可开发大屏组件 项目git地址&#xff1a;https://gitee.com/daelui/molecule 在线预览&#xff1a;http://www.daelui.com/daelui/molecule/app/index.…

探索如何赋予对象迭代魔法,轻松实现非传统解构赋值的艺术

前言 今天下午在网上冲浪过程中看到这样一个问题 面试题&#xff1a;如何让 var [a, b] {a: 1, b: 2} 解构赋值成功&#xff1f; 据说是某大厂面试题&#xff0c;于是我学习了一下这个问题&#xff0c;写下这篇文章记录一下。 学习过程 要想解决这个问题首先要知道什么是解…

概率论与数理统计_上_科学出版社

contents 前言第1章 事件与概率1.1 随机事件与样本空间1.1.1 样本空间1.1.2 随机事件1.1.3 事件之间的关系与运算 1.2 概率的三种定义及其性质1.2.1 概率的统计定义1.2.2 概率的古典定义1.2.3 概率的几何定义1.2.4 概率的性质 1.3 常用概型公式1.3.1 条件概率计算公式1.3.2 乘法…

百日筑基第十一天-看看SpringBoot

百日筑基第十一天-看看SpringBoot 创建项目 Spring 官方提供了 Spring Initializr 的方式来创建 Spring Boot 项目。网址如下&#xff1a; https://start.spring.io/ 打开后的界面如下&#xff1a; 可以将 Spring Initializr 看作是 Spring Boot 项目的初始化向导&#xff…

【数智化人物展】数势科技创始人兼CEO黎科峰:数智化时代To B软件行业面临颠覆与重塑...

黎科峰 本文由数势科技创始人兼CEO黎科峰投递并参与由数据猿联合上海大数据联盟共同推出的《2024中国数智化转型升级先锋人物》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 2020年&#xff0c;对我而言&#xff0c;是职业生涯中的一个重大转折点。在全球新…

频域信号通过逆傅里叶变换恢复成时域信号

频域信号通过逆傅里叶变换恢复成时域信号 flyfish import numpy as np import matplotlib.pyplot as plt from scipy.fftpack import fft, ifft plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False# 设置参数 t np.linspace(0, 1, 1000, en…

Simulink中示波器连续运行的方法

1.在Simulink中,经常要使用到示波器,默认示波器是定时运行的,只能观察到一小部分运行的波形;实际调试过程中,经常要连续运行,因此,需要设置示波器为连续运行模式,下面将介绍示波器连续运行的方法。 打开Simulink仿真软件,找到仿真设置按钮,点击设置: 2.将其停止时间…

音频流格式启用数据流

音频流格式启用数据流 音频流格式启用数据流使用 AudioStreamBasicDescription 结构在哪里以及如何设置流格式 音频流格式启用数据流 在单个样本帧级别处理音频数据时&#xff0c;就像使用音频单元一样&#xff0c;仅仅指定正确的数据类型来表示音频是不够的。单个音频样本值中…

HandlerMethodArgumentResolver :深入spring mvc参数解析机制

❃博主首页 &#xff1a; <码到三十五> ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a; 搬的每块砖&#xff0c;皆为峰峦之基&#xff1b;公众号搜索(码到三十…