AMD64内存属性详解

本文参考文档为AMD64 Architecture Programmer’s Manual Volume 2: System Programming,版本号3.41,这不是对原英文文档的翻译,但是所有内容的排版都是根据原手册的排版来的,如有与官方文档冲突的内容,以官方文档为准。

image-20231031223252117

Host内存属性:

内存类型

Guest内存属性:

由于Guest没有MTRR的硬件支持,MTRR属性可以通过嵌套页表模拟,所以可以假设嵌套页表的内存属性就是GuestMTRR属性。为了让Guest使用的内存其属性完全由Guest决定,一般都会将嵌套页表、hPAT、物理MTRR对应的Guest可见的内存全部映射为WB

内存类型1

3 System Resources

3.1 System-Control Registers

3.1.1 CR0 Register

CR0寄存器与内存属性相关的是缓存控制位Cache Disable (CD) Bit

CD被清0后,内部缓存被使能。

CD被置1后,新的指令或数据都不会再进入缓存,但是在如下情况,处理器任然是可以访问缓存的,只是不会再产生读分配和写分配:

  • 缓存被读命中的时候,数据任然会从缓存读取;

  • 缓存被写命中的时候,数据会被直接写入内存,并且命中的缓存会被无效掉;

CD = 1Cache Misses不会影响缓存。软件可以通过将CD1并无效掉缓存来阻止对缓存的访问。

✳分页被使能的时候,如果CD被设置为1,那么页级缓存控制位(PWTPCD)将会被忽略。这些位位于页转换表和CR3寄存器中。

3.2 Model-Specific Registers (MSRs)

3.2.1 System Configuration Register (SYSCFG)

SYSCFG寄存器包含使能和配置总线特性的控制位。SYSCFGMSR寄存器,其地址为C001_0010h

image-20231108225110750

✳内存加密和安全相关的位在这里不作解释:

  • **MtrrFixDramEn Bit.**设置这个位为1使能固定范围MTRRsRdMemWrMem属性。当清除为0的时候,属性被禁止。RdMemWrMem允许系统软件在使用固定范围MTRRs的时候定义固定范围的IORRs
  • **MtrrFixDramModEn Bit.**设置这个位为1的时候允许软件去读写RdMemWrMem位。当清除为0的时候,写是不会产生效果的,读的话会返回0
  • **MtrrVarDramEn Bit.**设置这个位为1使能TOP_MEM寄存器和可变范围的IORRs。当清除为0的时候这些寄存器被禁止。
  • **MtrrTom2En Bit.**设置这个位为1使能TOP_MEM2寄存器。当清除为0的时候寄存器被禁止。
  • **Tom2ForceMemTypeWB.**设置这个位为1的时候,强制位于4-GbyteTOP_MEM2之间的内存属性为WB,而不是MTRRdefType定义的默认内存类型。这个位要产生效果的话,MTRRdefType必须为1MTRR可变范围和PAT属性都可以覆盖这个内存类型。

7 Memory System

7.7 Memory-Type Range Registers

AMD64提供了三种机制去管理物理内存区域属性,并且三种机制是可以配合使用的,比较复杂:

  • MTRRs
  • PAT
  • top-of-memory

7.7.1 MTRR Type Fields

MTRR有如下几种编码:

image-20231031231812806

在配置MTRR的时候,可根据设备类型(e.g., ROM, flash, memory-mapped I/O)将对应的物理地址区域配置为如上的这些属性。

内存类型字段编码有两种变体:

  • standard
  • extended

在两种类型中都使用bits 2:0去指定内存类型,对于extended类型,还使用bits 4:3分别代表RdMemWrMem

只有固定范围的MTRRs支持extended类型编码,可变范围的MTRRs只支持standard类型的编码(✳实际上后面的IORR变相的支持了extended)。

✳如果在支持MTRR的硬件中禁止了MTRRs(MTRRdefType.E = 0),那么默认的内存类型会被设置为UC。即使通过将CR0.CD清除为0来启用缓存,内存访问也不会被缓存。必须使用MTRR建立可缓存内存类型,才能缓存内存访问。

7.7.2 MTRRs

