虚拟化技术 — 硬件辅助的虚拟化技术

news2025/2/27 22:54:48

目录

文章目录

  • 目录
  • 硬件辅助的虚拟化技术概览
  • CPU 虚拟化技术
    • 基于二进制翻译的全虚拟化技术(Full-Virtualization)
    • 需要改造 GuestOS 的半虚拟化技术(Para-Virtualization)
    • Intel VT-x 硬件辅助的虚拟化技术(Hardware-assisted virtualization)
      • VMCS 指令集和 VMCS Configuration 空间
      • VMX 切换(VM Entry 和 VM Exit 指令集)
      • VMCS Configuration 空间解析
  • Memory 虚拟化技术
    • 软件实现的两级地址映射技术
    • 软件实现的 SPT 影子页表技术
    • Intel VT-x 硬件辅助的 EPT 扩展页表技术
  • I/O 虚拟化技术
    • Intel VT-d 硬件辅助的 I/O 虚拟化技术
      • IOMMU 硬件单元
      • DMA Remapping Feature
      • Interrupt Remapping Feature

硬件辅助的虚拟化技术概览

硬件辅助的虚拟化技术,又称为芯片辅助(Chip-Assisted)的虚拟化技术,最初来自于 Intel CPU 实现的 VT(Virtualization Technology)技术,现在已经逐渐发展为以下虚拟化技术扩展分支:

  • Intel VT-x(Intel Virtualization Technology for x86):使得 VMM(虚拟机监视器)能够在 Intel x86 CPU 上直接运行,而不需要通过 “二进制翻译“ 技术来模拟。它提供了一组 CPU 指令和硬件辅助功能,包括 CPU 虚拟化和内存虚拟化,使得虚拟机能够更好地运行,并提供更好的安全性和隔离性。

  • Intel VT-d(Intel Virtualization Technology for Directed I/O):是为虚拟化环境中的 I/O 设备提供的硬件加速技术,它能够提高 VM(虚拟机)访问 I/O 设备的性能和安全性。它通过提供硬件辅助来限制 VM 访问 I/O 设备的范围和权限,防止恶意代码窃取敏感信息或破坏系统。

  • Intel VT-c(Intel Virtualization Technology for Connectivity):是一种网络加速技术,它通过提供硬件辅助来加速网络虚拟化的性能和可扩展性,提高虚拟机网络访问的效率和带宽利用率。它支持多队列、多核心和多路复用等功能,提高了虚拟机的网络吞吐量和响应速度。

在这里插入图片描述

  • 官方文档:https://www.intel.com.tw/content/www/tw/zh/virtualization/virtualization-technology/intel-virtualization-technology.html

CPU 虚拟化技术

基于二进制翻译的全虚拟化技术(Full-Virtualization)

基于二进制翻译的全虚拟化技术,是一种完全由软件实现的虚拟化技术,最初诞生于 1998 年,是由 VMware 在 x86 CPU 上实现的 “二进制翻译(Binary Translation)” 技术。其实现原理如下:

  1. HostOS(VMM 进程)运行在 x86 CPU 的 Ring0(内核态)上,而 GuestOS(VM 进程)运行在 Ring1 上,User Application 则运行在 Ring3(用户态)上。
  2. GuestOS 和 HostOS 的代码保持一致,虽然本质上是 HostOS 上的一个 User Process,但也会执行 CPU 提供的特权(Privilege)指令集(包括内核态和用户态的特权指令),例如:shutdown、reboot 等等。
  3. 为了避免 GuestOS 执行特权指令时,会对 HostOS 造成影响,所以 VMM 需要充当一道安全屏障,提供 “特权压缩“ 和 “陷入模拟“ 能力。
  • 特权压缩(Ring Compression):又称为特权降级。当 GuestOS 执行内核态的 Ring0 指令时,VMM 就会将其 “捕获",因为 VMM 运行在 Ring0 上,而 GuestOS 实际是运行在 RIng1 上,所以 VMM 可以捕获 GuestOS 发出的 CPU 指令。捕获后,VMM 调用若干个用户态的 Ring3 指令来进行 “模拟”,从而将 Ring0 的 “降级“ 为 Ring3。如此的,GuestOS 就能够照常执行内核态的指令了。但是,这只能解决内核态的特权指令问题,无法解决用户态的特权指令问题。所以还需要另外的 “陷入模拟“。

  • 陷入模拟(Binary translation):又称为二进制翻译,VMM 会 “捕获“ 所有无法通过 “特权压缩“ 来降级的特权指令,并陷入模拟,将特权指令 “翻译” 成一个只针对 GuestOS 这个进程的、且运行在用户态之上的非特权指令。例如:当 GuestOS 执行了 reboot 指令,VMM 首先将其捕获,然后翻译为 “reboot“,执行 GuestOS 的重启操作。

