【NVM】持久内存的架构

1 内存数据持久化

1.1 数据持久化

持久内存系统包含如下关键组件:微处理器、连接微处理器内存总线上的持久内存模组(Persistent MemoryModule,PMM)及持久内存上的非易失性存储介质。
使用持久内存来实现数据的持久化,需要重点关注如下三方面的内容。
1.材料特性
数据在掉电后的保存通常通过非易失性存储介质来实现。材料特效见专栏非易失存储特性一文。
2.持久内存特性
如今的计算机系统都假设一旦数据完成从内存控制器(Memory Controller,MC)向外部内存总线的传输操作,持久化过程即告完成,停止对持久内存的外部供电。然而,此时持久内存内部还需要电量将数据写入非易失性存储介质。因此持久内存需要储能器件提供电量,以保证在掉电后可以把缓冲区的数据写到磁性介质中。
与SSD类似,持久内存的储能也是依靠电容来实现的。由于系统掉电后持久内存模组的供电时间要长于它所在的计算机系统的供电时间,所以内存上还需要有供电隔离电路,以免内存上的电容反向向计算机系统进行供电。
3.数据完整性
微处理器在特定执行点保证数据的持久化。数据在微处理器内核和持久内存之间要经过一段很长的写入路径,为了保证数据的一致性和完整性,软件开发人员需要从代码层面明确控制数据到达写入路径的哪一环,以及何时可以认为持久化写入已经完成。持久化域就是硬件平台能力的抽象。当系统断电时,持久化域内的数据可以保证得到持久化保存,而持久化域外的数据则无法保证。
在这里插入图片描述
计算机的缓存和内存系统可能支持三类持久化域。
第一类持久化域是内存本身,数据持久性由持久内存本身及所需平台设计保障,对微处理器的依赖最低。
第二类持久化域是内存子系统,通过异步内存刷新(Asynchronous DRAM Refresh,ADR)技术保证WPQ内的数据得到保存。
第三类持久化域会扩展到缓存,通过增强异步内存刷新(Enhanced Asynchronous DRAM Refresh,eADR)技术保证缓存内的数据得到保存。在这里插入图片描述

2 持久内存的安全考虑

持久内存的安全功能跨越多个层级,包括保护持久内存介质中存取的数据,以及保护持久内存的配置数据和控制机制。持久内存的安全模型采用了SSD和NVMe技术使用的ATA(Advanced Technology Attachment,高级技术附件)安全模型,写入持久内存介质中的数据由每根持久内存控制器使用XTS-AES-256协议加密。
内存模式中的密钥在每次断电重启后都会重新生成,因此先前的数据不再可用,称为易失性,DRAM具有相同的特性。
在AD模式下运行时,可以通过设置用户密码来解锁持久内存区域,并启用对命名空间内数据的访问来保证安全性。持久内存支持主密码,主密码用来启动安全擦除功能,但是主密码仅可以用于本地介质擦除,如果主密码丢失,那么将无法解锁持久内存并且无法再次使用。如果用户密码丢失,则可以使用主密码来启用安全擦除功能,以重置持久内存。持久内存支持从操作系统或UEFI下访问的安全擦除功能,该功能可以强制重新生成密钥,使持久化区域中的数据无法访问。

2.1 威胁模型

威胁模型假定攻击者获得了包含持久内存的服务器的物理拥有权,该服务器包含敏感的或有价值的数据(或以前使用的独立持久内存),并试图非法恢复持久内存上的数据。在此威胁模型下,假定攻击者可以物理访问正在使用的服务器平台(内存模式区域或未锁定的AD模式区域),并且能够获取持久内存上的数据访问权限
持久内存的攻击场景包括:

  • 从办公室或数据中心盗取包含持久内存的服务器;
  • 持久内存被有平台访问权限的攻击者移除;
  • 从持久内存上物理复制数据;
  • 将攻击数据粘贴到持久内存中;
  • 窥探内存总线上的数据;
  • 修改持久内存固件。

云计算的出现对多租户虚拟化环境中的租户隔离和静态数据提出了更高的要求,运行时用户隔离受虚拟化基础架构虚拟机监视器的控制,企业级的存储设备应支持将存储介质划分为“个体租户”的逻辑分区(每个分区有独立的密钥管理),这种方法的好处是租户的数据可以独立锁定和擦除。多租户威胁模型假设租户数据可能因为隔离机制的漏洞受到其他租户的影响,因此能够安全地擦除租户数据是最小化暴露数据的有效方式。