MTRRfixed-sizevariable-size地址范围两种机制。fixed-size地址范围仅限于1M地址以内,而variable-size地址范围可位于整个物理地址空间。

image-20231101220921183

**Fixed-Range MTRRs.**固定范围的MTRRs地址都是固定的,每一个固定地址范围都被分成了8段,对应MSR中设置的8type字段。

**Variable-Range MTRRs.可变范围的MTRRs支持至多8个地址范围,每段范围由两个MSR描述:MTRRphysBasen and MTRRphysMaskn (n is the address-range number from 0 to 7)

image-20231101222200466

image-20231101222218429

Variable Range Size and Alignment.MTRRsIORRs的大小和对其规则如下:

  • 对齐边界必须大于等于范围大小,例如:地址范围是16 Mbytes,那么对齐边界必须是16-Mbyte对齐的。
  • 地址范围大小必须是2的幂次方,允许的最小大小为4 Kbytes

**PhysMask and PhysBase Values.**假设当前处理器支持的最大物理地址空间为52-bit,要配置一段起始地址为200_0000h,大小为32M bytes的地址范围的内存属性,PhysBasePhysMask两个MSR如何配置:

PhysBase = 0x2000000 | memory_type

PhysMask的计算稍微复杂一些:

  1. addr_mask = F_FFFF_FFFF_FFFFh = (1 << 52-bit) - 1
  2. PhysMask = addr_mask - (32M bytes - 1) | valid_bit

✳**Default-Range MTRRs.**没有包含在固定范围和可变范围的物理地址,其内存属性都是使用默认的内存属性。

image-20231101225243963

  • Type—Bits 7:0.
  • **Fixed-Range Enable (FE).**设置为0的时候,所有固定范围的MTRRs被禁止,但不影响可变范围的MTRRs
  • **MTRR Enable (E).**设置为0的时候,所有可变和固定范围的MTRRs全部被禁止,并且type字段的内容会被忽略,默认类型被视为UC。不会影响RdMemWrMem字段。

7.7.3 Using MTRRs

**Identifying MTRR Features.**可通过CPUID指令使用功能号0000_0001h8000_0001h查询是否支持MTRRs

如果支持MTRRs的话,可读取MTRRcap寄存器,获取MTRRs的相关能力:

image-20231101231335060

  • **Variable-Range Register Count (VCNT).**指示有多少可变范围MTRRs组被支持。
  • **Fixed-Range Registers (FIX).**指示固定范围MTRRs是否被支持。
  • **Write-Combining (WC).**指示WC内存类型是否被支持。

7.7.4 MTRRs and Page Cache Controls

MTRRs和分页机制都被使能的时候,有效的内存类型有以下几种情况,这里描述的是未修改的PAT,也就是PAT里面的值是上电默认值,只使用PCDPWT,没有PAT bit

  • 如果页是可缓存并且是写回(WB)的属性(PCD=0 and PWT=0),那么有效的内存类型由MTRR决定。
  • 如果页是不可缓存(PCD=1)的,那么有效的内存类型是UC
  • 如果页是可缓存并且是写直通的属性(PCD=0 and PWT=1),那么有效的内存类型由MTRR决定,除非MTRR指定是WB的内存,这种情况有效的内存类型是WT

文字描述起来不太好懂,还是表格比较好理解:

image-20231102222744708

**Large Page Sizes.**启用分页后,除了典型的4 KB页大小之外,软件还可以使用大页(2 MB4 MB)。当使用大页时,多个MTRR可能会跨越单个大页内的内存范围。每个MTRR可以表征页面内具有不同内存类型的区域。如果发生这种情况,则处理器在大页中使用的有效内存类型是未定义的。

软件可以下面的方法去避免这种情况:

  • 避免使用多个MTRRs去表征单个大页
  • 使用多个4-Kbyte页去替代这个大页
  • 如果必须用多个MTRRs去表征单个大页,可以将MTRR类型设置为相同的值
  • 如果多个MTRRs必须有不同的类型,软件可以将大页PCDPWT位设置为由多个MTRR定义的最严格的内存类型