可见,完全由软件实现的全虚拟化技术需要频繁的捕获这些特权指令,将这些指令进行转换之后,再交给 CPU 执行,导致其性能低下。

在这里插入图片描述

需要改造 GuestOS 的半虚拟化技术(Para-Virtualization)

半虚拟化(Para-Virtualization)技术,也是一种完全由软件实现的虚拟化技术,最初诞生与 2003 年,是由开源的 Xen 虚拟化项目首先提出。其实现原理如下:

  1. Virtualization Layer(HostOS + VMM)运行在 x86 CPU 的 Ring0(内核态)上,GuestOS(VM 进程)也运行在 Ring0 上,User Application 则运行在 Ring3(用户态)上。

  2. GuestOS 和 HostOS 的代码不一致。GuestOS 需要经过特殊的改造,将需要执行特权指令的代码都修改成对 Virtualization Layer API 的调用,称为 Hypercalls(区别于 Systemcalls)。通过这样的方式,VMM 就不再需要执行捕获了,因为 GuestOS 永远也无法发出特权指令,所以 VMM 在实现上会更加简单,但相对的也无法支持原生的操作系统内核。

在这里插入图片描述

另外,Xen 为了进一步提升 VM 的存储和网络 I/O 效率,还提供了一个特殊的 Domain0 VM,作为所有 Normal VMs 的 I/O 中转站。即:VM 通过一个 I/O Front-end(前端模块)与 Domain0 中的 Backend(后端模块)进行交互,并最终由 Domain0 中的 Device drivers 实现物理 I/O。

Domain0 的本质是 Xen 的一个特权虚拟机,运行着被修改过的 Linux kernel,它拥有访问物理 I/O 资源的权限,为其它的 Normal VMs 提供 I/O 外设模拟仿真功能。

在这里插入图片描述

Intel VT-x 硬件辅助的虚拟化技术(Hardware-assisted virtualization)

硬件辅助的虚拟化技术,顾名思义,是一种由 CPU 硬件来辅助实现的虚拟化技术,最早诞生于 2006 年,由 Intel 实现的 VT-x(Virtualization Technology for x86)技术。其实现原理如下:

  1. CPU 提供了 Root Mode 和 Non-root Mode 这 2 种运行模式。其中,HostOS(VMM)运行在 Root Mode 拥有最高执行权限,而 GustOS(VM)和 User Application 则运行在 Non-root Mode(受控模式),并且这 2 种模式都支持 Ring 0~3。因此 VMM 和 Guest OS 都可以自由选择它们所期望的 CPU 运行级别,因此 “特权压缩“ 的问题迎刃而解。

  2. 与二进制翻译的实现方式类型,运行在 Root Mode 上的 CPU 会自动捕获 GuestOS 发出的特权指令(触发异常),然后交由 VMM 来完成翻译,处理后再使用 VMLAUNCH 或 VMRESUME 指令返回到 GuestOS。

这种由硬件辅助来完成的方式显然会比完全由软件实现的方式效率更高。并且 Root Mode 和 Non-root Mode 之间的模式切换时,上下文的保存与恢复也是由 CPU 硬件来完成,也有效提高了陷入(模拟时上下文切换)的效率。

在这里插入图片描述

Intel VT-x(Intel Virtualization Technology for x86)技术的另一个核心是为 VMM 提供了一组 CPU 指令和硬件辅助功能。其中,最核心的 CPU 指令集有以下 3 个:

  1. VM Entry 指令集
  2. VM Exit 指令集
  3. VMCS 指令集和 VMCS Configuration 空间