2.2 安全目标

持久内存的安全分为三类:静态数据安全、访问控制和介质管理保护。
1.静态数据安全
(1)机密性保护。
持久内存可以为存储在设备上的所有用户数据提供机密性保护,从而防止持久内存落入不法分子手中,包括防止冷启动攻击,这意味着要对介质中的易失性和持久化区域进行加密。AES-XTS-256是用于保护持久内存介质的算法,它同样适用于块模式数据的加密。
(2)持久内存数据的静态保护。
静态保护持久内存数据需要用到加密持久内存的加密密钥,以加密锁定的方式永久存储用户数据,它要求安全管理员可以随时以加密方式擦除持久化域。安全擦除是一种安全管理员快速使设备上的数据无法恢复的方法。
锁定:持久性内存区域可在特定系统电源事件(关机、重新启动)期间“加密”锁定,持久内存安全架构要求该区域处于锁定状态,以提供静态数据保护。解锁持久内存应使用用户密码进行外部身份验证。
安全擦除:利用持久内存的安全擦除功能,能使设备上的数据无法恢复,以实现设备的安全退役或者设备的安全重置。安全擦除的作用域是全局的持久内存,而不是特定的持久内存或者块模式区域,只有安全管理员可以调用安全擦除命令。在安全擦除之后,持久化数据可能仍然存在于微处理器的高速缓存中,为避免数据被损坏或被窃取,必须使用特定指令使微处理器的高速缓存无效。
(3)易失性内存数据的保护。
为了模拟易失性内存的行为,持久内存介质上易失性区域被加密,然后在某些系统状态转换时以加密方式擦除。在内存模式下,DRAM缓存是未加密的,此时易失性内存加密区域在重置事件、睡眠、断电重启、电源故障(ADR命令和电压检测)事件中将无法恢复。
2.访问控制
持久内存为两种模式定义了不同的访问控制目标:AD模式访问控制和内存模式访问控制。
(1)AD模式访问控制。
持久内存提供了一种机制,以页面级粒度(由持久内存文件系统管理)强制应用程序访问持久内存区域。持久内存文件系统(Persistent Memory File System,PMFS)每个区域的粒度提供具有R/W/D/E权限类型的POSIX访问控制结构。作为开放区域的一部分,PMFS为请求的应用程序设置内存管理单元(Memory Management Unit,MMU)映射,持久内存访问控制用于Linux和Windows的主机虚拟文件系统(Virtual File System,VFS),以实现本机内核文件访问控制的功能。
(2)内存模式访问控制。
内存模式的访问控制与AD模式的工作方式类似,操作系统管理内存分配,并设置相应的页表权限,同时使用微处理器的内存管理单元强制执行页面级保护。
3.介质管理保护
持久内存介质管理算法通过反复均匀地写入位置来防止持久内存过早的磨损。持久内存支持为介质管理提供保护,以防过早地磨损介质和其他介质管理相关的PDOS攻击。

2.3 基于硬件的内存加密

持久内存使用AEP-XTS-256加密算法进行静态数据保护。
在内存模式下,每次断电重启后,DRAM缓存会丢失数据,持久内存加密密钥也会丢失,并在每次启动时重新生成。
在AD模式下,使用模块上的密钥加密持久化介质,持久内存在掉电时会将数据锁定,需要利用用户密钥解锁。
以下是持久内存为了保障数据和密码安全所采用的手段。

  • 加密密钥存储在模块上的元数据区域中,且只能被持久内存控制器访问,打开密钥需要输入密码;
  • 安全加密擦除和重写可以实现持久内存安全的再利用或丢弃;
  • 固件身份验证和完整性:支持使用固件的签名版本,并提供修订控制选项。

3 持久内存的可靠性、可用性和可维护性

3.1 可靠性、可用性和可维护性定义

在这里插入图片描述

3.2 硬件基础