**Overlapping MTRR Registers. **如果两个或多个MTRR的地址范围重叠,则应用以下规则来确定用于表征重叠地址范围的内存类型:

  • 当物理地址在1 Mbyte以下时,固定范围的MTRRs比可变范围的MTRRs优先级更高。
  • 如果两个或多个可变范围MTRRs重叠,则遵循以下规则:
    • 如果内存类型相同,则使用该内存类型。
    • 只要有一个UC内存类型,那内存类型就是UC
    • 如果只有WTWB两种内存类型,那么内存类型就是WT
    • 如果内存类型的组合未在上面几种情况列出,则所使用的内存类型是未定义的。

7.7.5 MTRRs in Multi-Processing Environments

在多处理器环境,所有处理器的MTRRsCR0.CDPAT都必须是一致的,不然就会违反一致性和原子原则。硬件不会去检查这些值在各个处理器是否是一致的,需要软件去初始化和维护它们在所有处理器之间的一致性。

7.8 Page-Attribute Table Mechanism

PAT机制提供和MTRRs相同的内存类型能力,但是更加的灵活。PATMTRR机制是可以一起使用的。

7.8.1 PAT Register

PAT寄存器有8个字段,也就是最大支持8种内存类型:

image-20231102230514194

其支持的内存类型如下,比MTRR多了一个UC-

image-20231102230653368

7.8.2 PAT Indexing

PAT索引由三个bit组成:

  • **PAT.**在4-Kbyte页中,PAT位位于PTEsbit7;在2-Mbyte4-Mbyte页中,PAT位位于PDEsbit12
  • **PCD.**位于所有页表条目的bit4
  • **PWT.**位于所有页表条目的bit3

下图是上电复位后PAT对应的默认内存类型:

image-20231102231602096

7.8.3 Identifying PAT Support

可通过CPUID指令使用功能号0000_0001h8000_0001h查询是否支持PAT

✳如果处理器支持PAT的话,那它默认就是使能的。并且不能通过软件禁止。但是软件可以使用如下方式避开使用PAT

  • 在页表条目中不将PAT位设置为1
  • 不修改PAT寄存器的上电默认值。

这样的话就和不支持PAT机制的实现是一样的。

7.8.4 PAT Accesses

在支持PAT机制的实现中,所有通过分页机制转换的内存访问都会使用PAT去索引PAT寄存器中对应的内存属性字段。过程如下:

  1. 处理器拿到一个虚拟地址。
  2. MMU通过分页机制将这个虚拟地址转换成物理地址。
  3. 在转换的同时,从相应的页表条目读取PATPCDPWT 位。
  4. 使用PATPCDPWT 位作为索引从PAT寄存器拿到对应的内存属性值。
  5. 转换后的物理地址就会以拿到的内存属性去访问物理内存。

Page-Translation Table Access.MMU使用的页表是没有PAT位的,只能使用PCDPWT 位去索引PAT寄存器的前四个字段。

7.8.5 Combined Effect of MTRRs and PAT

如果同一段物理地址同时使用MTRRsPAT,那么最终的内存属性是有很多种组合情况的:

image-20231102233711917
image-20231102233757878

7.8.6 PATs in Multi-Processing Environments

多核一致性和MTRRs是一样的。

7.8.7 Changing Memory Type

物理页不应该通过不同的虚拟映射分配不同的可缓存性类型;它们应该全部是可缓存类型(WBWTWP)或全部是不可缓存类型(UCWC)。否则,这可能会导致缓存一致性丢失,从而导致数据过时和不可预测的行为。因此,在更改页面的内存类型时必须采取一定的预防措施。特别是,当从可缓存内存类型更改为不可缓存类型时,必须刷新缓存,因为处理器的预测执行可能会导致内存被缓存,即使它没有以编程方式引用。下表总结了安全更改内存类型的序列化要求。

image-20231103220330550

  • **a.**先删除之前的映射(使其不存在于页表中);刷新TLB,包括可能使用该映射的其他处理器的TLB,即使是推测性的;使用新类型在页表中创建新映射。
  • **b.**除了注释a中描述的步骤之外,软件还应该从可能使用了先前映射的任何处理器的缓存中刷新页面。这必须在注释a中的TLB刷新完成后完成。