在这里插入图片描述

VMCS 指令集和 VMCS Configuration 空间

VMCS(Virtual Machine Control Structures,虚拟机控制指令)有两个部分组成:

  1. VMCS 指令集:故名思义,是用于控制 VM 的一系列操作指令。包括:VMREAD、VMWRITE、VMCLEAR 等等。

  2. VMCS Configuration 空间:本质是寄存器,存储了一个 64bits 的指针,指向一个物理的内存空间。以 vCPU 为对象,有多少个 vCPU,就有多少个 VMCS 指针。因为 VMM 和 GuestOS 共享底层的 CPU 资源,所以 CPU 需要一个物理的内存空间来自动保存或恢复彼此切换时的上下文。这块空间包括了 3 个区域:

    1. Guest State Area(Guest 状态区):在 VMX 切换的过程中,存放 GuestOS 的上下文。
    2. Host State Area(Host 状态区):存放 HostOS 的上下文。
    3. Execute State Area(执行控制区):存放可以操控 VM Entry 和 VM Exit 的标志位,例如:标记哪些事件可以导致 VM Exit,或者 VM Entry 时准备自动给 GuestOS 注册的中断类型等等。

VMX 切换(VM Entry 和 VM Exit 指令集)

VMX 切换,即:CPU Root Mode 和 Non-root Mode 之间的切换。CPU 收到 VMM 的控制,在这 2 种模式中进行切换,继而轮流执行 VMM 或 GuestOS 的代码。

在这里插入图片描述

VMX 切换,是 VMM 通过调用 VM Entry 和 VM Exit 这 2 个指令集来完成:

  • VM Entry 指令集:假设当前 CPU 运行在 Root Mode,在执行 VMM 的代码,此时 VMM 可以通过调用 VMLAUNCH 或 VMRESUME 指令将 CPU 的运行模式切换到 Non-root Mode。当 VMM 执行 VM Entry 时,CPU 就会从 Guest State Area 中加载 GuestOS 的上下文,开始执行 GuestOS 的代码。(值得注意的是,VMCS 并不需要保存 VMM 的上下文,因为 CPU 开支执行 VMM 之后,就不会受到 GuestOS 的干扰,只有 VMM 将工作彻底处理完毕后,CPU 才可能切换到执行 GuestOS 的代码。)

  • VM Exit 指令集:而当 GuestOS 在运行过程中遇到需要 VMM 处理的事件时,例如:缺页异常(Page fault)、I/O 中断、主动调用 VMM 的 VMCALL 指令等,CPU 的运行模式就会从 Root Mode 切换到 Non-root Mode。当 VMM 执行 VM Exit 时,CPU 会自动将 Guest OS 的上下文加载到 Guest State Area 中,挂起 GuestOS,并从 Host State Area 中加载 VMM 的通用事件处理函数的入口地址,开始执行 VMM 的代码。

在这里插入图片描述

一个执行 VMX 切换的例子是:GuestOS 发出了 I/O 请求,执行了 VM Exit,然后 VMM 可以直接读取 GuestOS 的内存并将 I/O 操作模拟出来,VMM 完成后,再调用 VMRESUME 指令执行 VM Entry,GuestOS 继续执行。此时在 VM 的角度看来,GuestOS 的 I/O 操作指令就像是直接被 CPU 执行了一样。

在这里插入图片描述

VMCS Configuration 空间解析

VMCS Configuration 空间非常重要,每次发生 VM Exit 时,硬件自动在 VMCS Configuration 中存入丰富的信息,方便 VMM 甄别事件的种类和原因。而当发生 VM Entry 时,VMM 可以方便地为 GuestOS 注入事件(中断和异常),因为 VMCS Configuration 中存有 GuestOS 的中断描述表(IDT)的地址,因此硬件能够自动地调用 GuestOS 的处理程序。

Guest State Area 和 Host State Area 都会存储部分 CPU 物理寄存器的信息,例如:

  • CR0、CR3、CR4 等控制寄存器;
  • ESP、EIP(32bits)或 RSP、RIP(64bits)寄存器;
  • CS、SS、DS、ES、FS、GS 等段寄存器及其描述项;
  • TR、GDTR、LDT、IDTR 等特权寄存器;
  • IA32_SYSENTER_CS、IA32_SYSENTER_ESP、IA32_SYSENTER_EIP、IA32_PERF_GLOBAL_CTRL 等 MSR 寄存器。