1.缓存行与纠错码
纠错码(Error Correcting Code,ECC)用来保护持久内存的数据正确性,涉及两个缓存行,这也意味着读操作会读出两个缓存行的数据。而对于写操作,持久内存控制器会尽量同时处理两个缓存行来优化性能。但是对于写一个缓存行,持久内存会通过读—修改—写来完成操作(ECC重新计算)。
2.介质的组织
持久内存的介质被组织成ECC块,每个ECC块包括4个微处理器缓存行(每个64字节)、4个毒药标志位(对应4个缓存行,存储在元数据中)、其他元数据(每个缓存行的状态)和ECC。
3.空闲块管理
持久内存会预留出一定的空闲块作为备份,空闲块由持久内存的固件来实现。如果持久内存检测到坏块,那么它会放弃坏块,选择新的空闲块。不能修复的数据会从坏块写到空闲块中,正确的ECC值和毒药标志位也会被写入空闲块。毒药标志位表明新的缓存行已经没有正确的数据了,软件如果读取新的缓存行,那么返回的数据将包括毒药标志。
4.数据毒药
数据毒药是一种错误抑制的方式,它提供了一个有可能恢复介质里不可纠正数据的机制。当发生不可纠正错误(Uncorrectable Error,UCE)时,持久内存控制器会用毒药标记错误数据,并将数据和毒药传给微处理器。
DRAM的毒药机制可以在系统启动时选择启用或者禁止,持久内存的毒药是必需的。对微处理器来说,如果毒药启用了,流程和标准的DRAM毒药一样;如果毒药没有启用,那么系统将产生严重的硬件错误异常。
毒药的一个影响是它延时不可纠正数据的“判断”。在传统的系统硬件错误架构中,当毒药机制被禁止时,不可纠正的数据是致命的错误,它会使系统立刻崩溃。但当毒药机制被启动时,不可纠正的数据则不是立刻致命的,取而代之的是数据被标记成毒药。因此当不可纠正的数据被读取时,进行读数据操作的用户可以决定如何处理被标记成毒药的数据。例如,计算机显卡完全可以忽略被标记成毒药的数据,继续工作,因为一个像素导致屏幕有一个觉察不到的闪光点是完全可以容忍的。如果是微处理器的某个进程或线程来读取数据,硬件会判断这个错误是不是可以恢复,如果硬件认为这个错误是可以恢复的,那么它会用特殊的记号来标记这个错误,这样操作系统或者虚拟机管理进程可以决定是否恢复错误或者怎么恢复错误。
毒药标志位被保存在持久内存介质的元数据里。在内存模式下,系统重启会清除毒药标记;在AD模式下,系统重启不会清除毒药标志位。值得注意的是:如果数据错误的类型是致命的,那么微处理器的上下文内容将被破坏且不能被信任,所以微处理器应该立刻重启系统以恢复到正常状态。
5.清除数据毒药
数据块上的毒药可以通过MB命令来清除。

3.3 错误检测和恢复

错误检测和恢复是持久内存控制器用来防止持久内存介质的随机比特位错误,目的是维护所传输数据的完整性。如果错误是可以纠正的,持久内存控制器就会纠正数据,这样就可以防止可纠正的错误(Correctable Error,CE)因错误比特位的积累变成不可纠正的错误。下面是三种错误的处理方式。
(1)读操作(可纠正错误)。
当读数据的时候,通过ECC对数据进行校验和纠正。如果从硬件上来说数据不能被纠正,持久内存控制器就会用毒药标记错误,并且传给主机内存控制器,之后系统或者BIOS可以通过软件进行恢复(重试、丢弃或者忽略)。
(2)读操作(不可纠正错误)。
当读数据的时候,通过ECC对数据进行校验和纠正。如果从硬件上来说数据不能被纠正,持久内存控制器就会用毒药标记错误,并且传给主机内存控制器,之后系统或者BIOS可以通过软件进行恢复(重试、丢弃或者忽略)。
(3)写操作(毒药区域)。
在写入新数据的时候,数据会被正常写到持久内存介质的毒药区域,同时毒药会被清除。

3.4 单芯片数据纠正和双芯片数据纠正

1.单芯片数据纠正
单芯片数据纠正(Single Device Data Correction,SDDC)用来纠正单个持久内存介质芯片上的比特位错误,延长系统的运行时间,防止数据被破坏。SDDC由持久内存控制器管理,不需要微处理器、BIOS或者操作系统的支持。
(1)可纠正错误。

  • 持久内存会纠正数据,并且把纠正好的数据发给主机;
  • 可纠正的数据不会被传给微处理器。
    (2)不可纠正错误。
  • 持久内存控制器会把数据包括毒药标记发给主机;
  • 持久内存控制器会在介质里创建一个记录,如果记录被启用,那么中断就会传给主机;
  • 持久内存控制器会把出错的数据移到新的数据块,并且在介质里设置毒药标志位。错误发生以后,虽然持久内存可以继续工作,但是错误检测能力会降低,所以性能会下降。