7.9 Memory-Mapped I/O

这段内容网上资料比较少,在Linux源码也没找到相关的用例,猜测是一段物理地址,物理内存和设备都使用了这段相同的地址,在访问时可以设置相关的位来将访问定向为系统内存还是内存映射I/O

7.9.1 Extended Fixed-Range MTRR Type-Field Encodings

固定范围的MTRRs使用预留的bits 4:3去指定物理地址是定向到系统内存还是内存映射I/O

  • **WrMem—Bit 3.**当设置为1的时候,处理器定向写请求到系统内存。清除为0的时候,定向到内存映射I/O
  • **RdMem—Bit 4.**当设置为1的时候,处理器定向读请求到系统内存。清除为0的时候,定向到内存映射I/O

image-20231107223925289

使能条件由SYSCFG这个MSR中的特定位决定:

  • **MtrrFixDramEn—Bit 18.**当设置为1的时候,RdMemWrMem属性被使能。清除为0的时候,这些属性被禁止。当禁止的时候,访问被定向到内存映射I/O
  • **MtrrFixDramModEn—Bit 19.**当设置为1的时候,软件可以读写RdMemWrMem位。清除为0的时候,写是不会产生效果的,读的话会返回0

要使用这个扩展,软件必须先设置MtrrFixDramModEn=1以允许修改RdMemWrMem位。在固定范围MTRRs寄存器中初始化这些属性位后,设置MtrrFixDramEn=1去使能这个扩展。

RdMemWrMem允许处理器独立地定向读取和写入系统内存或内存映射I/O。当隐藏位于内存映射I/O空间中的ROM设备时,RdMemWrMem控制特别有用。在RAM系统内存中隐藏此类设备以提高访问性能通常很有用,但写入RAM位置可能会损坏隐藏的ROM信息。MTRR扩展解决了这个问题。系统软件可以通过为指定的内存范围设置WrMem = 1RdMem = 0来创建影子位置,然后将ROM位置复制到自身中。读取定向到内存映射ROM,但写入则定向到系统内存中的相同物理地址。复制完成后,系统软件可以将值更改为WrMem = 0RdMem = 1。现在读取将定向到位于系统内存中的更快副本,写入将定向到内存映射ROMROM像平常一样响应写入,即忽略它。

不是所有的编码组合都被支持,使用保留的编码组合会产生不可预期的行为:

image-20231107231618312

7.9.2 IORRs

IORRs操作类似于可变范围MTRRsIORRs指定任何物理地址范围中的读取和写入是映射到系统内存还是内存映射I/O。使用IORR最多可以控制两个不同大小的地址范围。每个地址范围由一对IORRs控制:IORRBasenIORRMaskn(n值的范围01)。

IORR范围与等效有效MTRR范围的交集遵循与固定范围MTRR相同的类型编码表(表7-13),其中RdMem/WrMem和内存类型直接绑定在一起。

IORRBasen Registers.

  • **WrMem—Bit 3.**当设置为1的时候,处理器定向写请求到系统内存。清除为0的时候,定向到内存映射I/O
  • **RdMem—Bit 4.**当设置为1的时候,处理器定向读请求到系统内存。清除为0的时候,定向到内存映射I/O
  • **Range Physical-Base-Address (PhysBase)—Bits 51:12.**内存范围的物理基地址。PhysBaseAMD64架构最大支持52位物理地址空间,且是4-Kbyte(或更大)地址对齐的。PhysBase表示物理地址的高40位有效地址。物理地址位11:0假定为0

image-20231107234158552

IORRMaskn Registers.

  • **Valid (V)—Bit 11.**指示一对IORR是否有效。当为0的时候是无效的,并且不会被使用。
  • **Range Physical-Mask (PhysMask)—Bits 51:12. **指定内存范围的掩码。PhysMask4-Kbyte边界对齐的。

7.9.3 IORR Overlapping

不建议使用重叠的IORRs。如果指定了重叠的IORRs,则结果行为取决于具体的实现。

7.9.4 Top of Memory

TOP_MEM设置了不知道有什么用处,经测试不管如何配置对内存属性好像都没影响,但是TOP_MEM2对于内存属性是由影响的。