另外,Guest State Area 还会包含非物理寄存器的内容,例如:一个 32bits 的 Active State 值,以此表明 GuestOS 执行时 CPU 所处于的活跃状态,如果正常执行指令就是处于 Active 状态,如果触发了三重故障(Triple Fault)或其它严重错误就处于 Shutdown 状态等等。同时,Guest State Area 并不强制性包含通用寄存器的数据,这些数据由 VMM 在 VM Exit 的时候来决定是否进行保存,从而提高了系统性能。

在这里插入图片描述

Execute State Area 存放可以操控 VM Entry 和 VM Exit 的标志位,包括:

  • External-interrupt exiting:用于设置是否外部 I/O 中断可以触发 VM Exit,而不论 GuestOS 是否屏蔽了中断。
  • Interrupt-window exiting:如果设置,当 GuestOS 解除中断屏蔽时,触发 VM Exit。
  • Use TPR shadow:通过 CR8 访问 Task Priority Register(TPR)的时候,使用 VMCS 中的影子 TPR,可以避免触发 VM Exit。同时执行控制区还有一个 TPR 阈值的设置,只有当 GuestOS 设置的 TR 值小于该阈值时,才触发 VM Exit。
  • CR masks and shadows:每个控制寄存器的每一位都有对应的掩码,控制 GuestOS 是否可以直接写相应的位,或是触发 VM Exit。同时 VMCS 中包括影子控制寄存器,GuestOS 读取控制寄存器时,硬件将影子控制寄存器的值返回给 GuestOS。

VMCS 还包括一组 BitMap 以提供更好的适应性:

  • Exception bitmap:选择哪些异常可以触发 VM Exit,
  • I/O bitmap:对哪些 16bits 的 I/O 端口的访问触发 VM Exit。
  • MSR bitmaps:与控制寄存器掩码相似,每个 MSR 寄存器都有一组 “读” 的位图掩码和一组 “写” 的位图掩码。

Memory 虚拟化技术

Linux 操作系统采用页表的方式来管理虚拟内存技术,在没有引入 VM 之前,只需要完成 Virtual Memory 和 Physical Memory 之间的地址转换。
在这里插入图片描述

软件实现的两级地址映射技术

在引入了 VM 的同时,虚拟地址转换就增加了一层,形成了一种两级地址映射关系。如下图所示:Host Virtual Address(HVA)=> Host Physical Address(HPA)=> Guest Virtual Address(GVA)=> Guest Physical Address(GPA)。

需要注意的是,VM 的本质是一个 User Process,按理说应该像其他 Normal User Process 一样可以直接访问 HVA,但事实上,由于 VM User Process 运行于 CPU 的 Non-root Mode 中,所以无法直接访问 HVA,而是需要通过 VMM 来完成 GPA 到 HVA 之间的地址转换。即:VMM 需要 intercept (截获)VM 的内存访问指令,然后 virtualize(模拟)为 HVA(e.g. kvm_memory_slot 数据结构)。而 GVA 到 GPA 的地址转换则由 GuestOS 的系统页表完成。

显然,在 VMM 实现的两级地址映射中,VM 的每次内存访问都需要 VMM 介入,并由软件进行多次地址转换,其效率是非常低的。

在这里插入图片描述

软件实现的 SPT 影子页表技术

SPT(Shadow Page Table,影子页表)技术就是一种优化的地址转换过程,可以直接将 GVA 转换为 HPA。

SPT 为 GuestOS 的系统页表设计了一套对应的影子页表,并将影子页表装载到 CPU 的 MMU 中。影子页表的本质也是一个系统页表,从 MMU 的角度来看两者并无差别。只是系统页表是由 Kernel 来维护的,而影子页表是由 VMM 来维护的。并且 VMM 要为每个 VMs 都维护了一套对应的影子页表。

有了 SPT 之后,当 GuestOS 访问内存时,就可以根据 MMU 中的影子页表映射关系,完成 GVA 到 HPA 的直接映射。