2.双设备数据纠正
双设备数据纠正(Double Device Data Correction,DDDC)用来处理两个持久内存介质芯片上的比特位错误,延长系统的运行时间,防止数据被破坏。DDDC由持久内存控制器管理,不需要微处理器、BIOS或操作系统的支持。当第一个设备失效时,持久内存控制器会利用纠错码重建失效设备上的数据到另外一个空闲设备上,数据重建完成后,持久内存控制器的错误检测和纠正的能力将恢复正常。在第二个设备失效后,虽然持久内存仍然可以通过纠错编码进行数据读写,但是数据纠正功能降低了,所以性能会下降。

3.5 巡检

持久内存控制器内置了一个刷新引擎用来巡检(PatrolScrub),持久内存的巡检也被称为顺序刷新,和DRAM的巡检是各自独立运行的。该引擎会利用空闲的机会主动地搜索持久内存,可通过对持久内存的地址进行读操作,也可利用ECC修复可以纠正的错误。用户可以对刷新引擎的频率值进行编程,刷新引擎会根据这个频率对持久内存进行巡检访问,这样就可以有效地防止可纠正错误由于错误比特位的累积变 成不可纠正错误。只要有足够的时间,所有的持久内存的地址都会被访问到。
持久内存的巡检通常叫作“刷新”。

  • 适用模式:内存模式和AD模式。
  • 对于可纠正的错误,持久内存控制器会纠正数据并写回数据。
  • 对于不可纠正的错误,持久内存控制器会用毒药在介质的元数据里标记错误,不可纠正错误会被记录到持久内存的介质,然后持久内存控制器会把数据移到新的位置。如果系统设置了中断,那么中断会被发给主机。
  • 如果数据已经被标记成毒药,那么巡检时错误不会被记录和上传给系统。

3.6 地址区间检查

地址区间检查(Address Range Scrub,ARS)是ACPI规范里定义的DSM。BIOS和持久内存驱动可以通过ARS获取不可纠正错误的持久内存地址,以在持久内存被分配给应用程序使用之前获取状况良好的地址范围。和巡检相比,ARS检查内存地址的频率更高,但是更高的检查频率可能会影响持久内存硬件的服务质量,所以我们可以选择上一次ARS的结果,有时候也叫作快速ARS。
操作系统可以对有问题的持久内存不作映射,也可以标记成不可用空间,这样可以预防应用程序因为访问有问题的持久内存地址而崩溃。
为什么需要ARS?其原因如下。

  • 巡检不会检查已经被标记成毒药的地址,但ARS可以有效地获取所有有问题的地址;
  • 如果操作系统不清楚有问题的地址,应用程序一旦被分配到有不可纠正错误的持久化内存地址空间,读操作就会触发硬件错误异常,轻则应用程序崩溃,重则操作系统崩溃;
  • 如果操作系统不清楚有问题的地址,在系统重启以后,操作系统很可能因为不可纠正错误而不停重启。ARS只有在AD模式下才会生效。
    ARS可以在系统启动的时候自动启动,也可以在系统运行的时候手动启动。

3.7 病毒模式

系统发生不可恢复错误时,会采取多种措施减少错误的进一步扩散。大部分系统依赖毒药机制确保错误数据的抑制,坏数据包被标记成毒药并抑制其继续传输。操作系统可以选择终止可能使用错误数据的应用程序或虚拟机,来减少其扩散的机会。
对于毒药机制不能抑制的致命错误,为了延缓宕机增加可用性,系统可以选择更高级别的平台级错误抑制机制——病毒(viral)。启用病毒机制后,当发生致命错误时,病毒标志会扩散到UPI和PCIe接口。系统会在UPI数据包报头里设置病毒标志,并且把病毒状态扩散到其他的CPU。PCIe接口也进入病毒状态,此时所有PCIe设备的对内对外传输都会被丢弃。这样可以防止错误数据写入非易失性的存储设备或远程的网络设备。
持久内存也支持病毒机制,当持久内存控制器检测到病毒标志后:

  • 在AD模式下,持久内存的写操作会被丢弃,读操作不受影响;
  • 内存模式的写操作不受影响。病毒模式的退出:系统重启会清除病毒模式。
    病毒模式的退出:系统重启会清除病毒模式。