有两个top-of-memory寄存器,TOP_MEMTOP_MEM2用来指定作为内存映射I/O的物理地址范围。TOP_MEM寄存器指定的内存区域是8-Mbyte对齐的:

  • 对于物理地址0TOP_MEM - 1的内存访问被定向到系统内存。
  • 对于物理地址TOP_MEMFFFF_FFFFh的内存访问被定向到内存映射I/O
  • 对于物理地址1_0000_0000hTOP_MEM2 - 1的内存访问被定向到系统内存。
  • 对于物理地址TOP_MEM2到支持的最大物理地址空间的内存访问被定向到内存映射I/O

top-of-memory范围与等效有效MTRR范围的交集遵循与固定范围MTRR相同的类型编码表(表7-13),其中RdMem/WrMem和内存类型直接绑定在一起。

image-20231108223136475

TOP_MEMTOP_MEM2寄存器的格式如下,bits 51:23指定的是一个8-Mbyte对齐的物理地址。所有剩余的位被保留,并且为了兼容性应该清除为0.

image-20231108223447047

TOP_MEM寄存器被使能,当SYSCFG这个MSRbit 20(MtrrVarDramEn) 被设置为1时。TOP_MEM2寄存器被使能,当SYSCFG这个MSRbit 21(MtrrTom2En) 被设置为1时。当相应的位被清除为0的时候,寄存器被禁止。在top-of-memory寄存器被禁止后,默认的内存访问被定向到内存映射I/O

15 Secure Virtual Machine

15.25 Nested Paging

15.25.8 Combining Memory Types, MTRRs

当嵌套分页被禁用时,处理器的行为就像没有gPAT寄存器一样。

HostPAT MSR确定当前VM的内存类型属性,并且Guest写入未被VMM拦截的PAT MSR将更改HostPAT MSRVMM负责在虚拟机之间切换时对PAT MSR内容进行切换。

当嵌套分页被使能时,处理器组合Guest和嵌套页表的内存类型。影响内存类型的寄存器有:

  • 嵌套页表和Guest页表的PCD/PWT/PAT位。
  • gCR3nCR3PCD/PWT位。
  • GuestPAT类型。
  • HostPAT类型。
  • MTRRs
  • gCR0.CDhCR0.CD

GuestMTRRs没有硬件支持。VMM可以通过改变嵌套页表中的内存类型来模拟它们的效果。MTRR仅适用于系统物理地址。

构建Guest TLB条目时组合内存类型的规则是:

  • 嵌套和GuestPAT类型根据表15-19进行组合。
  • 组合的PAT类型进一步根据表15-20MTRR类型组合,其中相关MTRR由系统物理地址确定。
  • gCR0.CDhCR0.CD都可以禁用缓存。

image-20231108233452991

image-20231108233514287

**Memory Consistency Issues.**因为Guest使用额外的字段来确内存类型,所以VMM可以使用与Guest不同的内存类型来访问给定的内存区域。如果一个访问是可缓存的,而另一个访问不可缓存,则VMMGuest虚拟机可能会观察到不同的内存映像,这是非期望的结果。(多核处理器对这个问题特别敏感,当虚拟cpuVMM设计为可在物理cpu之间迁移。)

为了解决这个问题,提供了下面的机制:

  • VMRUN#VMEXIT刷新写组合。这确保了GuestWC内存的所有写入对于Host都是可见的(反之亦然),而无论内存类型如何。 (它不能确保一个代理的可缓存写入被另一代理的WC读取或写入正确观察到。)
  • 引入了新的内存类型WC+WC+是一种不可缓存的内存类型,并且像WC一样在写组合缓冲区中组合写操作。与WC不同(但与 CD 内存类型类似),对WC+内存的访问还会监听所有处理器上的缓存(包括自监听发出请求的处理器的缓存)以保持一致性。这可确保 可缓存的写入被WC+访问观察到。
  • 当组合与缓存不兼容的嵌套内存类型和Guest内存类型时,将使用WC+内存类型而不是WC(表 15-20 确保无论HostMTRR设置如何,都保留监听行为)。