虽然 SPT 将 VMM 实现的两级地址映射优化成为了一种基于 MMU 的直接映射,但本质上还是纯软件实现的,效率不高,而且 VMM 承担了太多影子页表的维护工作,设计不好。

在这里插入图片描述

Intel VT-x 硬件辅助的 EPT 扩展页表技术

为了进一步改善 SPT 内存虚拟化技术,同样需要由 CPT 来进行辅助。

EPT(Extend Page Table,扩展页表)技术最早由 Intel 提出,为 MMU 增加了 SLAT(Second Level Address Translation,二级内存翻译)功能,即:为 VMM 提供了一套专用的页表空间,进而抛弃掉了影子页表。

在这里插入图片描述

EPT 的基本原理如上图所示,EPT 在原有 CR3 页表一级映射的基础上,引入了 EPT 页表来实现另一层二级映射,这样就完全由硬件来实现了 GVA => GPA => HPA 之间的两次地址转换。

在这里插入图片描述

举例来说,当 GuestOS 中的 User Application 访问内存,CPU 首先会访问 GuestOS 的 CR3 页表来完成 GVA 到 GPA 的转换,如果 GPA 不为空,则 CPU 接着通过 EPT 页表来实现 GPA 到 HPA 的转换(实际上,CPU 首先会查看 Cache 或 TLB,如果没有缓存记录才会进一步查看 EPT 页表)。另外,如果 HPA 为空,那么 CPU 就会抛出 EPT Violation 异常,并交由 VMM 来处理。

另外,CPU 访问 GuestOS 的 CR3 页表发现 GPA 为空的话,那么就会触发缺页异常,并交由 GuestOS 的缺页异常中断处理程序处理。在中断处理程序中会调用 EXIT_REASON_EPT_VIOLATION 指令,VM Exit,VMM 截获到该异常,然后分配 HPA,并建立 GVA 到 HPA 的映射,最后保存到 EPT 中。这样在下次访问的时候就可以完成从 GVA 到 HPA 的转换了。

在这里插入图片描述

I/O 虚拟化技术

I/O 虚拟化技术大体上也可以分为 2 大类:

  1. 完全由软件实现的虚拟网络设备,例如:VirtI/O、vSwitch。
  2. 由硬件辅助实现的网络设备,例如:Intel VT-d、SR-IOV。

在这里插入图片描述

Intel VT-d 硬件辅助的 I/O 虚拟化技术

从 CPU 的角度看,为了解决 VM 访问物理网卡等 I/O 设备的性能问题,就是要避免 VMM 对 CPU 指令的捕获/翻译、上下文切换、内存拷贝等损耗。

Intel VT-d(Intel Virtualization Technology for Directed I/O)是一个针对系统 I/O 在北桥芯片(North Bridge)上提供硬件辅助功能的技术,主要解决的是物理 I/O 设备和 VMs 之间需要通过 VMM 来完成进行数据交换的问题。

主要包括了下面 2 个方面的功能增强:

  1. DMA 直接映射;
  2. IRQ 硬件中断请求。

对应的,Intel VT-d 在北桥芯片中提供了 IOMMU 硬件单元,并支持 DMA Remapping Feature 和 Interrupt Remapping Feature 功能。

在这里插入图片描述

  • 官方文档:https://eecs.ceas.uc.edu/~wilseypa/classes/ece975/sp2010/papers/abramson-06.pdf

IOMMU 硬件单元

IOMMU(Input/Output Memory Management Unit,I/O 内存管理单元)是北桥芯片上的一个硬件单元,类似于 CPU 上的 MMU,主要完成 HostOS HPA 和 I/O 外设之间的 DMA 地址映射。

在这里插入图片描述

Linux 操作系统中启用 IOMMU 的步骤

  1. 在 BIOS 中打开:
    在这里插入图片描述

  2. 设置内核参数:

# Intel
intel_iommu=on
# AMD
amd_iommu=on
  1. 检查 dmesg 以确认 IOMMU 已经被正确启用:
$ dmesg | grep -e DMAR -e IOMMU
[    0.000000] DMAR: IOMMU enabled

DMA Remapping Feature