3.8 错误报告和记录

错误报告包括错误记录和信号发送。从系统启动到系统运行,我们可能碰到各种错误,其中可纠正的错误由持久内存控制器来处理,不会上传给主机。如下几种不可纠正错误会被报告和记录:

  • AD模式和内存模式下的数据事务错误;
  • 持久内存控制器内部错误;
  • 系统初始化和引导过程中的错误;
  • 链路错误。

3.9 持久内存故障隔离

当系统发生可纠正错误或不可纠正错误时,必须把错误的信息发给用户。这是服务器设计厂商必须支持的功能,只有这样用户才能根据错误的性质决定采取何种措施,如替换有问题的DRAM或持久内存。为了实现正确的故障隔离,错误记录对于服务器系统设计有如下几个要求:

  • 系统必须支持BIOS和BMC的RAS功能;
  • 系统必须能区分设备错误和链路错误;
  • 系统必须能区分出错的内存位置地址;
  • 系统即使热启动也必须保证错误记录不丢失。
    当系统检测到不可纠正错误时,错误的系统地址会被记录在微处理器的寄存器里,BIOS会进行下面的处理:
  • 映射系统地址到现场可更换单元;
  • 如果现场可更换单元是持久内存,BIOS会查询持久内存的介质记录,寻找不可纠正错误。如果找到记录,BIOS会尝试把系统物理地址映射到持久内存的物理地址。

3.10 错误注入

服务器设计厂商需要测试RAS处理的能力,所以需要一个健壮的错误注入机制。持久内存同时支持DRAM的错误注入机制和持久内存的错误注入机制。DRAM的错误注入机制是由内存控制器来实现的,而持久内存的错误注入机制是由持久内存控制器来实现的,因为可纠正错误不会被上传给操作系统,所以错误注入机制只支持不可纠正错误的注入。

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

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

相关文章

蓝牙(2):BR/EDR的连接过程;查询(发现)=》寻呼(连接)=》安全建立=》认证=》pair成功;类比WiFi连接过程。

4.2.1 BR/EDR 流程: 查询(发现)》寻呼(连接)》安全建立》认证》pair成功 4.2.1.1 查询(发现)流程Inquiry (discovering) 类比WiFi的probe request/response 蓝牙设备使用查询流程来发现附近的…

【Docker实操】启动redis服务

一、步骤 1、获取redis镜像 执行获取redis镜像命令&#xff1a;docker pull redis。打印镜像清单&#xff0c;可以看到新拉到的redis镜像。 2、创建redis.conf配置文件 linux主机 mkdir -p /root/www/redis/conf touch /root/www/redis/conf/redis.conf cat << EOF &…

vue contextPath的思考

先说我这边的情况&#xff0c;目前项目都是前后端分离开发的&#xff0c;上线有种部署方式&#xff0c;常见的就是前后端分开部署&#xff0c;这是比较常见的&#xff0c;我这边因客户原因&#xff0c;打包一起进行部署比较简单&#xff0c;交付技术运维部方便后期其他现场部署…

基于Matlab卷积神经网络人脸识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 人脸识别作为计算机视觉领域的关键技术之一&#xff0c;具有广泛的应用前景&#xff0c;如安全…

“高考钉子户”唐尚珺决定再战2024年高考

“高考钉子户”唐尚珺决定在2024年再次参加高考&#xff0c;这个选择确实很特别也很有趣。十几年连续参加高考&#xff0c;他已经积累了大量的备考经验和应试技巧。这样的经验对于高考辅导机构来说无疑是非常宝贵的资源&#xff0c;他如果选择去辅导机构当老师&#xff0c;应该…

文章解读与仿真程序复现思路——电力系统保护与控制EI\CSCD\北大核心《基于改进粒子滤波的锂离子电池剩余寿命预测 》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

vue 点击复制文本到剪贴板

一、首先在vue文件的template中定义复制按钮 <div size"small" v-if"item.prop jadeCode" class"cell-container"><span>{{ scope.row.jadeCode }}</span> <button click"handleCopy(scope.row.jadeCode)" clas…

告别硬编码:Spring条件注解优雅应对多类场景