image-20231109221448682

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++破局】C++内存管理之new与deleted剖析

​作者主页 &#x1f4da;lovewold少个r博客主页 ⚠️本文重点&#xff1a;c内存管理部分知识点梳理 &#x1f449;【C-C入门系列专栏】&#xff1a;博客文章专栏传送门 &#x1f604;每日一言&#xff1a;花有重开日&#xff0c;人无再少年&#xff01; 目录 C/C的内存分配机…

向量的点积和外积

参考&#xff1a;https://www.cnblogs.com/gxcdream/p/7597865.html 一、向量的内积&#xff08;点乘&#xff09; 定义&#xff1a; 两个向量a与b的内积为 ab |a||b|cos∠(a, b)&#xff0c;特别地&#xff0c;0a a0 0&#xff1b;若a&#xff0c;b是非零向量&#xff0c;…

测量直线模组时如何降低误差?

直线模组属于高精度传动零部件&#xff0c;是机械行业中不可或缺的零部件之一&#xff0c;其具有高精度、速度快、使用寿命长等特点&#xff1b;如果直线模组的精度受损&#xff0c;则不能达到预期的使用效果&#xff0c;那么我们测量时应该如何减少误差&#xff0c;确保直线模…

【数据结构】二叉树经典例题---<你真的掌握二叉树了吗?>(第一弹)

一、已知一颗二叉树如下图&#xff0c;试求&#xff1a; (1)该二叉树前序、中序和后序遍历的结果。 (2)该二叉树是否为满二叉树&#xff1f;是否为完全二叉树&#xff1f; (3)将它转换成对应的树或森林。 (4)这颗二叉树的深度为多少? (5)试对该二叉树进行前序线索化。 (6)试对…

Vue3路由配置

目录 ​编辑 一&#xff1a;前言 二&#xff1a;配置路由 1、安装路由 2、创建各文件 1&#xff09;views 下的 index.vue 文件 2&#xff09;router 下的 index.ts 3&#xff09;App.vue 文件修改 4&#xff09;main.ts 文件修改 3、一些会遇到的报错 1&#xff09;…

【计算机毕业设计】基于微信小程序实现校园综合服务平台-芒果校园(源码+路演ppt)

项目场景&#xff1a; 这个是之前在准备比赛做的项目&#xff0c;本来拿来去参加的&#xff0c;后面因为一些原因&#xff0c;这个项目被搁置了&#xff0c;今天打开源码 好在还在&#xff0c;但当我打开的时候&#xff0c;接口发生了一些变化&#xff0c;例如 getLocation();…

Doris:多源数据目录(Multi-Catalog)

目录 1.基本概念 2.基本操作 2.1 查看 Catalog 2.2 新增 Catalog 2.3 切换 Catalog 2.4 删除 Catalog 3.元数据更新 3.1手动刷新 3.2定时刷新 3.3自动刷新 4.JDBC Catalog 4.1 上传mysql驱动包 4.2 创建mysql catalog 4.3. 读取mysql数据 1.基本概念 …

【数据结构】顺序表 | 详细讲解

在计算机中主要有两种基本的存储结构用于存放线性表&#xff1a;顺序存储结构和链式存储结构。本篇文章介绍采用顺序存储的结构实现线性表的存储。 顺序存储定义 线性表的顺序存储结构&#xff0c;指的是一段地址连续的存储单元依次存储链性表的数据元素。 线性表的&#xf…

EtherCAT报文-LRW(逻辑寻址读写)抓包分析

0.工具准备 1.EtherCAT主站 2.EtherCAT从站(本文使用步进电机驱动器) 3.Wireshark1.EtherCAT报文帧结构 EtherCAT使用标准的IEEE802.3 Ethernet帧结构,帧类型为0x88A4。EtherCAT数据包括2个字节的数据头和44-1498字节的数据。数据区由一个或多个EtherCAT子报文组成,每个子…

MYSQL操作详解

一)计算机的基本结构 但是实际上&#xff0c;更多的是这种情况: 二)MYSQL中的数据类型: 一)数值类型: 数据类型内存大小(字节)说明bit(M)M指定位数,默认为1单个二进制位值&#xff0c;或者为0或者为1&#xff0c;主要用于开/关标志tinyint1字节1个字节的整数值&#xff0c;支持…