在传统的 IOMMU 中,它提供了一种集中的方式管理所有的 DMA 地址,通过统一的 ZONE_DMA 内存地址范围来区分不同的 I/O 外设,但却不支持不同 I/O 外设之间的 DMA 隔离。因此 Intel VT-d 在北桥芯片上添加了 DMA Remapping Feature(DMA 重映射)功能,支持地址空间上的隔离,使得 I/O 外设只能访问规定的内存区域。

通过 DMA Remapping Feature,VM 可以直接访问到 Host 中的物理网卡的 DMA 寄存器和 Rx/Tx Queues 空间。

可见,DMA Remapping Feature 主要解决了 2 个问题:

  1. 一方面为每个 VM 创建了一个 DMA 保护域并实现了安全的隔离。
  2. 另一方面提供一种机制是将 GuestOS 的 GPA 翻译为 HostOS 的 HPA。从而 GuestOS 访问自己 GPA 的 ZONE_DMA 时,实际上就是直接访问了 HostOS 的 HPA 中的 ZONE_DMA 地址空间。

在这里插入图片描述

Interrupt Remapping Feature

I/O 外设会产生非常多的硬中断请求,在虚拟化场景中,IOMMU 需要正确的将不同的 I/O 硬中断请求分离到对应的 VMs 上处理。

传统的 I/O 硬中断请求路由方式,需要通过 “DMA 写请求“ 指令根据目标内存地址定向地发出一个 MSI(Message signaled interrupts,消息中断)。但由于 “DMA 写请求“ 需要嵌入一个目标内存地址,因此 DMA Controller 就需要访问所有的 ZONE_DMA 内存地址,无法实现中断隔离。

因此,Intel VT-d 实现的 Interrupt Remapping Feature(中断重映射)功能重新定义了 MSI 的格式来解决这个问题。新的 MSI 不再嵌入目标内存地址,取而代之的是一个 Msg ID,并通过维护一个表结构,来完成 Msg ID 和 VM 内存区域的映射。

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

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

相关文章

智芯Z20K11x串口printf重定向

智芯Z20K11x串口printf重定向 目录 智芯Z20K11x串口printf重定向前言1 串口代码编写2 Keil勾选MicroLIB库结束语 前言 智芯Z20K11x系列是基于ARM CORTEX M0的中低端微控制器,高达256K P FLASH 128K D FLASH,2路CANFD接口,4路UART/LIN接口&a…

综合能源系统中基于电转气和碳捕集系统的热电联产建模与优化研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

HashMap理解

简单介绍 HashMap是双列集合Map接口下的实现类,jdk1.8之前其数据结构是数组链表、jdk1.8之后是数组链表红黑树,是线程不安全的, 原理图: HashMap放值的过程: HashMap先是根据Hash算法算出key的hashcode码值&#xff0…

Vivado之VIO原理及应用

虚拟输入输出(Virtual Input Output,VIO)核是一个可定制的IP核,它可用于实时监视和驱动内部FPGA的信号,如图所示。 可以定制VIO的输入和输出端口的数量与宽度,用于和FPGA设计进行连接。由于VIO核与被监视和驱动的设计同步&#xf…

Linux操作系统原理—内核网络协议栈

前言 本文主要记录 Linux 内核网络协议栈的运行原理 数据报文的封装与分用 封装:当应用程序用 TCP 协议传送数据时,数据首先进入内核网络协议栈中,然后逐一通过 TCP/IP 协议族的每层直到被当作一串比特流送入网络。对于每一层而言&#xff…

SwiftUI 使用 UIPageViewController 翻页后出现空白的原因及解决

问题现象 我们 SwiftUI 开发的 App 需要 UIPageViewController 的翻页功能,这可以非常方便的通过桥接 UIKit 到 SwiftUI 来搞定: 不过,观察上图可以发现 App 翻页显示的并不太对:当用户通过右下角的 UIPageControl 触发翻页时没有问题,但当用户直接手动在 UIPageViewCont…

【毕业设计】基于程序化生成和音频检测的生态仿真与3D内容生成系统----音频检测算法设计