一、背景 在当今的软件开发中&#xff0c;服务接口通常需要对应多个实现类&#xff0c;以满足不同的需求和场景。举例来说&#xff0c;假设我们是一家2B公司&#xff0c;公司的产品具备对象存储服务的能力。然而&#xff0c;在不同的合作机构部署时&#xff0c;发现每家公司底…

ABB 任务 模块 程序

1&#xff0c;任务由模块组成 &#xff0c; 2&#xff0c;模块分为程序模块和系统模块 3&#xff0c;可以通过新建程序模块和删除程序模块 4.可以在程序模块中构建程序 5&#xff0c;系统模块不能够被删除 6&#xff0c;main 程序主要体现在自动运行中

【Unity AR开发插件】四、制作热更数据-AR图片识别场景

专栏 本专栏将介绍如何使用这个支持热更的AR开发插件&#xff0c;快速地开发AR应用。 链接&#xff1a; Unity开发AR系列 插件简介 通过热更技术实现动态地加载AR场景&#xff0c;简化了AR开发流程&#xff0c;让用户可更多地关注Unity场景内容的制作。 “EnvInstaller…”支…

鸿蒙开发配置官方地图

一共需要配置 p12 p7b cer csr 四个文件 p12文件配置 注意创建文件名必须是.p12 到AGC创建项目 AppGallery Connect 添加自己的项目名称 我没有开启 暂时不需要 看个人需求 下载刚创建的cer证书 回到我的项目中 点击刚创建的项目 点击这里 四个文件齐全了 "metadata&qu…

Python爬取B站视频:封装一下

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️如遇文章付费&#xff0c;可先看…

跨境电商赛道,云手机到底能不能化繁为简?

当下国内电商背景&#xff1a; 从零售额的数据来看&#xff1a;随着互联网的普及和消费者购物习惯的改变&#xff0c;国内电商市场规模持续扩大。据相关数据显示&#xff0c;网络消费亮点纷呈&#xff0c;一季度全国网上零售额达到了3.3万亿元&#xff0c;同比增长12.4%。这表…

本地centos7+docker+ollama+gpu部署

1、一台有 NVIDIA GPU 驱动的机器 2、Docker CE安装 # 删除旧版本的 Docker&#xff08;如果存在&#xff09; sudo yum remove -y docker docker-common docker-selinux docker-engine # 安装必要的软件包&#xff1a; sudo yum install -y yum-utils device-mapper-persiste…

gpt-4o继续迭代考场安排程序 一键生成考场清单

接上两篇gpt-4o考场安排-CSDN博客&#xff0c;考场分层次安排&#xff0c;最终exe版-CSDN博客 当然你也可以只看这一篇。 今天又添加了以下功能&#xff0c;程序见后。 1、自动分页&#xff0c;每个考场打印一页 2、添加了打印试场单页眉 3、添加了页脚 第X页&#xff0c;…

基于 Java 的浏览器——JxBrowser使用分享

软件介绍 JxBrowser 是一个基于 Java 的浏览器&#xff0c;它使用 Chromium 引擎来提供高性能的网页渲染和丰富的功能。它支持多种 GUI 框架&#xff0c;如 Swing、JavaFX 和 SWT&#xff0c;使得在 Java 应用程序中嵌入浏览器组件变得简单。 JxBrowser 是一个适用于多种用途…

一维前缀和[模版]

题目链接 题目: 分析: 因为要求数组中连续区间的和, 可以使用前缀和算法注意:下标是从1开始算起的, 真正下标0的位置是0第一步: 预处理出来一个前缀和数组dp dp[i] 表示: 表示[1,i] 区间所有元素的和dp[i] dp[i-1] arr[i]例如示例一中: dp数组为{1,3,7}第二步: 使用前缀数…

CSS基础(第二天)

Emmet语法 快速生成HTML结构语法 1. 生成标签 直接输入标签名 按tab键即可 比如 div 然后tab 键&#xff0c; 就可以生成 <div></div> 2. 如果想要生成多个相同标签 加上 * 就可以了 比如 div*3 就可以快速生成3个div 3. 如果有父子级关系的标签&#xff0c;可以…

Spark介绍

Spark简介 Spark,是一种通用的大数据计算框架,正如传统大数据技术Hadoop的MapReduce、Hive引擎,以及Storm流式实时计算引擎等. Spark是加州大学伯克利分校AMP实验室(Algorithms Machines and People Lab)开发的通用内存并行计算框架,用于构建大型的、低延迟的数据分析应用程序…