如何将一个 HRESULT 转换为 Win32 错误码?

地球人都知道&#xff0c;可以使用 HRESULT_FROM_WIN32 这个宏将一个 Win32 错误码转换为一个 HRESULT&#xff0c;但是如何将一个 HRESULT 转换为 Win32 错误码呢&#xff1f; 让我们先看看 HRESULT_FROM_WIN32 这个宏的定义&#xff1a; #define HRESULT_FROM_WIN32(x) \ ((…

[LeetCode]-622. 设计循环队列

目录 662. 设计循环队列 题目 思路 代码 662. 设计循环队列 622. 设计循环队列 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/design-circular-queue/ 题目 设计你的循环队列实现。 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&…

硝烟后的茶歇 | 中睿天下谈攻防演练之邮件攻击溯源实战分享

近日&#xff0c;由中国信息协会信息安全专业委员会、深圳市CIO协会、PCSA安全能力者联盟主办的《硝烟后的茶歇广东站》主题故事会在深圳成功召开。活动已连续举办四年四期&#xff0c;共性智慧逐步形成《年度红蓝攻防系列全景图》、《三化六防“挂图作战”》等共性研究重要成果…

NSF服务器

1.简介 1.1 NFS背景介绍 NFS是一种古老的用于在UNIX/Linux主机之间进行文件共享的协议。它古老到你必须穿着白大补才能接近一台计算机的年代。在那个年代&#xff0c;所有的联网计算机都被认为是可信的&#xff0c;而不像现今这样&#xff0c;任何人都有多种多样方法能连接到你…

视频剪辑技巧:探索画中画视频剪辑,如何制作引人入胜的视觉效果

在视频制作领域&#xff0c;画中画视频剪辑是一种备受瞩目的技术&#xff0c;它可以将多个视频画面叠加在一起&#xff0c;形成一种独特的视觉效果。这种剪辑技巧可以让观众同时看到两个或多个视频片段&#xff0c;创造出一种引人入胜的视觉体验。在开始画中画视频剪辑之前&…

SQL必知会(二)-SQL查询篇(3)-过滤数据

第4课、过滤数据 WHERE&#xff1a;过滤条件 使用 WHERE 子句 指定搜索条件进行过滤。 WHERE 子句操作符 表4-1 WHERE 子句操作符 操作符说明操作符说明等于>大于< >不等于>大于等于!不等于!>不大于<小于BETWEEN在指定的两个值之间<小于等于IS NULL为…

线程活跃性

文章目录 1. 简介2. 死锁3. 活锁4. 饥饿 1. 简介 所谓线程的活跃性&#xff0c;我们知道每个线程所要执行的java代码是有限的&#xff0c;在执行一段时间后线程自然会陷入Terminated状态&#xff0c;但由于某些外部原因导致线程一直执行不完&#xff0c;一直处于活跃状态&…

leetCode 493 翻转对 归并分治 + 图解

493. 翻转对 - 力扣&#xff08;LeetCode&#xff09; 给定一个数组 nums &#xff0c;如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。你需要返回给定数组中的重要翻转对的数量。 求"小和"问题是&#xff0c;当我 j 来到一个位置的…

快速排序实现方法(剑指offer思路)

快速排序思想 从参与排序的数组中&#xff0c;选择一个数&#xff0c;把小于这个数的放在左边&#xff0c;大于这个数的放在右边&#xff0c;然后递归操作。 实现算法思路 选择最后一个当作参考值&#xff0c;使用small索引当作比这个数小的下标值遍历数组&#xff0c;如果小…

【Python】 Python 使用 Pillow 处理图像:几何变换

Python 使用 Pillow 处理图像&#xff1a;几何变换 pillow库操作切片、旋转、滤镜、输出文字、调色板等功能一应俱全。 1. 几何变换 Image 包含调整图像大小 resize() 和旋转 rotate() 的方法。前者采用元组给出新的大小&#xff0c;后者采用逆时针方向的角度。 调整大小并…
最新文章