(2条消息) 【开发日志】2022.09.02 ZENO----Audio----Beat detection algorithm----Combine Wav&Mp3_minimp3 和 ffmpeg_EndlessDaydream的博客-CSDN博客https://blog.csdn.net/Angelloveyatou/article/details/126670613 4 音频检测算法设计 4.1 节拍检测算法 4.1.1 节…

JavaSE——数组

这篇文章的面向读者为Java初级程序员,也就是刚刚接触到Java这门语言,里面描述的内容主要是数组相关的内容,讲解了最基础的一些数组扩容思路,数组赋值机制,什么是引用地址,什么是基础数据赋值。 Java该章节数…

JAVA入坑之线程

目录 一、:相关概念 1.1中央处理器(CPU,Central Processing Unit) 1.2程序、进程、线程 1.3线程与任务 二、线程的创建: 2.1继承Thread创建线程: 使用Thread子类创建线程的优缺点 2.2实现Runnable接口创建线程:…

【C++STL精讲】list的使用教程及其模拟实现

文章目录 💐专栏导读💐文章导读🌷list是什么?🌷list如何使用?🌷list的模拟实现🌺定义list类🌺构造函数🌺push_back🌺pop_back 🌷list迭…

利用STM32实现自平衡机器人功能与方法

将机器人整体开源,同时总结一下机器人搭建过程中遇到的坑和未来的改进方向。在分享的文件里包含了结构设计、程序控制、电路设计以及其他模块相关资料供大家参考。 第一:机器人原理分析 首先来看成品图: 如图所示,该机器人根据陀…

宝塔面板设置虚拟内存Swap降低的方法

宝塔面板可以通过设置Swap/虚拟内存的方式来降低内存使用率和负载,使用宝塔面板的Linux工具箱即可设置虚拟内存,新手站长来详细说下宝塔Linux面板设置Swap/虚拟内存的方法: 宝塔面板设置虚拟内存 设置虚拟内存是通过Linux工具箱&#xff0c…

4.0、Java继承与多态 - 抽象类与抽象方法

4.0、Java继承与多态 - 抽象类与抽象方法 先给大家举个例子 -> 创建一个父类 - 图形类;图形类中有一个计算面积的方法 calculateArea(); 创建三个子类 - 正方形、三角形、圆形 类; 由于我们图形类父类中未明确指明是什么图形&#xff0c…

内网域环境搭建学习

建立的关系就是这样,接下来就开始讲解遇到的困难 虚拟机中我们可以克隆来实现域的搭建 可能会出现这样的问题,原因是你的虚拟机没有关闭,所以才会导致这样的原因,解决方法 将虚拟机打开后,电源 -> 关闭客户机&…

MySQL学习笔记第二天

第03章 基本的SELECT语句 1.SQL概述 1.1 SQL背景知识 1946年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖。在这几十年里,无数的技术、产业在这片江湖里沉浮,有的方兴未艾,有的…

reactxp搭建,start:windows运行不起来

1、官网 reactxp 2、VSCode和Visual Studio2019 安装VSCode Visual Studio 下载地址 先不用勾选工作负荷,直接安装 3、安装nvm 访问下载地址下载安装nvm: 百度云分享 官网直装链接 nvm的github发行界面下载nvm-setup.exe GitCode镜像下载nvm-setup…

ACL配置学习(附练习题)------ensp

从此文了解ACL配置,欢迎学习、指导。 目录 基本ACL配置举例 高级ACL配置举例 ACL配置练习题 定义 访问控制列表ACL(Access Control List)本质上是一种报文过滤器。 范围: OSI七层模型中的网络层、传输层的信息。 滤芯:五…

2023年4月实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】

首先,来看下效果图 在线体验地址:https://geojson.hxkj.vip,并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据&#xff0…

大型医院体检管理系统源码,PEIS体检系统源码 丰富的诊断模板,自动产生小结、综述和建议

PEIS体检管理系统源码 体检条码化管理,体检数据比对,丰富的诊断模板,自动产生小结、综述和建议。 文末获取联系 PEIS体检管理系统对医院体检中心进行系统化和规范化的管理,大大提高体检中心的综合管理水平、工作效率。系统从业务…

设计模式-结构型模式之享元模式

5. 享元模式 5.1. 模式动机 面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。 享元模式正是为解决这一类问题而诞生的。享元模…